3, Docker study, theoretical knowledge, on the third day --DockerFile

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.
This link: https://blog.csdn.net/LeeDemoOne/article/details/102746050

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

Guess you like

Origin blog.csdn.net/LeeDemoOne/article/details/102746050