1. 环境准备与系统检查
在CentOS 7上部署Docker容器环境前,必须确保系统满足基础运行条件。我通常会先执行cat /etc/redhat-release确认系统版本,CentOS 7.6及以上版本能获得更好的兼容性。内存建议至少2GB,生产环境推荐4GB以上,可通过free -h快速查看。
关键提示:部署前务必检查内核版本(uname -r),3.10.0-514以上内核才能稳定运行Docker CE。我曾遇到过3.10.0-123版本导致容器网络异常的问题,升级内核后解决。
存储配置需要特别注意:
- 根分区剩余空间建议20GB以上(df -h)
- 关闭SELinux(setenforce 0 && sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config)
- 防火墙放行必要端口(firewall-cmd --zone=public --add-port=2375/tcp --permanent)
以下是典型环境检查清单:
| 检查项 | 命令 | 预期结果 |
|---|---|---|
| 系统版本 | cat /etc/redhat-release | CentOS Linux release 7.x |
| 内核版本 | uname -r | ≥3.10.0-514 |
| 内存容量 | free -h | ≥2GB |
| 交换分区 | swapon --show | 存在且≥1GB |
| 存储空间 | df -h / | ≥20GB可用 |
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Docker引擎安装与优化
2.1 官方源安装Docker CE
CentOS 7的默认yum源中的docker版本较旧,推荐使用官方仓库:
bash复制sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum makecache fast
sudo yum install -y docker-ce docker-ce-cli containerd.io
安装后启动服务并设置开机自启:
bash复制sudo systemctl start docker
sudo systemctl enable docker
验证安装成功的正确姿势:
bash复制sudo docker run --rm hello-world
这个测试容器会自动下载镜像并输出欢迎信息,最后自动删除容器本身(--rm参数作用)。
2.2 国内镜像加速配置
直接连接Docker Hub速度不稳定,需要配置国内镜像加速器。这是我常用的阿里云加速配置(需替换为自己的专属加速地址):
bash复制sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://{your-id}.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
配置要点解析:
- registry-mirrors:镜像加速地址
- native.cgroupdriver:与systemd集成
- log-driver:日志轮转策略
- storage-driver:推荐overlay2文件系统
2.3 磁盘空间管理策略
Docker默认将镜像存储在/var/lib/docker,随着使用可能耗尽磁盘空间。建议采用以下策略:
- 使用独立分区挂载到/var/lib/docker
- 定期清理无用资源:
bash复制# 删除所有停止的容器
docker container prune -f
# 删除所有未被使用的镜像
docker image prune -a -f
# 删除构建缓存
docker builder prune -f
- 设置日志轮转(前文daemon.json已配置)
3. Redis容器化部署实战
3.1 单节点Redis部署
使用官方Redis镜像快速部署:
bash复制docker run -d --name redis-server \
-p 6379:6379 \
-v /data/redis:/data \
--restart unless-stopped \
redis:6.2-alpine \
redis-server --appendonly yes
参数详解:
- -p 6379:6379:端口映射
- -v /data/redis:/data:数据持久化目录
- --restart unless-stopped:自动重启策略
- redis-server --appendonly yes:启用AOF持久化
验证Redis运行状态:
bash复制docker exec -it redis-server redis-cli ping
# 应返回 PONG
3.2 生产环境配置建议
对于生产环境,需要更完善的配置方案:
- 创建自定义配置文件redis.conf:
conf复制bind 0.0.0.0
protected-mode yes
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize no
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile ""
databases 16
always-show-logo no
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /data
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
replica-priority 100
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
stream-node-max-bytes 4096
stream-node-max-entries 100
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
- 使用配置启动容器:
bash复制docker run -d --name redis-prod \
-p 6379:6379 \
-v /data/redis/conf:/usr/local/etc/redis \
-v /data/redis/data:/data \
--restart unless-stopped \
--memory 1g \
--cpus 2 \
redis:6.2-alpine \
redis-server /usr/local/etc/redis/redis.conf
3.3 性能调优经验
根据我的实战经验,Redis性能优化有几个关键点:
- 内存分配策略:
bash复制# 在redis.conf中添加
maxmemory 2gb
maxmemory-policy allkeys-lru
- 网络参数优化:
bash复制sysctl -w net.core.somaxconn=65535
sysctl -w vm.overcommit_memory=1
echo never > /sys/kernel/mm/transparent_hugepage/enabled
- 监控方案建议:
bash复制docker run -d --name redis-exporter \
-p 9121:9121 \
oliver006/redis_exporter \
--redis.addr redis://redis-prod:6379
4. PostgreSQL容器化部署
4.1 基础部署方案
使用官方PostgreSQL镜像部署:
bash复制docker run -d --name postgresql \
-p 5432:5432 \
-e POSTGRES_PASSWORD=mysecretpassword \
-v /data/postgresql:/var/lib/postgresql/data \
--restart unless-stopped \
postgres:13-alpine
环境变量说明:
- POSTGRES_USER:默认用户(默认为postgres)
- POSTGRES_PASSWORD:必填项
- POSTGRES_DB:初始数据库名(默认为POSTGRES_USER值)
- PGDATA:数据目录(默认为/var/lib/postgresql/data)
4.2 生产级配置
生产环境需要更完善的配置方案:
- 创建自定义配置文件postgresql.conf:
conf复制listen_addresses = '*'
max_connections = 200
shared_buffers = 512MB
effective_cache_size = 2GB
work_mem = 16MB
maintenance_work_mem = 128MB
random_page_cost = 1.1
effective_io_concurrency = 200
wal_level = replica
synchronous_commit = on
wal_buffers = 16MB
checkpoint_timeout = 15min
checkpoint_completion_target = 0.9
max_wal_size = 2GB
min_wal_size = 1GB
archive_mode = off
max_wal_senders = 0
hot_standby = off
log_destination = 'stderr'
logging_collector = on
log_directory = 'pg_log'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_truncate_on_rotation = on
log_rotation_age = 1d
log_rotation_size = 0
log_min_messages = warning
log_min_error_statement = error
log_min_duration_statement = 1000
log_checkpoints = on
log_connections = on
log_disconnections = on
log_duration = off
log_line_prefix = '%m [%p] '
log_lock_waits = on
log_statement = 'none'
log_temp_files = 0
track_activities = on
track_counts = on
track_io_timing = on
track_functions = all
shared_preload_libraries = 'pg_stat_statements'
pg_stat_statements.max = 10000
pg_stat_statements.track = all
- 启动容器时加载配置:
bash复制docker run -d --name postgresql-prod \
-p 5432:5432 \
-e POSTGRES_PASSWORD=ComplexP@ssw0rd \
-v /data/postgresql/conf:/etc/postgresql \
-v /data/postgresql/data:/var/lib/postgresql/data \
-v /data/postgresql/logs:/var/log/postgresql \
--restart unless-stopped \
--memory 4g \
--cpus 4 \
postgres:13-alpine \
-c config_file=/etc/postgresql/postgresql.conf
4.3 日常维护技巧
- 备份策略:
bash复制# 单库备份
docker exec postgresql-prod pg_dump -U postgres dbname > backup.sql
# 全库备份
docker exec postgresql-prod pg_dumpall -U postgres > alldb.sql
# 定时任务配置(每天2点全量备份)
0 2 * * * docker exec postgresql-prod pg_dumpall -U postgres | gzip > /backups/postgresql-$(date +\%Y\%m\%d).sql.gz
- 性能监控方案:
bash复制docker run -d --name pgadmin \
-p 8080:80 \
-e PGADMIN_DEFAULT_EMAIL=admin@example.com \
-e PGADMIN_DEFAULT_PASSWORD=AdminP@ss \
--restart unless-stopped \
dpage/pgadmin4
- 常见问题处理:
sql复制-- 连接数爆满处理
SELECT pg_terminate_backend(pid) FROM pg_stat_activity
WHERE state = 'idle' AND pid <> pg_backend_pid();
-- 索引使用分析
SELECT * FROM pg_stat_all_indexes WHERE schemaname = 'public';
-- 长事务查询
SELECT pid, now() - xact_start AS duration, query
FROM pg_stat_activity
WHERE state IN ('idle in transaction', 'active')
ORDER BY duration DESC;
5. 容器编排与资源管理
5.1 使用Docker Compose统一管理
创建docker-compose.yml文件统一管理服务:
yaml复制version: '3.8'
services:
redis:
image: redis:6.2-alpine
container_name: redis
ports:
- "6379:6379"
volumes:
- /data/redis/data:/data
- /data/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf
command: redis-server /usr/local/etc/redis/redis.conf
restart: unless-stopped
environment:
- TZ=Asia/Shanghai
deploy:
resources:
limits:
cpus: '1'
memory: 1G
postgres:
image: postgres:13-alpine
container_name: postgres
ports:
- "5432:5432"
volumes:
- /data/postgresql/data:/var/lib/postgresql/data
- /data/postgresql/conf:/etc/postgresql
- /data/postgresql/logs:/var/log/postgresql
environment:
- POSTGRES_PASSWORD=ComplexP@ssw0rd
- TZ=Asia/Shanghai
restart: unless-stopped
deploy:
resources:
limits:
cpus: '2'
memory: 2G
pgadmin:
image: dpage/pgadmin4
container_name: pgadmin
ports:
- "8080:80"
environment:
- PGADMIN_DEFAULT_EMAIL=admin@example.com
- PGADMIN_DEFAULT_PASSWORD=AdminP@ss
restart: unless-stopped
启动服务栈:
bash复制docker-compose up -d
5.2 资源限制与监控
- 容器资源限制:
bash复制# CPU限制示例
docker update --cpus 2 redis-server
# 内存限制示例
docker update --memory 1g --memory-swap 2g postgresql-prod
- 监控方案:
bash复制# 安装cAdvisor
docker run -d \
--name=cadvisor \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:ro \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--volume=/dev/disk/:/dev/disk:ro \
--publish=8081:8080 \
--restart unless-stopped \
google/cadvisor:latest
访问http://服务器IP:8081查看容器资源使用情况。
5.3 日志集中管理方案
- 配置json-file日志驱动(前文daemon.json已配置)
- 使用logrotate管理日志:
bash复制sudo tee /etc/logrotate.d/docker <<-'EOF'
/var/lib/docker/containers/*/*.log {
rotate 7
daily
compress
delaycompress
missingok
copytruncate
}
EOF
- ELK方案部署:
bash复制docker run -d --name elasticsearch \
-p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
--restart unless-stopped \
docker.elastic.co/elasticsearch/elasticsearch:7.14.0
docker run -d --name kibana \
-p 5601:5601 \
--link elasticsearch:elasticsearch \
--restart unless-stopped \
docker.elastic.co/kibana/kibana:7.14.0
docker run -d --name logstash \
-p 5000:5000 \
-v /path/to/logstash.conf:/usr/share/logstash/pipeline/logstash.conf \
--link elasticsearch:elasticsearch \
--restart unless-stopped \
docker.elastic.co/logstash/logstash:7.14.0
6. 安全加固实践
6.1 Docker安全配置
- 启用用户命名空间隔离:
bash复制sudo tee /etc/docker/daemon.json <<-'EOF'
{
"userns-remap": "default"
}
EOF
sudo systemctl restart docker
- 限制容器能力:
bash复制docker run -d --cap-drop ALL --cap-add NET_BIND_SERVICE nginx
- 只读根文件系统:
bash复制docker run -d --read-only -v /data/redis:/data redis
6.2 Redis安全加固
- 密码保护:
bash复制# 在redis.conf中添加
requirepass StrongPassword123
- 禁用危险命令:
bash复制rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command CONFIG ""
rename-command SHUTDOWN SHUTDOWN_MENOT
- 网络隔离:
bash复制docker network create redis-net
docker run -d --network redis-net --name redis-secure redis
6.3 PostgreSQL安全加固
- 密码复杂度策略:
sql复制ALTER SYSTEM SET password_encryption = 'scram-sha-256';
CREATE ROLE app_user WITH LOGIN PASSWORD 'ComplexP@ss123' VALID UNTIL '2023-12-31';
- 连接限制:
sql复制-- pg_hba.conf配置示例
# TYPE DATABASE USER ADDRESS METHOD
host all all 10.0.0.0/8 scram-sha-256
host all all 172.16.0.0/12 scram-sha-256
host all all 192.168.0.0/16 scram-sha-256
- 审计配置:
sql复制ALTER SYSTEM SET log_statement = 'all';
ALTER SYSTEM SET log_connections = on;
ALTER SYSTEM SET log_disconnections = on;
7. 故障排查与性能优化
7.1 Docker常见问题
- 存储驱动问题:
bash复制# 检查存储驱动
docker info | grep Storage
# 清理磁盘空间
docker system prune -a -f --volumes
- 网络连接问题:
bash复制# 检查容器网络
docker network inspect bridge
# 测试容器间连通性
docker exec -it container1 ping container2
- 性能问题诊断:
bash复制# 查看容器资源使用
docker stats
# 进入容器分析
docker exec -it container_name top
7.2 Redis性能调优
- 慢查询分析:
bash复制# 设置慢查询阈值(单位微秒)
config set slowlog-log-slower-than 10000
# 查看慢查询日志
slowlog get 10
- 内存优化:
bash复制# 查看内存使用
info memory
# 优化哈希表
config set hash-max-ziplist-entries 512
config set hash-max-ziplist-value 64
- 持久化监控:
bash复制# AOF重写监控
info persistence
# RDB保存状态
lastsave
7.3 PostgreSQL性能诊断
- 查询分析:
sql复制-- 查看活跃查询
SELECT pid, now() - query_start AS duration, query
FROM pg_stat_activity
WHERE state = 'active'
ORDER BY duration DESC;
-- 重置统计信息
SELECT pg_stat_reset();
- 索引优化:
sql复制-- 缺失索引分析
SELECT * FROM pg_stat_all_tables
WHERE schemaname NOT IN ('pg_catalog', 'information_schema')
ORDER BY seq_scan DESC;
-- 索引使用统计
SELECT * FROM pg_stat_user_indexes;
- 配置调优:
sql复制-- 共享缓冲区使用率
SELECT name, setting, unit,
(setting::numeric/current_setting('shared_buffers')::numeric)*100 as percent
FROM pg_settings
WHERE name IN ('shared_buffers', 'effective_cache_size', 'work_mem', 'maintenance_work_mem');
8. 升级与迁移策略
8.1 Docker版本升级
- 备份关键数据:
bash复制# 备份容器配置
docker inspect <container_id> > container_backup.json
# 备份卷数据
tar -czvf docker_volumes_backup.tar.gz /var/lib/docker/volumes/
- 升级步骤:
bash复制sudo yum remove docker-ce docker-ce-cli containerd.io
sudo rm -rf /var/lib/docker
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y docker-ce docker-ce-cli containerd.io
sudo systemctl start docker
8.2 Redis版本升级
- 数据备份:
bash复制# RDB备份
docker exec redis-server redis-cli save
# AOF备份
docker exec redis-server redis-cli BGREWRITEAOF
- 滚动升级方案:
bash复制# 启动新版本容器连接旧版作为从节点
docker run -d --name redis-new \
--link redis-server:master \
redis:7.0-alpine \
redis-server --replicaof master 6379
# 等待数据同步完成
docker exec redis-new redis-cli info replication
# 切换应用连接至新节点
# 停用旧节点
docker stop redis-server
8.3 PostgreSQL大版本升级
- 使用pg_dumpall逻辑备份:
bash复制docker exec postgresql-prod pg_dumpall -U postgres > full_backup.sql
- 使用pg_upgrade物理升级:
bash复制# 停止旧容器
docker stop postgresql-prod
# 启动新版本容器挂载旧数据目录
docker run -d --name postgresql-new \
-v /data/postgresql/data:/var/lib/postgresql/olddata \
-v /data/postgresql/newdata:/var/lib/postgresql/data \
postgres:14-alpine
# 容器内执行升级
docker exec -it postgresql-new bash
pg_upgrade -b /usr/lib/postgresql/13/bin \
-B /usr/lib/postgresql/14/bin \
-d /var/lib/postgresql/olddata \
-D /var/lib/postgresql/data \
-o '-c config_file=/etc/postgresql/13/postgresql.conf' \
-O '-c config_file=/etc/postgresql/14/postgresql.conf'
- 验证升级:
bash复制docker exec postgresql-new psql -U postgres -c "SELECT version();"
