10、指令10:RUN指令
案例:编写docker file,并制作镜像
#my first docker file
FROM busybox:latest
MAINTAINER "zxhk <237745635@qq.com>"
ENV 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 http://nginx.org/download/nginx-1.17.6.tar.gz ./
RUN cd ${WORK_DIR} && tar -xf nginx-1.17.6.tar.gz && mv nginx-1.17.6 nginx
VOLUME $MYSQL_DIR
EXPOSE 80/tcp 53/udp
[root@host1 img1]# docker build -t miniser:v1-8 ./
基于镜像启动一个容器,检测是否已经解压
[root@host1 img1]# docker run --rm --name t1 miniser:v1-8 ls /var/usr/src/
nginx
nginx-1.17.6.tar.gz
11、指令11:CMD指令
CMD指令有三种格式
格式1:CMD <命令>
格式2:CMD ["<命令>", "<参数1>","<参数2>"]
格式3:CMD ["<参数1>","<参数2>"]
案例1:使用格式1让容器运行的时候,自动运行apache
第一步:创建dockerfile
FROM busybox
LABEL maintainer="zxhk<237745635@qq.com>"
ENV DOC_ROOT="/var/www/html/"
RUN mkdir -p ${DOC_ROOT} && \
echo "<h2>test</h2>">${DOC_ROOT}index.html
CMD /bin/httpd -f -h ${DOC_ROOT}
第二步:制作镜像
[root@host1 img2]# docker build -t miniser:v2-1 ./
第三步:查看镜像的详细信息
[root@host1 img2]# docker inspect miniser:v2-1 -f '{{.ContainerConfig.Cmd}}'
[/bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin/httpd -f -h ${DOC_ROOT}"]]
第四步:创建容器
[root@host1 img2]# docker run --name t1 --rm -d miniser:v2-1
第五步:登录容器,查看容器信息
[root@host1 img2]# docker exec -it t1 /bin/sh
/ #
/ # netstat -an
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 :::80 :::* LISTEN
/ #
/ # ps
PID USER TIME COMMAND
1 root 0:00 /bin/httpd -f -h /var/www/html/
10 root 0:00 /bin/sh
15 root 0:00 ps
/ #
案例2:使用格式2让容器运行的时候,自动运行apache
FROM busybox
LABEL maintainer="zxhk<237745635@qq.com>"
ENV DOC_ROOT="/var/www/html/"
RUN mkdir -p ${DOC_ROOT} && \
echo "<h2>test</h2>">${DOC_ROOT}index.html
CMD ["/bin/sh", "-c", "/bin/httpd", "-f", "-h", "${DOC_ROOT}"]
11、指令11:ENTRYPOINT指令
ENTRYPOINT的功能就是和CMD类似的,用于指定容器启动后要默认运行的程序
在启动容器的时候,run后面指定的命令,可以覆盖镜像中的CMD命令
ENTRYPOINT所运行的命令不会不被docker run所指定的命令覆盖
案例:用ENTRYPOINT制作镜像实现启动容器自动运行apache
FROM busybox
LABEL maintainer="zxhk<237745635@qq.com>"
ENV DOC_ROOT="/var/www/html/"
RUN mkdir -p ${DOC_ROOT} && \
echo "<h2>test</h2>">${DOC_ROOT}index.html
ENTRYPOINT /bin/httpd -f -h ${DOC_ROOT}
制作镜像并启动容器测试
[root@host1 img2]# docker build -t miniser:v2-2 ./
[root@host1 img2]# docker run --name t2 --rm -it miniser:v2-2 ls /data
ENTRYPOINT和CMD组合使用的情况
FROM busybox
LABEL maintainer="zxhk<237745635@qq.com>"
ENV DOC_ROOT="/var/www/html/"
RUN mkdir -p ${DOC_ROOT} && \
echo "<h2>test</h2>">${DOC_ROOT}index.html
CMD ["/bin/httpd", "-f", "-h", "${DOC_ROOT}"]
ENTRYPOINT ["/bin/sh","-c"]
案例:在启动容器的时候,动态生成配置文件
1、创建工作目录
[root@host1 img3]# mkdir /img3
[root@host1 img3]# cd /img3
2、准备一个shell脚本,用于生成配置文件
[root@host1 img3]# vim entrypoint.sh
#!/bin/sh
cat>/etc/nginx/conf.d/www.conf<<EOF
server {
server_name $HOSTNAME;
listen ${IP:-0.0.0.0}:${PORT:-80};
root ${NGX_DOC_ROOT:-/usr/share/nginx/html};
}
EOF
exec "$@"
3、创建测试页面
[root@host1 img3]# echo "test page">index.html
4、编写Dockerfile文件
[root@host1 img3]# vim Dockerfile
FROM nginx:1.14-alpine
LABEL author="zxhk<237745635@qq.com>"
ENV NGX_DOC_ROOT='/data/web/html/'
ADD index.html ${NGX_DOC_ROOT}
ADD entrypoint.sh /bin/
#nginx的配置文件必须以;为结尾
CMD ["/usr/sbin/nginx","-g","daemon off;"]
ENTRYPOINT ["/bin/entrypoint.sh"]
在执行dockerfile的时候,CMD的内容会传递到ENTRYPOINT中
ENTRYPOIN会启动运行这个shell脚本,shell脚本就是pid为1的进程,shell脚本就会生成配置文件
在脚本的最后会通过exec 来执行nginx,让nginx工作在前台,同时nginx进程顶替shell成为pid为1的进程
5、构建镜像
[root@host1 img3]# docker build -t miniser:v2-4 ./
6、启动容器
[root@host1 img3]# docker run --name nginx1 --rm miniser:v2-4
登录容器看看
[root@host1 ~]# docker exec -it nginx1 /bin/sh
/ #
/ # cat /etc/nginx/conf.d/www.conf
server {
server_name c1d255997da4;
listen 0.0.0.0:80;
root /data/web/html/;
}
/ #
7、再重新启动一个容器,让nginx监听127.0.0.1的8080端口
[root@host1 img3]# docker run --name nginx1 --rm \
> -e "PORT=8080" -e "IP=1.2.3.4" miniser:v2-4
再登录容器看看
[root@host1 ~]# docker exec -it nginx1 /bin/sh
/ #
/ #
/ # cat /etc/nginx/conf.d/www.conf
server {
server_name 92c978c97b3c;
listen 127.0.0.1:8080;
root /data/web/html/;
}
/ #
12、指令12:USER指令
语法格式:
13、指令13:HEALTHCHECK指令
HEALTHCHECK的功能选项
--interval=xx 指定每隔多久检查一次(默认每隔30s检查一次)
--timeout=xx 指定等待超时时间(默认也是30s)
--start-period=xx 启动容器后,等待多久开始做健康检查(默认是0秒,也就是不等)
--retries=xx 指定请求几次数据都没获得返回的情况下才认为是出现了异常(默认是3次)
HEALTHCHECK的返回值
0:success成功
1:unhealth不健康
2:预留,没有意义
案例:每隔5分钟检查一次,超时时间是3秒
14、指令14:SHELL指令
举例:
SHELL ["/bin/sh","-c"]
15、指令15:STOPSIGNAL指令
格式
STOPSIGNAL 9
16、指令16:ARG指令
编写镜像文件
FROM nginx:1.14-alpine
ARG info="zxhk<237745635@qq.com>"
LABEL author="${info}"
ENV NGX_DOC_ROOT='/data/web/html/'
ADD index.html ${NGX_DOC_ROOT}
ADD entrypoint.sh /bin/
#nginx的配置文件必须以;为结尾
CMD ["/usr/sbin/nginx","-g","daemon off;"]
ENTRYPOINT ["/bin/entrypoint.sh"]
制作镜像
[root@host1 img3]# docker build -t miniser:v2-5 --build-arg new="tom@qq.com" ./
注意区分ENV和ARG
17、指令17:ONBUILD指令
案例:如果别人基于这个镜像做新镜像,就让其下载一个文件
第一步:制作一个基础镜像
[root@host1 img3]# vim Dockerfile
FROM nginx:1.14-alpine
LABEL author="zxhk<237745635@qq.com>"
ENV NGX_DOC_ROOT='/data/web/html/'
ADD index.html ${NGX_DOC_ROOT}
ADD entrypoint.sh /bin/
ONBUILD ADD http://x.x.x.x/xxx /data/web/html/
#nginx的配置文件必须以;为结尾
CMD ["/usr/sbin/nginx","-g","daemon off;"]
ENTRYPOINT ["/bin/entrypoint.sh"]
制作镜像
[root@host1 img3]# docker build -t base:v1.1 ./
第二步:基于基础镜像做新镜像
[root@host1 ~]# mkdir /img4
[root@host1 img4]# cd /img4
[root@host1 img4]# vim Dockerfile
FROM base:v1-1
RUN mkdir /data
制作镜像
[root@host1 img4]# docker build -t newimg:v1-1 ./