dockerfile 入门_Dockerfile入门指南

dockerfile 入门

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

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

这是RethinkDBDockerfileRethinkDB是一种流行的开源实时数据库。

dockerfile FROM debian:jessie

MAINTAINER Daniel Alan Miller dalanmiller@rethinkdb.com

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 <info@example.com>

现在为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 <PATH_TO_SITE>:/home/jekyll <IMAGE_ID>

到目前为止,一切都很好。 但是请记住,随着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 <IMAGE_ID> <USERNAME>/jekyll:devel

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

df_images_with_tag

并将其推送到Docker Hub:

bash docker push <USERNAME>/jekyll

df_docker_push

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

df_docker-hub

后续步骤和最佳做法

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

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

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

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

dockerfile 入门

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值