一、docker file的指令
1、指令1:FROM指令
FROM的语法格式
注意:
例子:基于busybox的最新版做镜像
FROM busybox:latest
2、指令2:MAINTANIER指令
已经被废弃,用LABEL替换了
用于说明制作者的名称
可选选项
例子:
MAINTAINER "zxhk <zxhk0816@qq.com>"
3、指令3:LABEL指令
语法格式
LABEL <KEY>=<VALUE> <KEY>=<VALUE> <KEY>=<VALUE>..
4、指令4: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文件
[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
[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
5、指令5: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/
6、指令6:WORKDIR指令
#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,将/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 #
8、指令8: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
9、指令9: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
我们要清楚,变量在从构建镜像,到启动容器的过程中,变量会传递两次,如下
案例:启动容器的时候传递变量
[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