1/16

第五章:了解 Docker Compose

这一章要实现一个应用,当用户访问页面时,返回当前页面访问总次数。

  • 准备项目

新建文件夹,并在文件夹内创建:

package.json

{
 "name": "docker-visists",
 "version": "1.0.0",
 "description": "",
 "main": "index.js",
 "scripts": {
   "test": "echo \"Error: no test specified\" && exit 1",
   "start": "node index.js"
},
 "keywords": [],
 "author": "",
 "license": "ISC",
 "dependencies": {
   "express": "*",
   "redis": "2.8.0"
}
}

index.js

const express = require('express');
const redis = require('redis');

const app = express();
const client = redis.createClient();
client.set('visits', 0);

app.get('/', (req, res) => {
   client.get('visits', (err, visits) => {
       res.send('访问次数 ' + visits);
       client.set('visits', parseInt(visits) + 1);
  });
});

app.listen(8081, () => {
   console.log('监听8081端口中...');
});

Dockerfile

FROM node:14-alpine

WORKDIR '/app'

COPY package.json .
RUN npm install
COPY . .

CMD ["npm", "start"]

.npmrc(额外加的,提高 npm 依赖安装速度)

registry=https://registry.npmmirror.com

然后运行 docker build 命令打包镜像:

wuxianmimi docker-visists % docker build -t wuxianmimi/visits .
[+] Building 4.3s (11/11) FINISHED
=> [internal] load build definition from Dockerfile                                                                              0.0s
=> => transferring dockerfile: 159B                                                                                              0.0s
=> [internal] load .dockerignore                                                                                                 0.0s
=> => transferring context: 2B                                                                                                   0.0s
=> [internal] load metadata for docker.io/library/node:14-alpine                                                                 1.7s
=> [internal] load build context                                                                                                 0.0s
=> => transferring context: 507B                                                                                                 0.0s
=> [1/6] FROM docker.io/library/node:14-alpine@sha256:80e825b1f5ab859498a2f0f98f8197131a562906e5f8c95977057502e68ca05a           0.0s
=> CACHED [2/6] WORKDIR /app                                                                                                     0.0s
=> [3/6] COPY .npmrc .                                                                                                           0.0s
=> [4/6] COPY package.json .                                                                                                     0.0s
=> [5/6] RUN npm install                                                                                                         2.3s
=> [6/6] COPY . .                                                                                                                0.0s
=> exporting to image                                                                                                            0.1s
=> => exporting layers                                                                                                           0.1s
=> => writing image sha256:e5d5a301d20e68b4ebc59d451410ebbe9379bd2c3519acea6f1f3b6b12a9bfed                                      0.0s
=> => naming to docker.io/wuxianmimi/visits                                                                                      0.0s
  • Docker Compose

Docker Compose 是 Docker 安装时一起安装的一个命令行工具,作用是使同时启动多个容器更方便。

我们通过 docker-compose.yml 文件来配置相关信息,在这个项目中,我们需要启动两个容器,一个是 redis,另一个是我们的 Node 应用。

docker-compose.yml

# 使用的的 docker compose 文件标准
version: '3'
# 服务列表,一个容器可以理解为一个服务
services:
 # 容器1
redis-server:
   # 使用的镜像
  image: 'redis'
 # 容器2
node-app:
   # 构建当前项目
  build: .
   # 端口映射
  ports:
- "8081:8081"

services 列表中的容器,在网络层面是自动互通的,我们只需要在 Node 应用中,指明 redis 连接的 host 为 redis-server 即可,docker 会自动帮我们转发至对应名称的容器中。

  • 启动

通过命令 docker-compose up 来启动容器:

wuxianmimi docker-visists % docker-compose up
[+] Running 2/0
⠿ Container docker-visists-node-app-1     Created                                                                               0.0s
⠿ Container docker-visists-redis-server-1 Created                                                                               0.0s
Attaching to docker-visists-node-app-1, docker-visists-redis-server-1
docker-visists-redis-server-1 | 1:C 09 Jan 2023 13:17:30.111 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
docker-visists-redis-server-1 | 1:C 09 Jan 2023 13:17:30.111 # Redis version=7.0.7, bits=64, commit=00000000, modified=0, pid=1, just started
docker-visists-redis-server-1 | 1:C 09 Jan 2023 13:17:30.111 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
docker-visists-redis-server-1 | 1:M 09 Jan 2023 13:17:30.111 * monotonic clock: POSIX clock_gettime
docker-visists-redis-server-1 | 1:M 09 Jan 2023 13:17:30.112 * Running mode=standalone, port=6379.
docker-visists-redis-server-1 | 1:M 09 Jan 2023 13:17:30.112 # Server initialized
docker-visists-redis-server-1 | 1:M 09 Jan 2023 13:17:30.114 * Loading RDB produced by version 7.0.7
docker-visists-redis-server-1 | 1:M 09 Jan 2023 13:17:30.114 * RDB age 3 seconds
docker-visists-redis-server-1 | 1:M 09 Jan 2023 13:17:30.114 * RDB memory usage when created 0.92 Mb
docker-visists-redis-server-1 | 1:M 09 Jan 2023 13:17:30.114 * Done loading RDB, keys loaded: 1, keys expired: 0.
docker-visists-redis-server-1 | 1:M 09 Jan 2023 13:17:30.114 * DB loaded from disk: 0.000 seconds
docker-visists-redis-server-1 | 1:M 09 Jan 2023 13:17:30.114 * Ready to accept connections
docker-visists-node-app-1     |
docker-visists-node-app-1     | > docker-visists@1.0.0 start /app
docker-visists-node-app-1     | > node index.js
docker-visists-node-app-1     |
docker-visists-node-app-1     | 监听8081端口中...

浏览器访问 localhost:8081 页面:

imgnode-app 应用

需要停止时,通过 docker-compose down 来停止容器并移除容器与网络:

wuxianmimi docker-visists % docker-compose down
[+] Running 3/0
⠿ Container docker-visists-node-app-1     Removed                                                                               0.0s
⠿ Container docker-visists-redis-server-1 Removed                                                                               0.0s
⠿ Network docker-visists_default           Removed                                                                               0.1s
  • 自动重启容器

目前为止,如果我们的应用发生错误了,容器就停止了,那如何让容器关闭时自动重启呢?

可以在 docker-compose.yml 中配置 restart 属性:

# 使用的的 docker compose 文件标准
version: '3'
# 服务列表,一个容器可以理解为一个服务
services:
 # 容器1
redis-server:
   # 使用的镜像
  image: 'redis'
 # 容器2
node-app:
   # 程序永远会在停止时自动重启
  restart: always
   # 构建当前项目
  build: .
   # 端口映射
  ports:
    - "8081:8081"

restart 一共有四种策略

imgrestart 策略

  • docker-compose ps

docker ps 类似,docker-compose ps 可以查看容器的状态(不只是正在运行的):

wuxianmimi docker-visists % docker-compose ps
NAME                           COMMAND                 SERVICE             STATUS             PORTS
docker-visists-node-app-1       "docker-entrypoint.s…"   node-app           exited (0)
docker-visists-redis-server-1   "docker-entrypoint.s…"   redis-server       exited (0)

⚠️:与 docker 命令不同,docker-compose 命令,都需要目录内有 docker-compose.yml 文件,否则会报错。

posted @ 2025-01-16 20:18  Hbro  阅读(5)  评论(0)    收藏  举报