通过 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

相关推荐
冬奇Lab16 小时前
一天一个开源项目(第41篇):Workout.cool - 现代化开源健身教练平台,训练计划与进度追踪
docker·开源·资讯
天朝八阿哥1 天前
使用Docker+vscode搭建离线的go开发调试环境
后端·docker·visual studio code
阿虎儿2 天前
Docker安装(非sudo用户可用)
docker
fetasty3 天前
rustfs加picgo图床搭建
docker
蝎子莱莱爱打怪4 天前
GitLab CI/CD + Docker Registry + K8s 部署完整实战指南
后端·docker·kubernetes
小p5 天前
docker学习7:docker 容器的通信方式
docker
小p5 天前
docker学习5:提升Dockerfile水平的5个技巧
docker
小p5 天前
docker学习3:docker是怎么实现的?
docker
小p6 天前
docker学习: 2. 构建镜像Dockerfile
docker