Docker入门 服务部署的艺术

Docker入门 服务部署的艺术

本课程可能涉及的内容 :Docker核心命令, Docker软件部署,Dockerfile镜像制作, Docker实战, Docker集群搭建

Docker需求:高可用,高并发 => 集群服务器 服务器忙闲不均

Docker介绍

docker是一个开源的应用容器引擎,基于GO语言并遵从Apache2.0协议的开源引擎。

Docker可以让开发者打包他们的应用以及依赖包到一个轻量级,可移植的容器中。容器完全是沙箱机制,没有接口连接,PLUS容器性能开销极低

Docker将应用与依赖包打包到可以指的容器中,进而可以在任何流行的Linux系统上部署应用

Docker与云结合,让云空间更充分地利用,解决硬件问题也改变虚拟化的方式

Docker保证了执行的一致性,是的应用迁移更加的容易。Docker可以在很多平台上运行,并且保证了结果的一致

Docker可以做到:

  • web应用的自动化打包与发布
  • 自动化测试的持续继承与发布
  • 从头编译或扩展现有的OpenShift 或Cloud Foundary 搭建自己的Paas(平台即服务: 硬件 + 安装开发环境工具包)环境
Docker与虚拟化技术

虚拟机:进行硬件资源划分,利用硬件虚拟化技术,实现对硬件资源的彻底隔离(eg. 通过hypevisor层实现),不同虚拟机不存在资源共享,更适用于资源需要完全隔离的情况(eg.病毒试险 (doge))

Docker: 在操纵系统层面的隔离而非硬件级别的隔离,各个docker之间的硬件资源可以共享,隔离方式如进程隔离,无需多加中间层实现 ,在运行大量实例并保证资源充分利用的目标下使用(资源充分利用与云计算的资源池的概念有异曲同工之妙)

简单对比总结:

特性DockerVM
启动秒级分钟级
硬盘使用一般为MB上升为GB
性能接近原生弱于原生(资源调度需经过中间层)
系统支持并发量单机支持上千Docker单机一般最多一百个就歇菜了,别的不说硬盘占用就是硬伤好么

Docker架构

docker包括三个基本的概念:镜像(Image) ,容器 (Container),仓库 (Repository)

(好像每个人都会maven一样这些概念早就知道了,没办法只能硬啃)

Image: 镜像的概念大家都知道,毕竟容灾计算机体系结构都学过。镜像就是对这个系统本身,文件,环境等进行一个全备份。而这样的一份镜像就可以创建容器了

Container: 容器就是我们刚刚通过镜像制造处的类似于环境。你可以在器内部安装任何的软件与库文件,做任意的运行配置。Docker引擎并不关心容器的内容,容器是镜像创建的实例,是镜像的实例

Repository: 仓库是放置镜像文件的场所,如Docaker共公司提供的官方仓库DockerHub。任何人都可以部署一个自己的仓库(repository项目是开源的哦)

Dockerhub链接: https://hub.docker.com (需要注册AND我还没注册,下次一定)

Docker引擎:使用C/S架构,通过使用全程api来管理和创建Docker容器

docker Image 是一个特殊的文件系统,一经创建不会再改变

Docker体积小,速度快的秘籍

  • Docker有比虚拟机更少的抽象层,在资源利用速度与利用率上有显著的提升
  • Docker系统操作更依赖宿主机的内核,启动时无需重新加载操作系统,不需要GuestOS的启动,速度更快
  • Docker压缩镜像的好帮手:Union FS。毕竟镜像包含完整的操作系统文件, Docker采用分层技术压缩了体积,详情见下
拓展: Union FS

unionFS(联合文件系统 Union File System): 可以把多个目录(也叫作分支)内容联合挂在导同一个目录文件下面,而目录的物理位置是分开的。(他大抵描述的是挂载,但是没错,我也没懂他这句鸟语究竟在讲些什么,参考文章https://blog.csdn.net/weixin_44250083/article/details/109705839)

但是不要慌,遇事不觉先看命令,挂载很明显是由mount命令决定的,所以各位,我去继续更新Linux入门大全了(误)

好的各位我又回来了。unionFS显然就是mount挂载重所采用的技术,我已经在linux入门中更新相关内容,这里不展开讲解了。

我们重点需要知道Docker镜像的设计中,是通过层变化来达到新镜像的容器部署的。用户制作镜像的每一步,变量目录的每一次变化都会生成一个层。换言之,Docker著作镜像的过程就是层的罗列。每一个命令都会创建一个新的层。镜像的制作由于是不可变的,所以镜像的所有层都是可读层。而容器/镜像的实例化就是在镜像的最上层添加一层可写层/容器层。所有对容器的修改都是基于对这一层的修改(参考https://blog.csdn.net/weixin_45187434/article/details/108398165)

这意味着,宿主机中只要有一份系统的镜像,就可以运行所有基于此镜像的容器,这也就当然完全减少了每个docker的大小(参考https://jerry.blog.csdn.net/article/details/85161108)

Docker镜像设置:注册表(Docker Registry)的妙用 (官方文档:https://www.cnblogs.com/yinzhengjie/p/12232737.html)

Docker registry 是 Docker的核心组件之一,负责镜像内容的存储与分发。客户端的docker pull以及push都直接与registry交互(换句话说 Docker registry是构建私人仓库的基础之一)

Docker镜像管理

获取镜像的方式:1. 从官方仓库(HubDocker)获取镜像 2. 管理本地主机上的镜像

* docker search [-f(filiter过滤)]		 	搜索内容 	从我们设置好的镜像网站上进行镜像的搜索(也可以直接在网上查)
* docker images/image ls			  	 罗列存在本地仓库中/下载的镜像
* docker pull [选项] 地址(IP)[:端口号]   	 从镜像仓库中拉取或者更新指定镜像   默认地址为hubdocker的地址
  However在hub docker上面直接有命令   	  	见下图,直接用即可
 
捕获

在下载镜像的时候就能更清楚的人知道镜像的分层操作,因为镜像下载就是逐层下载的。在下载过程每一层的名称给出的是其ID的前十二位,并且下载结束后给出文件的sha256的哈希值,这里的sha256的作用是作为文件的摘要。而且,在下载有相同基础层的dicker时你会发现实际多层返回:already exists 体现了union FS的特点,相同层会被挂载在设定目录下面,而各层资源可以相互使用,不过在进程上隔离罢了。

2

滚回来更新啦

当你安装好了Docker之后,你会发现woc,Docker所有命令都需要管理原权限,这不是麻烦死了。而且,我们打开docker,创建docker进程的时候都是sudo ,要是Docker发生意外甚至有可能危害到我们本机,所以必须想办法拿下他的权限。首先我们看看Docker有哪些权限:

seed@ubuntu:/run$ ls -l /run | grep docker
drwx------  8 root              root    180 Mar  3 23:07 docker
-rw-r--r--  1 root              root      4 Mar  3 22:50 docker.pid
srw-rw----  1 root              docker    0 Mar  3 22:50 docker.sock

结合Linux的笔记(chmod和chown那一节)我们就很好理解docker现在的权限状态了。docker.sock就是docker与我们Unix核心之间的一个socket.我们的命令是有dock文件接受并统合到内核,等待内核执行这样的一个过程。所以docker.sock的权限就是我们运行docker锁需要的条件。根据系统的给出的权限,我们不难看出: docker.sock处于 root用户, docker组下面,且root用户权限为读写, docker组用户权限为读写,其他用户无权限。难怪我的seed账户必须root。我们更改权限,有三种方式: a. 将我的seed用户拉入组中 b. 更docker.sock文件的所有者 c.更改docker.sock的文件权限。这里我选择了更改文件权限的方法 **注意,这里记的抓拍快照防止搞崩了 **之后我们可以看到docker已经可以不需要管理员的权限了。

seed@ubuntu:/run$ sudo chmod 666 docker.sock
seed@ubuntu:/run$ ls -l /run | grep docker
drwx------  8 root              root    180 Mar  3 23:07 docker
-rw-r--r--  1 root              root      4 Mar  3 22:50 docker.pid
srw-rw-rw-  1 root              docker    0 Mar  3 22:50 docker.sock
seed@ubuntu:/run$ docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED      STATUS          PORTS                                       NAMES
b6abd8b5c3c2   redis     "docker-entrypoint.s…"   2 days ago   Up 13 minutes   0.0.0.0:6379->6379/tcp, :::6379->6379/tcp   redis_docker

Docker基础命令:

  1. images / image ls 展现已经下载的镜像
seed@ubuntu:~$ docker images
REPOSITORY                           TAG       IMAGE ID       CREATED         SIZE
redis                                latest    7614ae9453d1   2 months ago    113MB
hello-world                          latest    feb5d9fea6a5   5 months ago    13.3kB
vulfocus/thinkphp-cve_2018_1002015   latest    46ed53574c75   22 months ago   120MB
  1. docker start / stop 打开/关闭某个已经建好的容器
seed@ubuntu:~$ docker start redis_docker
redis_docker
seed@ubuntu:~$ docker stop redis_docker
redis_docker
  1. docker image rm 删除镜像,支持多删(以 ibmcom/testjob aafa6fc1383b 为例)

    注: 当存在此镜像生成的容器时会删除失败

seed@ubuntu:~$ docker images
REPOSITORY                           TAG       IMAGE ID       CREATED         SIZE
bitnami/jupyter-base-notebook        latest    baa3658ddfb8   8 weeks ago     509MB
tomcat                               latest    fb5657adc892   2 months ago    680MB
redis                                latest    7614ae9453d1   2 months ago    113MB
hello-world                          latest    feb5d9fea6a5   5 months ago    13.3kB
ibmcom/testjob                       latest    aafa6fc1383b   6 months ago    7.59MB
vulfocus/thinkphp-cve_2018_1002015   latest    46ed53574c75   22 months ago   120MB
seed@ubuntu:~$ docker image rm aafa6fc1383b
Untagged: ibmcom/testjob:latest
Untagged: ibmcom/testjob@sha256:5ddd1f1d87cf757ccb09ac1de0b988ac0a17000e6af2d9c931e9f04812a2a2d8
Deleted: sha256:aafa6fc1383b1e33c9ba3c4bf20c112ad2ca211e57fb50215cfc728b25dfffae
Deleted: sha256:b75c5510972ce74d362a83a6efc0c6dff251346b86d16f11b59eb75c36cdb77e
Deleted: sha256:72e830a4dff5f0d5225cdc0a320e85ab1ce06ea5673acfe8d83a7645cbd0e9cf
seed@ubuntu:~$ docker images
REPOSITORY                           TAG       IMAGE ID       CREATED         SIZE
bitnami/jupyter-base-notebook        latest    baa3658ddfb8   8 weeks ago     509MB
tomcat                               latest    fb5657adc892   2 months ago    680MB
redis                                latest    7614ae9453d1   2 months ago    113MB
hello-world                          latest    feb5d9fea6a5   5 months ago    13.3kB
vulfocus/thinkphp-cve_2018_1002015   latest    46ed53574c75   22 months ago   120MB
seed@ubuntu:~$ docker image rm hello-world
Error response from daemon: conflict: unable to remove repository reference "hello-world" (must force) - container a5194b78b4e8 is using its referenced image feb5d9fea6a5

Docker 容器管理

  1. docker ps 查看正在运行的容器/全部的容器
seed@ubuntu:~$ docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED      STATUS         PORTS                                       NAMES
b6abd8b5c3c2   redis     "docker-entrypoint.s…"   2 days ago   Up 3 seconds   0.0.0.0:6379->6379/tcp, :::6379->6379/tcp   redis_docker
seed@ubuntu:~$ docker ps -a
CONTAINER ID   IMAGE         COMMAND                  CREATED      STATUS                  PORTS                                       NAMES
b6abd8b5c3c2   redis         "docker-entrypoint.s…"   2 days ago   Up 8 seconds            0.0.0.0:6379->6379/tcp, :::6379->6379/tcp   redis_docker
a5194b78b4e8   hello-world   "/hello"                 4 days ago   Exited (0) 4 days ago                                               agitated_aryabhata
3fbcf210ad35   hello-world   "/hello"                 4 days ago   Exited (0) 4 days ago                                               keen_ishizaka
seed@ubuntu:~$ docker ps -a -q
6dd50002bc6b
e4434a013f4a
3b6d24e87bc9
b6abd8b5c3c2
  1. docker run 创建容器(基于镜像新建容器并启用)
docker run 参数 --name 创建的容器名称 [-p 宿主机端口:镜像端口映射] 镜像名称
参数列表:
-i: 	以交互模式运行容器,通常与 -t 同时使用
-t: 	为容器重新分配一个伪输入终端,通常与 -i 同时使用
-rm:	在进行交互后立即删除
-d: 	后台运行容器,并返回容器ID;
seed@ubuntu:~$ docker run -d --name my_tomcat -p 8080:8080 tomcat
6dd50002bc6b5e50f20f87019192583ff0763a0ad4d2fb5b874562bffc5484b9
//这个时候我的浏览器就能访问tomcat了
  1. docker start 打开容器,支持多开
seed@ubuntu:~$ docker start redis_docker my_tomcat
redis_docker
my_tomcat
  1. docker stop 关闭容器,支持多闭
seed@ubuntu:~$ docker stop $(docker ps -q)
6dd50002bc6b
b6abd8b5c3c2
seed@ubuntu:~$ docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
  1. docker exec -it 进入容器
seed@ubuntu:~$ docker exec -it my_tomcat bash
root@6dd50002bc6b:/usr/local/tomcat#
//这里的it和上面run的选项的意思是一样的
  1. docker cp 在宿主机与容器之间交换文件
docker cp [options]  container_name:container-path   logicalpath			容器文件复制到宿主机中
                     logicalpath 	container_name:container_path			宿主机文件复制到文件中
seed@ubuntu:~/Documents/tomcat_docker$ docker cp hello my_tomcat:/bin
seed@ubuntu:~/Documents/tomcat_docker$ docker exec -it my_tomcat bash
root@6dd50002bc6b:/bin# cat hello
My name is why, and I'm thamkful for your kindness.
  1. docker logs [option] dockername 查看容器的日志
options:
-f 		查看实时日志
-t 		查看日志产生的日期
-n		查看后x条日志
--since 从哪天开始

seed@ubuntu:/usr$ docker logs -f -t -n=2 my_tomcat
2022-03-04T09:41:48.254934262Z 04-Mar-2022 09:41:48.254 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"]
2022-03-04T09:41:48.270320023Z 04-Mar-2022 09:41:48.270 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in [1033] milliseconds

Docker数据卷

问题:通过镜像创造一个容器,容器一旦被销毁,容器内的数据被一并删除。容器中的数据不是持久化状态的。同时为了数据更方便的更改数据(每次都要进入容器中更改)

概念:数据卷是一个可供一个或多个容器使用,或容器与宿主机间进行数据交互的特殊目录

特性:

  • 数据卷可以在容器之间共享,宠用
  • 对数据卷的修改会立刻生效
  • 对数据卷的更新不会影响镜像
  • 数据卷默认会一致存在,即使容器删除

数据卷(Volumn)机制: 数据卷是一个或多个容器中的特定文件或文件夹。这个文件夹独立于docker存在于系统中。

数据卷使用:

  1. docker -run -v 宿主机路径:容器内部路径 镜像名称 在创建container的时候进行数据卷的创建
seed@ubuntu:/$ docker run -v /home/seed/Desktop:/var/tomcat_connection -p 8080:8080 --name my_tomcat tomcat
之后就可以在桌面上的tomcat_connection与tomcat容器进行交互了

注,由于nginx的容器创建后会立即被同步数据卷内容。所以再使用前需要先将数据卷中放好拷贝的文件才能进行数据卷的配置

Docker定制

官方的情况大部分无法满足我们的需求。主要是我们字写得东西希望部署再docker上面。Docker支持我们创建镜像。所谓镜像就是分层的定死得数据。所以说,我们完全可以将容器最上的操作层定死来完成镜像的创建。 dockerfile可以帮助我们定制镜像。

dockerfile定制镜像命令

**我们可以把容器每一层的修改,安装,构建,操作的命令都写入一个脚本,用这个脚本来构建,定制镜像。**这个脚本就是dockerfile

dockerfile是一个文本文件,其内部包含了一条条指令。每一条指令构建一层,因此每一条指令的内容就是描述该层如何创建。

dockerfile命令(结合python3.7 镜像源码 https://github.com/docker-library/python/blob/a4b368154b7e3c33c76385f1be7a998fcf3123eb/3.7/buster/Dockerfile)

  1. From 指定基础镜像。基础镜像不存在会在dockerhub上拉取
格式:
From [境像名称]:[tag(版本号)]
From [境像名称]@[digest(校验码)]
eg.
FROM buildpack-deps:buster
  1. ENV 为即将创建的image设置环境变量,设置好的环境变量可以使用docker inspect 查看container的环境变量
格式
ENV 关键字 变量位置
eg.
ENV PATH /usr/local/bin:$PATH		将PATH的此路径调价到原来PATH的环境变量中
ENV LANG C.UTF-8					同理
  1. WORKDIR 两个目录之间的跳转,效果等同于cd (dockerfile没有cd)
eg.(由于python源码里没有实例,我们使用别的教程)
WORKDIR /home/local
  1. RUN +Linux的指令集可以执行Linux指令。但是执行命令仅限于本条RUN指令,这也就是为啥不用Run cd
eg. 
RUN set -eux; \
	apt-get update; \
	apt-get install -y --no-install-recommends \
		libbluetooth-dev \
		tk-dev \
		uuid-dev \
	; \
	rm -rf /var/lib/apt/lists/
  1. EXPOSE 为容器打开指定的端口实现与外部通讯
eg.
EXPOSE 8080
  1. COPY 将宿主机文件赋值到镜像中去CO
COPY src "相对路径" dest "绝对路径"
  1. ADD 与Copy相似,把宿主机文件复制到某个文件中
    • TIPS: Dockerfile中的COPY指令和ADD指令都可以将主机上的资源复制或加入到容器镜像中,都是在构建镜像的过程中完成的。COPY指令和ADD指令的唯一区别在于是否支持从远程URL获取资源。COPY指令只能从执行docker build所在的主机上读取资源并复制到镜像中。而ADD指令还支持通过URL从远程服务器读取资源并复制到镜像中。
  2. Volumn 数据卷,理论桑可以再RUN里面去配置
dockerfile定制镜象实战
  1. 在宿主机中创建一份目录(写入dockerfile),我放在了

  2. 在Dockerfile中写入我们的命令

    //一个简单的我的flaskdockerfile示例
    FROM wisdy/python3-opencv-zbar 
    RUN pip install flask
    RUN mkdir /etc/web
    COPY web/ /etc/web
    WORKDIR /etc/web/html
    EXPOSE 5000
    
    

    Tip: 在构建向我一样的flask项目是,需要将默认的host(127.0.0.1)改为0.0.0.0. 在进行Docker Run 创建容器进行端口映射的时候可以很清晰的看到映射关系就是0.0.0.0的IP映射

  3. 运用如下命令构建镜像

(Dockerfile所在路径)docker build -t (你希望的镜像名) .(这里是Dockerfile文件的历经,由于是同一文件夹下面,所以是.)
  1. 我尝试将自己的stego_项目部署到镜像中,部署成功,可以考虑移植到服务器上面
虚悬镜像

我们在构建镜像的时候与现有的镜像名称重叠,就会出现虚悬镜像的情况。(Name一致,Tag一致).此时会导致较早创建的镜像的Name, Tag均为空,而最新创建的Docker保留名称与Tag,也就是我们所说的虚悬镜像的过程。

一般来说悬空镜像都有不定的版本,所以其本身是没有用处的。我们可以通过如下命令删除所有的玄虚镜像

docker image prnus
SpringBoot/Cloud 部署实战(略):

docker学习可以告一段落了,在更多的了解SpringCloud后我会继续来写实战部署的笔记。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值