【DevOps基础篇】Dockerfile快速掌握

2018-09-10T13:11:33+08:00 | 5分钟阅读 | 更新于 2018-09-10T13:11:33+08:00

Macro Zhao

【DevOps基础篇】Dockerfile快速掌握

@TOC

推荐超级课程:

在本指南中,我们将学习关于Dockerfile的内容。它是什么,如何创建一个,以及如何配置基本内容来启动您自己的Docker化应用程序。

什么是Dockerfile?

  • Dockerfile是使用特殊语法 编写的文本配置文件。
  • 它描述了所有您需要运行的命令的逐步说明,以组装一个Docker镜像。
  • docker build命令处理此文件,在您的本地镜像缓存中生成一个Docker镜像,然后您可以使用docker run命令启动它,或者将其推送到永久镜像仓库中。

创建一个Dockerfile

创建Dockerfile就像使用您选择的文本编辑器创建一个名为“Dockerfile”的新文件并定义一些指令一样简单。文件的名称并不重要。Dockerfile是默认名称,但您可以使用任何您想要的名称(甚至在同一个文件夹中有多个Dockerfile)。

#
# 每一行都是一个命令,在编译成镜像时候,会产生一层layer。
#
#
# 基础镜像:最新版 Ubuntu 
FROM ubuntu:latest
#
# 维护者标签
LABEL maintainer="myname@somecompany.com"
#
# apt更新命令
RUN apt-get update && apt-get upgrade -y
#
# 安装 NGINX
RUN apt-get install nginx -y
#
# 暴露端口 80
EXPOSE 80
#
# 指示镜像运行后,启动nginx
CMD ["nginx", "-g", "daemon off;"]

Dockerfile 指令

ADD — 定义要从主机文件系统复制到容器中的文件

  • ADD ./local/config.file /etc/service/config.file

CMD — 这是容器启动时将运行的命令

  • CMD \[“nginx”, “-g”, “daemon off;”\]

ENTRYPOINT — 设置每次从镜像创建容器时要使用的默认应用程序。如果与CMD一起使用,可以删除应用程序并只在此处定义参数

  • CMD Hello World!
  • ENTRYPOINT echo

ENV — 在从镜像创建的容器中设置/修改环境变量

  • ENV VERSION 1.0

EXPOSE — 定义要暴露的容器端口

  • EXPOSE 80

FROM — 选择要在其顶部构建新镜像的基础镜像

  • FROM ubuntu:latest

LABEL maintainer — 可选字段,用于指定自己为该镜像的维护者。这只是一个标签(它曾经是一个专用的Docker指令)。

RUN — 指定要对镜像和随后从该镜像启动的容器进行更改的命令。这包括更新软件包,安装软件,添加用户,创建初始数据库,设置证书等。这些是您在命令行上运行以安装和配置应用程序的命令。这是最重要的dockerfile指令之一。

  • RUN apt-get update && apt-get upgrade -y && apt-get install -y nginx && rm -rf/var/lib/apt/lists/*

USER — 定义从镜像创建的任何容器中所有命令将作为的默认用户。它可以是UID或用户名

  • USER docker

VOLUME — 在容器内创建一个挂载点,将其链接回Docker主机可以访问的文件系统。新卷将填充指定位置的现有内容。需要特别指出的是,在Dockerfile中定义卷可能会引发问题。应该使用docker-compose或“docker run”命令管理卷。卷是可选的。如果您的应用程序没有任何状态(大多数Web应用程序都是这样工作的),那么您不需要使用卷。

  • VOLUME /var/log

WORKDIR — 为“ENTRYPOINT”或“CMD”指令中定义的命令定义默认工作目录

  • WORKDIR /home

构建和测试 Dockerfiles

有一个免费的服务,可以让你通过网络界面快速创建 Docker 实例,叫做:“Play With Docker”

  1. 首先,访问 http://play-with-docker.com 并开始一个新的会话。你需要先创建一个账户。
  2. 一旦你的会话处于活动状态,点击“添加新实例”:

  1. 一个新的实例将会启动一个准备好接受命令的Docker引擎。

  1. 接下来创建/编辑Dockerfile。运行“vi Dockerfile”,按“i”切换到“插入模式”,复制/粘贴我们Dockerfile的内容,按“Esc”退出“插入模式”,然后输入“:x”保存并退出。

  1. 编译镜像 docker build <path>. 指定 Dockerfile文件路径

  1. 成功后出现类似提示: “Successfully built

  1. 我们开始用命令启动容器: docker run -p 80:80 <image ID>. 参数 -p 80:80用来绑定80端口到主机,以便外部访问。

  1. 访问我们的 NGINX service

为你自己的应用编写Dockerfile

在前面的部分中,我们已经看到了一个用于nginx的Docker镜像的示例。但是,如果你想要在Docker镜像中打包自己的应用程序呢?

在这种情况下,你可以在与你的源代码相同的文件夹中创建一个Dockerfile。然后在dockerfile中放入指令,这些指令模仿你在本地工作站上所做的编译/打包代码的过程。

第一步应该是找到一个使用你的编程语言的公共Docker镜像。一些示例是:

一旦找到合适的基础图像,您可以使用它来打包您自己的应用程序。以下是Python的一个示例。

FROM python:3.6.4-alpine3.6
ENV FLASK_APP=minitwit
COPY . /app
WORKDIR /app
RUN pip install --editable .
RUN flask initdb
EXPOSE 5000
CMD [ "flask", "run", "--host=0.0.0.0" ]

如何从Dockerfile创建一个优化的Docker镜像

一旦你熟悉了构建Docker镜像,你还需要关注另外两个主题:

  • 创建尽可能小的文件大小的Docker镜像
  • 使用多阶段构建来打包实际需要的内容

以下是一个使用多阶段构建的Node应用程序示例:

FROM node:8.16 as build-deps
WORKDIR /usr/src/app
COPY package.json yarn.lock ./
RUN yarn
COPY . ./
RUN yarn build
FROM nginx:1.12-alpine
COPY --from=build-deps /usr/src/app/build /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

结语

现在你已经理解掌握了基本的Dockerfile技术知识,完全可以自己为自己的应用程序进行容器化了!

© 2011 - 2025 Macro Zhao的分享站

关于我

如遇到加载502错误,请尝试刷新😄

Hi,欢迎访问 Macro Zhao 的博客。Macro Zhao(或 Macro)是我在互联网上经常使用的名字。

我是一个热衷于技术探索和分享的IT工程师,在这里我会记录分享一些关于技术、工作和生活上的事情。

我的CSDN博客:
https://macro-zhao.blog.csdn.net/

欢迎你通过评论或者邮件与我交流。
Mail Me

推荐好玩(You'll Like)
  • AI 动·画
    • 这是一款有趣·免费的能让您画的画中的角色动起来的AI工具。
    • 支持几十种动作生成。
我的项目(My Projects)
  • 爱学习网

  • 小乙日语App

    • 这是一个帮助日语学习者学习日语的App。
      (当然初衷也是为了自用😄)
    • 界面干净,简洁,漂亮!
    • 其中包含 N1 + N2 的全部单词和语法。
    • 不需注册,更不需要订阅!完全免费!
  • 小乙日文阅读器

    • 词汇不够?照样能读日语名著!
    • 越读积累越多,积跬步致千里!
    • 哪里不会点哪里!妈妈再也不担心我读不了原版读物了!
赞助我(Sponsor Me)

如果你喜欢我的作品或者发现它们对你有所帮助,可以考虑给我买一杯咖啡 ☕️。这将激励我在未来创作和分享更多的项目和技术。🦾

👉 请我喝一杯咖啡

If you like my works or find them helpful, please consider buying me a cup of coffee ☕️. It inspires me to create and share more projects in the future. 🦾

👉 Buy me a coffee