【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指令)。
- LABEL maintainer=someone@xyz.xyz ”
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”
- 首先,访问 http://play-with-docker.com 并开始一个新的会话。你需要先创建一个账户。
- 一旦你的会话处于活动状态,点击“添加新实例”:
- 一个新的实例将会启动一个准备好接受命令的Docker引擎。
- 接下来创建/编辑Dockerfile。运行“vi Dockerfile”,按“i”切换到“插入模式”,复制/粘贴我们Dockerfile的内容,按“Esc”退出“插入模式”,然后输入“:x”保存并退出。
- 编译镜像
docker build <path>
. 指定 Dockerfile文件路径
- 成功后出现类似提示: “Successfully built
”
- 我们开始用命令启动容器:
docker run -p 80:80 <image ID>
. 参数-p 80:80
用来绑定80端口到主机,以便外部访问。
- 访问我们的 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技术知识,完全可以自己为自己的应用程序进行容器化了!