Docker [2] —镜像制作和容器管理

一、commit镜像并上传仓库

1、创建一个centos容器:启动后自动进入此容器

在这里插入图片描述
容器内安装nginx服务:
添加一下nginx源:
rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
yum search nginx ##搜索一下看看
yum install nginx -y ## 安装
启动nginx服务
在这里插入图片描述
ctrl +P+Q退出容器,在主机环境内校验nginx请求,正常得到欢迎页
在这里插入图片描述
commit服务为一个nginx镜像
现在要将cent容器提交成为一个镜像,命令如下:
docker commit cent cent-ng:v1
可看到得到了新的镜像cent-ng:v1
在这里插入图片描述
启动此nginx镜像
1、使用新建的镜像创建容器,并进入查看,发现已安装有nginx,但nginx并未启动
在这里插入图片描述
容器内启动nginx服务,并退出容器。在主机方校验,nginx欢迎页面出现
在这里插入图片描述
2、现在我们希望启动容器时,直接启动nginx服务,怎么做?
docker run -d --name ngx3 cent-ng:v1 /usr/sbin/nginx -g “daemon off;”
在这里插入图片描述
可看到,容器内nginx服务也已正常运行
ps:后面运行的命令都是容器命令,由于nginx命令没有设置到path中,所以全路径启动,
而nginx -g这个参数是指可以在外面添加指令到nginx的配置文件中,
daemon off是指nginx服务不运行在后端,而是在前台运行(container中的服务必须运行在前台)

2、commit创建镜像方式的本质

在这里插入图片描述
原容器与commit后的镜像,在文件系统上并无区别。只是把容器层原来的可写属性,置成了只读。于是变成了一个不可改的镜像

二、数据管理

docker容器运行,产生一些数据/文件/等等持久化的东西,不应该放在容器内部。应当以挂载的形式存在主机文件系统中。

1、docker的文件系统

在这里插入图片描述
1.镜像与容器读写层,通过联合文件系统,组成系统文件视角
2.容器服务运行中,一定会生成数据
3.容器只是运行态的服务器,是瞬时的,不承载数据的持久功能

2、volume文件挂载的探究

1、volume参数创建容器数据卷
在这里插入图片描述

2、我们通过docker inspect data查看容器元数据,可看到挂载信息
在这里插入图片描述
在这里插入图片描述

3、在容器端添加一个文件
在这里插入图片描述
回主机目录查看,果然存在此文件:
在这里插入图片描述

4、在主机方添加一个文件
在这里插入图片描述
回容器里查看,果然也同步增加了此文件
在这里插入图片描述
5、指定主机目录方式挂载文件
格式:-v path1:path2
如下命令,容器方会自动增加一个data目录
在这里插入图片描述
宿主机方,同样自动增加一个/opt/data目录
在这里插入图片描述

3、volumes-from引用数据卷

新启一容器,引入上一步的data容器目录
在这里插入图片描述

自动得到同一个目录,内容与data容器里挂载一样
在这里插入图片描述
备份/恢复数据卷
备份:docker run --rm --volumes-from data -v $(pwd):/backup centos tar cvf /backup/data.tar /opt/data
恢复:docker run --rm --volumes-from data -v $(pwd):/backup centos tar xvf /backup/data.tar -C /

释义:
docker run --rm ----- 启动一个新的容器,执行完毕删除
–volumes-from data ------- data容器中挂载卷
-v $(pwd):/backup --------挂载当前目录到容器中为backup
cvf /backup/data.tar /opt/data --------- 备份/opt/data目录(即卷中所有的数据)为data.tar

xvf /backup/data.tar -C / ---------- 解压data.tar 到根目录/ ,因tar归档中已包含了/opt/data路径
删除数据卷:
docker rm -v data

三、Dockerfile使用

1、dockerfile方式创建容器

最简单的dockerfile
在这里插入图片描述
创建镜像
在这里插入图片描述
使用此镜像运行一个容器
在这里插入图片描述

2、dockerfile基本要素

在这里插入图片描述

dockerfile指令

2.1 FROM:
FROM {base镜像}
必须放在DOckerfile的第一行,表示从哪个baseimage开始构建
MAINTAINER:
可选的,用来标识image作者的地方
2.2 RUN
RUN都是启动一个容器、执行命令、然后提交存储层文件变更。
第一层 RUN command1 的执行仅仅是当前进程,一个内存上的变化而已,其结果不会造成任何文件。
而到第二层的时候,启动的是一个全新的容器,跟第一层的容器更完全没关系,自然不可能继承前一层构建过程中的内存变化。
而如果需要将两条命令或者多条命令联合起来执行需要加上&&。
如:cd /usr/local/src && wget xxxxxxx
2.3 CMD:
  CMD的作用是作为执行container时候的默认行为(容器默认的启动命令)
  当运行container的时候声明了command,则不再用image中的CMD默认所定义的命令
一个Dockerfile中只能有一个有效的CMD,当定义多个CMD的时候,只有最后一个才会起作用
2.4 EXPOSE
EXPOSE 指令是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务。在 Dockerfile 中写入这样的声明有两个好处,一个是帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射;另一个用处则是在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。
2.5 entrypoint:
entrypoint的作用是,把整个container变成可执行的文件,且不能够通过替换CMD的方法来改变创建container的方式。但是可以通过参数传递的方法影响到container内部
每个Dockerfile只能够包含一个entrypoint,多个entrypoint只有最后一个有效
当定义了entrypoint以后,CMD只能够作为参数进行传递
2.6 ADD & COPY:
  把host上的文件或者目录复制到image中(能够进行自动解压压缩包) 
2.7 ENV:
  用来设置环境变量,后续的RUN可以使用它所创建的环境变量
2.8 WORKDIR:
  用来指定当前工作目录(或者称为当前目录)
2.9 USER:
  运行RUN指令的用户
2.10 VOLUME:
  用来创建一个在image之外的mount point

3、nginx镜像制作实战

编译/安装nginx
mkdir一个目录,在此目录内下载nginx源码包
wget http://nginx.org/download/nginx-1.13.2.tar.gz

并创建一个Dockerfile文件,文件内制作一系列nginx的编译安装流程,内容如文件:
在这里插入图片描述
其中,每一个RUN就是增加一个镜像层文件,一层层的RUN命令最终形成一系列镜像层
运行build指令(注意最后的.代表当前路径),制作镜像
docker build -t cent-ngx2 .
在这里插入图片描述
我们查看一下这个镜像的层次历史
在这里插入图片描述
可看到,此镜像层基本与dockerfile文件的RUN是一一对应的

使用制作的nginx镜像,创建一个容器。
因此镜像无前台命令,因为必须指定启动命令 :/usr/local/nginx/sbin/nginx -g “daemon off;”
在这里插入图片描述
为镜像指定环境变量,挂载目录,默认启动命令
在上一版镜像的基础上,我们新加配置
在这里插入图片描述
执行:docker build -t cent-ngx3 .
在这里插入图片描述
查看镜像的历史,可看到比ngx2的镜像多了几个层
在这里插入图片描述
ngx3的镜像创建容器,已经不需要再指定cmd命令了
可执行命令自行校验:docker run -d --name ng2 cent-ngx3

四、nginx镜像制作实战

docker容器的主业
docker理念里,容器启动时,应当为它指定主业是什么,如nginx容器主业就是nginx代理服务,tomcat容器就是web服务等等
1、容器创建时,必须指定主业任务,如不指定,则容器无事可干立即退出。
2、在dockerfile打包镜像时,可以使用cmd命令来指定一个默认的主业,如下:
在这里插入图片描述
3、既然镜像里是默认主业,即意味着创建容器时,可以覆盖此默认命令,如下
在这里插入图片描述
推荐的ENTRYPOINT方式
1、镜像本身应该有稳定的主业,应当指定后即不能更改用途,于是引入ENTRYPOINT
2、使用ENTRYPOINT字义即容器入口,它不能被run中cmd覆盖,如下例:
在这里插入图片描述
执行:docker build -t nginxx:v3 .
在这里插入图片描述
以后使用nginxx:v3这个镜像时,只能做nginx服务来使用啦

五、打包镜像

可以自行百度,很少使用
2.1 手动打包
2.2 maven源码打包
2.3 maven插件打包

六、容器管理

3.1 Docker-Compose使用 (已经很少使用)
3.2 K8S(后面有专门文章详解)

七、Docker网络路由

docker的跨主机网络路由
假设我们现在有两台docker主机,各启动了自己的容器在运行
在这里插入图片描述
问题由来
1、在网桥模式下,同一个主机下的容器,使用同一个网桥docker0,它们组成一个局域网,如上图主机1的172.17.6.0网段下的三个容器
2、同一个主机下的容器,相互之间网络是通的
3、但不同主机下,是不同的局域网,它们之间网络不能互通。如:172.17.6.2的容器,想要访问172.17.8.2的容器

方案
a机192.168.244.7,容器网段172.17.6.1/16,a机起了容器ip是172.17.6.2
b机192.168.244.8,容器网段172.17.8.1/16,b机起了容器ip是172.17.8.2

两台机分别配置路由表
a机,route add -net 172.17.8.0 netmask 255.255.255.0 gw 192.168.244.8
b机,route add -net 172.17.6.0 netmask 255.255.255.0 gw 192.168.244.7
添加好后,路由表类似下图
在这里插入图片描述
然后a机ping b机容器,发现仍是ping不通,卡住ping不通,就是数据包被drop掉了
ip_forward配置
我们在b机上使用以下命令查看网络包转发情况,发现有掉包
iptables -t filter -nvL FORWARD
在这里插入图片描述
我们需要b机上配置,寻找172.17段ip的网络包不要丢掉,要转发
a机: iptables -I DOCKER --dst 172.17.0.0/16 -j ACCEPT
b机: iptables -I DOCKER --dst 172.17.0.0/16 -j ACCEPT
网络ok,整个网络包的流程,完整如下:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值