Dockerfile入门指南

谦虚但功能强大的Dockerfile是Docker映像和容器的构建块。 本质上,这是Docker引擎运行以组装映像的命令列表,因此将映像实例作为容器。

在学习构造自己的示例之前,让我们看一个示例。

这是RethinkDB的Dockerfile ,这是一种流行的开源实时数据库。

dockerfile FROM debian:jessie

MAINTAINER Daniel Alan Miller [email protected]

RUN apt-key adv --keyserver pgp.mit.edu --recv-keys 1614552E5765227AEC39EFCFA7E00EF33A8F2399 RUN echo "deb http://download.rethinkdb.com/apt jessie main" > /etc/apt/sources.list.d/rethinkdb.list

ENV RETHINKDBPACKAGEVERSION 2.0.4~0jessie

RUN apt-get update \ && apt-get install -y rethinkdb=$RETHINKDBPACKAGEVERSION \ && rm -rf /var/lib/apt/lists/*

VOLUME ["/data"]

WORKDIR /data

CMD ["rethinkdb", "--bind", "all"]

EXPOSE 28015 29015 8080

第一个FROM命令是一个重要的Docker命令,允许您从其他映像中提取依赖关系; 在这种情况下,为Debian的Jessie版本。 下一条命令设置映像的维护程序,以供参考和信息。

您将经常使用RUN命令。 这些定义命令在容器首次创建时从容器中运行。 如果您有依赖项来支持,这些可以是您希望的任何命令行指令。 例如,如果您使用的图像包含Ruby运行时,则这些可能是Ruby命令。

  • ENV设置容器内可用的环境变量,对于设置软件需要运行的变量很有用。
  • VOLUME定义了容器中的路径,Docker在运行容器时将其公开给主机系统并使用-v参数进行映射。
  • 万一需要从特定位置或在特定位置运行命令, WORKDIR会将容器的活动目录更改为指定位置。

RUN发出用于准备要使用的容器的命令的同时, CMD运行容器设计为运行的软件(格式为CMD [ "executable""parameter1""parameter2" ]),并且最适合用于以下命令产生一个交互式外壳,例如Python。

反映Docker的微服务结构,理想情况下应该只存在一个CMD ;如果存在多个,则只有最后一个才有意义。

如果您的容器需要更复杂的东西,请使用ENTRYPOINT命令。 ENTRYPOINTCMD一起使用作为参数, ENTRYPOINT设置映像的主命令,使您可以像运行该命令一样运行映像。

例如,以下运行swarm命令,将--help作为参数传递:

dockerfile ENTRYPOINT ["/swarm"] CMD ["--help"]

ENTRYPOINT命令的另一个常见用法是在ENTRYPOINT中运行bash脚本,从而可以进行更复杂的操作。

EXPOSE公开软件使用的端口,以便在运行带有-p参数的容器时可以映射到主机。

!新的号召性用语

从头开始创建Dockerfile

对于此示例,我将创建一个图像(从而创建容器)以测试网站并为在Jekyll中构建的网站构建过程。 我之所以选择Jekyll,是因为我所有的站点都使用它,这是一个易于理解的简单系统,我非常喜欢它。

有一个官方图片 ,但是它没有使用Jekyll的最新版本,(我认为)过于复杂,无论如何,我想向您展示如何编写自己的图片。

创建一个新文件夹,然后在其中创建一个Dockerfile。 首先设置基础映像(在本例中为正式的Ruby映像) ,然后设置一个维护程序。

dockerfile FROM ruby:latest MAINTAINER Name 

现在为Jekyll创建一个用户和组,设置适当的权限并安装Jekyll gem:

dockerfile RUN \ mkdir -p /home/jekyll && \ groupadd -rg 1000 jekyll && \ useradd -rg jekyll -u 1000 -d /home/jekyll jekyll && \ chown jekyll:jekyll /home/jekyll && \ gem install jekyll

我正在本地处理项目的源文件,因此创建一个挂载点,Docker容器可以在该挂载点访问主机系统上的文件。

dockerfile VOLUME /home/jekyll

您也可以将文件复制到容器中,但这会使图像的灵活性降低:

dockerfile COPY . /home/jekyll/

容器中不需要文件夹,因此请创建一个新的.dockerignore文件以忽略某些路径:

dockerfile .bundle .git _site

接下来,设置包含站点的目录,然后为站点提供服务。

dockerfile WORKDIR /home/jekyll ENTRYPOINT ["jekyll", "serve"] EXPOSE 4000

您现在可以使用以下方法构建图像:

dockerfile docker build .

根据映像创建容器,并使用所需的docker run命令的任何变体。 但是,类似以下命令的操作将基于映像创建容器,该映像设置名称并在安装点安装本地卷。 您可以从Docker images命令获取IMAGE_ID

bash docker run --name cs_jk -it -d -P -v :/home/jekyll 

到目前为止,一切都很好。 但是请记住,随着Jekyll网站的发展,您将添加在容器中也需要可用的gem和其他依赖项。 通过在WORKDIR命令下面添加以下行来修复此问题:

dockerfile COPY Gemfile /home/jekyll COPY Gemfile.lock /home/jekyll RUN bundle install

现在,当您重建并重新运行容器时,添加的宝石将可用。

将映像推送到Docker Hub

大! 您现在有了一个简单的自定义图像。 下一步是将其安装到Docker Hub上,在这里您和其他Docker用户可能会更有用。

在Docker Hub上创建一个帐户,然后使用相同的凭据从您的终端登录:

bash docker login

现在,标记您的图像:

bash docker tag  /jekyll:devel

当然,可以随时将所有值更改为其他值。 它们可以是对您有用的任何东西,但是用户需要一些标准标签。 现在,如果您运行Docker映像,您最终将在REPOSITORY列中看到一个用户可读的名称。

Dockerfile入门指南_第1张图片

并将其推送到Docker Hub:

bash docker push /jekyll

Dockerfile入门指南_第2张图片

如果您登录到您的Hub帐户,您将看到列出的图像,并可供其他人通过docker pull /jekyll命令使用。

Dockerfile入门指南_第3张图片

后续步骤和最佳做法

Dockerfile很简单,这是有意的。 Docker的核心概念之一是使每个组件尽可能小且离散,每个容器理想地每个执行一个任务。

以Jekyll网站为例。 也许您还想整理代码和文本以查找错误,然后创建另一个图像和容器。 想要生成文本的ePub吗? 使用Pandoc进程创建另一个容器。 需要在您的网站上搜索吗? 连接一个Elasticsearch图像和容器。 然后,您可以将它们链接在一起,并与Docker Compose共享同一代码库,从而允许您创建复杂的,相互连接的容器和应用程序。

Dockerfile是Docker的构建块,没有它们,工具链中的其他功能将无法正常工作。 尽管它们很简单,但实际上很难理解最佳的编写方式来提供最大的灵活性。 如果您想了解更多信息,我推荐Docker的官方指南 ,欢迎您提出任何意见或问题。

翻译自: https://www.javacodegeeks.com/2016/08/beginners-guide-dockerfile.html

你可能感兴趣的:(Dockerfile入门指南)