1/14
第三章:了解 Dockerfile
基本上围绕着如何书写 Dockerfile,以实现一个 redis-server 为例。
-
Dockerfile
我们创建自定义镜像从 Dockerfile 开始。
Dockerfile 是一个文本文件,在里面添加我们的配置信息,这些信息定义了容器的行为方式。
Dockerfile 文件经由 Docker Client 传给 Docker Server,最后由 Docker Server 解析并构建镜像。
Dockerfile 中添加的配置项一般是三步曲(工作流)
-
规定基础镜像
-
运行命令来安装必要的依赖、程序
-
规定容器启动参数
创建一个文件夹,并在文件夹内创建 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]/[镜像名]:[版本号]

浙公网安备 33010602011771号