上文讲了Docker的使用方法,这次讲实战案例。有兴趣的可以往下看。

五、实战案例:Web 应用与数据库部署
5.1 Node.js Web 应用容器化部署
让我们通过一个完整的 Node.js Express 应用案例,来演示如何使用 Docker 进行容器化部署。
应用准备:
假设我们有一个简单的 Node.js Express 应用,目录结构如下:
node-app/
├── app.js
├── package.json
├── Dockerfile
└── docker-compose.yml
app.js内容:
const express = require('express');
const app = express();
app.get('/', (req, res) => {
res.send('Hello, Docker! This is a Node.js app running in a container.');
});
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`Server running on port ${PORT}`);
});
package.json内容:
{
"name": "node-docker-app",
"version": "1.0.0",
"dependencies": {
"express": "^4.18.2"
}
}
Dockerfile 编写:
使用多阶段构建来优化镜像:
# 第一阶段:构建阶段
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json .
RUN npm install
COPY . .
RUN npm run build # 如果有构建步骤
# 第二阶段:运行阶段
FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/package*.json .
COPY --from=builder /app/node\_modules ./node\_modules
COPY --from=builder /app/dist ./dist # 如果有构建输出
COPY app.js .
EXPOSE 3000
ENV NODE\_ENV production
CMD ["node", "app.js"]
docker-compose.yml 配置:
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
environment:
- NODE\_ENV=production
- PORT=3000
restart: unless-stopped
# 可以添加其他服务,如数据库
# db:
# image: mongo:latest
# volumes:
# - db\_data:/data/db
# volumes:
# db\_data:
构建和运行应用:
- 构建镜像:
docker-compose build
- 启动应用:
docker-compose up -d
- 验证应用:
curl http://localhost:3000
# 输出:Hello, Docker! This is a Node.js app running in a container.
- 查看日志:
docker-compose logs -f
开发环境配置:
在开发过程中,我们一般需要实时更新代码。可以使用卷挂载来实现:
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
environment:
- NODE\_ENV=development
- PORT=3000
volumes:
- .:/app # 挂载当前目录到容器
- /app/node\_modules # 排除node\_modules目录
restart: unless-stopped
这样,当我们修改本地代码时,容器内的代码会自动更新,无需重新构建镜像。
5.2 MySQL 数据库容器部署
数据库是大多数应用的核心组件,正确部署和管理数据库容器至关重大。
单实例 MySQL 部署:
使用 Docker 部署 MySQL 的最简单方式:
docker run -d \
--name mysql \
-p 3306:3306 \
-e MYSQL\_ROOT\_PASSWORD=your\_password \
-e MYSQL\_DATABASE=myapp\_db \
-e MYSQL\_USER=myapp\_user \
-e MYSQL\_PASSWORD=user\_password \
mysql:8.0
使用数据卷实现持久化:
为了避免数据丢失,必须使用数据卷:
# 创建数据卷
docker volume create mysql\_data
# 使用数据卷启动MySQL
docker run -d \
--name mysql \
-p 3306:3306 \
-v mysql\_data:/var/lib/mysql \
-e MYSQL\_ROOT\_PASSWORD=your\_password \
mysql:8.0
配置文件挂载:
如果需要自定义 MySQL 配置,可以挂载配置文件:
# 在宿主机创建配置目录
mkdir -p /etc/mysql/conf.d
# 创建my.cnf配置文件
cat > /etc/mysql/conf.d/my.cnf <<EOF
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4\_unicode\_ci
EOF
# 挂载配置文件
docker run -d \
--name mysql \
-p 3306:3306 \
-v mysql\_data:/var/lib/mysql \
-v /etc/mysql/conf.d:/etc/mysql/conf.d \
-e MYSQL\_ROOT\_PASSWORD=your\_password \
mysql:8.0
主从复制部署:
使用 docker-compose 部署 MySQL 主从复制:
version: '3.8'
services:
mysql-master:
image: mysql:8.0
hostname: mysql-master
volumes:
- mysql-master-data:/var/lib/mysql
- ./master.cnf:/etc/mysql/conf.d/master.cnf
environment:
- MYSQL\_ROOT\_PASSWORD=secret
- MYSQL\_DATABASE=test
- MYSQL\_USER=slave
- MYSQL\_PASSWORD=slave\_password
networks:
- mysql-network
mysql-slave:
image: mysql:8.0
hostname: mysql-slave
volumes:
- mysql-slave-data:/var/lib/mysql
- ./slave.cnf:/etc/mysql/conf.d/slave.cnf
environment:
- MYSQL\_ROOT\_PASSWORD=secret
- MYSQL\_DATABASE=test
networks:
- mysql-network
networks:
mysql-network:
volumes:
mysql-master-data:
mysql-slave-data:
master.cnf内容:
[mysqld]
server-id=1
log-bin=mysql-bin
binlog-format=ROW
slave.cnf内容:
[mysqld]
server-id=2
relay-log=relay-log
read-only=1
启动后,需要在主库创建复制用户并在从库配置复制:
-- 在主库执行
CREATE USER 'slave'@'%' IDENTIFIED BY 'slave\_password';
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%';
FLUSH PRIVILEGES;
-- 在从库执行
CHANGE MASTER TO
MASTER\_HOST='mysql-master',
MASTER\_USER='slave',
MASTER\_PASSWORD='slave\_password',
MASTER\_LOG\_FILE='mysql-bin.000001',
MASTER\_LOG\_POS=0;
START SLAVE;
5.3 WordPress 完整解决方案
WordPress 是最流行的博客和内容管理系统之一。使用 Docker 可以轻松部署一个完整的 WordPress 站点。
使用 docker-compose 一键部署:
version: '3.8'
services:
db:
image: mysql:8.0
volumes:
- db\_data:/var/lib/mysql
environment:
- MYSQL\_ROOT\_PASSWORD=your\_password
- MYSQL\_DATABASE=wordpress
- MYSQL\_USER=wordpress
- MYSQL\_PASSWORD=wordpress\_password
wordpress:
depends\_on:
- db
image: wordpress:latest
ports:
- "80:80"
- "443:443"
volumes:
- wordpress\_data:/var/www/html
- ./wordpress.conf:/etc/nginx/conf.d/wordpress.conf
environment:
- WORDPRESS\_DB\_HOST=db:3306
- WORDPRESS\_DB\_USER=wordpress
- WORDPRESS\_DB\_PASSWORD=wordpress\_password
- WORDPRESS\_DB\_NAME=wordpress
restart: unless-stopped
volumes:
db\_data:
wordpress\_data:
配置 HTTPS 支持:
要启用 HTTPS,需要配置 SSL 证书。可以使用 Let's Encrypt 自动获取证书:
- 安装 certbot:
docker run -it --rm \
--name certbot \
-v "/etc/letsencrypt:/etc/letsencrypt" \
-v "/var/lib/letsencrypt:/var/lib/letsencrypt" \
certbot/certbot certonly --webroot \
--webroot-path=/var/www/html \
-d yourdomain.com
- 更新 docker-compose.yml,添加 SSL 配置:
wordpress:
# ...其他配置
volumes:
- ./wordpress.conf:/etc/nginx/conf.d/wordpress.conf
- /etc/letsencrypt/live/yourdomain.com/fullchain.pem:/etc/ssl/certs/ssl-cert-snakeoil.pem
- /etc/letsencrypt/live/yourdomain.com/privkey.pem:/etc/ssl/private/ssl-cert-snakeoil.key
- 创建wordpress.conf配置文件:
server {
listen 80;
server\_name yourdomain.com;
return 301 https://$server\_name$request\_uri;
}
server {
listen 443 ssl;
server\_name yourdomain.com;
ssl\_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem;
ssl\_certificate\_key /etc/ssl/private/ssl-cert-snakeoil.key;
root /var/www/html;
index index.php;
location / {
try\_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi\_pass unix:/run/php/php8.2-fpm.sock;
}
}
高级配置:
- 多站点支持:可以通过修改 nginx 配置文件,在同一个服务器上部署多个 WordPress 站点。
- 缓存优化:
- 添加 Redis 缓存:
redis:
image: redis:latest
volumes:
- redis\_data:/data
networks:
- wordpress\_network
wordpress:
# ...
environment:
- WP\_REDIS\_HOST=redis
- WP\_REDIS\_PORT=6379
- WP\_REDIS\_PASSWORD=
- 性能优化:
- 使用 php-fpm 容器替代默认的 php-cgi
- 配置 nginx 缓存
- 启用 WordPress 的 OPcache
- 备份策略:
# 创建备份脚本
cat > backup.sh <<EOF
#!/bin/bash
DATE=$(date +%Y%m%d)
docker run --rm \
--volumes-from mysql \
-v $(pwd)/backups:/backups \
alpine \
tar czvf /backups/mysql\_backup\_$DATE.tar.gz /var/lib/mysql
docker run --rm \
--volumes-from wordpress \
-v $(pwd)/backups:/backups \
alpine \
tar czvf /backups/wordpress\_backup\_$DATE.tar.gz /var/www/html
EOF
chmod +x backup.sh
下一篇将会讲个角色的使用场景介绍,有兴趣的可以收藏关注,谢谢!
#docker#
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...





