Disclaimer: This article is a blogger original article, follow the CC 4.0 BY-SA copyright agreement, reproduced, please attach the original source link and this statement.
Docker learning
A, DockerFile resolve
1. What is DockerFile
DockerFile Docker image is used to construct the build file, the script is a series of commands and configuration parameters.
构建三步骤:
1、手动编写一个DockerFile文件
2、docker build,获得一个自定义的镜像
3、docker run
2, DockerFile build process parse
基础知识:
2.1》、每条保留字指令都必须为大写字母,且后面要跟随至少一个参数
2.2》、知名按照从上到下,顺序执行
2.3》、#表示注释
2.4》、每条指令都会创建一个新的镜像层,并对镜像进行提交
大致执行流程:
2.1》、docker从基础镜像运行一个容器(一定会有一个基础镜像)
2.2》、执行一条指令并对容器做出修改
2.3》、执行类似docker commit的操作提交一个新的镜像层
2.4》、docker再基于刚提交的镜像运行一个新容器
2.5》、执行dockerfile中的下一条指令到所有制令都执行完成
①, dockerfile is software that raw materialsbuild> ②, docker is mirroring software deliverables ==run=> ③, docker container is a software operating state
3, DockerFile reserved word instruction
3.1》、FROM 基础镜像,当前新的镜像是基于那个镜像的
FROM scratch
3.2》、MAINTAINER 镜像维护者的姓名和邮箱地址
MAINTAINER The CentOs Project <[email protected]>
3.3》、RUN 容器构建的时候需要运行的命令
RUN groupadd -r redis && useradd -r -g redis redis
3.4》、EXPOSE 当前容器对外暴露出的端口
EXPOSE 6379
3.5》、WORKDIR 制定在创建容器后,终端默认登录进来的工作目录,一个落脚点
WORKDIR /data
3.6》、ENV 用来在构建镜像的过程中设置环境变量
ENV MY_PATH /usr/mytest
(这个环境变量可以在后续的任何RUN指令中使用,这就如同在命令前制定了环境变量前缀一样,也可以在其他指令中直接使用这些环境变量,如 WORKDIR $MY_PATH)
3.7》、ADD 将宿主机目录下的文件拷贝进镜像且ADD命令自动处理URL和解压tar压缩包
ADD centos-7-docker.tar.xz
(COPY直接拷贝,ADD拷贝+解压缩)
3.8》、COPY 类似ADD,拷贝文件和目录到镜像中
COPY src desc 或 COPY["src","desc"]
3.9》、VOLUME 容器数据卷,用于数据保存和持久化[HOST和容器目录文件映射]
VOLUME myFile:myFileContainer
3.10》、CMD 指定一个容器启动时要运行的命令
(DockerFile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换)
shell格式: CMD <命令>
exec格式: CMD ["可执行文件","参数1","参数2"]
(即 docker run -it centos /bin/bash 会覆盖dockerfile文件中的CMD 命令)
3.11》、ENTRYPOINT 指定一个容器启动时要运行的命令
(EBTRYPOINT的目的和CMD一样,都是在指定容器启动程序及参数)
(和CMD不同的是,CMD会被覆盖,ENTRYPOINT会被追加)
3.12》、ONBUILD 当构建一个被继承的DockerFile时运行命令,父镜像在被子继承后,父镜像的onbuild被触发
ONBUILD RUN echo "hello...world"
(类似于触发器,只要有子镜像继承了‘我’,就会处罚这条命令)
3.13》、LABEL 标签
[Image dump the chain fails, the source station may have security chain mechanism, it is recommended to save the picture down uploaded directly (img-xr0oBw6V-1571993430005) (C: \ Users \ Administrator \ Desktop \ dockerfile.png)]
4, DockerFile custom images myCentOS
Base image scratch, DockerHub 99% of the image are built up by installing and configuring software required in the mirror base
需求:修改centos登录后的默认路径、支持vim编辑器、支持ip addr查看网络配置
代码:
4.1、创建mycentos DockerFile文件
FROM centos ##本地centos镜像
MAINTAINER mycentosmlee<[email protected]> ##作者介绍
ENV MYPATH /usr/local ##设置变量
WORKDIR $MYPATH ##默认登录后进入tmp路径
RUN yum -y install vim ##安装vim
RUN yum -y install net-tools ##安装网络适配器
EXPOSE 80 ##对外暴露端口80
CMD echo $MYPATH ##输出 mypath
CMD echo "success.....ok" ##输出 success。。。ok
CMD /bin/bash ##运行/bin/bash
4.2、构建 docker build -f dockerfile文件路径 -t 新镜像的名字:TAG .
(TAG版本号.当前目录)
4.3、docker images 查看新创建的镜像
4.4、docker run -it mycentos:1.3
(检测目录 ip addr vim)
4.5、docker history 镜像ID 列出镜像的变更历史
5, DockerFile the CMD command and ENTERPOINT Case
When a container is specified command starts to run
回忆:
3.10》、CMD 指定一个容器启动时要运行的命令
(DockerFile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换)
shell格式: CMD <命令>
exec格式: CMD ["可执行文件","参数1","参数2"]
(即 docker run -it centos /bin/bash 会覆盖dockerfile文件中的CMD 命令)
3.11》、ENTRYPOINT 指定一个容器启动时要运行的命令
(EBTRYPOINT的目的和CMD一样,都是在指定容器启动程序及参数)
(和CMD不同的是,CMD会被覆盖,ENTRYPOINT会被追加)
Case:
CMD
在hub.docker.com中tomcat dockerfile文件的最后有一句话:
CMD ["catalina.sh", "run"] ##启动tomcat
我们测试 docker run -it tomcat ls -l 会发现列出了/usr/local/tomcat的目录列表
docker ps 发现tomcat没有运行,证明CMD ["catalina.sh", "run"]没有被执行,而是执行了ls -l
ENTERPOINT
先测试下这个:
curl http://ip.cn 会将该网址的页面信息输出
curl -s http://ip.cn
curl -s -i http://ip.cn
1)、创建myCurlDockerFile文件,内容:
FROM centos
RUN yum -y install curl
CMD ["curl","-s","http://ip.cn"]
2)、build文件生成镜像
docker build -f myCurlDockerFile -t myip .
3)、run镜像
docker run -it myip
4)、测试 curl -s -i http://ip.cn
5)、测试 增加一个 -i 的参数
docker run -it myip -i
类似 在CMD ["curl","-s","http://ip.cn"]后增加了一行CMD -i
6)、将CMD 变成ENTERPOINT
FROM centos
RUN yum -y install curl
ENTERPOINT ["curl","-s","http://ip.cn"]
7)、build文件生成镜像
docker build -f myCurlDockerFile2 -t myip2 .
8)、run镜像
docker run -it myip2
9)、run镜像
docker run -it myip2 -i
类似在ENTERPOINT ["curl","-s","http://ip.cn"]中增加了参数
ENTERPOINT ["curl","-s","-i","http://ip.cn"]
6, DockerFile case of ONBUILD command
3.12》、ONBUILD 当构建一个被继承的DockerFile时运行命令,父镜像在被子继承后,父镜像的ONBUILD被触发
Case:
1、创建myonbuild文件
FROM centos
RUN yum -y install curl
ENTERPOINT ["curl","-s","http://ip.cn"]
ONBILD RUN echo "hello...world"
2、build生成镜像并run
docker build -f myonbuild -t myip_father .
docker images
docker run myip_father
3、创建myonbuild2文件
FROM myip_father
RUN yum -y install curl
CMD ["curl","-s","http://ip.cn"]
4、build生成镜像并run
docker build -f myonbuild -t myip_son .
docker images
docker run myip_son