1、docker file的指令
html
一、指令1:FROM指令node
FROM必须是第一个非注释指令mysql
用于指定基础镜像,这个能够是任意的镜像nginx
在使用FROM指令的时候,docker daemon会自动先在本机上找所指定的镜像,若是没有就会去docker hub或者其余服务上找镜像 web
FROM的语法格式
sql
格式1:FROM <repository>[:tag]docker
格式2:FROM <repository>@<digest>apache
注意:vim
第一种各式做镜像指的是基于基础镜像的名子来作新镜像,可是这种作多是存在漏洞centos
第二种格式是基于镜像的哈希码作镜像,这样所作的镜像就避免了这个问题
例子:基于busybox的最新版作镜像
FROM busybox:latest
二、指令2:MAINTANIER指令
已经被废弃,用LABEL替换了
用于说明制做者的名称
可选选项
例子:
MAINTAINER "zxhk <zxhk0816@qq.com>"
三、指令3:LABEL指令
这是新版docker中的指令
这个命令是用来指定各类元数据,指定的方法就是用kye value格式,其实做者信息只是其中的一种
语法格式
LABEL <KEY>=<VALUE> <KEY>=<VALUE> <KEY>=<VALUE>..
四、指令4:COPY指令
将宿主机中的工做目录中的文件复制到目标镜像的文件系统中
语法格式
复制一个文件:COPY <src> <dest>
复制多个文件:COPY [<src1> <src2> <src3> ... <dest>]
注意:
源文件路径,通常是相对路径
目标文件路径,通常是绝对路径
支持使用通配符
文件复制的准则
准则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:ADD指令
与COPY相似,区别是ADD支持使用URL路径,也就是若是你的作镜像的这个主机能够联网,那么就能够将网络上的一个文件下载到本地并引入到你的文件中。
ADD的另外一个做用就是若是源文件是一个本地文件,而且这个文件是tar压缩归档的文件,那么ADD能够自动将这个文件解压展开到你的工做目录.须要特别注意,若是源文件是一个网络文件,那么没法自动解压展开。
语法格式:
ADD <src> <dest> ADD ["<src>" "<src>" ... "<dest>"]
演示:下载nginx并放入到镜像的/var/usr/src下
第一步:去找nginx下载地址
第二步:编辑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: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:VOLUME指令
用于在镜像中建立一个挂载点目录,用以挂载宿主机上的卷或者其余容器上的卷
基于dockerfile建立的卷,是没法指定卷所在的宿主机的目录的,须要自动生成
语法格式
VOLUME <mountpoint>
若是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:EXPOSE指令
为容器打开监听的端口以实现和外部主机进行通讯
语法格式:
EXPOSE <port>[/<protocol>] <port>[/<protocol>] <port>[/<protocol>] ...
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:ENV指令
用于为镜像定义所须要的环境变量
ENV定义的环境变量能够被其后面的指令,好比COPY ADD等指令调用
ENV 能够嵌套ENV
调用变量的格式 $var 或者 ${var}
定义变量的格式:ENV <key> <value> 或者 ENV <key>=<value>
补充:
定义多个变量,须要续航的时候,能够用\
变量名中若是有空格,须要用引号引发来
案例:修改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
咱们要清楚,变量在从构建镜像,到启动容器的过程当中,变量会传递两次,以下
在从镜像构建容器的时候,也是能够传递变量的,而这些变量是能够直接从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