通过 Docker 创建开发环境

通过 Docker 创建开发环境

网络设置

1. 查看所有Docker网络

powershell 复制代码
docker network ls

示例结果:

复制代码
NETWORK ID     NAME          DRIVER    SCOPE
b649b57f5bc5   bridge        bridge    local
7e8c2d2c0b5a   host          host      local
6a9c8d69bfb2   none          null      local
  • bridge: Docker默认的桥接网络
  • host: 使用主机网络
  • none: 不使用网络

2. 查看特定网络的详细信息

powershell 复制代码
docker network inspect nacos-net

显示信息:

  • 网络的子网范围
  • 网关地址
  • 该网络下所有容器的IP和名称

3. 查看网络内的所有容器

powershell 复制代码
docker network inspect nacos-net | findstr "Name" "IPAddress"

或者更简洁的方式:

powershell 复制代码
docker network inspect nacos-net --format '{{ range .Containers }}{{ .Name }} - {{ .IPAddress }}{{ end }}'

更复杂的网络设置

1. 自定义桥接网络

powershell 复制代码
docker network create \
  --driver bridge \
  --subnet 192.168.100.0/24 \
  --gateway 192.168.100.1 \
  --ip-range 192.168.100.0/25 \
  net-name
  • --driver: 指定网络驱动类型为 bridge(桥接模式,Docker 默认的网络类型,用于单机容器之间的通信)
  • --subnet: 指定网络的子网
  • --gateway: 指定网关
  • --ip-range: 指定可用IP范围

2. Overlay网络(跨主机通信)

powershell 复制代码
# 在第一个主机上创建
docker network create --driver overlay my-overlay-net

# 在第二个主机上加入
docker network connect my-overlay-net <container-name>

3. 多网络连接(微服务架构)

powershell 复制代码
# 创建两个网络
docker network create frontend-net
docker network create backend-net

# 启动前端服务
docker run -d --name frontend --network frontend-net nginx

# 启动后端服务
docker run -d --name backend --network backend-net --network frontend-net app

# 启动数据库
docker run -d --name mysql --network backend-net mysql

这样设置后,前端服务可以通过frontend-net网络访问,后端服务可以通过backend-net网络访问数据库,同时也能通过frontend-net与前端通信。

关于容器IP的操作示例

1. 获取容器IP

powershell 复制代码
# 获取nacos-net网络中所有容器的IP
docker network inspect nacos-net --format '{{range .Containers}}{{.Name}} - {{.IPv4Address}}{{end}}'

2. 为容器指定固定IP

powershell 复制代码
docker run -d \
  --name mysql \
  --network nacos-net \
  --ip 192.168.100.10 \
  mysql:8.4

3. 网络安全配置(防火墙规则)

bash 复制代码
# 仅允许特定网络访问SSH
iptables -A INPUT -p tcp --dport 22 -s 192.168.100.0/24 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP

通过docker设置本地环境

redis-stack

创建Redis Stack容器

使用 Redis Stack 镜像(redis的功能全家桶,推荐),基于标准 Redis,集成了 RediSearch、RedisJSON、RedisTimeSeries 等多个扩展模块,且自带可视化管理工具:

powershell 复制代码
# 拉取镜像
docker pull redis/redis-stack:7.2.0-v19
# 启动redis-stack容器
docker run -d -p 6379:6379 -p 8001:8001 --name redis-stack redis/redis-stack:7.2.0-v19

待修改(已经正常启动,且日志无异常,但是当前本地无法访问,可能是挂载目录的权限问题)

Redis Stack 容器挂载「数据 + 日志 + 配置」

Redis Stack 镜像的默认目录的路径和标准 Redis 略有差异,如下:

  • 配置文件: 默认路径是/etc/redis-stack.conf 核心配置文件(包括 RediSearch、RedisJSON 等扩展模块的默认配置)
  • 数据目录: 默认路径是/data 用于持久化数据存储(RDB/AOF 文件、扩展模块数据等)
  • 日志目录: 无默认路径(需手动配置) 默认日志输出到控制台,需在配置文件中指定日志文件路径(如 /var/log/redis)
创建宿主机挂载目录
powershell 复制代码
# 创建数据、配置、日志目录(路径可自定义,保持统一即可)
mkdir -p D:\ProgramData\docker-volumes\redis-stack-7-2-0\data
mkdir -p D:\ProgramData\docker-volumes\redis-stack-7-2-0\conf
mkdir -p D:\ProgramData\docker-volumes\redis-stack-7-2-0\logs

# 创建空日志文件(避免 Redis 需要创建目录)
New-Item -Path "D:\ProgramData\docker-volumes\redis-stack-7-2-0\logs\redis-stack.log" -ItemType File -Force

# (可选)Windows 无需手动改权限,Docker 自动适配;Linux 需执行:chmod 777 -R /xxx/redis-stack
启动容器,复制默认配置文件
powershell 复制代码
# 使用镜像 redis/redis-stack:7.2.0-v19 启动容器
docker run -d -p 6379:6379 -p 8001:8001 --name redis-stack redis/redis-stack:7.2.0-v19

# 复制容器内的默认 redis.conf 到宿主机 conf 目录
docker cp redis-stack:/etc/redis-stack.conf D:\ProgramData\docker-volumes\redis-stack-7-2-0\conf\

# 删除容器
docker stop redis-stack
docker rm redis-stack
修改配置文件
复制代码
# 监听端口(默认 6379)
port 6379
# 设置密码
# requirepass 123456
# 允许外部连接
bind 0.0.0.0
# 是否以守护进程方式运行(在容器中应设为 no,日志输出到 stdout/stderr)
daemonize no
# 禁用保护模式(允许外部连接,开发环境用)
protected-mode no

# 日志文件路径(容器内路径) 不使用 logfile时,日志输出到控制台,由docker管理
logfile "/var/log/redis-stack/redis-stack.log"
# 日志级别:debug / verbose / notice / warning
# 生产环境建议使用 notice 或 warning
loglevel notice

# 同时启用 RDB 快照 + AOF 日志(混合持久化)
# RDB 快照规则(格式:save 秒数 修改次数)
# 15 分钟内至少有 1 次写入 → 触发快照
save 900 1
# 5 分钟内至少有 10 次写入 → 触发快照
save 300 10
# 启用 AOF(Append Only File)持久化,提供更高数据安全性
appendonly yes
# AOF 文件名(默认保存在 Redis 工作目录,通常为 /data)
appendfilename "appendonly.aof"
# always 每次写操作都同步(最安全,性能差);everysec 每秒同步一次(默认);no 由操作系统决定(性能好,风险高)
# appendfsync everysec

# Redis Stack 兼容层模块(用于支持旧版命令)
loadmodule /opt/redis-stack/lib/rediscompat.so
# 全文搜索模块(RediSearch)
loadmodule /opt/redis-stack/lib/redisearch.so
# 时间序列数据模块(RedisTimeSeries)
loadmodule /opt/redis-stack/lib/redistimeseries.so
# JSON 数据类型支持(RedisJSON)
loadmodule /opt/redis-stack/lib/rejson.so
# 概率数据结构模块(Bloom Filter, Cuckoo Filter 等)
loadmodule /opt/redis-stack/lib/redisbloom.so
# 函数式流处理引擎(RedisGears)
# 需指定 V8 插件路径以支持 JavaScript 执行
loadmodule /opt/redis-stack/lib/redisgears.so v8-plugin-path /opt/redis-stack/lib/libredisgears_v8_plugin.so
正式启动 Redis Stack 容器(挂载所有目录)
powershell 复制代码
docker run --name redis-stack -d `
  -p 6379:6379 `
  -p 8001:8001 `
  -v D:\ProgramData\docker-volumes\redis-stack-7-2-0\data:/data `
  -v D:\ProgramData\docker-volumes\redis-stack-7-2-0\conf\redis-stack.conf:/etc/redis-stack.conf `
  -v D:\ProgramData\docker-volumes\redis-stack-7-2-0\logs:/var/log/redis-stack `
  --restart=always `
  redis/redis-stack:7.2.0-v19 redis-server /etc/redis-stack.conf

docker run -d -p 6379:6379 -p 8001:8001 --name redis-stack redis/redis-stack:7.2.0-v19

docker run --name redis-stack -d -p 6379:6379

-p 8001:8001 -v D:\ProgramData\docker-volumes\redis-stack-7-2-0\conf\redis-stack.conf:/etc/redis-stack.conf

-v D:\ProgramData\docker-volumes\redis-stack-7-2-0\logs:/var/log/redis-stack --restart=always

redis/redis-stack:7.2.0-v19 redis-server /etc/redis-stack.conf


Nacos 和 MySQL

Windows 通过 Docker Desktop 部署 Nacos3.x,设置数据库为MySQL,挂载数据、日志、配置,具体信息可以参考nacos-docker 官方文档
当前操作环境为windows,需要注意与linux的区别

网络设置

自定义桥接网络确保容器之间的稳定通信,创建一个名为 nacos-net 的自定义桥接网络(默认是 bridge 驱动)

powershell 复制代码
docker network create container-net

为了使用MySQL存储Nacos的数据(docker镜像默认使用内置的derby数据库),先部署MySQL(Nacos3.x要求MySQL5.6.5+)

MySQL

Docker 部署 MySQL
powershell 复制代码
# 拉取镜像
docker pull mysql:8.4

# 创建挂载目录 (注意,如果是linux环境需要修改文件夹权限)
mkdir -p D:\ProgramData\docker-volumes\mysql-data-8-4\data
mkdir -p D:\ProgramData\docker-volumes\mysql-data-8-4\conf
mkdir -p D:\ProgramData\docker-volumes\mysql-data-8-4\logs

# Windows 环境启动MySQL容器(命令行/ Powershell 执行)
# 将容器添加到自定义网络`container-net`,确保容器之间的通信
# 设置数据、配置、日志挂载
docker run --name mysql84 --network container-net -d -p 3306:3306 `
  -v D:\ProgramData\docker-volumes\mysql-data-8-4\data:/var/lib/mysql `
  -v D:\ProgramData\docker-volumes\mysql-data-8-4\conf:/etc/mysql/conf.d `
  -v D:\ProgramData\docker-volumes\mysql-data-8-4\logs:/var/log/mysql `
  -e MYSQL_ROOT_PASSWORD=root `
  mysql:8.4
修改MySQL日志配置

默认情况下,MySQL 仅输出错误日志到 /var/log/mysql/error.log。若需开启慢查询日志、二进制日志等,可在宿主机中挂载的 conf 目录下创建自定义配置文件(如 D:\ProgramDatadocker-volumes\mysql-data-8-4\conf\my.cnf),添加日志配置:

ini 复制代码
[mysqld]
# 错误日志(默认已开启,指定路径与挂载目录一致)
log_error = /var/log/mysql/error.log

# 慢查询日志(开启并指定路径)
slow_query_log = 1  # 1=开启,0=关闭
slow_query_log_file = /var/log/mysql/slow.log  # 慢查询日志文件
long_query_time = 2  # 执行时间超过 2 秒的查询记为慢查询
log_queries_not_using_indexes = 1  # 记录未使用索引的查询

# 二进制日志(用于数据恢复、主从复制,按需开启)
log_bin = /var/log/mysql/mysql-bin.log
server-id = 1  # 主从复制必需(唯一标识)

修改配置后,重启容器让配置生效:

posershell 复制代码
docker restart mysql84

Nacos

windows中使用docker设置nacos 3.1.1环境

创建临时nacos容器,获取默认配置

!NOTE

从Nacos 2.2.1开始为了系统安全考虑移除了以下环境变量的默认值,启动时请自行添加,否则会启动报错.

NACOS_AUTH_IDENTITY_KEY

NACOS_AUTH_IDENTITY_VALUE

NACOS_AUTH_TOKEN

posershell 复制代码
# 拉取镜像
docker pull nacos/nacos-server:v3.1.1

# 创建挂载目录
mkdir -p D:\ProgramData\docker-volumes\nacos-data-3-1-1\data
mkdir -p D:\ProgramData\docker-volumes\nacos-data-3-1-1\conf
mkdir -p D:\ProgramData\docker-volumes\nacos-data-3-1-1\logs

# 启动临时Nacos容器获取默认配置(含占位环境变量,仅用于避免启动报错,不适合生产环境)
docker run --name nacos-standalone-mysql `
	-e MODE=standalone `
	-e NACOS_AUTH_TOKEN="MTQwMDIwOWVhZjRiNGI4NWI5MDRkMTFmMTFhNmViMmN0" `
	-e NACOS_AUTH_IDENTITY_KEY="key-placeholder" `
	-e NACOS_AUTH_IDENTITY_VALUE="value-placeholder" `
	-p 8080:8080 `
	-p 8848:8848 `
	-p 9848:9848 `
	-d nacos/nacos-server:v3.1.1

!NOTE

NACOS_AUTH_TOKEN: Nacos 用于生成JWT Token的密钥,使用长度大于32字符的字符串,再经过Base64编码。

NACOS_AUTH_IDENTITY_KEY: Nacos Server端之间 Inner API的身份标识的Key,必填。

NACOS_AUTH_IDENTITY_VALUE: Nacos Server端之间 Inner API的身份标识的Value,必填。

powershell 复制代码
# 复制容器内的 conf(核心配置)、logs(日志)、data(临时缓存,可选)到宿主机 Nacos 挂载目录
# 1. 复制核心配置目录(必选!后续要修改这里的application.properties连接MySQL)
docker cp nacos-standalone-mysql:/home/nacos/conf D:\ProgramData\docker-volumes\nacos-data-3-1-1\

# 2. 复制日志目录(可选,实现日志持久化)
docker cp nacos-standalone-mysql:/home/nacos/logs D:\ProgramData\docker-volumes\nacos-data-3-1-1\

# 3. 复制数据目录(可选,Nacos的本地临时缓存,业务数据最终存在MySQL,非必需)
docker cp nacos-standalone-mysql:/home/nacos/data D:\ProgramData\docker-volumes\nacos-data-3-1-1\

复制完成后删除容器
docker stop nacos-standalone-mysql
docker rm nacos-standalone-mysql
初始化mysql数据库,

连接mysql84容器中的数据库,根据配置文件中的连接信息创建数据库nacos_config,执行nacos挂载目录中数据库初始化文件D:\ProgramData\docker-volumes\nacos-data-3-1-1\conf\mysql-schema.sql,对数据库进行初始化。

确认MySQL用户的访问权限

另外需要确保要访问的mysql设置了IP访问权限,以mysql84为例,其中的root用户默认允许local和任意IP访问

powershell 复制代码
docker exec -it mysql84 mysql -uroot -proot
mysql> use mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select host,user from user;
+-----------+------------------+
| host      | user             |
+-----------+------------------+
| %         | root             |
| localhost | mysql.infoschema |
| localhost | mysql.session    |
| localhost | mysql.sys        |
| localhost | root             |
+-----------+------------------+
5 rows in set (0.00 sec)
重新创建Nacos容器
数据库设置

Nacos默认的数据源是derby,如果要使用mysql,需要修改数据源参数,nacos默认数据源配置如下:

properties 复制代码
  #*************** Datasource Related Configurations ***************#
  ### nacos.plugin.datasource.log.enabled=true
  spring.sql.init.platform=${SPRING_DATASOURCE_PLATFORM:}
  ### Count of DB:
  # db.num=1

  ## Connect URL of DB:
  db.num=${MYSQL_DATABASE_NUM:1}
  db.url.0=jdbc:mysql://${MYSQL_SERVICE_HOST}:${MYSQL_SERVICE_PORT:3306}/${MYSQL_SERVICE_DB_NAME}?${MYSQL_SERVICE_DB_PARAM:characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false}
  db.user.0=${MYSQL_SERVICE_USER}
  db.password.0=${MYSQL_SERVICE_PASSWORD}

配置文件中通过环境变量设置数据源的属性:

  • SPRING_DATASOURCE_PLATFORM: 数据源平台
  • MYSQL_SERVICE_HOST: MySQL数据源地址
  • MYSQL_SERVICE_PORT: MySQL 端口
  • MYSQL_SERVICE_DB_NAME: Nacos 专用数据库名
  • MYSQL_SERVICE_USER: MySQL 用户名
  • MYSQL_SERVICE_PASSWORD: MySQL 密码
  • MYSQL_SERVICE_DB_PARAM: MySQL 连接参数(编码、超时等),可以直接使用默认
容器之间的连通性

nacos容器访问MySQL数据源的地址需要是可访问的地址,以之前创建的数据库容器 mysql84为例:

如果没有在创建容器时指定网络设置,那么该容器使用docker的默认网络 bridge(桥接)

注意,docker的默认bridge与自定义的桥接模式不同,nacos容器无法直接通过容器名mysql84访问数据库容器。

nacos访问mysql容器的解决方法

  1. 直接使用mysql容器的ip地址,通过如下方式获取
powershe 复制代码
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysq87

将获取到的mysql容器IP地址添加到nacos配置文件中就可以实现nacos对mysql的访问。但是docker容器的IP地址会随着容器的停止、删除发生变化,为了保证稳定性,建议自定义桥接网络,并在创建容器时为需要通信的容器添加同一网络设置

  1. 自定义桥接网络
    自定义一个桥接网络(默认网络驱动)网络
powershell 复制代码
docker network create container-net

将nacos的网络设置为container-net,确保mysql和nacs容器之间的通信

修改nacos数据源配置,将地址设置为mysql容器的容器名mysql84,同一网络内的容器可以直接通过容器名访问

properties 复制代码
db.url.0=jdbc:mysql://mysql84:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false
修改nacos配置文件的数据库配置

修改挂载的nacos配置文件 D:\ProgramData\docker-volumes\nacos-data-3-1-1\conf\application.properties,将数据库连接的url地址修改为获取到的mysql容器IP地址:

properties 复制代码
spring.sql.init.platform=mysql
db.num=1
db.url.0=jdbc:mysql://mysql84:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true
db.user=root
db.password=root

注意:

地址中使用的mysql容器访问地址为mysql容器名。

另外为了保证nacos容器能够直接访问到MySQL容器,需要在地址参数中添加allowPublicKeyRetrieval=true。
MySQL 8.0 默认不允许公钥检索,而 allowPublicKeyRetrieval=true 这个参数的作用是允许客户端从服务器获取 RSA 公钥用于密码身份验证。

修改日志存储

properties 复制代码
#--------------- Nacos logs Configurations ---------------#
nacos.logs.path=/home/nacos/logs
重新创建nacos容器
powershell 复制代码
docker run --name nacos-standalone-mysql --network container-net `
  -e MODE=standalone `
  -e NACOS_AUTH_TOKEN="MTQwMDIwOWVhZjRiNGI4NWI5MDRkMTFmMTFhNmViMmN0" `
  -e NACOS_AUTH_IDENTITY_KEY="key-placeholder" `
  -e NACOS_AUTH_IDENTITY_VALUE="value-placeholder" `
  -v D:\ProgramData\docker-volumes\nacos-data-3-1-1\data:/home/nacos/data `
  -v D:\ProgramData\docker-volumes\nacos-data-3-1-1\conf:/home/nacos/conf `
  -v D:\ProgramData\docker-volumes\nacos-data-3-1-1\logs:/home/nacos/logs `
  -p 8080:8080 `
  -p 8848:8848 `
  -p 9848:9848 `
  -d nacos/nacos-server:v3.1.1

Nacos配置文件中鉴权设置的默认值为false,如果要开启鉴权需要将其修改为 true

powershell 复制代码
### If turn on auth system:
# Whether open nacos server API auth system
nacos.core.auth.enabled=false
# Whether open nacos admin API auth system
nacos.core.auth.admin.enabled=true
# Whether open nacos console API auth system
nacos.core.auth.console.enabled=true

相关推荐
小黑蛋学java10 小时前
Ubuntu Docker 安装手册
linux·ubuntu·docker
qq_364371721 天前
基于 Docker 容器化环境配置
运维·docker·容器
GentleDevin1 天前
Docker 运维常用命令大全
docker·容器·运维命令
运维全栈笔记1 天前
基于Docker的MinIO单机部署与功能测试指南
运维·docker·容器
心机之蛙qee1 天前
docker的安装(RHEL9)
运维·docker·容器
炸炸鱼.1 天前
Docker 高级管理 —— 容器通信技术与数据持久化
docker
乐hh1 天前
DM8配置SSL
数据库·docker·ssl
极客先躯1 天前
高级java每日一道面试题-2025年12月05日-实战篇[Dockerj]-Docker 安装后的默认存储路径是什么?如何修改?
java·docker·默认存储路径在不同系统上的区别·linux overlay2·修改存储路径的理论方法·修改流程中的关键理论点
凤舞飘伶1 天前
windows安装docker-desk
windows·docker·容器
运维全栈笔记1 天前
Docker一键部署Immich:自建私有云相册,照片视频备份无忧
linux·服务器·网络·docker·容器