如何通过Docker搭建一个完整的开发环境?

摘要:通过 Docker 创建开发环境 网络设置 1. 查看所有Docker网络 docker network ls 示例结果: NETWORK ID NAME DRIVER SCOPE b649b57f5bc5 bridge bridge lo
通过 Docker 创建开发环境 网络设置 1. 查看所有Docker网络 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. 查看特定网络的详细信息 docker network inspect nacos-net 显示信息: 网络的子网范围 网关地址 该网络下所有容器的IP和名称 3. 查看网络内的所有容器 docker network inspect nacos-net | findstr "Name" "IPAddress" 或者更简洁的方式: docker network inspect nacos-net --format '{{ range .Containers }}{{ .Name }} - {{ .IPAddress }}{{ end }}' 更复杂的网络设置 1. 自定义桥接网络 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网络(跨主机通信) # 在第一个主机上创建 docker network create --driver overlay my-overlay-net # 在第二个主机上加入 docker network connect my-overlay-net <container-name> 3. 多网络连接(微服务架构) # 创建两个网络 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 # 获取nacos-net网络中所有容器的IP docker network inspect nacos-net --format '{{range .Containers}}{{.Name}} - {{.IPv4Address}}{{end}}' 2. 为容器指定固定IP docker run -d \ --name mysql \ --network nacos-net \ --ip 192.168.100.10 \ mysql:8.4 3. 网络安全配置(防火墙规则) # 仅允许特定网络访问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 等多个扩展模块,且自带可视化管理工具: # 拉取镜像 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) 创建宿主机挂载目录 # 创建数据、配置、日志目录(路径可自定义,保持统一即可) 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 启动容器,复制默认配置文件 # 使用镜像 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 容器(挂载所有目录) 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 驱动) docker network create container-net 为了使用MySQL存储Nacos的数据(docker镜像默认使用内置的derby数据库),先部署MySQL(Nacos3.x要求MySQL5.6.5+) MySQL Docker 部署 MySQL # 拉取镜像 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),添加日志配置: [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 # 主从复制必需(唯一标识) 修改配置后,重启容器让配置生效: 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 # 拉取镜像 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,必填。 # 复制容器内的 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访问 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默认数据源配置如下: #*************** 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容器的解决方法 直接使用mysql容器的ip地址,通过如下方式获取 docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysq87 将获取到的mysql容器IP地址添加到nacos配置文件中就可以实现nacos对mysql的访问。但是docker容器的IP地址会随着容器的停止、删除发生变化,为了保证稳定性,建议自定义桥接网络,并在创建容器时为需要通信的容器添加同一网络设置 自定义桥接网络 自定义一个桥接网络(默认网络驱动)网络 docker network create container-net 将nacos的网络设置为container-net,确保mysql和nacs容器之间的通信 修改nacos数据源配置,将地址设置为mysql容器的容器名mysql84,同一网络内的容器可以直接通过容器名访问 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地址: 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 公钥用于密码身份验证。 修改日志存储 #--------------- Nacos logs Configurations ---------------# nacos.logs.path=/home/nacos/logs 重新创建nacos容器 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 ### 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