银河麒麟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 访问各服务
- Nginx: http://服务器IP
- .NET 6 WebAPI: http://服务器IP:5000 或通过Nginx反向代理访问
- Python应用: http://服务器IP:5001
- MySQL: 使用MySQL客户端连接服务器IP:3306
- Redis: 使用Redis客户端连接服务器IP:6379
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可以简化多容器应用的部署和管理流程。