看到这篇文章的读者肯定希望快速上手 docker,所以这篇文章不会涉及到 docker的底层原理,而是主要讲如何编写 Dockerfile以及如何使用 docker进行项目部署,不管怎么样我们先用起来。不过在这之前我们先简单介绍一下 docker以便确定你是否真的需要使用 docker。
首先我们先了解一下 docker能够帮我们做什么。用一句话概括就是:docker可以将我们的项目打包,然后无障碍地部署到大部分服务器上。docker本身可以运行在大部分系统上,但使用 docker部署的项目必须基于 linux系统。也就是说我们可以在 windows上用 docker部署运行在 Linux上的项目,但是我们没办法在 windows上用 docker部署运行在 windows上的项目,当然在 Linux上也不行。
在手动部署项目的时候我们通常会先把代码上传到服务器、然后安装相关依赖、配置环境、最后启动项目。通常这些过程都需要我们手动敲入命令,每次部署的时候都需要重新敲一遍。而 docker做的工作就是将这些命令记录下来,在部署的时候再逐个执行。
看到这里可能会有人问:这和我写的部署脚本有什么区别?如果 docker仅仅只做这些事的话,那真的是没有啥区别。但是 docker还能够保证每次运行的环境都是一致的,并且与宿主机的环境进行隔离。相信看到这里大家已经能够 get到 docker的妙用了。
1 Dockerfile
前面讲到了 docker通过记录执行的命令来保证每次部署时执行的命令都一致,Dockerfile就是保存这些命令的文件。docker会根据 Dockerfile来构建环境并生成一个镜像,最后通过运行镜像来完成项目部署。
想要快速上手 docker我们需要了解下面这几个命令:FROM, MAINTAINER, ENV, ADD, COPY, EXPOSE, ENTRYPOINT, WORKDIR, RUN, CMD等。下面我们对他们进行逐个介绍。
1.1 FROM
FROM
用来指定基础镜像。可以理解为所需要的的操作系统,不过与操作系统不同的是 FROM
指定的镜像通常会配置好我们所需要的的环境。比如下面这行代码就指定了带有 python
环境的镜像,我们可以在构建好的镜像中直接使用 python
而不需要额外安装。
FROM python:3.6
1.2 MAINTAINER
MAINTAINER
指定了 Dockerfile的作者,或者说维护者。可填可不填。
1.3 ENV
ENV
用来设置环境变量。示例如下:
ENV PRODUCTION_ENV 1
1.4 ADD
ADD
命令可以用来向镜像中添加我们需要的文件,比如配置文件、代码、资源文件等等。ADD
中所使用的的路径是 Dockerfile所在目录的相对路径,也可以使用 URL,如果目标文件是一个 tar压缩包的话会被自动解压成目录。示例如下,其中第一个参数是要添加的文件,第二个参数是镜像中对应的文件,如果不存在会自动创建:
ADD ./database.ini /root
ADD ./src /root
ADD http://www.baidu.com /root
ADD code.tar /root
1.5 COPY
COPY
的功能和 ADD
相似,不过 COPY
只能复制本地的文件到镜像中,并且不会自动解压 tar压缩包。
1.6 EXPOSE
EXPOSE
声明容器中要使用的端口,仅仅做声明,没有实际作用。运行时使用 -p 容器端口:宿主机端口
指定端口映射。
EXPOSE 80
EXPOSE 80 8080
1.7 ENTRYPOINT
容器启动时执行的命令,并且不会被 docker run
的参数覆盖。如果指定了多个 ENTRYPOINT
只有最后一个会被执行。命令的格式如下:
ENTRYPOINT ["可执行文件", "参数1", "参数2"]
EN