三分钟读懂Dockerfile

three min Spell over Dockerfile

Posted by Xiekers on October 13, 2015

Dockerfile的编写工作是使用Docker和容器服务的最基础步骤之一。为了帮助更多的人熟悉和编写Dockerfile,笔者采编了Docker官网的相关文章,以帮助更多的人能够顺利的使用灵雀云的容器服务。下面是一个完整的Dockerfile例子,其主要目的是构建一个memcached服务,并在容器启动的时候以用户daemon的身份运行该容器。您可以先看例子,之后文章会对每一个命令有详尽的解释。

# Memcached
# VERSION 2.2
FROM ubuntu

# make sure the package repository is up to date
RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list
RUN apt-get update

# install memcached
RUN apt-get install -y memcached

# Launch memcached when launching the container
ENTRYPOINT ["memcached"]

# run memcached as the daemon user
USER daemon

# expose memcached port
EXPOSE 11211


FROM命令

FROM image //每一个Dockerfile都从FROM命令开始。

该语句为后续命令设置了基础镜像。例如:

FROM ubuntu

在这个例子中,我们选择ubuntu作为我们的基础镜像。你可以在灵雀云的“镜像社区”发现一系列有用的基础镜像。

RUN命令

RUN用于对镜像执行命令并commit,RUN命令产生的新的镜像会被用于后续命令。和源代码管理机制类似,叠加RUN命令和不断commit符合Docker的核心概念,就是容器可以从镜像历史任意一个时间点产生。

RUN command

Run command 等价于docker命令docker run image command + docker commit container_id。例如:

RUN apt-get install -y memcached

正如上文所述,在执行RUN命令前,我们需要先执行FROM命令,使Docker知道从哪个基础镜像开始构建新的镜像。

FROM ubuntu
RUN apt-get install -y memcached

这个例子在ubuntu这个基础镜像上安装memcached,并产生一个新的镜像。


 

ENTRYPOINT 命令

ENTRYPOINT命令允许容器在启动的时候触发一条命令。例如,你希望容器在启动的时候打印“Hello, container!”,那么你可以这么用:

ENTRYPOINT echo "Hello container!"

ENTRYPOINT 有两种文法,除了上面的例子,你也可以用:

ENTRYPOINT ["echo", "Hello container"]

在我们前面的例子里,我们在ubuntu上安装了memcached。同时我们希望在容器启动的时候也启动memcached,这样我们可以使用如下命令:

ENTRYPOINT ["memcached", "-u", "daemon"]

这条命令中,我们用用户daemon的身份运行应用memcached。

USER命令

在很多情况下,我们并不想用root的身份运行应用。前面的例子里,Memcached本身具有参数设置可以让我们用不同的用户来运行。但不是所有的服务都有这样的设置。所以,这种情况下,当要运行镜像时,我们可以使用USER命令设置username或者UID。上面的命令我们可以改写为:

ENTRYPOINT ["memcached"]
USER daemon

EXPOSE命令

EXPOSE设置镜像运行时暴露的端口。Memcached 使用端口11211,所以我们要将容器的该端口暴露出来以便于和其他容器交互。所以我们要加入如下命令:

EXPOSE 11211

这样做了之后,该容器的端口11211在运行的时候就可以被访问了。需要说明的是,memcached并不是一个http服务,你可以写一个程序通过memcached的客户端通过项目演示平台的映射端口调用该服务。

原文翻译节选自Docker tutorial,有部分改动。