银河麒麟v10服务器版Docker部署教程-.NET 6 WebAPI-nginx-redis-python3.8

银河麒麟v10服务器版Docker部署教程

1. 前言

本教程旨在指导用户在银河麒麟v10服务器版上部署Docker,并使用Docker容器化技术部署以下服务:

  • .NET 6 WebAPI
  • Nginx
  • Redis
  • MySQL 8
  • Python 3.8 虚拟环境

所有服务均配置为开机自启动。

2. 系统环境准备

2.1 系统要求

  • 银河麒麟v10服务器版
  • 至少4GB内存
  • 至少20GB可用磁盘空间
  • 网络连接正常

2.2 系统更新

bash 复制代码
# 更新系统软件包
sudo yum update -y

3. Docker安装与配置

3.1 安装Docker

bash 复制代码
# 安装必要的依赖包
sudo yum install -y yum-utils device-mapper-persistent-data lvm2

# 添加Docker软件源
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# 安装Docker CE
sudo yum install -y docker-ce docker-ce-cli containerd.io

# 启动Docker服务
sudo systemctl start docker

# 验证Docker安装
sudo docker --version

3.2 配置防火墙

bash 复制代码
# 启动并启用firewalld服务
sudo systemctl start firewalld
sudo systemctl enable firewalld

# 允许Docker服务通过防火墙
sudo firewall-cmd --permanent --zone=public --add-service=docker

# 允许相关端口通过防火墙
sudo firewall-cmd --permanent --zone=public --add-port=80/tcp
sudo firewall-cmd --permanent --zone=public --add-port=443/tcp
sudo firewall-cmd --permanent --zone=public --add-port=3306/tcp
sudo firewall-cmd --permanent --zone=public --add-port=6379/tcp
sudo firewall-cmd --permanent --zone=public --add-port=5000/tcp
sudo firewall-cmd --permanent --zone=public --add-port=5001/tcp

# 重新加载防火墙规则
sudo firewall-cmd --reload

3.3 配置Docker开机自启动

bash 复制代码
# 启用Docker服务开机自启
sudo systemctl enable docker

# 启动Docker服务(如果尚未启动)
sudo systemctl start docker

3.4 安装Docker Compose

bash 复制代码
# 下载Docker Compose二进制文件
curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 赋予执行权限
sudo chmod +x /usr/local/bin/docker-compose

# 创建软链接
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

# 验证安装
docker-compose --version

4. 目录结构规划

bash 复制代码
# 创建项目目录结构
sudo mkdir -p /opt/docker/{mysql,redis,nginx,aspnetcore,python}
sudo chmod -R 777 /opt/docker

5. MySQL 8部署

5.1 创建MySQL配置文件

bash 复制代码
cat > /opt/docker/mysql/my.cnf << EOF
[mysqld]
user=mysql
character-set-server=utf8mb4
default_authentication_plugin=mysql_native_password
secure_file_priv=/var/lib/mysql
expire_logs_days=7
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
max_connections=1000

[client]
default-character-set=utf8mb4

[mysql]
default-character-set=utf8mb4
EOF

5.2 创建MySQL Docker Compose配置

bash 复制代码
cat > /opt/docker/mysql/docker-compose.yml << EOF
version: '3.8'
services:
  mysql:
    image: mysql:8.0
    container_name: mysql8
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: your_root_password  # 请修改为强密码
      MYSQL_USER: your_user                    # 请修改为自定义用户名
      MYSQL_PASSWORD: your_password            # 请修改为自定义密码
    ports:
      - "3306:3306"
    volumes:
      - /opt/docker/mysql/data:/var/lib/mysql
      - /opt/docker/mysql/my.cnf:/etc/mysql/conf.d/my.cnf
      - /opt/docker/mysql/logs:/var/log/mysql
    command:
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_unicode_ci
EOF

5.3 启动MySQL服务

bash 复制代码
cd /opt/docker/mysql
docker-compose up -d

6. Redis部署

6.1 创建Redis配置文件

bash 复制代码
cat > /opt/docker/redis/redis.conf << EOF
bind 0.0.0.0
port 6379
databases 16
dbfilename dump.rdb
dir /data
requirepass your_redis_password  # 请修改为强密码
maxmemory 256mb
maxmemory-policy allkeys-lru
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
EOF

6.2 创建Redis Docker Compose配置

bash 复制代码
cat > /opt/docker/redis/docker-compose.yml << EOF
version: '3.8'
services:
  redis:
    image: redis:6.2
    container_name: redis
    restart: always
    ports:
      - "6379:6379"
    volumes:
      - /opt/docker/redis/data:/data
      - /opt/docker/redis/redis.conf:/etc/redis/redis.conf
    command: redis-server /etc/redis/redis.conf
EOF

6.3 启动Redis服务

bash 复制代码
cd /opt/docker/redis
docker-compose up -d

7. Nginx部署

7.1 创建Nginx配置文件

bash 复制代码
cat > /opt/docker/nginx/nginx.conf << EOF
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    # 配置WebAPI反向代理
    server {
        listen       80;
        server_name  your_domain.com;  # 请修改为你的域名或IP

        location / {
            proxy_pass http://aspnetcore:5000;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection keep-alive;
            proxy_set_header Host $host;
            proxy_cache_bypass $http_upgrade;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }

    include /etc/nginx/conf.d/*.conf;
}
EOF

7.2 创建Nginx Docker Compose配置

bash 复制代码
cat > /opt/docker/nginx/docker-compose.yml << EOF
version: '3.8'
services:
  nginx:
    image: nginx:latest
    container_name: nginx
    restart: always
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /opt/docker/nginx/nginx.conf:/etc/nginx/nginx.conf
      - /opt/docker/nginx/html:/usr/share/nginx/html
      - /opt/docker/nginx/logs:/var/log/nginx
    depends_on:
      - aspnetcore
EOF

7.3 启动Nginx服务

bash 复制代码
cd /opt/docker/nginx
docker-compose up -d

8. .NET 6 WebAPI部署

8.1 准备.NET 6 WebAPI项目

将你的.NET 6 WebAPI项目发布到/opt/docker/aspnetcore目录:

bash 复制代码
# 示例:从Windows发布到Linux服务器
# 在Windows上执行:
dotnet publish -c Release -o ./publish

# 将publish目录下的所有文件复制到服务器的/opt/docker/aspnetcore目录

8.2 创建Dockerfile

bash 复制代码
cat > /opt/docker/aspnetcore/Dockerfile << EOF
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 5000

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["YourWebApiProject.csproj", "."]
RUN dotnet restore "./YourWebApiProject.csproj"
COPY . .
WORKDIR "/src/"
RUN dotnet build "YourWebApiProject.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "YourWebApiProject.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "YourWebApiProject.dll"]
EOF

8.3 创建Docker Compose配置

bash 复制代码
cat > /opt/docker/aspnetcore/docker-compose.yml << EOF
version: '3.8'
services:
  aspnetcore:
    build: .
    container_name: aspnetcore-webapi
    restart: always
    ports:
      - "5000:5000"
    environment:
      - ASPNETCORE_ENVIRONMENT=Production
      - ASPNETCORE_URLS=http://+:5000
      - ConnectionStrings__DefaultConnection=Server=mysql8;Database=YourDatabase;User=your_user;Password=your_password;  # 请修改数据库连接信息
    depends_on:
      - mysql8
      - redis
EOF

8.4 启动.NET 6 WebAPI服务

bash 复制代码
cd /opt/docker/aspnetcore
docker-compose up -d

9. Python 3.8虚拟环境部署

9.1 创建Python项目目录

bash 复制代码
mkdir -p /opt/docker/python/app

9.2 创建requirements.txt

bash 复制代码
cat > /opt/docker/python/app/requirements.txt << EOF
# 在此添加你的Python依赖
Flask==2.0.1
requests==2.26.0
EOF

9.3 创建Python应用示例

bash 复制代码
cat > /opt/docker/python/app/app.py << EOF
from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello():
    return "Hello from Python 3.8!"

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5001)
EOF

9.4 创建Dockerfile

bash 复制代码
cat > /opt/docker/python/Dockerfile << EOF
FROM python:3.8-slim
WORKDIR /app

# 创建虚拟环境
RUN python -m venv /venv
ENV PATH="/venv/bin:$PATH"

# 安装依赖
COPY app/requirements.txt .
RUN pip install --upgrade pip
RUN pip install -r requirements.txt

# 复制应用代码
COPY app/ .

# 启动应用
CMD ["python", "app.py"]
EOF

9.5 创建Docker Compose配置

bash 复制代码
cat > /opt/docker/python/docker-compose.yml << EOF
version: '3.8'
services:
  python:
    build: .
    container_name: python38
    restart: always
    ports:
      - "5001:5001"
    volumes:
      - /opt/docker/python/app:/app
EOF

9.6 启动Python服务

bash 复制代码
cd /opt/docker/python
docker-compose up -d

10. 整体Docker Compose配置(可选)

如果你希望使用一个统一的Docker Compose文件管理所有服务,可以创建以下配置:

bash 复制代码
cat > /opt/docker/docker-compose.yml << EOF
version: '3.8'
services:
  # MySQL服务
  mysql8:
    image: mysql:8.0
    container_name: mysql8
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: your_root_password
      MYSQL_USER: your_user
      MYSQL_PASSWORD: your_password
    ports:
      - "3306:3306"
    volumes:
      - /opt/docker/mysql/data:/var/lib/mysql
      - /opt/docker/mysql/my.cnf:/etc/mysql/conf.d/my.cnf
      - /opt/docker/mysql/logs:/var/log/mysql
    command:
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_unicode_ci

  # Redis服务
  redis:
    image: redis:6.2
    container_name: redis
    restart: always
    ports:
      - "6379:6379"
    volumes:
      - /opt/docker/redis/data:/data
      - /opt/docker/redis/redis.conf:/etc/redis/redis.conf
    command: redis-server /etc/redis/redis.conf

  # .NET 6 WebAPI服务
  aspnetcore:
    build: ./aspnetcore
    container_name: aspnetcore-webapi
    restart: always
    ports:
      - "5000:5000"
    environment:
      - ASPNETCORE_ENVIRONMENT=Production
      - ASPNETCORE_URLS=http://+:5000
      - ConnectionStrings__DefaultConnection=Server=mysql8;Database=YourDatabase;User=your_user;Password=your_password;
    depends_on:
      - mysql8
      - redis

  # Nginx服务
  nginx:
    image: nginx:latest
    container_name: nginx
    restart: always
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /opt/docker/nginx/nginx.conf:/etc/nginx/nginx.conf
      - /opt/docker/nginx/html:/usr/share/nginx/html
      - /opt/docker/nginx/logs:/var/log/nginx
    depends_on:
      - aspnetcore

  # Python服务
  python38:
    build: ./python
    container_name: python38
    restart: always
    ports:
      - "5001:5001"
    volumes:
      - /opt/docker/python/app:/app
EOF

10.1 使用整体配置启动所有服务

bash 复制代码
cd /opt/docker
docker-compose up -d

11. 开机自启动配置

所有服务已通过Docker Compose的restart: always参数配置为容器级别的开机自启。为了确保Docker服务本身在系统启动时自动运行:

bash 复制代码
# 启用Docker服务开机自启
sudo systemctl enable docker

# 验证开机自启设置
sudo systemctl is-enabled docker

11.1 配置Docker Compose服务开机自启(可选)

如果使用整体Docker Compose配置,可以创建一个systemd服务单元:

bash 复制代码
cat > /etc/systemd/system/docker-compose.service << EOF
[Unit]
Description=Docker Compose Application Service
Requires=docker.service
After=docker.service

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/opt/docker
ExecStart=/usr/local/bin/docker-compose up -d
ExecStop=/usr/local/bin/docker-compose down
TimeoutStartSec=0

[Install]
WantedBy=multi-user.target
EOF

启用并启动该服务:

bash 复制代码
sudo systemctl enable docker-compose
sudo systemctl start docker-compose

12. 服务验证

12.1 检查Docker容器状态

bash 复制代码
docker ps

12.2 访问各服务

13. 常见问题与故障排除

13.1 Docker容器无法启动

bash 复制代码
# 查看容器日志
docker logs [容器名称]

# 例如查看MySQL容器日志
docker logs mysql8

13.2 端口被占用

bash 复制代码
# 检查端口占用情况
sudo netstat -tuln | grep [端口号]

# 例如检查80端口
sudo netstat -tuln | grep 80

13.3 权限问题

bash 复制代码
# 检查目录权限
sudo ls -la /opt/docker/[服务目录]

# 修复权限
sudo chmod -R 777 /opt/docker/[服务目录]

13.4 Docker服务无法启动

bash 复制代码
# 检查Docker服务状态
sudo systemctl status docker

# 重启Docker服务
sudo systemctl restart docker

14. 总结

本教程详细介绍了在银河麒麟v10服务器版上使用Docker部署.NET 6 WebAPI、Nginx、Redis、MySQL 8和Python 3.8虚拟环境的步骤。所有服务均已配置为开机自启动,确保系统重启后服务能够自动恢复运行。

通过Docker容器化技术,各服务之间相互隔离,便于管理和维护。同时,使用Docker Compose可以简化多容器应用的部署和管理流程。

相关推荐
仪***沿8 小时前
C# 与台达 PLC 串口通讯实现实时监控
.net
武藤一雄8 小时前
C# 万字拆解线程间通讯?
后端·微软·c#·.net·.netcore·多线程
潘晓可9 小时前
Docker部署Bookstack
运维·docker·容器
赵庆明老师9 小时前
NET 10 集成Session
缓存·.net
Heavydrink9 小时前
华为云EulerOS 2.0安装docker详细教程
docker·容器·华为云
网络小白不怕黑9 小时前
Docker容器网络:从容器互联到跨主机通信
网络·docker·容器
SEO-狼术9 小时前
Detect Trends with Compact In-Cell Visuals
.net
Rysxt_9 小时前
Docker Compose 启动与停止命令完全指南
docker·容器·docker compose
吃喝不愁霸王餐APP开发者9 小时前
霸王餐API网关层缓存:Nginx Proxy Cache与Cache-Control细节
nginx·spring·缓存
赵庆明老师10 小时前
.NET 日志和监控
.net