docker搭建环境
一、创建自定义网络
创建桥接模式网络,统一各容器网络环境,便于容器间通过别名通信:
docker network create -d bridge test
参数说明:-d bridge 指定网络模式为桥接模式(默认网络模式)。
注:已统一网络名称为test,与后续容器启动命令保持一致。
后续若需查看已创建的网络、删除无用网络,可执行以下命令,适配本次部署场景:
- 查询已有网络(查看所有网络,确认test网络是否创建成功)
# 命令1:查看所有Docker网络(简洁显示,包含网络名称、ID、驱动模式)
docker network ls
# 命令2:查看指定网络详情(如查看test网络的详细信息、关联的容器)
docker network inspect test
说明:执行docker network ls后,若列表中出现“test”、驱动为“bridge”,即为本次创建的桥接网络;执行docker network inspect test可查看该网络下关联的容器(如mysql、redis等)。
- 删除Docker网络(删除无用网络,需注意前置条件)
# 命令:删除指定名称的网络(如删除test网络)
docker network rm test
注意事项:
- 删除网络前,必须先停止并移除该网络下关联的所有容器(如mysql、redis、tomcat、nginx),否则会删除失败;
- 若提示“Error response from daemon: error while removing network: network test has active endpoints”,说明该网络仍有关联容器,需先执行
docker stop mysql redis tomcat nginx(停止容器)、docker rm mysql redis tomcat nginx(删除容器),再执行删除网络命令; - 不要删除Docker默认网络(如bridge、host、none),仅删除自定义创建的无用网络(如test),避免影响Docker正常运行。
二、安装MYSQL
步骤一:拉取MYSQL 5.7镜像
docker pull mysql:5.7
步骤二:在宿主机创建目录及配置文件
创建配置文件目录和数据存储目录,用于挂载容器内的配置和数据(避免容器删除后数据丢失):
mkdir -p /root/docker/mysql/conf
mkdir -p /root/docker/mysql/data
在 conf 目录下创建 my.cnf 配置文件,内容如下:
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
user=mysql
character-set-server=utf8
default_authentication_plugin=mysql_native_password
配置说明:指定字符集为UTF-8,兼容中文;设置默认认证插件为 mysql_native_password,避免Navicate等工具连接时出现认证错误。
步骤三:启动MySQL容器
(原文档缺失步骤三,补充序号以保持连贯,删除重复启动命令,补充--name参数便于容器管理)
docker run -d -p 3306:3306 \
--name mysql \
--network test --network-alias mysql --privileged=true \
-v /root/docker/mysql/conf/my.cnf:/etc/mysql/my.cnf \
-v /root/docker/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=test123456 mysql:5.7
参数说明:
- --name mysql:给容器命名为mysql,简洁规范,便于后续通过名称管理(如启动、停止、删除容器);
- -d:后台运行容器;
- -p 3306:3306:将宿主机3306端口映射到容器内3306端口(宿主机端口:容器内端口);
- --network test:加入之前创建的test自定义网络;
- --network-alias mysql:设置容器在网络中的别名,其他容器可通过该别名访问MySQL(无需记IP);
- --privileged=true:赋予容器真正的root权限,避免挂载目录时出现权限问题;
- -v:目录挂载,分别将宿主机的配置文件和数据目录挂载到容器对应目录,实现配置持久化和数据持久化;
- -e MYSQL_ROOT_PASSWORD=test123456:设置MySQL root用户的密码为test123456(与启动命令保持一致)。
步骤四:连接MySQL
查看宿主机IP(以Linux为例):
ip addr
使用Navicate等工具连接:输入宿主机IP、端口3306、用户名root、密码test123456,即可连接容器内的MySQL。
补充:(容器内登录报错排查)
执行 docker exec -it mysql /bin/bash
进入容器后,输入 mysql -u root -p,输入密码后提示:
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES),核心原因是「密码错误」「密码加密方式不兼容」或「权限表异常」,按以下步骤逐一排查(适配本次部署场景,全程可复制执行):
-
确认密码绝对正确(最核心原因)本次部署中,MySQL root初始密码固定为
test123456(对应容器启动命令-e MYSQL_ROOT_PASSWORD=test123456); -
排查操作:重新执行
mysql -u root -p,输入密码时慢输核对,不要多输/少输字符、避免空格或换行误输入(本次密码为test+123456,无大小写、特殊字符)。 -
排查密码加密方式(适配MySQL 5.7)本次my.cnf配置已指定
default_authentication_plugin=mysql_native_password(兼容MySQL 5.7默认加密方式),若手动修改过该配置,会导致密码加密异常、登录失败; -
排查操作(容器内执行):
# 1. 查看配置文件,确认加密方式正确 cat /etc/mysql/my.cnf | grep default_authentication_plugin # 2. 若输出为空/不是mysql_native_password,重启容器加载正确配置(宿主机执行) # 先退出容器:exit docker restart mysql # 重新进入容器,再次尝试登录 docker exec -it mysql /bin/bash mysql -u root -p -
重置root密码(兜底方案,100%解决密码/加密问题)若密码确认正确、加密方式无误仍报错,直接重置root密码(容器内全程复制执行):
# 1. 先退出当前MySQL登录尝试,回到容器bash终端 quit # 2. 停止容器内MySQL服务(避免权限表占用) service mysql stop # 3. 跳过权限验证,启动MySQL服务 mysqld_safe --skip-grant-tables & # 4. 重新打开一个新的宿主机终端,进入mysql容器 docker exec -it mysql /bin/bash # 5. 无需密码,直接登录MySQL mysql -u root # 6. 执行命令,重置root密码(加密方式适配MySQL 5.7,密码仍设为test123456,与前文一致) use mysql; update user set authentication_string=password('test123456') where user='root' and host='localhost'; flush privileges; # 7. 退出MySQL,停止并重启MySQL服务 quit service mysql stop service mysql start # 8. 重新登录,验证是否成功 mysql -u root -p # 输入密码test123456,能进入MySQL命令行即为排查成功 -
终极排查:修复权限表异常若以上步骤均失败,大概率是MySQL权限表(mysql.user)异常,执行以下命令修复(容器内执行):
# 1. 进入容器(若未进入),登录MySQL(先执行步骤3重置密码后再操作) docker exec -it mysql /bin/bash mysql -u root -p # 2. 修复权限表,刷新权限 use mysql; repair table user; flush privileges; quit # 3. 重新登录,验证效果 mysql -u root -p
关键说明:该报错(root@localhost)仅出现在「容器内登录」,与远程连接报错无关,无需排查防火墙、远程权限,重点聚焦「密码」和「容器内MySQL配置」,优先执行步骤1和步骤3,基本可快速解决问题。
三、安装REDIS
步骤一:拉取Redis 7.0.12镜像
docker pull redis:7.0.12
步骤二:在宿主机创建目录及配置文件
创建Redis配置文件目录,用于挂载配置文件:
mkdir -p /root/docker/redis/conf
提供两个版本Redis配置文件,按需选择使用:
版本一:简单配置
在 conf 目录下创建 redis.conf,内容如下:
# 基础网络配置(Docker必备)
# bind 127.0.0.1 -::1 # 注释后允许所有IP访问
protected-mode no # 关闭保护模式,允许外部连接
port 6379 # 默认端口
# Docker专属配置
daemonize no # 禁止后台运行,否则容器退出
logfile "" # 日志输出到标准输出,便于docker logs查看
# 安全配置
requirepass 123456789 # 连接密码
# 持久化配置(基础保障数据不丢失)
save 900 1
save 300 10
save 60 10000
dbfilename dump.rdb
dir /data
# 字符编码
charset utf-8
版本二:全量配置
在 conf 目录下创建 redis.conf,内容如下:
# Redis配置文件(Redis 7.0.12,适配Docker环境)
# 一、基础网络配置
# bind 127.0.0.1 -::1 # 注释后允许所有IP访问(Docker环境必备)
protected-mode no # 关闭保护模式,允许外部网络连接
port 6379 # Redis服务默认端口
tcp-backlog 511 # 监听的TCP.backlog参数,默认511
timeout 0 # 客户端连接超时时间(秒),0表示无超时
tcp-keepalive 300 # TCP保持连接时间(秒),默认300
# 二、通用配置
daemonize no # Docker环境必须设为no(否则容器会退出)
pidfile /var/run/redis_6379.pid # 进程PID文件(Docker可忽略)
loglevel notice # 日志级别:debug、verbose、notice、warning
logfile "" # 日志输出到标准输出,便于docker logs查看
databases 16 # 默认16个数据库
always-show-logo yes # 显示启动日志横幅
# 三、安全配置
requirepass 123456789 # 连接密码
# rename-command CONFIG "" # 可选:重命名危险命令增强安全性
# 四、持久化配置(RDB模式)
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes # 持久化出错时停止写入
rdbcompression yes # RDB文件压缩(节省空间)
rdbchecksum yes # RDB文件校验(确保完整性)
dbfilename dump.rdb # RDB文件名
dir /data # RDB文件存储目录(容器内路径)
# 五、持久化配置(AOF模式,默认关闭,按需开启)
appendonly no # 是否开启AOF持久化
appendfilename "appendonly.aof" # AOF文件名
appendfsync everysec # AOF同步策略(每秒同步,平衡性能与可靠性)
no-appendfsync-on-rewrite no # AOF重写时不暂停同步
auto-aof-rewrite-percentage 100 # AOF重写触发条件(文件体积翻倍)
auto-aof-rewrite-min-size 64mb # AOF重写最小体积
aof-load-truncated yes # AOF文件损坏时忽略错误
aof-use-rdb-preamble yes # AOF重写使用RDB预写模式
# 六、字符编码配置
charset utf-8 # 兼容中文
# 七、客户端配置
maxclients 10000 # 最大客户端连接数
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
# 八、内存管理配置
maxmemory 0 # 最大内存限制(0表示无限制,建议按宿主机内存设置)
maxmemory-policy noeviction # 内存满时拒绝写入(避免数据丢失)
maxmemory-samples 5 # 内存淘汰采样数量
# 九、其他优化配置
slowlog-log-slower-than 10000 # 慢查询日志阈值(微秒)
slowlog-max-len 128 # 慢查询日志最大条数
tcp-nodelay yes # 减少TCP延迟
activerehashing yes # 开启渐进式重哈希
使用建议:
- 测试/基础部署用简单配置;生产环境用全量配置,可根据宿主机内存调整 maxmemory 参数(如1G设为1gb);
- daemonize 必须设为 no,若设为 yes,Redis会进入后台运行,Docker检测不到前台进程会直接退出容器;
- bind 127.0.0.1 必须注释,否则仅允许容器内部访问,外部工具无法连接。
步骤三:启动Redis容器
docker run -d -p 6379:6379 \
--name redis \
--network test --network-alias redis \
-v /root/docker/redis/conf/redis.conf:/etc/redis/redis.conf \
--privileged=true redis:7.0.12 \
redis-server /etc/redis/redis.conf
参数说明:
- --name redis:给容器命名为redis,简洁规范,便于后续管理容器;
- -p 6379:6379:映射宿主机6379端口到容器内6379端口(Redis默认端口);
- --network test --network-alias redis:加入test网络,设置网络别名为redis,方便其他容器访问;
- redis-server /etc/redis/redis.conf:指定容器启动时加载挂载的自定义配置文件。
四、安装TOMCAT
步骤一:拉取Tomcat 8.5镜像
docker pull tomcat:8.5
步骤二:在宿主机准备项目文件
创建Tomcat webapps目录:
mkdir -p /root/docker/tomcat/webapps
将项目包上传至该webapps目录,并解压(示例命令,按实际包名调整):
# 示例:上传后解压war包(假设项目包为pinter.war)
unzip /root/docker/tomcat/webapps/pinter.war -d /root/docker/tomcat/webapps/pinter
修改项目配置文件(application.properties),更新数据库连接信息:
说明:配置中数据库和Redis地址用容器别名,无需填IP,test网络内可自动解析,与前文容器启动配置保持一致。
步骤三:启动Tomcat容器
docker run -d -p 8080:8080 \
--name tomcat \
--network test --network-alias tomcat-pinter-1 \
-v /root/docker/tomcat/webapps:/usr/local/tomcat/webapps \
--privileged=true tomcat:8.5
参数说明:
- --name tomcat:给容器命名为tomcat,简洁规范,便于后续管理容器;
- -v 挂载宿主机webapps目录到容器内对应目录,项目修改后无需重启容器,仅需重启Tomcat服务即可生效。
五、安装NGINX
步骤一:拉取Nginx镜像
docker pull nginx
步骤二:在宿主机创建目录及配置文件
创建Nginx核心目录,用于挂载配置、日志和静态文件,确保容器内外数据同步:
mkdir -p /root/docker/nginx/{conf.d,logs,html}
在 /root/docker/nginx/conf.d 目录下创建唯一配置文件 pinter.conf,内容如下(直接复制可用,含长连接优化):
upstream www.pinter.com {
server tomcat-pinter-1:8080; # 同一test网络,Tomcat容器别名直接解析
keepalive 10; # 长连接优化,减少TCP握手开销
}
server {
listen 80;
server_name www.pinter.com;
location / {
proxy_pass http://www.pinter.com;
# 传递真实请求信息,避免Tomcat获取不到客户端IP和域名
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 超时控制,防止请求卡顿超时
proxy_connect_timeout 30s;
proxy_read_timeout 60s;
}
# 验证转发配置,访问Tomcat示例页面排查问题
location /examples {
proxy_pass http://www.pinter.com/examples;
}
}
补充说明:Nginx主配置文件(容器内路径 /etc/nginx/nginx.conf)默认加载conf.d 目录下所有 .conf 文件,无需手动修改,核心加载语句为 include /etc/nginx/conf.d/*.conf;。
步骤三:启动Nginx容器
docker run -d -p 80:80 \
--name nginx \
--network test --network-alias nginx \
-v /root/docker/nginx/conf.d:/etc/nginx/conf.d \
-v /root/docker/nginx/logs:/var/log/nginx \
-v /root/docker/nginx/html:/usr/share/nginx/html \
--privileged=true nginx
参数说明:
- --name nginx:给容器命名为nginx,简洁规范,便于后续管理容器;
- -v /root/docker/nginx/conf.d:/etc/nginx/conf.d:挂载配置目录,修改pinter.conf后重载Nginx即可生效;
- -v /root/docker/nginx/logs:/var/log/nginx:挂载日志目录,便于宿主机查看和管理访问日志;
- -v /root/docker/nginx/html:/usr/share/nginx/html:挂载静态目录,用于存放404、50x等错误页面。
步骤四:配置本地Hosts文件(实现域名访问)
在本地电脑(Windows/Mac)配置Hosts文件,将域名 www.pinter.com 指向宿主机IP,步骤如下:
- Windows:打开 C:\Windows\System32\drivers\etc\hosts 文件,添加一行:宿主机IP www.pinter.com;
- Mac:打开 /etc/hosts 文件,添加一行:宿主机IP www.pinter.com。
配置完成后,打开浏览器输入 http://www.pinter.com ,即可通过域名访问Tomcat部署的pinter项目。

浙公网安备 33010602011771号