1/14

第三章:了解 Dockerfile

基本上围绕着如何书写 Dockerfile,以实现一个 redis-server 为例。

  • Dockerfile

我们创建自定义镜像从 Dockerfile 开始。

Dockerfile 是一个文本文件,在里面添加我们的配置信息,这些信息定义了容器的行为方式。

Dockerfile 文件经由 Docker Client 传给 Docker Server,最后由 Docker Server 解析并构建镜像。

Dockerfile 中添加的配置项一般是三步曲(工作流)

  1. 规定基础镜像

  2. 运行命令来安装必要的依赖、程序

  3. 规定容器启动参数

创建一个文件夹,并在文件夹内创建 Dockerfile 文件,内容如下:

# 三步曲1:规定基础镜像
# 基础镜像可以理解为操作系统,我们在安装其他程序前,需要先安装操作系统
FROM alpine

# 三步曲2:运行命令来安装必要的依赖、程序
# apk 是 alpine 内建的包管理命令,我们使用这个包管理程序安装 redis
RUN apk add --update redis

# 三步曲3:规定容器启动参数
CMD ["redis-server"]

在文件夹根目录内,使用 docker build . 命令(不要漏了最后的 .):

wuxianmimi docker-redis-image % docker build .
[+] Building 15.5s (7/7) FINISHED
=> [internal] load build definition from Dockerfile                                                                                                              0.0s
=> => transferring dockerfile: 240B                                                                                                                              0.0s
=> [internal] load .dockerignore                                                                                                                                 0.0s
=> => transferring context: 2B                                                                                                                                   0.0s
=> [internal] load metadata for docker.io/library/alpine:latest                                                                                                  5.1s
=> [1/2] FROM docker.io/library/alpine@sha256:8914eb54f968791faf6a8638949e480fef81e697984fba772b3976835194c6d4                                                   5.8s
=> => resolve docker.io/library/alpine@sha256:8914eb54f968791faf6a8638949e480fef81e697984fba772b3976835194c6d4                                                   0.0s
=> => sha256:8914eb54f968791faf6a8638949e480fef81e697984fba772b3976835194c6d4 1.64kB / 1.64kB                                                                    0.0s
=> => sha256:af06af3514c44a964d3b905b498cf6493db8f1cde7c10e078213a89c87308ba0 528B / 528B                                                                        0.0s
=> => sha256:d3156fec8bcbc7b491a4edc271a7734dcfa186fc73282d4e120eeaaf2ce95c43 1.49kB / 1.49kB                                                                    0.0s
=> => sha256:261da4162673b93e5c0e7700a3718d40bcc086dbf24b1ec9b54bca0b82300626 3.26MB / 3.26MB                                                                    5.6s
=> => extracting sha256:261da4162673b93e5c0e7700a3718d40bcc086dbf24b1ec9b54bca0b82300626                                                                         0.1s
=> [auth] library/alpine:pull token for registry-1.docker.io                                                                                                     0.0s
=> [2/2] RUN apk add --update redis                                                                                                                              4.6s
=> exporting to image                                                                                                                                            0.0s
=> => exporting layers                                                                                                                                           0.0s
=> => writing image sha256:5159f921568f4b843c002a76d29c37ca0ffbef1d284352a7b50691dd29d3fe29                                                                      0.0s

Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them

5159f921568f4b843c002a76d29c37ca0ffbef1d284352a7b50691dd29d3fe29,这一串就是我们镜像的ID。

Dockerfile 中的每条指令都会“返回”一个镜像,在基于这个镜像创建的临时容器中执行下一条指令,临时容器在指令执行完毕后会被删除,而这个容器的文件系统快照会被保存到当前指令“返回”的镜像中。

使用 docker run 命令创建并运行容器:

wuxianmimi docker-redis-image % docker run 5159f921568f4b843c002a76d29c37ca0ffbef1d284352a7b50691dd29d3fe29
1:C 07 Jan 2023 13:29:48.051 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1:C 07 Jan 2023 13:29:48.051 # Redis version=7.0.7, bits=64, commit=00000000, modified=0, pid=1, just started
1:C 07 Jan 2023 13:29:48.051 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
1:M 07 Jan 2023 13:29:48.052 * monotonic clock: POSIX clock_gettime
1:M 07 Jan 2023 13:29:48.052 * Running mode=standalone, port=6379.
1:M 07 Jan 2023 13:29:48.052 # Server initialized
1:M 07 Jan 2023 13:29:48.054 * Ready to accept connections

到这步,我们创建的第一个镜像就顺利完工了~~

但是现在有个问题,我们每次运行都要粘贴这一长串镜像ID太麻烦了,有没有什么好办法解决这个问题?

答案就是在 docker build 命令增加 -t 选项来给我们自定义镜像加标签:

wuxianmimi docker-redis-image % docker build -t wuxianmimi/redis:latest .
[+] Building 1.6s (6/6) FINISHED
=> [internal] load build definition from Dockerfile                                                                              0.0s
=> => transferring dockerfile: 37B                                                                                               0.0s
=> [internal] load .dockerignore                                                                                                 0.0s
=> => transferring context: 2B                                                                                                   0.0s
=> [internal] load metadata for docker.io/library/alpine:latest                                                                  1.5s
=> [1/2] FROM docker.io/library/alpine@sha256:8914eb54f968791faf6a8638949e480fef81e697984fba772b3976835194c6d4                   0.0s
=> CACHED [2/2] RUN apk add --update redis                                                                                       0.0s
=> exporting to image                                                                                                            0.0s
=> => exporting layers                                                                                                           0.0s
=> => writing image sha256:5159f921568f4b843c002a76d29c37ca0ffbef1d284352a7b50691dd29d3fe29                                      0.0s
=> => naming to docker.io/wuxianmimi/redis:latest                                                                                0.0s

标签的约定格式就是: [你的DockerID]/[镜像名]:[版本号]

posted @ 2025-01-14 19:49  Hbro  阅读(4)  评论(0)    收藏  举报