Dockerfile详解
1、Dockerfile
Dockerfile由一行行命令语句组成,并且支持以#开头的注释行。
一般而言,Dockerfile可以分为四部分
基础镜像信息 维护者信息 镜像操作指令 启动时执行指令
指令 | 说明 |
FROM | 指定基础镜像 |
MAINTAINER | 指定维护者信息,已经过时,可以使用LABEL maintainer=xxx 来替代 |
RUN | 运行命令 v |
CMD | 指定启动容器时默认的命令 v |
LABEL | 指定生成镜像的元数据标签信息 v |
EXPOSE | 声明镜像内服务监听的端口 v |
ENV | 指定环境变量,可以在docker run的时候使用-e改变 v |
ADD | 复制指定的src路径下的内容到容器中的dest路径下,src可以为url会自动下载,可以为tar文件,会自动解压 |
COPY | 复制本地主机的src路径下的内容到镜像中的dest路径下,但不会自动解压等 |
ENTRYPOINT | 指定镜像的默认入口.运行命令 v |
VOLUME | 创建数据卷挂载点 |
USER | 指定运行容器时的用户名或UID |
WORKDIR | 配置工作目录,为后续的RUN、CMD、ENTRYPOINT指令配置工作目录 |
ARG | 指定镜像内使用的参数(如版本号信息等),可以在build的时候,使用–build-args改变 v |
OBBUILD | 配置当创建的镜像作为其他镜像的基础镜像是,所指定的创建操作指令 |
STOPSIGNAL | 容器退出的信号值 |
HEALTHCHECK | 健康检查 |
SHELL | 指定使用shell时的默认shell类型 |
1、RUN、CMD、ENTRYPOINT区别
- RUN 执行命令并创建新的镜像层RUN 经常用于安装软件包(在构建镜像时运行的)。
- CMD 设置容器启动后默认执行的命令及其参数但 CMD 能够被
docker run后面跟的命令行参数替换。- ENTRYPOINT 配置容器启动时运行的命令。
- 以上命令都可以使用shell或者exec方式执行
CMD ["executable","param1","param2"](exec form, this is the preferred form)CMD ["param1","param2"](as default parameters to ENTRYPOINT)CMD command param1 param2(shell form)2、shell和exec方式
- shell 是 /bin/sh -c 的方式,
- exec ["/bin/sh","-c",command] 的方式== shell方式
eg:shell方式
ENV name michael
ENTRYPOINT echo "Hello, $name"
#输出 Hello icoding
ENTRYPOINT ["/bin/echo", "Hello, $name"]
#输出 Hello $name
ENTRYPOINT ["/bin/sh", "-c", "echo Hello, $name"]
#输出 Hello michael
##建议:CMD 和 ENTRYPOINT 推荐使用 Exec 格式因为指令可读性更强更容易理解。RUN 则两种格式都可以。exec的时候要获取环境变量等值,就用/bin/sh -c 即可。No ENTRYPOINT | ENTRYPOINT exec_entry p1_entry | ENTRYPOINT [“exec_entry”, “p1_entry”] | |
No CMD | error, not allowed | /bin/sh -c exec_entry p1_entry | exec_entry p1_entry |
CMD [“exec_cmd”, “p1_cmd”] | exec_cmd p1_cmd | /bin/sh -c exec_entry p1_entry | exec_entry p1_entry exec_cmd p1_cmd |
CMD [“p1_cmd”, “p2_cmd”] | p1_cmd p2_cmd | /bin/sh -c exec_entry p1_entry | exec_entry p1_entry p1_cmd p2_cmd |
CMD exec_cmd p1_cmd | /bin/sh -c exec_cmd p1_cmd | /bin/sh -c exec_entry p1_entry | exec_entry p1_entry /bin/sh -c exec_cmd p1_cmd |
2、实战Dockerfile
#1、ping命令小工具。
编写Dockerfile-->打包镜像--->根据这个镜像启动容器使用容器的功能
docker build -t hello .
-t:tag标签。镜像名字
.:在当前目录下工作
默认.这个目录下就得有一个 Dockerfile
FROM alpine
CMD ping baidu.com
#2、文件名不是Dockerfile。用-f 指定
docker build -f Dockerfile2 -t hello:v1.0 .
docker run -d --name hello hello;
#3、默认构建出来的镜像,放到了我们的本地镜像仓库。
1)、登陆到dockerhub
2)、dockehub国外,就算能Push,非常慢。阿里云加速的是下载。
#4、把这个镜像发布到Docker hub
1)、docker login -u icodingallen;登陆到docker hub
2)、docker push nginx:v1.0;推送过去。
#5、搭建私有的镜像仓库。使用阿里云的镜像仓库(免费)。
1)、docker login --username=xxxx@
为了团队自治。只能看到自己的仓库的所有镜像。namespace;
创建镜像仓库。保存镜像各种版本,book: 1 2 3 4 5
docker tag hello:v1.0 /michaeldocker/hello:v1.3
docker push /michaeldocker/hello:v1.3![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zUGX4Xcy-1588769942277)(01%E3%80%81Docker.assets/image-20200427213352196.png)] cmd docker run 参数 cmd dockerfile_shell](https://s2.51cto.com/images/blog/202307/10134947_64ab9bfbc782193367.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=,x-oss-process=image/resize,m_fixed,w_1184)
结果:

/libarary/hello:latest
/icodingdocker/hello:v1.0
总结:
镜像—》打包–》上传。
















