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区别

  1. RUN 执行命令并创建新的镜像层RUN 经常用于安装软件包(在构建镜像时运行的)。
  2. CMD 设置容器启动后默认执行的命令及其参数但 CMD 能够被 docker run 后面跟的命令行参数替换。
  3. ENTRYPOINT 配置容器启动时运行的命令。
  4. 以上命令都可以使用shell或者exec方式执行
  5. CMD ["executable","param1","param2"] (exec form, this is the preferred form)
  6. CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
  7. CMD command param1 param2 (shell form)

2、shell和exec方式

  1. shell 是 /bin/sh -c 的方式,
  1. 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

cmd docker run 参数 cmd dockerfile_shell

结果:

cmd docker run 参数 cmd dockerfile_docker_02

/libarary/hello:latest

/icodingdocker/hello:v1.0

总结:
镜像—》打包–》上传。