Dockerfile

A Dockerfile is a text document that contains all the commands a user could call on the command line to assemble an image.

dockerfile文件实际上就是一个包含了一堆指令的文件,在执行docker build path的时候,Docker的后台程序会自动从上至下依次执行dockerfile中的指令。

**注意:**执行docker build的时候,会将你填写的路径中的全部内容发送给Docker后台程序,因此千万不要使用根目录/作为build的路径,因为这么程序会将你的整个硬盘发送给Docker后台进程。

最佳实践:docker build path的时候,永远在新建的文件夹中执行。

.dockerignore

与.gitignore文件一样,可以在path目录下新建.dockerignore文件来避免发送、COPYADD某些希望忽略的文件。docker build的时候会先检查.dockerignore文件,之后才会将路径下的全部内容发送给Docker后台进程。

Dockerfile格式

# 注释
INSTRUCTION(命令) arguments(参数)

**最佳实践:**命令保持全部大写。虽然Docker本身并不要求一定需要大写,但是大写可以更好的区分命令与参数。

注意:#的注释只有在一行的开头才会认为是注释,出现在一行中的其他地方均会被当成正常字符。

常用Dockerfile命令

  • FROM <image>[:<tag>] [AS <name>]使用哪一个基础image来build(构建)新的image,每一个Dockerfile必须至少有一个FROM命令。如果不设置tag,默认使用lastest标签的image。
  • ENV <key> <value>设置环境变量,dockerfile本身可以使用${var}来使用环境变量。最终生成的容器中也可以通过不同程序调用系统的接口,获取到该环境变量。例如python的os包中的os.getenv()。
  • RUN <command>执行任意的shell命令。
  • CMD ["executable","param1","param2"]执行shell命令,和RUN的区别就是CMD指令只会执行最终的那一条设置,因此一般用来结尾执行某些只需要执行一次的命令。**注意:**该指令格式,RUN命令也支持。
  • LABEL <key>=<value>为image设置一些元数据,例如作者、版本等,使用docker inspect imagename可以查看image的label。
  • EXPOSE <port> [<port>/<protocol>...]对外界暴露指定的端口以及协议。
  • ADD [--chown=<user>:<group>] <src>... <dest>将src的文件、内容,新增到image的dest目标路径中。并清除src的源文件。
  • COPY [--chown=<user>:<group>] <src>... <dest>将src的文件、内容,复制到image的dest目标路径中。不会清除src的源文件。
  • VOLUME ["dir",...]生成一个挂载点。
  • USER <user>[:<group>]设置运行shell命令的用户与用户组。
  • WORKDIR /path/to/workdir工作路径,dockerfile中所有的命令都会以workdir为根目录。

构建/运行image

  • docker build -t imagename path构建image,并命名。
  • docker run -p 4000:80 imagename运行image并将暴露的80端口绑定至本机的4000端口,如果这里的image本地不存在,docker会尝试从远端直接pull并运行该image。

分享、上传image

  • docker login登录docker,需要先在hub.docker.com注册,所需的用户名不是邮箱而是唯一的用户名。
  • docker tag image username/repository:tagtag image。
  • docker push username/repository:tag发布image至远端。

常用指令列表:

  • docker ps # 查看运行中的container
  • docker image ls # 查看image list
  • docker image rm
  • docker inspect # 查看image label信息
  • docker container ls # 查看container list
  • docker container ls --all # 查看全部模式的container
  • docker login # 登录docker
  • docker tag username/repository:tag # tag image
  • docker push username/repository:tag # 推送image至远端
  • docker run username/repository:tag # 运行image