Docker系列9:Dockerfile指令详解(1)-创新互联

一、docker file的指令

创新互联公司专注为客户提供全方位的互联网综合服务,包含不限于做网站、成都网站建设、塔河网络推广、小程序开发、塔河网络营销、塔河企业策划、塔河品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们大的嘉奖;创新互联公司为所有大学生创业者提供塔河建站搭建服务,24小时服务热线:028-86922220,官方网址:www.cdcxhl.com

1、指令1:FROM指令

  • FROM必须是第一个非注释指令

  • 用于指定基础镜像,这个可以是任意的镜像

  • 在使用FROM指令的时候,docker daemon会自动先在本机上找所指定的镜像,如果没有就会去docker hub或者其他服务上找镜像 

FROM的语法格式

  • 格式1:FROM [:tag]

  • 格式2:FROM @

注意:

  • 第一种各式作镜像指的是基于基础镜像的名子来做新镜像,但是这种做可能是存在漏洞

  • 第二种格式是基于镜像的哈希码做镜像,这样所做的镜像就避免了这个问题

例子:基于busybox的最新版做镜像

FROM busybox:latest

2、指令2:MAINTANIER指令

  • 已经被废弃,用LABEL替换了

  • 用于说明制作者的名称

  • 可选选项

例子:

MAINTAINER  "zxhk "

3、指令3:LABEL指令

  • 这是新版docker中的指令

  • 这个命令是用来指定各种元数据,指定的方法就是用kye value格式,其实作者信息只是其中的一种 

语法格式

LABEL = = =..

4、指令4:COPY指令

  • 将宿主机中的工作目录中的文件复制到目标镜像的文件系统中

语法格式

  • 复制一个文件:COPY    

  • 复制多个文件:COPY [ ... ]

注意:

  • 源文件路径,一般是相对路径

  • 目标文件路径,一般是绝对路径

  • 支持使用通配符

文件复制的准则

  • 准则1:src必须是工作目录下的目录或者文件,不能是父目录中的

  • 准则2:如果dest不存在,会被动自动创建

  • 准则3:如果src是目录,那么在进行复制的时候,会将src下的全部内容都递归方式复制过去,但是src自身不会被复制过去

  • 准则4:如果如果指定了多个src或者在src中使用了通配符,那么dest必须是一个目录,并且比用以/为结尾

例子:将当前工作目录下的index.html复制到目标容器的文件系统中的/data/web/html下

COPY index /data/web/html

【有了这四个指令就可以做一个镜像了】

案例;演示创建docker file的过程

需求:

  • 在容器中创建一个index.html

  • 在容器中准备好yum到的配置文件

实现过程

第一步:创建工作目录

[root@host1 ~]# mkdir /img1 [root@host1 ~]# cd /img1/

第二步:创建html文件

[root@host1 img1]# echo "test page">>index.html [root@host1 img1]# ls index.html

第三步:准备yum的配置文件

[root@host1 img1]# cp -a /etc/yum.repos.d/ ./ [root@host1 img1]# ls index.html  yum.repos.d

第四步:编写docker file文件

  • 指定作者,可用MAINTAINER 也可以用 LABEL

  • 将index.html放在/data/下

  • 将yum.repos.d下的所有文件放在/etc/yum.repos.d下

[root@host1 img1]# vim Dockerfile #my first docker file FROM busybox:latest MAINTAINER "zxhk <237745635@qq.com>" COPY index.html /data/ COPY yum.repos.d /etc/yum.repos.d/
  • 源目录只需要指定目录名称,目录下的文件会被复制过去

  • 在目标位置不会生成源目录同名目录,必须手动指定,而且必须以/为结尾

第五步:制作镜像

[root@host1 img1]# docker build -t miniser:v1-1 ./ Sending build context to Docker daemon  20.99kB Step 1/4 : FROM busybox:latest  ---> b534869c81f0 Step 2/4 : MAINTAINER "zxhk <237745635@qq.com>"  ---> Running in 9f9f8d0793fa Removing intermediate container 9f9f8d0793fa  ---> c928cd55b12c Step 3/4 : COPY index.html /data/  ---> 5fe09215a0e2 Step 4/4 : COPY yum.repos.d /etc/yum.repos.d/  ---> 679710cab9bf Successfully built 679710cab9bf Successfully tagged miniser:v1-1
  • -t:是用来指定镜像的标签的

[root@host1 img1]# docker image ls | grep mini miniser                                         v1-1                679710cab9bf        2 minutes ago       1.23MB

第六步:基于镜像启动一个容器

[root@host1 img1]# docker run --name t123 \ > --rm miniser:v1-1 ls /etc/yum.repos.d CentOS-Base.repo CentOS-CR.repo CentOS-Debuginfo.repo CentOS-Media.repo CentOS-Sources.repo CentOS-Vault.repo CentOS-fasttrack.repo docker.repo
  • 这个容器就是执行一个ls命令,当ls执行完,这个容器也就停止了

  • 这个容器的执行结果是输出repo文件名列表

5、指令5:ADD指令

  • 与COPY类似,区别是ADD支持使用URL路径,也就是如果你的做镜像的这个主机可以联网,那么就可以将网络上的一个文件下载到本地并引入到你的文件中。

  • ADD的另一个作用就是如果源文件是一个本地文件,并且这个文件是tar压缩归档的文件,那么ADD可以自动将这个文件解压展开到你的工作目录.需要特别注意,如果源文件是一个网络文件,那么无法自动解压展开。

语法格式:

ADD   ADD ["" "" ... ""]

演示:下载nginx并放入到镜像的/var/usr/src下

第一步:去找nginx下载地址

Docker系列9:Docker file指令详解(1)

第二步:编辑docker file文件

#my first docker file FROM busybox:latest MAINTAINER "zxhk <237745635@qq.com>" COPY index.html /data/ COPY yum.repos.d /etc/yum.repos.d/ ADD http://nginx.org/download/nginx-1.17.6.tar.gz /var/usr/src/

第三步:构建镜像

[root@host1 img1]# docker build -t miniser:v1-2 ./[root@host1 img1]# docker image ls | grep mini miniser                                         v1-2                eaceb1156a52        2 minutes ago       2.27MB miniser                                         v1-1                679710cab9bf        23 minutes ago      1.23MB

注意:也可以先将nginx的安装包下载到本地,然后导入到镜像中

Dockerfile文件内容如下

ADD nginx-1.17.2.tar.gz /usr/local/src/
  • 此时是将nginx解压到/usr/local/src目录下

6、指令6:WORKDIR指令

  • 用于设定工作目录,比如上个例子中,将nginx放在了/usr/loca/src下,我们就可以将这个目录设置为工作目录,如下

#my first docker file FROM busybox:latest MAINTAINER "zxhk <237745635@qq.com>" COPY index.html /data/ COPY yum.repos.d /etc/yum.repos.d/ WORKDIR /var/usr/src/ ADD http://nginx.org/download/nginx-1.17.6.tar.gz ./

7、指令7:VOLUME指令

  • 用于在镜像中创建一个挂载点目录,用以挂载宿主机上的卷或者其他容器上的卷

  • 基于dockerfile创建的卷,是无法指定卷所在的宿主机的目录的,需要自动生成

语法格式

  • VOLUME

  • 如果docker所指定的卷下以前有文件,那么挂载卷之后,这些文件就会出现在容器中

案例:修改Dockerfile,将/data/mysql作为卷

第一步:修改Dockerfile文件

#my first docker file FROM busybox:latest MAINTAINER "zxhk <237745635@qq.com>" COPY index.html /data/ COPY yum.repos.d /etc/yum.repos.d/ WORKDIR /var/usr/src/ ADD http://nginx.org/download/nginx-1.17.6.tar.gz ./ VOLUME /data/mysql/

第二步:构建镜像

[root@host1 img1]# docker build -t miniser:v1-3 ./

第三步:启动容器,查看挂载情况

[root@host1 img1]# docker run --rm -it --name t100 miniser:v1-3 /var/usr/src #  /var/usr/src # mount | grep mysql /dev/mapper/centos-root on /data/mysql type xfs (rw,seclabel,relatime,attr2,inode64,noquota) /var/usr/src #
  • 也可执行docker inspect进行查看

8、指令8:EXPOSE指令

  • 为容器打开监听的端口以实现和外部主机进行通信

语法格式:

  • EXPOSE [/] [/] [/] ...

  • protocol是指定协议,可以是tcp,也可以是udp,默认tcp

例子:暴漏多个端口

  • 例子:EXPOSE 11211/udp 11211/tcp

注意:

  • 写在文件中的EXPOSE指令,仅仅是说端口是可以暴漏的,但并未真正暴露出来

  • 当需要端口暴漏出去的时候,需要在创建镜像的时候用选项 -P,这个选项会自动去读取EXPOSE的设置,来将必要的端口暴漏出来

案例:制作镜像,暴漏80端口

第一步:制作dockerfile

#my first docker file FROM busybox:latest MAINTAINER "zxhk <237745635@qq.com>" COPY index.html /data/ COPY yum.repos.d /etc/yum.repos.d/ WORKDIR /var/usr/src/ ADD nginx-1.17.6.tar.gz ./ VOLUME /data/mysql/ EXPOSE 80/tcp 53/udp

第二步制作镜像文件

[root@host1 img1]# docker build -t miniser:v1-4 ./

第二步:启动容器,在启动的时候,运行apache

[root@host1 img1]# docker run --name t100 -it --rm miniser:v1-4 httpd -f -h /data

检查一下地址

[root@host1 img1]# docker inspect t100 -f '{{.NetworkSettings.IPAddress}}' 172.17.0.3

直接访问容器的地址

[root@host1 img1]# curl 172.17.0.3 test page

可以查看,此时是否暴漏端口了

[root@host1 img1]# docker port t100 [root@host1 img1]#
  • 没有暴漏任何端口

接下来,重启运行一个容器,并且用-p选项

[root@host1 img1]# docker run --name t101 -p 80 -it --rm miniser:v1-4 httpd -f -h /data

再次检查暴漏的端口

[root@host1 ~]# docker port t101 80/tcp -> 0.0.0.0:32768
  • 其实此时还可以配合-p 选项来暴漏那些镜像中没有要指定暴漏的端口

9、指令9:ENV指令

  • 用于为镜像定义所需要的环境变量

  • ENV定义的环境变量可以被其后面的指令,比如COPY ADD等指令调用

  • ENV 可以嵌套ENV

  • 调用变量的格式 $var 或者 ${var}

  • 定义变量的格式:ENV 或者 ENV =

补充:

  • 定义多个变量,需要续航的时候,可以用\

  • 变量名中如果有空格,需要用引号引起来

案例:修改Dockerfile环境变量

#my first docker file FROM busybox:latest MAINTAINER "zxhk <237745635@qq.com>" ENV SOFT_NGX=nginx-1.17.6.tar.gz \     DOC_ROOT=/data/ \     WORK_DIR=/var/usr/src/ \     REPO_DIR=/etc/yum.repos.d/ \     MYSQL_DIR=/data/mysql/ COPY index.html ${DOC_ROOT:-/var/www/html/} COPY yum.repos.d $REPO_DIR WORKDIR $WORK_DIR ADD $SOFT_NGX ./ VOLUME $MYSQL_DIR EXPOSE 80/tcp 53/udp

制作镜像

[root@host1 img1]# docker build -t miniser:v1-5 ./[root@host1 img1]# docker run --name t103 --rm miniser:v1-5 printenv PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin HOSTNAME=a93864cdbbce SOFT_NGX=nginx-1.17.6.tar.gz DOC_ROOT=/data/ WORK_DIR=/var/usr/src/ REPO_DIR=/etc/yum.repos.d/ MYSQL_DIR=/data/mysql/ HOME=/root

我们要清楚,变量在从构建镜像,到启动容器的过程中,变量会传递两次,如下

Docker系列9:Docker file指令详解(1)

  • 在从镜像构建容器的时候,也是可以传递变量的,而这些变量是可以直接从Dockerfile中获得

  • 也可以在创建容器的时候,手动方式传入变量

案例:启动容器的时候传递变量

[root@host1 img1]# docker run --name t103 --rm \ > --env DOC_ROOT=/data/html/ \ > miniser:v1-5 printenv PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin HOSTNAME=d76460e0f8cd DOC_ROOT=/data/html/ SOFT_NGX=nginx-1.17.6.tar.gz WORK_DIR=/var/usr/src/ REPO_DIR=/etc/yum.repos.d/ MYSQL_DIR=/data/mysql/ HOME=/root

另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


网站题目:Docker系列9:Dockerfile指令详解(1)-创新互联
转载注明:http://scyanting.com/article/deghji.html