linux怎么查看本机内存大小
220
2022-10-27
docker快速入门6-dockerfile和registry
docker快速入门6-dockerfile和registry
dockerfile是构造Docker images的一行行命令的集合,是一个纯文本文件。
语法格式
# 注释信息
INSTRUCTION 指令,指令不区分大小写,但约定使用大写
非注释行的第一行必须是FROM指令
工作目录
使用Dockerfile制作镜像时需要一个干净的工作目录,该目录结构如下:
Dockerfile文件 可选的 .dockerignore,用于存放要打包进镜像的文件目录中需要排除的文件 文件1,文件2,... 目录1,目录2,...
要打包进镜像的文件或目录都存放在与Dockerfile文件同级。
Dockerfile指令
更多的dockerfile指令相关信息请参考:https://docs.docker.com/engine/reference/builder
FROM
Dockerfile文件开篇的第一个非注释行,用于为镜像文件构建过程指定基准镜像,后续的指令运行于此基准镜像所提供的运行环境。
语法
FROM
LABLE
为Dockerfile提供key,value对的源数据信息,是MAINTAINER的替代指令
LABEL
COPY
从Docker主机复制文件至创建的新镜像文件中
有两种方式
COPY [--chown=
ADD
类似COPY指令,ADD支持使用tar文件和url路径
两种语法格式
ADD [--chown=
WORKDIR
用于为Dockerfile中所有的RUN、CMD、ENTRYPOINT、COPY和ADD指定设定的工作目录。
语法 WORKDIR /path/to/workdir 在Dockerfile文件中,WORKDIR指令可以出现多次,其路径也可以为相对路径,不过,其是相对此前一个WORKDIR指令指定的路径。另外,WORKDIR也可调用由ENV指令指定的变量。 如: ENV DIRPATH /path WORKDIR $DIRPATH/
VOLUME
用于在image中创建一个挂载点目录,以挂载Docker host上的卷或其它容器上的卷,该卷属于Docker managed volume类型的卷,即宿主机上要挂载的目录由dockerd管理。
语法 VOLUME ["/data"] 如果挂载点目录路径下此前有文件存在,docker run命令会在卷挂载完成后将此前的所有文件复制到新挂载的卷中。
EXPOSE
用于为容器打开指定要监听的端口以实现与外部通信
语法
EXPOSE
ENV
用于为镜像定义所需要的环境变量,并可被Dockerfile文件中位于其后的其它指令(如ENV、ADD、COPY等)所调用。
语法
ENV
RUN
用于指定docker build过程中运行的程序,其可以是任何命令
语法
RUN
CMD
类似RUN指令,CMD指令也可用于运行任何命令或程序,不过二者的运行时间点不同。
RUN指令运行于镜像文件构建过程中,而CMD指令运行于基于Dockerfile构建出的新镜像文件启动一个容器时;CMD指令的首要目的在于为启动的容器指定默认要运行的程序,且其运行结束后,容器也将终止;不过,CMD指定的命令可以被“docker run”的命令行选项所覆盖;
在Dockerfile中可以存在多个CMD指令,但仅最后一个会生效。
语法 CMD ["executable","param1","param2"] (exec的形式, 首选使用这种) CMD ["param1","param2"] (为ENTRYPOINT指代默认参数) CMD command param1 param2 (同RUN一样)
ENTRYPOINT
类似CMD指令的功能,用于为容器指定默认运行程序,从而使得容器像是一个单独的可执行程序。与CMD不同的是,由ENTRYPOINT启动的程序不会被docker run命令行指定的参数所覆盖,而且,这些命令行参数会被当作参数传递给ENTRYPOINT指定的程序。不过,docker run命令的--entrypoint选项的参数可以覆盖ENTRYPOINT指令指定的程序。
语法 ENTRYPOINT ["executable", "param1", "param2"] ENTRYPOINT command param1 param2 docker run命令传入的命令参数会覆盖CMD指令的内容,并且附加到ENTRYPOINT命令最后做为其参数使用,如果docker run命令行未传入命令参数,那ENTRYPOINT会以CMD指令中的内容作为其默认参数 Dockerfile文件中也可以存在多个ENTRYPOINT指令,但仅有最后一个会生效
USER
用于指定运行image时的或运行Dockerfile中任何RUN、CMD或ENTRYPOINT指令指定的程序时的用户名或UID
默认情况下,container的运行身份为root用户
语法
USER
HEALTHCHECK
用于Docker如何测试容器是否仍在正常工作。
语法 HEALTHCHECK [OPTIONS] CMD command (通过在容器内部运行命令来检查容器的运行状况) HEALTHCHECK NONE (禁用从基本映像继承的任何运行状况检查) [OPTIONS]: --interval=DURATION(默认值:30s) 表示检查间隔时间 --timeout=DURATION(默认值:30s) 表示检查超时时间 --start-period=DURATION(默认值:0s) 表示container运行后等待主进程起动程序,开始健康检查前的等待时长 --retries=N(默认值:3) 当检查失败时,需要连续检查多少次才判定该服务处于不健康状态 检查命令的退出状态,可能的值为: 0:成功-容器健康且可以使用 1:不健康-容器无法正常工作 2:保留-请勿使用此退出代码 事例 HEALTHCHECK --interval=5m --timeout=3s \ CMD curl -f || exit 1
SHELL
用于覆盖RUN,CMD,ENTRYPOINT等指令运行的默认shell。
语法 SHELL ["executable", "parameters"] linux默认使用["/bin/sh", "-c"],windows默认使用["cmd", "/S", "/C"]
STOPSIGNAL
向容器发送退出的信号
语法 STOPSIGNAL signal signal为系统合法的无符号的信号数字,如9
ARG
用于给docker build时传递变量
语法
ARG
ONBUILD
用于在Dockerfile中定义一个触发器
Dockerfile用于build映像文件,此映像文件亦可作为base image被另一个Dockerfile用作FROM指令的参数,并以之构建新的映像文件,在后面的这个Dockerfile中的FROM指令在build过程中被执行时,将会“触发”创建其base image的Dockerfile文件中的ONBUILD指令定义的触发器。
语法
ONBUILD
Dockerfile事例
root@node01:~/img01# pwd
/root/img01
root@node01:~/img01# ls -al
total 20
drwxr-xr-x 2 root root 4096 Jul 20 09:58 .
drwx------ 5 root root 4096 Jul 20 09:58 ..
-rw-r--r-- 1 root root 513 Jul 20 09:32 Dockerfile
-rwxr-xr-x 1 root root 195 Jul 20 09:58 entrypoint.sh
-rw-r--r-- 1 root root 35 Jul 20 09:22 index.html
root@node01:~/img01# cat Dockerfile
FROM nginx:1.14-alpine
# ARG定义的变量可以在build时通过--build-arg 传递参数替换
ARG author="Jack
entrypoint.sh文件中末尾的exec "$@"尤为重要,由于Dockerfile中同时定义了ENTRYPOINT和CMD指令,所以容器运行时执行的程序为/bin/entrypoint.sh "/usr/sbin/nginx" "-g" "daemon off;" 而后边的参数都会entrypoint.sh脚本末尾的“$@”收集,即成了exec "/usr/sbin/nginx" "-g" "daemon off;",因使用了exec来执行,所以启动nginx的进程ID会替代运行/bin/entrypoint.sh脚本时的sh进程的ID。
build生成镜像
root@node01:~/img01# docker build --build-arg 'author="Tom
查看镜像详细信息
root@node01:~/img01# docker image inspect mynginx:v0.1-1
...
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"NGINX_VERSION=1.14.2",
"NGX_DOC_ROOT=/data/web/html/"
],
"Cmd": [
"/usr/sbin/nginx",
"-g",
"daemon off;"
],
"Healthcheck": {
"Test": [
"CMD-SHELL",
"wget -O - -q http://${IP:-0.0.0.0}:${PORT:-80}/"
],
"StartPeriod": 3000000000
},
"Image": "sha256:7eaa7434d331cfc56db82b03ee9472eca1dd4ee3411252fb0155d86debb5fa78",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": [
"/bin/entrypoint.sh"
],
"OnBuild": [
"RUN echo \"Hello Word!\" > /tmp/readme.txt"
],
"Labels": {
"maintainer": "\"Tom
其中Labels中的maintainer是docker build使用--build-arg传递的值Tom <tom@163.com>,不再是Docerfile中定义的值Jack <jack@qq.com>。
基于镜像mynginx:v0.1-1运行一个容器
root@node01:~# docker container run --rm --name nginx01 -e "PORT=8080" mynginx:v0.1-1 127.0.0.1 - - [20/Jul/2020:14:43:44 +0000] "GET / HTTP/1.1" 200 35 "-" "Wget" "-" 127.0.0.1 - - [20/Jul/2020:14:44:14 +0000] "GET / HTTP/1.1" 200 35 "-" "Wget" "-" ......
因配置了HEALTHCHECK,在容器运行后,运行进程运行3秒后每隔30秒都会检查nginx的主页。
另起终端连接到容器中
root@node01:~# docker container exec -i -t nginx01 /bin/sh / # cat /etc/nginx/conf.d/conf server { server_name eaf2cfb1eece; listen 0.0.0.0:8080; root /data/web/html/; } / # netstat -tanl Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:8080 127.0.0.1:33032 TIME_WAIT tcp 0 0 127.0.0.1:8080 127.0.0.1:33030 TIME_WAIT / # ps PID USER TIME COMMAND 1 root 0:00 nginx: master process /usr/sbin/nginx -g daemon off; 8 nginx 0:00 nginx: worker process 44 root 0:00 /bin/sh 66 root 0:00 ps / # ls /tmp/ / #
生成了配置文件,监听8080端口是docker run命令行传递的PORT变量的值。
再来测试一下ONBUILD指令,以生成的新镜像mynginx:v0.1-1为基础镜像再来制作一个镜像
root@node01:~/img02# pwd /root/img02 root@node01:~/img02# ls Dockerfile root@node01:~/img02# cat Dockerfile FROM mynginx:v0.1-1 RUN /bin/touch /tmp/1.txt root@node01:~/img02# docker build -t test:v0.1-1 ./ Sending build context to Docker daemon 2.048kB Step 1/2 : FROM mynginx:v0.1-1 # Executing 1 build trigger ---> Using cache ---> 8fd69355802f Step 2/2 : RUN /bin/touch /tmp/1.txt ---> Running in 2e123d9c7683 Removing intermediate container 2e123d9c7683 ---> cce488581509 Successfully built cce488581509 Successfully tagged test:v0.1-1
以此镜像运行一个容器
root@node01:~# docker container run -i -t --rm --name test01 test:v0.1-1 /bin/sh / # ls /tmp/ 1.txt readme.txt / # cat /tmp/readme.txt Hello Word! / #
/tmp/readme.txt生成了,说明基础镜像里定义的ONBUILD指令被触发了。
docker官方在github在还有许多Dockerfile事例,可以参考:Registry
Registry用于保存docker镜像,包括镜像的层次结构和元数据。用户可以自建Registry,也可以使用官方的Docker Hub。
分类:
Sponsor Registry: 第三方的registry,供客户和Docker社区使用 Mirror Registry: 第三方的registry,只让客户使用 Vendor Registry: 由发布Docker镜像的供应商提供的Registry Private Registry: 通过设有防火墙和额外的安全层的私有实体提供的registry
私有registry搭建
官方提供了docker-distribution软件包来搭建一个Private Registry,也提供了一个名为registry的镜像,只需要pull该镜像,启动容器就可以搭建起来,如果要提供["192.168.101.41/myreposition"]
此key表示访问192.168.101.41/myreposition这个Private Registry可以使用http协议。
官方提供的registry过于简陋,vmware对该软件进行了二次开发,名为Harbor为其增加了许多特性,还提供了一个web界面,详细信息请参考:https://github.com/goharbor/harbor
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~