在这份指南中,我们将看到 Dockerfile 的简要介绍以及如何在 Linux 中使用 Dockerfile 来自动的 创建自定义 Docker 镜像 。
什么是 Dockerfile ?
Dockerfile 是附有构建 Docker 镜像说明的易于理解的文本文件。它囊括了用户在创建镜像时可以调用的所有命令。
我们可以使用 Dockerfile 创建自定义的镜像。可以通过 Docker Hub 分享的自定义 Docker 镜像。
如果你还不知道,Docker Hub 是 Docker 提供的托管存储库服务,用于团队查找和共享容器镜像,当然世界上任何人也都可以访问。
想象一下,早期如果我们想用 Nginx,我们要通过很多步骤,才能安装和配置好 Nginx 。得益于 Docker Hub ,现在我们可以在几分钟内,下载并运行 Nginx 的预置容器镜像。
Nginx Docker Image In Dockerhub
运行如下命令从 Docker Hub 上拉取 Nginx 镜像:
# docker pull nginx
一旦我们拉取了 Docker 镜像,可以运行如下命令使用它:
# docker run -it -d -p 8080:8080 nginx
就这样,十分简单!
Docker Hub 上有超过十万个来自软件供应商、开源项目以及社区的容器镜像。
你可以从 Docker Hub 上下载你选择的镜像,并且使用上面的命令开始使用它。
理解 Dockerfile 格式
Docker 可以读取 Dockerfile 中的 指令 来自动的创建镜像。
典型的 Dockerfile 包含如下指令:
1、FROM —— 这会设置容器的基础镜像。
例如:
FROM ubuntu:22.04
这会将容器的基础镜像设置为 Ubuntu 。如果 ‘22.04’ 这个标志没有特别指明,则会设为最新版本(latest)。
2、LABEL —— 这是用来明确镜像的元数据信息的键值对。
例如:
LABEL ENV=“DEVELOPMENT”
3、RUN —— 这会在基础镜像中执行指令并创建一个新层。
例如:
RUN apt-get update
RUN apt-get install tomcat
4、CMD —— 这用来设置容器启动后先执行的命令。
例如:
CMD ["java", "-jar", "app.jar"]
5、EXPOSE —— 设置用于访问容器的端口。容器将会监听该端口。我们可以用来获得输出。
例如:
EXPOSE 8080
6、``MAINTAINER` —— 显示创建镜像作者的信息。
例如:
MAINTAINER info@ostechnix.com
7、ENV —— 用来设置环境变量的键值对。这些变量在镜像创建的时候设置,并在容器创建好后可以使用。
例如:
ENV DB_NAME=”MySQL”
ENV DB_VERSION=”8.0”
8、COPY —— 用来拷贝本地文件至容器中。
例如:
COPY /target/devops.jar devops.jar
9、ADD —— 具有与拷贝相同的功能,不过更进一步还可以提取本地的 tar 文件或者从 URL 拷贝文件。
例如:
ADD devops.tar.xz / .
ADD http://example.com/abc.git /usr/local/devops/
10、ENTRYPOINT —— 用来设置镜像的主要命令。与 CMD 指令功能相同。不同的是 ENTRYPOINT 中的指令不会被重写。
例如:
ENTRYPOINT ["java", "-jar", "app.jar"]
11、VOLUME —— 该指令用来创建指定位置的挂载点。
例如:
VOLUME /app/devops
12、USER —— 将设置运行镜像并使用的用户名称以及用户组。
例如:
USER dhruv
USER admin
13、WORKDIR —— 这会设置工作目录。如果目录不存在,则会创建。
例如:
WORKDIR /var/lib/
这是一个 Dockerfile 的样本,可以参考一下:
FROM ubuntu:latest
MAINTAINER Senthilkumar Palani "info@ostechnix.com"
RUN apt-get install -y software-properties-common python
RUN add-apt-repository ppa:chris-lea/node.js
RUN echo "deb http://us.archive.ubuntu.com/ubuntu/ jammy universe" >>
/etc/apt/sources.list
RUN apt-get update
RUN apt-get install -y nodejs
RUN mkdir /var/www
ADD app.js /var/www/app.js
CMD ["/usr/bin/node", "/var/www/app.js"]
我将向你展示创建一个 Dockerfile 、创建并使用镜像的简单例子。
创建一个 Dockerfile
创建一个名为 dockerfile 的文件:
# nano dockerfile
添加下面几行命令。我们将更新并安装 vim 和 curl 包:
FROM alpine
RUN apk update
RUN apk add vim
RUN apk add curl
Dockerfile For Alpine Linux
按下 CTRL+O 和 CTRL+X 键保存文件并关闭。
现在 Dockerfile 已经就位。让我们继续,用该 Dockerfile 创建一个镜像。
注意: 如果你在使用 Docker 桌面版,你可以以一个普通用户运行 docker 命令。
使用 Dockerfile 创建 Docker 镜像
只需运行以下命令,便可以使用 Dockerfile 创建 Docker 镜像:
# docker build -t alpine .
请注意最后有一个 点(.)。
输出示例:
[+] Building 51.2s (8/8) FINISHED
=> [internal] load build definition from Dockerfile 0.1s
=> => transferring dockerfile: 104B 0.0s
=> [internal] load .dockerignore 0.1s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/alpine:latest 38.8s
=> [1/4] FROM docker.io/library/alpine@sha256:7580ece7963bfa863801466c0a 2.7s
=> => resolve docker.io/library/alpine@sha256:7580ece7963bfa863801466c0a 0.0s
=> => sha256:d7d3d98c851ff3a95dbcb70ce09d186c9aaf7e25d48 1.47kB / 1.47kB 0.0s
=> => sha256:530afca65e2ea04227630ae746e0c85b2bd1a179379 2.80MB / 2.80MB 2.4s
=> => sha256:7580ece7963bfa863801466c0a488f11c86f85d9988 1.64kB / 1.64kB 0.0s
=> => sha256:9b2a28eb47540823042a2ba401386845089bb7b62a9637d 528B / 528B 0.0s
=> => extracting sha256:530afca65e2ea04227630ae746e0c85b2bd1a179379cbf2b 0.2s
=> [2/4] RUN apk update 4.3s
=> [3/4] RUN apk add vim 3.5s
=> [4/4] RUN apk add curl 1.3s
=> exporting to image 0.4s
=> => exporting layers 0.4s
=> => writing image sha256:14231deceb6e8e6105d2e551799ff174c184e8d9be8af 0.0s
=> => naming to docker.io/library/alpine 0.0s
Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them
按照上面的命令, Docker 会通过保存在当前工作目录中的 Dockerfile 中的命令开始自动的创建镜像。还记得我们在 Dockerfile 中保存的 apk update、apk add vim 和 apk add curl 命令吗?这些命令也将会自动的执行。
如果 Dockerfile 保存在其他目录,你可以使用 -f 标志来指定路径,例如:
# docker build -f /path/to/a/Dockerfile .
创建好镜像后,我们可以使用如下命令运行它:
# docker run -it alpine
该命令会启动这个 Alpine 容器并连接到它。
/ # uname -a
Linux 8890fec82de8 5.10.104-linuxkit #1 SMP Thu Mar 17 17:08:06 UTC 2022 x86_64 Linux
/ # cat /etc/alpine-release
3.16.1
/ #
如果你使用 Docker 桌面版,你可以通过容器Containers标签页界面来查看运行中的容器。
View Containers In Docker Desktop
这就是使用 Dockerfile 构建自定义容器映像的方式。
我们仅仅讲了基础内容。你可以用 Dockerfile 做到很多东西。建议你参考一下官方 Dockerfile 参考 ,以了解更多内容。