创建一个 Dockerfile 去运行 Redis-Server

Posted GoldenaArcher

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了创建一个 Dockerfile 去运行 Redis-Server相关的知识,希望对你有一定的参考价值。

创建一个 Dockerfile 去运行 Redis-Server

整体的流程如下:

pass provide build dockerfile docker client docker server usable image

其中Dockerfile的作用是配置与定义,其最基础的功能为:

  1. 指定一个base image
  2. 运行一些指令去安装额外的软件
  3. 制定在容器开始时会运行的命令

如题所示,在本次练手项目里,就会通过创建一个 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中的组成。

  1. FROM + node:14-alpine

    找到 node:14-alpine 这个镜像,更多景象的参考资料在这里:

    选择Alpine是因为这是一个比较小的镜像(~5MB),而且这个镜像提供了一些基本的指令。

  2. RUN apk add --update redis

    apk add --update redis 这一段就是普通的Linux的指令,这一段就是让容器去运行这一段指令,也就是下载 redis 镜像

  3. CMD ["redis-server"]

    最后这里就是运行redis server。

一些其他的内容

  1. Docker的不可变性

    Docker 在每次运行指令的时候都会创建一个新的中间镜像(intermediate container),这部分可以从console中输出的指令看到,如:

    Step 2/3 : RUN apk add --update redis
    ---> Running in b9dd14a362f2
    # ...
    Removing intermediate container b9dd14a362f2
    

    这里就会创建一个新的 hash 为b9dd14a362f2的容器,在完成了这一阶段的指令后,Docker截取这部分的snapshot,创建一个新的临时容器,再将已经用过的容器删除。

  2. 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 redisRUN apk add some-software 的顺序变了,那么redis也会重新被下载和编译。

    因此在编写Dockerfile的时机,将会变动的指令放在Dockerfile文件的末端会减少重新编译的时间。

  3. 给运行的进项加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 即可。

  4. Docker中可以使用 docker commit 去手动生成镜像……这种操作太麻烦了,我没试过,就知道可以。

以上是关于创建一个 Dockerfile 去运行 Redis-Server的主要内容,如果未能解决你的问题,请参考以下文章

创建一个 Dockerfile 去运行 Redis-Server

docker配置redis持久化

Docker运行MongoDB及Redis及ssh端口映射远程连接

如何在docker中安装redis

docker Dockerfile学习---构建redis环境

DockerFile部署lnmp+memcached+redis+mongodb开发环境for Redis