创建一个 Dockerfile 去运行 Redis-Server
Posted GoldenaArcher
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了创建一个 Dockerfile 去运行 Redis-Server相关的知识,希望对你有一定的参考价值。
创建一个 Dockerfile 去运行 Redis-Server
整体的流程如下:
其中Dockerfile的作用是配置与定义,其最基础的功能为:
- 指定一个base image
- 运行一些指令去安装额外的软件
- 制定在容器开始时会运行的命令
如题所示,在本次练手项目里,就会通过创建一个 Dockerfile 去运行 redis-server。
完整的Dockerfile如下:
docker file:
# use an existing image
FROM node:14-alpine
# download and install dependency
RUN apk add --update redis
# tell image what to do as a container
CMD ["redis-server"]
运行结果如下:
➜ redis-image docker build .
Sending build context to Docker daemon 2.048kB
Step 1/3 : FROM node:14-alpine
14-alpine: Pulling from library/node
213ec9aee27d: Already exists
3af31e9dbfcf: Pull complete
c60ddf63b622: Pull complete
16677254a57a: Pull complete
Digest: sha256:0a37794193aa27ba8af16a2da0998a3e0c551fcc4ebec2ce95b1615032daf820
Status: Downloaded newer image for node:14-alpine
---> 798752c1e2a0
Step 2/3 : RUN apk add --update redis
---> Running in b9dd14a362f2
fetch https://dl-cdn.alpinelinux.org/alpine/v3.16/main/x86_64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.16/community/x86_64/APKINDEX.tar.gz
(1/1) Installing redis (7.0.5-r0)
Executing redis-7.0.5-r0.pre-install
Executing redis-7.0.5-r0.post-install
Executing busybox-1.35.0-r17.trigger
OK: 11 MiB in 17 packages
Removing intermediate container b9dd14a362f2
---> da585159b2fe
Step 3/3 : CMD ["redis-server"]
---> Running in c186e4ee809a
Removing intermediate container c186e4ee809a
---> e083ffd9b5b1
Successfully built e083ffd9b5b1
Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them
以及:
➜ redis-image docker run e083ffd9b5b1
1:C 04 Oct 2022 17:20:51.467 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1:C 04 Oct 2022 17:20:51.467 # Redis version=7.0.5, bits=64, commit=7658871b, modified=0, pid=1, just started
1:C 04 Oct 2022 17:20:51.467 # 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 04 Oct 2022 17:20:51.467 * monotonic clock: POSIX clock_gettime
1:M 04 Oct 2022 17:20:51.468 * Running mode=standalone, port=6379.
1:M 04 Oct 2022 17:20:51.468 # Server initialized
1:M 04 Oct 2022 17:20:51.470 * Ready to accept connections
^C1:signal-handler (1664904055) Received SIGINT scheduling shutdown...
1:signal-handler (1664904055) You insist... exiting now.
➜ redis-image
指令在两个代码部分的第一句,剩下的都是运行结果。
Dockerfile 的组成
在具体说组成之前,先说一下Dockerfile中指令的组成:instruction(指示) + arguments(参数),如FROM + node:14-alpine
。
下面解释一下这个Dockerfile中的组成。
-
FROM + node:14-alpine
找到 node:14-alpine 这个镜像,更多景象的参考资料在这里:
-
所有Node 的镜像
-
https://hub.docker.com/_/alpine
所有Alpine的镜像。
选择Alpine是因为这是一个比较小的镜像(~5MB),而且这个镜像提供了一些基本的指令。
-
-
RUN apk add --update redis
apk add --update redis
这一段就是普通的Linux的指令,这一段就是让容器去运行这一段指令,也就是下载 redis 镜像 -
CMD ["redis-server"]
最后这里就是运行redis server。
一些其他的内容
-
Docker的不可变性
Docker 在每次运行指令的时候都会创建一个新的中间镜像(intermediate container),这部分可以从console中输出的指令看到,如:
Step 2/3 : RUN apk add --update redis ---> Running in b9dd14a362f2 # ... Removing intermediate container b9dd14a362f2
这里就会创建一个新的 hash 为b9dd14a362f2的容器,在完成了这一阶段的指令后,Docker截取这部分的snapshot,创建一个新的临时容器,再将已经用过的容器删除。
-
Docker会从缓存中进行重构
如果Docker指令没有修改的话,Docker会挺智能地从之前的缓存拉去进度。但是如果Docker指令变了,那么Docker就会重新下载、编译已经运行过的指令。
如上面的Docker文件:
# use an existing image FROM node:14-alpine # download and install dependency RUN apk add --update redis RUN apk add some-software # tell image what to do as a container CMD ["redis-server"]
如果 some-software 变成了 some-other-software,
RUN apk add --update redis
这一段不会重新被下载和编译,Docker会从RUN apk add some-other-software
这一段开始重新下载编译。如果
RUN apk add --update redis
和RUN apk add some-software
的顺序变了,那么redis也会重新被下载和编译。因此在编写Dockerfile的时机,将会变动的指令放在Dockerfile文件的末端会减少重新编译的时间。
-
给运行的进项加tag
目前来说,每次想要运行Docker镜像的话,那么就需要运行镜像的hash id,这个每次都会变,稍微会有一点麻烦。
Docker提供了一个可以加tag的方式,这样就可以运行一个固定的名称。运行指令为:
dockerid/repo/projectname:version
,运行结果如下:➜ redis-image docker build -t goldenaarcher/redis:latest . Sending build context to Docker daemon 2.048kB Step 1/3 : FROM node:14-alpine ---> 798752c1e2a0 Step 2/3 : RUN apk add --update redis ---> Using cache ---> da585159b2fe Step 3/3 : CMD ["redis-server"] ---> Using cache ---> e083ffd9b5b1 Successfully built e083ffd9b5b1 Successfully tagged goldenaarcher/redis:latest Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them ➜ redis-image docker run goldenaarcher/redis 1:C 04 Oct 2022 18:30:42.009 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 1:C 04 Oct 2022 18:30:42.009 # Redis version=7.0.5, bits=64, commit=7658871b, modified=0, pid=1, just started 1:C 04 Oct 2022 18:30:42.009 # 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 04 Oct 2022 18:30:42.010 * monotonic clock: POSIX clock_gettime 1:M 04 Oct 2022 18:30:42.011 * Running mode=standalone, port=6379. 1:M 04 Oct 2022 18:30:42.012 # Server initialized 1:M 04 Oct 2022 18:30:42.012 * Ready to accept connections ^C1:signal-handler (1664908244) Received SIGINT scheduling shutdown... 1:M 04 Oct 2022 18:30:44.841 # User requested shutdown... 1:M 04 Oct 2022 18:30:44.841 * Saving the final RDB snapshot before exiting. 1:M 04 Oct 2022 18:30:44.845 * DB saved on disk 1:M 04 Oct 2022 18:30:44.845 # Redis is now ready to exit, bye bye...
其名规则是Docker约定俗成的,在运行的时候,如果运行最新版本的话,可以省略
latest
这一段,直接运行dockerid/repo/projectname
即可。 -
Docker中可以使用
docker commit
去手动生成镜像……这种操作太麻烦了,我没试过,就知道可以。
以上是关于创建一个 Dockerfile 去运行 Redis-Server的主要内容,如果未能解决你的问题,请参考以下文章
创建一个 Dockerfile 去运行 Redis-Server
Docker运行MongoDB及Redis及ssh端口映射远程连接