Docker镜像制作和管理

 docker 镜像生命周期

 

通过docker commit手动构建镜像

基于容器手动制作镜像步骤具体如下:

1.下载一个系统的官方基础镜像,如: CentOS 或 Ubuntu

2.基于基础镜像启动一个容器,并进入到容器

3.在容器里面做配置操作

    安装基础命令

    配置运行环境

   安装服务和配置服务

    放业务程序代码

4.提交为一个新镜像 docker commit

5.基于自己的的镜像创建容器并测试访问

 

格式一:
[root@ubuntu1804 ~]#docker commit -a "wei<root@weirui.com>" -c 'CMD  /bin/httpd -f -h /data/html' -c "EXPOSE 80" b1 httpd-busybox:v1.0

格式二:
[root@ubuntu1804 ~]#docker commit -a "wei<root@weirui.com>" -c 'CMD ["/bin/httpd", "-f", "-h", "/data/html"]' -c "EXPOSE 80" b1 httpd-busybox:v1.0

 

 

利用Dockerfile文件执行docker  build自行构建镜像

DockerFile是一种被Docker程序解释执行的脚本,由一条条命令组成,每条命令对应linux下面的一条命令,DOcker程序将这些Dockerfile指令再翻译成真正的linux命令,其有自己的书写方式和支持的命令,Docker程序读取Dockerfile并根据指令生成Docker镜像。相比手动制作镜像方式,Dockerfile更能直观的展示镜像是怎么产生的,有了Dockerfile,当后期有额外的需求时,只要在之前的Dockerfile添加或修改响应的命令即可重新生成新的Docker镜像,避免了重复手动制作镜像的麻烦,类似与shell脚本一样,可以方便高效的制作镜像

Docker守护程序Dockerfile逐一运行指令,如有必要,将每个指令的结果提交到新镜像,然后最终输出新镜像ID。Docker守护程序将自动清理发送的上下文

注:每条指令 都是独立运行的,并会导致创建新镜像。比如RUN , cd /tmp 对下一条指令不会有任何影响

Docker将尽可能重用中间映像(缓存),以显著加速docker build命令的执行过程,这由Using cache控制台输出中的消息指示

Dockerfile镜像制作和使用流程

Dockerfile文件的制作镜像的分层结构

Dockerfile文件说明:

  • 每一行以Dockerfile的指令开头,指令不区分大小写,但是惯例使用大写
  • 使用#开始作为注释
  • 每一行只支持一条指令,每条指令可以携带多个参数
  • 指令按文件的顺序从上至下进行执行
  • 每个指令的执行会生成一个新的镜像层,为了减少分层和镜像大小,尽可能将多条指令合并成一条指令
  • 制作镜像一般可能需要反复多次,每次执行dockerfile都按顺序执行,从头开始,已经执行过的指令已经缓存,不需要再执行,如果后续有一行新的指令没执行过,其往后的指令将会重新执行过,所以为加速镜像制作,将最常变化的内容放下dockerfile的文件后面

Dockerfile常见相关指令: ADD   COPY    ENV   EXPOSE    FROM    LABEL STOPSIGNAL    USER   VOLUME   WORKDIR

Dockerdfile 构建过程和指令总结

Dockerfile构建(docker   build)过程

  • 从基础镜像运行一个容器
  • 执行一条指令,对容器做出修改
  • 执行类似docker commit的操作,提交一个新的中间镜像层(可以利用中间层镜像创建容器进行调试和排错)
  • 再基于刚提交的镜像运行一个新容器
  • 执行Dockerfile中的下一条指令,直至所有指令执行完毕

查看镜像的构建历史: docker  history   镜像ID

 

Docker直接制作Nginx镜像的Dockerfile文件:

[root@ubuntu1804 ~]#mkdir /data/dockerfile/web/nginx/1.18.0
[root@ubuntu1804 ~]#cd /data/dockerfile/web/nginx/1.18.0
[root@ubuntu1804 1.18.0]#vim nginx.conf
user nginx;
worker_processes  1;
#daemon off;
[root@ubuntu1804 1.18.0]#wget http://nginx.org/download/nginx-1.18.0.tar.gz

[root@ubuntu1804 1.18.0]#pwd
/data/dockerfile/web/nginx/1.18.0
[root@ubuntu1804  1.18.0]# ls
Dockerfile nginx.conf  index.html  

[root@ubuntu1804 1.18.0]#cat Dockerfile
#Nginx Dockerfile
FROM centos:centos7.7.1908
MAINTAINER wei <root@weirui.vip>
RUN yum install -y  gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl
openssl-devel \
   && useradd -r -s /sbin/nologin nginx \
   && yum clean all 
ADD nginx-1.18.0.tar.gz /usr/local/src/ 
RUN cd /usr/local/src/nginx-1.18.0 \
   && ./configure --prefix=/apps/nginx \
   && make \
   && make install \
   && rm -rf /usr/local/src/nginx*
ADD nginx.conf /apps/nginx/conf/nginx.conf
COPY index.html /apps/nginx/html/
RUN ln -s /apps/nginx/sbin/nginx /usr/sbin/nginx 
EXPOSE 80 443
CMD ["/apps/nginx/sbin/nginx"]