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
本文来自博客园,作者:kirin(麒麟),转载请注明原文链接:https://www.cnblogs.com/kirin365/articles/16137787.html