docker搭建环境

一、创建自定义网络

创建桥接模式网络,统一各容器网络环境,便于容器间通过别名通信:

docker network create -d bridge test

参数说明:-d bridge 指定网络模式为桥接模式(默认网络模式)。

注:已统一网络名称为test,与后续容器启动命令保持一致。

后续若需查看已创建的网络、删除无用网络,可执行以下命令,适配本次部署场景:

  1. 查询已有网络(查看所有网络,确认test网络是否创建成功)
# 命令1:查看所有Docker网络(简洁显示,包含网络名称、ID、驱动模式)
docker network ls

# 命令2:查看指定网络详情(如查看test网络的详细信息、关联的容器)
docker network inspect test

说明:执行docker network ls后,若列表中出现“test”、驱动为“bridge”,即为本次创建的桥接网络;执行docker network inspect test可查看该网络下关联的容器(如mysql、redis等)。

  1. 删除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),核心原因是「密码错误」「密码加密方式不兼容」或「权限表异常」,按以下步骤逐一排查(适配本次部署场景,全程可复制执行):

  1. 确认密码绝对正确(最核心原因)本次部署中,MySQL root初始密码固定为 test123456(对应容器启动命令 -e MYSQL_ROOT_PASSWORD=test123456);

  2. 排查操作:重新执行 mysql -u root -p,输入密码时慢输核对,不要多输/少输字符、避免空格或换行误输入(本次密码为test+123456,无大小写、特殊字符)。

  3. 排查密码加密方式(适配MySQL 5.7)本次my.cnf配置已指定 default_authentication_plugin=mysql_native_password(兼容MySQL 5.7默认加密方式),若手动修改过该配置,会导致密码加密异常、登录失败;

  4. 排查操作(容器内执行):

    # 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
    
  5. 重置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命令行即为排查成功
    
  6. 终极排查:修复权限表异常若以上步骤均失败,大概率是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项目。

posted @ 2026-01-26 16:22  向闲而过  阅读(4)  评论(0)    收藏  举报