1/16
这一章要实现一个应用,当用户访问页面时,返回当前页面访问总次数。
-
准备项目
新建文件夹,并在文件夹内创建:
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
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 页面:
node-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
restart 一共有四种策略
restart 策略
-
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)

浙公网安备 33010602011771号