這里簡單介紹使用 Docker Compose 來運行 Redis 服務(wù),并通過掛載卷進(jìn)行數(shù)據(jù)持久化。關(guān)于 Docker Compose,建議看官方文檔。
安裝 Docker Compose
這一部分的前提是已經(jīng)安裝好了 Docker。
先安裝 EPEL 庫:
yum install epel-release
然后安裝 python-pip:
yum install -y python-pip
使用 pip 安裝 Docker Compose:
pip install docker-compose
升級 CentOS 7 上的所有 Python 包:
yum upgrade python*
檢查 Docker Compose 版本,驗證是否成功安裝:
docker-compose -v
如果打印出了如下信息,說明完成安裝:
docker'compose version 1.16.1, build 6d1ac219
Docker Compose 文件
在 docker-compose.yml 文件中定義容器如何運行:
version: '3'
services:
Redis:
image: "redis:5.0-rc"
container_name: redis
command: /usr/local/etc/redis/redis.conf
volumes:
- ./redis/redis.conf:/usr/local/etc/redis/redis.conf
- ./redis/data:/data
ports:
- "127.0.0.1:6379:6379"
privileged: true
restart: always
對以上內(nèi)容簡單說明:
version:Compose 文件格式版本號。
services:要構(gòu)建的服務(wù)名稱,這里是 Redis,即生產(chǎn)環(huán)境中的容器。服務(wù)只運行一個鏡像,它規(guī)定鏡像運行的方式 - 應(yīng)該使用哪些端口,應(yīng)該運行多少個容器副本,等等。
image:指定從哪個鏡像構(gòu)建此容器,這里使用的是官方鏡像。
container_name:容器名稱。
-
command:容器啟動后執(zhí)行的命令。這里是指定配置文件,雖然官方鏡像的 dockerfile 里面已經(jīng)指定了
CMD為redis-server,這里指定配置文件位置的命令會覆蓋CMD的命令。看了下 dockerfile 中指定的
docker-entrypoint.sh文件,里面運行了redis-server命令,command 標(biāo)簽后面的命令會追加到此命令。最終效果就是執(zhí)行了:redis-server /usr/local/etc/redis/redis.conf命令。 -
volumes:
第一行是將宿主機(jī)上指定的配置文件掛載到 redis 默認(rèn)的配置文件上以覆蓋它。
第二行是將容器中的目錄映射到指定的宿主機(jī)目錄,以做數(shù)據(jù)持久化。
ports:將容器的 6379 端口映射到宿主機(jī)對應(yīng)端口,以便容器外部訪問。
restart:容器總是會重啟。
運行容器
執(zhí)行命令 docker-compose up -d,運行 redis 容器。
由于之前沒有看 dockerfile 的內(nèi)容,是按照 macOS 中的目錄 /usr/local/var/db/redis 掛載的持久卷,執(zhí)行此命令后,容器總是重啟,查看日志發(fā)現(xiàn)以下信息:
[offset 0] Unexpected EOF reading RDB file
[additional info] While doing: start
[additional info] Reading type 0 (string)
[info] 0 keys read
[info] 0 expires
[info] 0 already expired
1:C 14 Aug 2018 04:22:25.052 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1:C 14 Aug 2018 04:22:25.052 # Redis version=4.9.104, bits=64, commit=00000000, modified=0, pid=1, just started
1:C 14 Aug 2018 04:22:25.052 # Configuration loaded
1:M 14 Aug 2018 04:22:25.053 * Running mode=standalone, port=6379.
1:M 14 Aug 2018 04:22:25.053 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
1:M 14 Aug 2018 04:22:25.053 # Server initialized
1:M 14 Aug 2018 04:22:25.053 # Short read or OOM loading DB. Unrecoverable error, aborting now.
1:M 14 Aug 2018 04:22:25.053 # Internal error in RDB reading function at rdb.c:2055 -> Unexpected EOF reading RDB file
[offset 0] Checking RDB file dump.rdb
后來查看 dockerfile 文件,其中 VOLUME 和 WORKDIR 指定的目錄是 /data。修改后,停止并刪除容器,刪除宿主機(jī) ./redis/data 目錄中的內(nèi)容,再重新運行容器,正常工作。