文章结构:
(一)Docker常用知识点
(二)Dockerfile指令详解
文章最后附一份docker教学视频,本篇的Dockerfile指令详解是看该教学视频做的笔记
(一)Docker常用知识点
【1.1】进入一个正在运行的Docker容器命令:
~]# docker ps
~]# docker exec -it 775c7c9ee1e1 /bin/bash
【1.2】Docker 退出容器但不关闭当前容器:
按Ctrl+P+Q进行退出容器
【1.3】docker状态转换和事件:
【1.4】常用操作:
【1.5】四种Docker容器网络
【1.6】在容器中使用Volumes
Volume(卷)为docker提供了独立于容器的数据管理机制
可以把“镜像”想象成静态文件,例如“程序”,把卷类比为动态内容,例如“数据”;于是,镜像可以重用,而卷可以共享;
卷实现了 “程序(镜像)” 和 “数据(卷)” 分离,以及 “程序(镜像)” 和 “制作镜像的主机” 分离。用户在制作镜像时无须再考虑镜像运行的容器所在的主机的环境
一共有两种volume可以用,都能实现数据持久化,使用方式都一样,宿主机内修改容器内也改了,容器内修改宿主机内也改了。两种方式不同在于宿主机上存放位置是随机还是指定。
docker inspect 查看时在Mounts对象里可以看到type不一样
(1)Docker-managed volume,这种volume在宿主机上存在放的路径是随机的
~]# docker run -it -name bbox1 -v /data busybox
~]# docker inspect -f {{.Mounts}} bbox1
查看bbox1容器的卷、卷标识符及挂载的主机目录
(2)Bind-mount Volume,这种volume可以指定具体在宿主机上存放的位置
~]# docker run -it -v HOSTDIR:VOLUMEDIR --name bbox2 busybox
~]# docker inspect -f {{.Mounts}} bbox2
(二)Dockerfile指令详解:
【2.1】Dockerfile语法格式
注意:
1.Dockerfile中json数组中引号都为双引号,不能写单引号
2.通常一行一个指令
3..找一个专用工作目录放Dockerfile,Dockerfile首字母要大写
4.如果需要打包很多文件进镜像,必须要把文件放到当前Dockerfile所在的工作目录下。即Dockerfile中引用文件的路径不能是其父路径,可以是子路径
5.Dockerfile还支持专用的工作目录下做一个隐藏文件,叫.dockeringore,这也是个文本文件。在这个文件中可以写文件路径,可以使用通配符。所有在打包时的文件只要在.dockeringore中写的路径,打包时都不包含进去。
【2.2】Dockerfile中FROM指令
【2.3】Dockerfile中LABEL指令
LABEL为镜像制定各种元数据
【2.4】Dockerfile中COPY指令
举个栗子:
COPY index.html /data/web/html/
COPY yum.repos.d /etc/
【2.5】Dockerfile中ADD指令
举个栗子:
ADD nginx-1.15.2.tar.gz ./src/
注意:上面的./src是相对路径,相对于WORKDIR设置的工作路径
【2.6】Dockerfile中WORKDIR指令
用来设置容器的当前工作路径,设置完之后的COPY和ADD指令中
【2.7】Dockerfile中EXPOSE指令
举个栗子:
EXPOSE 80/tcp
【2.8】Dockerfile中ENV指令
举个栗子:
ENV DOC_ROOT /data/web/html/
COPY index.html $DOC_ROOT
#给DOC_ROOT加个默认值:
COPY index.html ${doc_root:-/data/web/html/}
#一次设置多个变量:
ENV DOC_ROOT=/data/web/html/ \
WEB_SERVER_PACKAGE="NGINX-1.15.2"0
【2.9】Dockerfile中VOLUME指令
举个栗子:
VOLUME /data/mysql/
【2.10】Dockerfile中RUN指令
RUN指令是在由基础镜像生成目标镜像docker build过程中执行的。RUN指令可以在Dockerfile中写多个,多个RUN指令都起作用,逐一运行。如果多个Command之间有关联关系建议用一条RUN写下来,因为Dockerfile中一条指令就会生成一个镜像层。
格式:
RUN COMMAND1 && \
COMMAND2
举个栗子:
RUN cd /usr/local/src && \
tar xf ${WEB_SERVER_PACKAGE}
【2.11】Dockerfile中的CMD指令
CMD是定义一个镜像文件启动容器时默认要运行的程序块。Docker程序默认只运行一个程序。Dockerfile中只能有一个CMD指令有效。如果写了多个只有最后一个CMD起作用。
【2.12】Dockerfile中ENTRYPOINT指令
【2.13】Dockerfile案例
Dockerfile案例需求介绍:
运行nginx时,nginx通过接收变量来生成配置文件。接收的变量能在启动容器时进行传递。
案例中三个文件entrypoint.sh,Dockerfile,index.html在同一个目录下
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 "$@"
上面的exec用来替换当前进程,“$@”含义是脚本的所有参数,即传什么就运行什么
Dockerfile文件:
FROM nginx:1.14-alpine
LABEL maintainer="Andy
" ENV NGX_DOC_ROOT="/data/web/html/"
ADD index.html ${NGX_DOC_ROOT}
ADD entrypoint.sh /bin/
CMD ["/usr/sbin/nginx","-g","daemon off;"]
ENTRYPOINT ["/bin/entrypoint.sh"]
index.html文件:
New Doc Root for Nginx
docker build:
[root@node01 img3]# docker build -t myweb:v0.3-6 ./
docker run:
[root@node01 ~]# docker run --name myweb1 --rm -P myweb:v0.3-6
启动时设置端口号,监听到8080上
[root@node01 ~]# docker run --name myweb1 --rm -P -e "PORT=8080" myweb:v0.3-6
进入容器验证:
[root@node01 ~]# docker exec -it myweb1 /bin/sh
/ # cat /etc/nginx/conf.d/www.conf
/ # netstat -tnl
/ # wget -o - -q 主机名(在www.conf中查看到的server_name)
杀掉一个运行中的容器:
[root@node01 ~]# docker kill myweb1
【2.14】Dockerfile中USER指令
【2.15】Docker中HEALTHCHECK指令
主进程健康检测不能通过看进程在不在来确定,而是应该通过看是否能提供服务来确定。通过HEALTHCHECK来检测是否能提供服务。
option释义:
--interval含义是每隔多久检测一次主进程
--timeout含义是超时时长,即多久没响应算为主进程不健康
--start-period含义是容器启动后等多久开始进行健康检测
--retries含义是检测多少次失败后认定为不健康
三个返回值中reserved表示预留的,可以自己定义
【2.16】Dockerfile中ARG指令
在Dockerfile中定义的ARG指令可以在docker build 命令中通过--build-arg <变量名>=<变量值>的方式传递自定义参数。
注意:在docker run时可以向环境变量传值,docker build时不能向环境变量传值,只能用默认值。如果想在docker build时也能给变量定义值,那就得使用ARG。
举个栗子:
在Dockerfile中:
ARG author="pony
" LABEL maintainer="${author}"
在docker build命令中:
docker build --build-arg author="andy
" -t myweb:v0.3-10 ./
【2.17】Dockerfile中ONBUILD指令
ONBUILD指令后面跟的是正常的Dockerfile中的指令如RUN、ADD等等。
自己做的镜像可以被别人作为基础镜像使用,如果自己做的镜像Dockerfile中写了ONBUILD指令,这个指令后面的Dockerfile指令在自己做image时不会执行。而当别人把你的镜像当做基础镜像,并写在Dockerfile,在他的build时才会执行。
结束语:到此为止就可以愉快的做镜像了,如果还是不熟练,可以到 docker hub 上看看别人怎么写的,读别人写的Dockerfile可以了解怎么用他的镜像更合适。多读几个应该就会写了。
点击获取马哥的docker教学视频