10、自动制作docker镜像

版权声明:原创作品,谢绝转载!否则将追究法律责任。 ————— 作者:kirin

手动镜像: 就像抓好的中药打成包给你

自动制作镜像:就像是我把药方给你,你自己按照药方来制作镜像

两种方法最终都可以得到一个一模一样的镜像

手动制作镜像与自动制作镜像的区别:

dockerfile: 就相当于那个配方

10.1.dockerfile常用指令

FROM  基础镜像
RUN   制作镜像过程中需要的执行命令(安装服务,不能出现夯住的命令就是交互式命令)
CMD   容器启动的时候执行的初始命令,容易被替换(启动服务)
ENTRYPOINT  容器启动的时候执行的初始命令,不能被替换,如果同时使用CMD和ENTRYPOINT,cmd命令将作为ENTRYPOINT命令的参数
------------------------------------------------------------------------------

ENTRYPOINT  容器启动的时候执行的吃屎命令,不能被替换,如果同时使用CMD和ENTRYPPOINT。CMD命令将作为ENTRYPOINT命令的参数
1.编辑配置文件
[root@docker01 ~/dockerfile/centos7_nginx_sshd]#  vim dockerfile 
[root@docker01 ~/dockerfile/centos7_nginx_sshd]#  cat dockerfile
FROM centos7_nginx_ssh:v2

RUN yum install openssh-server -y && \
 yum install initscripts -y && \
 /usr/sbin/sshd-keygen

ADD init.sh   /init.sh
EXPOSE 80 22

ENV SSH_PASS 123
#CMD /bin/bash /init.sh
#CMD ["/bin/bash","/init.sh"]
ENTRYPOINT  ["/bin/bash","/init.sh"]

[root@docker01 ~/dockerfile/centos7_nginx_sshd]# docker build --network=host -t centos7_nginx_ssh:v8 .
[root@docker01 ~/dockerfile/centos7_nginx_sshd]#  docker ps -a -l
可以看到容器的初始命令是echo 123
-------------------------------------------------------------------------------

ADD   把dockerfile当前目录下的文件拷贝到容器中(自动解压tar包)
COPY  把dockerfile当前目录下的文件拷贝到容器中(不解压tar包)
COPY指令演示:
[root@docker01 ~/dockerfile/xiaoniao]#  vim dockerfile 
[root@docker01 ~/dockerfile/xiaoniao]#  cat dockerfile
FROM centos:7
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
RUN curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
RUN yum install nginx -y
RUN rm -rf /usr/share/nginx/html/index.html

COPY  xiaoniao.tar.gz /usr/share/nginx/html

##CMD nginx -g 'daemon off'  ###官方推荐下面这种写法
CMD ["nginx","-g","daemon off;"]

[root@docker01 ~/dockerfile/xiaoniao]#  docker build -t xiaoniao:v2 .
[root@docker01 ~/dockerfile/xiaoniao]#  docker run -d xiaoniao:v2
[root@docker01 ~/dockerfile/xiaoniao]#  docker exec -it serene_bell /bin/bash
[root@ac0daebed253 /]#  cd /usr/share/nginx/html

WORKDIR 指定容器的默认工作目录(相当于永久的cd命令)
[root@docker01 ~/dockerfile/oldzhang_linux]#  vim dockerfile 
[root@docker01 ~/dockerfile/oldzhang_linux]#  cat dockerfile 
FROM scratch

ADD oldzhang.tar.gz /
 

WORKDIR /usr/share/nginx/htnl
CMD ["/bin/sh"]

[root@docker01 ~/dockerfile/oldzhang_linux]#  docker build -t oldzhang_linux:v2 .
[root@docker01 ~/dockerfile/oldzhang_linux]#  docker run -it oldzhang_linux:v2

EXPOSE  镜像要暴露的端口
[root@docker01 ~/dockerfile/xiaoniao]#  vim dockerfile 
[root@docker01 ~/dockerfile/xiaoniao]#  cat dockerfile 
FROM centos:7
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
RUN curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
RUN yum install nginx -y
RUN rm -rf /usr/share/nginx/html/index.html

COPY  xiaoniao.tar.gz /usr/share/nginx/html

WORKDIR /usr/share/nginx/html
EXPOSE 80 22
##CMD nginx -g 'daemon off'  ###官方推荐下面这种写法
CMD ["nginx","-g","daemon off;"]

[root@docker01 ~/dockerfile/xiaoniao]#  docker build -t xiaoniao_linux:v3 . 
[root@docker01 ~/dockerfile/xiaoniao]#  docker run -d -P xiaoniao_linux:v3 
[root@docker01 ~/dockerfile/xiaoniao]#  docker ps -l

VOLUME  随机的持久化卷
1.宿主机先看看都没有卷,有的话清理卷(前提是没有容器在使用)
[root@docker01 ~/dockerfile/xiaoniao]#  docker volume ls
[root@docker01 ~/dockerfile/xiaoniao]#  docker volume prune 

2. 编辑配置文件
[root@docker01 ~/dockerfile/xiaoniao]#  vim dockerfile 
[root@docker01 ~/dockerfile/xiaoniao]#  cat dockerfile 
FROM centos:7
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
RUN curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
RUN yum install nginx -y
RUN rm -rf /usr/share/nginx/html/index.html

ADD  xiaoniao.tar.gz /usr/share/nginx/html
WORKDIR /usr/share/nginx/html
EXPOSE 80 22

VOLUME /var/log/nginx
##CMD nginx -g 'daemon off'  ###官方推荐下面这种写法
CMD ["nginx","-g","daemon off;"]

3.启动容器并且查看
[root@docker01 ~/dockerfile/xiaoniao]#  docker run -d -p 80:80 xiaoniao_nginx:v5 

4.表面看不出任何变化,但是当执行docker volume ls的时候会发现多了一个卷
[root@docker01 ~/dockerfile/xiaoniao]#   docker volume ls

ENV     环境变量(ssh的密码,数据库的密码)
1.编辑dockerfile
[root@docker01 ~/dockerfile/centos7_nginx_sshd]#  vim dockerfile 
[root@docker01 ~/dockerfile/centos7_nginx_sshd]#  cat dockerfile
FROM centos7_nginx_ssh:v2

RUN yum install openssh-server -y && \
 yum install initscripts -y && \
 /usr/sbin/sshd-keygen

ADD init.sh   /init.sh
EXPOSE 80 22
#CMD /bin/bash /init.sh
CMD ["/bin/bash","/init.sh"]

2.编辑脚本文件
[root@docker01 ~/dockerfile/centos7_nginx_sshd]#  vim init.sh 
[root@docker01 ~/dockerfile/centos7_nginx_sshd]#  cat init.sh
#!/bin/bash

echo $SSH_PASS|passwd --stdin root
nginx
/usr/sbin/sshd -D

3.制作镜像
[root@docker01 ~/dockerfile/centos7_nginx_sshd]# docker build --network=host -t centos7_nginx_ssh:v6 .

4.启动容器并设置容器密码
[root@docker01 ~/dockerfile/centos7_nginx_sshd]# docker run -d -P --env "SSH_PASS=654321" centos7_nginx_ssh:v6

5.假设没有设置环境变量密码或者是忘了,怎么办呢?
#修改dockerfile,给用户设置一个初始密码
[root@docker01 ~/dockerfile/centos7_nginx_sshd]#  vim dockerfile 
[root@docker01 ~/dockerfile/centos7_nginx_sshd]#  cat dockerfile
FROM centos7_nginx_ssh:v2

RUN yum install openssh-server -y && \
 yum install initscripts -y && \
 /usr/sbin/sshd-keygen

ADD init.sh   /init.sh
EXPOSE 80 22

ENV SSH_PASS 123
#CMD /bin/bash /init.sh
CMD ["/bin/bash","/init.sh"]

#创建并启动容器
[root@docker01 ~/dockerfile/centos7_nginx_sshd]# docker build --network=host -t centos7_nginx_ssh:v7 .
[root@docker01 ~/dockerfile/centos7_nginx_sshd]# docker run -d -P centos7_nginx_ssh:v7

6.如果我们在docker run的时候又一次指定密码的话,docker run –env的优先级会比dockerfile高
[root@docker01 ~/dockerfile/centos7_nginx_sshd]# docker run -d -P --env "SSH_PASS=321" centos7_nginx_ssh:v7

LABEL       镜像的属性标签
MAINTAINER  管理者标识
根据dockerfile自动构建镜像的思路
a:   手动制作docker镜像,记录历史命令
b: 根据历史命令编写dockerfile文件
c: docker build构建docker镜像
d: 测试镜像的功能

10.2. dockerfile单服务例子1:

1.创建对应目录,编写配置文件
[root@docker01 ~]#  mkdir dockerfile
[root@docker01 ~]#  cd dockerfile
[root@docker01 ~/dockerfile]#  mkdir centos7_nginx/
[root@docker01 ~/dockerfile]#  mkdir centos7_nginx/
[root@docker01 ~/dockerfile]#  cd centos7_nginx/
[root@docker01 ~/dockerfile/centos7_nginx]#  vi dockerfile
[root@docker01 ~/dockerfile/centos7_nginx]#  cat dockerfile
FROM centos:7
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
RUN curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
RUN yum install nginx -y
RUN rm -rf /usr/share/nginx/html/index.html
RUN echo 'oldzhang' >/usr/share/nginx/html/index.html

##CMD nginx -g 'daemon off'  ###官方推荐下面这种写法
CMD ["nginx","-g","daemon off;"]

2.开始自动构建镜像
[root@docker01 ~/dockerfile/centos7_nginx]#  docker build -t centos7_nginx_ssh:v3 .

3.启动容器,测试容器
[root@docker01 ~]#  docker run -d -p 80:80 centos7_nginx_ssh:v3 
[root@docker01 ~]#  docker ps
[root@docker01 ~]#  curl 10.0.0.11

4.自动构建镜像小提示:
自动构建镜像过程中如果ctrl+c了,就会产生一些临时镜像

删除临时镜像的命令
[root@docker01 ~]#  docker image prune

10.3. dockerfile单服务例子2:

1.创建一个小鸟的目录,编写配置文件
[root@docker01 ~/dockerfile]#  cp -a centos7_nginx/ xiaoniao
[root@docker01 /opt/xiaoniao]#  cp /root/xiaoniaofeifei.zip .
[root@docker01 /opt/xiaoniao]#  unzip xiaoniaofeifei.zip 
[root@docker01 /opt/xiaoniao]#  rm -rf xiaoniaofeifei.zip 
[root@docker01 /opt/xiaoniao]#  tar zcf xiaoniao.tar.gz ./*
[root@docker01 /opt/xiaoniao]#  mv xiaoniao.tar.gz /root/dockerfile/xiaoniao/
[root@docker01 /opt/xiaoniao]#  cd /root/dockerfile/xiaoniao/
[root@docker01 ~/dockerfile/xiaoniao]#  ll

[root@docker01 ~/dockerfile/xiaoniao]#  vim dockerfile 
[root@docker01 ~/dockerfile/xiaoniao]#  cat dockerfile 
FROM centos:7
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
RUN curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
RUN yum install nginx -y
RUN rm -rf /usr/share/nginx/html/index.html

ADD xiaoniao.tar.gz /usr/share/nginx/html

##CMD nginx -g 'daemon off'  ###官方推荐下面这种写法
CMD ["nginx","-g","daemon off;"]

2.执行命令,创建自动构建镜像
[root@docker01 ~/dockerfile/xiaoniao]#  docker build -t xiaoniao:v1 .

![image-20220602222314082](1 容器的介绍.assets/image-20220602222314082.png)

3.启动容器并且测试
[root@docker01 ~/dockerfile/xiaoniao]#  docker run -d -p 81:80 xiaoniao:v1

10.4.dockerfile 基础系统镜像制作

1.下载清华源的tar包
[root@docker01 ~/download]# wget https://mirrors.tuna.tsinghua.edu.cn/lxc-images/images/alpine/3.13/amd64/default/20210612_13%3A00/rootfs.tar.xz

2.解压
[root@docker01 ~/download]#  tar xf rootfs.tar.xz 

3.删除源包,在打包移动到dockerfile目录下的oldzhanglinux目录下
[root@docker01 ~/download]#  rm -rf rootfs.tar.xz 
[root@docker01 ~/download]#  tar zcf /tmp/oldzhang.tar.gz *
[root@docker01 ~]#  cd dockerfile/
[root@docker01 ~/dockerfile]#  mkdir oldzhang_linux
[root@docker01 ~/dockerfile]#  cd oldzhang_linux
[root@docker01 ~/dockerfile/oldzhang_linux]#  mv /tmp/oldzhang.tar.gz .
[root@docker01 ~/dockerfile/oldzhang_linux]#  vim dockerfile
[root@docker01 ~/dockerfile/oldzhang_linux]#  cat dockerfile
FROM scratch

ADD oldzhang.tar.gz /

CMD ["/bin/sh"]

4.创建镜像
[root@docker01 ~/dockerfile/oldzhang_linux]# docker build -t oldzhang_linux:v1 .

5.启动镜像
[root@docker01 ~/dockerfile/oldzhang_linux]# docker run -it oldzhang_linux:v1

6.如何查看镜像的构建历史?
#比如,查看nginx镜像的
[root@docker01 ~]#  docker image history nginx:latest 

10.5.dockerfile多服务例子3:

1.创建对应目录,编写fockerfile
[root@docker01 ~/dockerfile]#  mkdir centos7_nginx_sshd
[root@docker01 ~/dockerfile]#  cd centos7_nginx_sshd
[root@docker01 ~/dockerfile/centos7_nginx_sshd]#  vim dockerfile
[root@docker01 ~/dockerfile/centos7_nginx_sshd]#  cat dockerfile 
FROM centos7_nginx_ssh:v2

RUN yum install openssh-server -y 
RUN yum install initscripts -y
RUN /usr/sbin/sshd-keygen
RUN /usr/sbin/sshd
RUN echo '123456'|passwd --stdin root

ADD init.sh   /init.sh
EXPOSE 80 22
#CMD /bin/bash /init.sh
CMD ["/bin/bash","/init.sh"]

2.编写脚本文件
[root@docker01 ~/dockerfile/centos7_nginx_sshd]#  vim init.sh
[root@docker01 ~/dockerfile/centos7_nginx_sshd]#  cat init.sh
#!/bin/bash

nginx
/usr/sbin/sshd -D

3.制作镜像,启动镜像(--network=host意思是容器使用宿主机网路,后面讲到网络的时候会说,这里先用一下)
[root@docker01 ~/dockerfile/centos7_nginx_sshd]# docker build --network=host -t centos7_nginx_ssh:v4 .

4.启动镜像
[root@docker01 ~/dockerfile/centos7_nginx_sshd]# docker run -d -P centos7_nginx_ssh:v4
[root@docker01 ~/dockerfile/centos7_nginx_sshd]#  docker ps -l
[root@docker01 ~/dockerfile/centos7_nginx_sshd]#  curl -I 10.0.0.11:49157
[root@docker01 ~/dockerfile/centos7_nginx_sshd]#  ssh root@10.0.0.11 -p 49158


5.RUN指令也可以写成一条,用&&符号接就可以
[root@docker01 ~/dockerfile/centos7_nginx_sshd]#  vim dockerfile 
[root@docker01 ~/dockerfile/centos7_nginx_sshd]# cat dockerfile
FROM centos7_nginx_ssh:v2

RUN yum install openssh-server -y && \
 yum install initscripts -y && \
 /usr/sbin/sshd-keygen && \
 /usr/sbin/sshd && \
 echo '123456'|passwd --stdin root

ADD init.sh   /init.sh
EXPOSE 80 22
#CMD /bin/bash /init.sh
CMD ["/bin/bash","/init.sh"]

6.制作镜像
[root@docker01 ~/dockerfile/centos7_nginx_sshd]#  docker build --network=host -t centos7_nginx_ssh:v5 .

类似于这种
[root@docker01 ~/dockerfile/centos7_nginx_sshd]#  /bin/sh -c 'echo 111;echo 222'
111
222
-------------------------------------------------------------------------------
FROM centos7_nginx:v1
RUN yum install php-fpm php-gd php-mbstring -y
ADD www.conf /etc/php-fpm.d/www.conf
ADD default.conf /etc/nginx/conf.d/default.conf 
RUN mkdir /html
WORKDIR /html.

RUN curl -o kodexplorer4.40.zip http://192.168.19.200/191127/kodexplorer4.40.zip
RUN yum install unzip -y
RUN unzip kodexplorer4.40.zip 
RUN chown -R nginx:nginx .
ADD init.sh   /init.sh

CMD ["/bin/bash","/init.sh"]

vi /init.sh
#!/bin/bash

service php-fpm start
nginx -g 'daemon off;'

dockerfile使用环境变量的例子4:

FROM centos:7
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
RUN curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
RUN yum install nginx openssh-server initscripts -y
RUN /usr/sbin/sshd-keygen
ADD init.sh  /init.sh
ENTRYPOINT ["/bin/bash","/init.sh"]

vi  init.sh
#!/bin/bash
if [ -z $SSH_PWD ];then
    SSH_PWD=$1
fi

echo $SSH_PWD|passwd --stdin root
nginx
/usr/sbin/sshd -D
posted @ 2022-06-03 10:41  kirin(麒麟)  阅读(380)  评论(0编辑  收藏  举报
Δ