原文: https://blog.csdn.net/xyz_dream/article/details/86717241
几分钟就能掌握Dockerfile文件命令的含义:
1.ARG version=1.0 # 传递过来的变量参数 默认值是1.0 在使用docker build --build-arg version=1.0(默认参数) 使用 ${ARG变量名} 来当做变量:
例如 :
ARG version=1.12
FROM nginx:${version} # 如果ARG的version没有通过 docker build --build-arg key=val传过来的话使用默认值 1.12 ,如果传递则覆盖。
2.FROM ubuntu:16.04 # 基础镜像,你要在哪个镜像的基础上构建
3.LABLE com.java.version=1.7 \ # 自定义lable
com.java.jdk=1.8
maintainer="author author@xx.com" # MAINTAINER已经废弃 主要是写一些关于Dockerfile维护者的想你想
# shell形式 此形式默认真实执行的命令是: /bin/sh -c "echo 'hello world' >> /root/data.txt"
4.RUN echo "hello world" >> /root/data.txt # 提交一层镜像 apt-get update 删除rm -rf /var/lib/apt/lists/* 减小镜像大小
# exec 形式
5.RUN ["/bin/sh","-c","echo world"] # 默认shell是 /bin/sh -c
6.CMD ["可执行文件","参数1","参数2"] # 默认默认启动的命令。 可以有多个,但是最后一个会覆盖前面所有的CMD的。最后一个为准
["作为entrypoint的默认参数1","作为entrypoint的默认参数2"] # 有entrypoint的情况下
命令 参数 ...# shell模式
7.EXPOSE 3306/tcp 80/tcp 23/udp # 声明要暴露的端口信息
8.ENV key1=val1 key2=val2 key3=val3 # 环境变量
9.COPY ./file/ /data/ # 拷贝文件到镜像中
# 入口执行命令 可以在docker run加入参数 --entrypoint = command 覆盖掉
# 如果是exec数组形式,若存在CMD命令且CMD命令也是exec模式 则CMD作为附加参数给entrypoint
10.ENTRYPOINT ["可执行文件","参数1","参数2"]
11.VOLUME ["/lib","/data"] #挂载数据到此目录
12.USER dreammo:root # 用户名:组名称
13.WORKDIR /data # 进入容器层所处的目录。 记住 每一个RUN命令都是在一个镜像层 使用cd /data 仅仅只是在本层镜像有效 下一层镜像无效
14.ONBUILD RUN XXX # 当别人使用此镜像作为基础镜像build的时候 触发此命令
15.SHELL ["/bin/bash","-c"] # 设置默认docker使用的shell 默认是 /bin/sh -c
16.HEALTHCHECK options CMD # 健康检查
有3个参数:
--interval=30s # 每隔30s检查一次
--timeout=5s # 超时
--retries=5 #当遇到错误 重新尝试检查5次
有3个状态:
0 健康
1 不健康
2 保留原值
HEALTHCHECK --interval=30s --timeout=10s --retries=5 CMD curl -I http://localhost \ | grep 200 && exit 0 || exit 1
| grep 200
附加docker network内容:
Docker网络的4种模式:
1.host
不会使用namespace隔离。 复用 宿主机的网卡信息, 在容器操作就相当于在操作宿主机的网络。 但是其他是隔离的。
2.container
新创建的容器复用原容器(container)的网络信息,而不是新创建自己的网络信息。 其他还是通过namespace隔离的。
3.none
容器会创建自己的网卡 namespace隔离网络。但是 该网络不会有任何配置 例如 ip 网卡 路由等, 需要我们自己手动配置。
4.bridge # 桥接模式 (默认)
容器被namespace分配网络信息。然后连接到一个虚拟网桥上。彼此连接到同一个网桥上的容器,可以相互通信。