1. 环境准备与基础镜像选择
在腾讯云CentOS系统上部署Docker容器化环境,首先需要确保基础环境配置正确。我推荐使用CentOS 7.9或8.2版本作为宿主机操作系统,这两个版本对Docker的兼容性经过长期验证。通过SSH连接到腾讯云服务器后,执行以下命令更新系统:
bash复制sudo yum update -y
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
Docker的安装源配置直接影响后续稳定性。腾讯云镜像源提供了优化的下载节点,这是我多年实践中最稳定的选择:
bash复制sudo yum-config-manager --add-repo https://mirrors.cloud.tencent.com/docker-ce/linux/centos/docker-ce.repo
安装Docker引擎时,建议锁定特定版本以避免兼容性问题。当前生产环境验证稳定的版本是20.10.17:
bash复制sudo yum install -y docker-ce-20.10.17 docker-ce-cli-20.10.17 containerd.io
启动Docker服务后,需要调整两个关键配置:
- 存储驱动改为overlay2(编辑/etc/docker/daemon.json)
- 配置腾讯云容器镜像加速(提升拉取速度)
json复制{
"registry-mirrors": ["https://mirror.ccs.tencentyun.com"],
"storage-driver": "overlay2"
}
经验提示:在腾讯云环境中,务必检查安全组规则是否开放了2375等Docker端口。我曾遇到因默认安全组限制导致容器网络异常的情况,建议提前放行所需端口范围。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Tomcat容器化部署实战
2.1 官方镜像选择与优化
Tomcat官方镜像存在多个变体,根据生产需求选择合适版本至关重要。对于Java应用部署,我推荐使用tomcat:9.0-jdk8-corretto这个组合:
- 基于Amazon Corretto JDK8构建
- 已包含优化过的JVM参数
- 镜像体积比OpenJDK版本小15%
拉取镜像时指定版本号避免后续意外升级:
bash复制docker pull tomcat:9.0.65-jdk8-corretto
2.2 目录结构与权限配置
创建符合生产规范的目录结构是保证可维护性的关键。我的标准做法是:
code复制/webapps
├── tomcat
│ ├── conf # 挂载自定义server.xml
│ ├── logs # 持久化日志
│ ├── webapps # 应用部署目录
│ └── work # 临时工作目录
设置正确的目录权限(注意不要盲目使用777):
bash复制mkdir -p /webapps/tomcat/{conf,logs,webapps,work}
chown -R 1000:1000 /webapps/tomcat # 匹配容器内tomcat用户UID
find /webapps/tomcat -type d -exec chmod 755 {} \;
2.3 容器启动与健康检查
使用以下命令启动带健康检查的Tomcat容器:
bash复制docker run -d \
--name mytomcat \
-p 8080:8080 \
-v /webapps/tomcat/conf:/usr/local/tomcat/conf \
-v /webapps/tomcat/logs:/usr/local/tomcat/logs \
-v /webapps/tomcat/webapps:/usr/local/tomcat/webapps \
-v /webapps/tomcat/work:/usr/local/tomcat/work \
--health-cmd "curl -f http://localhost:8080 || exit 1" \
--health-interval 30s \
--health-timeout 10s \
--health-retries 3 \
tomcat:9.0-jdk8-corretto
避坑指南:曾经有项目因未配置健康检查导致K8s无法感知容器假死状态。建议所有生产容器都必须配置健康检查,检查间隔根据应用响应时间调整。
3. MySQL容器化部署方案
3.1 镜像版本选择策略
MySQL官方镜像的版本选择需要考虑:
- 生产环境推荐5.7或8.0的GA版本
- 注意ARM架构与x86的镜像差异
- 明确是否需要包含客户端工具
我常用的稳定版本拉取命令:
bash复制docker pull mysql:5.7.38
3.2 数据持久化配置
MySQL容器必须正确配置数据持久化,这是血泪教训换来的经验:
bash复制mkdir -p /data/mysql/{data,conf.d,initdb}
chown -R 999:999 /data/mysql # MySQL容器内用户UID
创建自定义配置文件(/data/mysql/conf.d/my.cnf):
ini复制[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
default-time-zone='+08:00'
innodb_buffer_pool_size=1G # 根据内存调整
skip-name-resolve
3.3 安全启动与密码管理
生产环境必须设置root密码并禁用匿名账户:
bash复制docker run -d \
--name mysql57 \
-p 3306:3306 \
-v /data/mysql/data:/var/lib/mysql \
-v /data/mysql/conf.d:/etc/mysql/conf.d \
-v /data/mysql/initdb:/docker-entrypoint-initdb.d \
-e MYSQL_ROOT_PASSWORD=ComplexPwd@123 \
-e MYSQL_ROOT_HOST='%' \
--restart unless-stopped \
mysql:5.7.38 \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_unicode_ci
安全提醒:永远不要在环境变量中直接使用简单密码。我曾通过审计发现某企业数据库被暴力破解,根源就是使用了弱密码。建议使用--env-file参数从文件加载敏感信息。
4. 容器网络互联与调优
4.1 自定义桥接网络创建
默认的bridge网络存在DNS解析限制,创建自定义网络:
bash复制docker network create --driver bridge \
--subnet=172.28.0.0/16 \
--gateway=172.28.0.1 \
--opt com.docker.network.bridge.name=mybridge \
app-network
将已有容器连接到新网络:
bash复制docker network connect app-network mytomcat
docker network connect app-network mysql57
4.2 容器间通信验证
在Tomcat容器内测试MySQL连接(使用容器名作为host):
bash复制docker exec -it mytomcat bash
apt-get update && apt-get install -y mysql-client
mysql -h mysql57 -uroot -pComplexPwd@123
4.3 性能调优参数
在docker-compose.yml或运行命令中添加资源限制:
yaml复制services:
mysql:
deploy:
resources:
limits:
cpus: '2'
memory: 4G
reservations:
memory: 2G
ulimits:
nofile:
soft: 65536
hard: 65536
对于Java应用,需要配置JVM内存参数(在catalina.sh中添加):
bash复制JAVA_OPTS="-Xms2g -Xmx2g -XX:MaxMetaspaceSize=512m"
5. 运维监控与日志管理
5.1 容器日志轮转配置
编辑/etc/docker/daemon.json添加日志限制:
json复制{
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
}
}
5.2 监控指标暴露
MySQL容器启用性能监控:
bash复制docker run \
-e EXPOSE_METRICS=1 \
-e METRICS_PORT=9104 \
-p 9104:9104 \
mysql:5.7.38
Tomcat启用JMX监控:
bash复制-e JAVA_OPTS="-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=1099 \
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.authenticate=false"
5.3 常用运维命令
查看容器资源使用情况:
bash复制docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"
进入容器排查问题:
bash复制docker exec -it mytomcat bash -c "tail -f /usr/local/tomcat/logs/catalina.out"
导出MySQL数据备份:
bash复制docker exec mysql57 sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > all-databases.sql
在多年容器化实践中,我发现定期执行docker system prune -f能有效避免磁盘空间耗尽问题。但切记要先停止相关容器,否则可能造成数据不一致。对于生产环境,建议每周维护窗口执行一次完整的镜像清理。
