一起搞清什么是docker(四)

内容分享8小时前发布
0 0 0

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

一起搞清什么是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:

构建和运行应用

  1. 构建镜像:
docker-compose build
  1. 启动应用:
docker-compose up -d
  1. 验证应用:
curl http://localhost:3000

# 输出:Hello, Docker! This is a Node.js app running in a container.
  1. 查看日志:
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 自动获取证书:

  1. 安装 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
  1. 更新 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
  1. 创建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;

    }

}

高级配置

  1. 多站点支持:可以通过修改 nginx 配置文件,在同一个服务器上部署多个 WordPress 站点。
  2. 缓存优化
  • 添加 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=
  1. 性能优化
  • 使用 php-fpm 容器替代默认的 php-cgi
  • 配置 nginx 缓存
  • 启用 WordPress 的 OPcache
  1. 备份策略
# 创建备份脚本

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#

© 版权声明

相关文章

暂无评论

none
暂无评论...