使用docker-compse安装了一套系统。
结果发现mysql等中间件无法通过主机ip访问。
尝试使用 telnet 127.0.0.1 3306可以通,telnet 主机IP 3306不通。
经过各种折腾,发现问题。
居然没有创建ipv4的端口映射。
查了下资料发现,现在的很多新版本系统,都是默认ipv6网络优先。
然后安装docker后,docker默认使用ipv6构建docker0网络。
所以容器端口映射,仅创建了tcp6的端口,没有tcp的端口。也就是不支持使用ipv4访问。
解决办法:
修改主机/etc/docker/daemon.json的配置,增加如下配置项:
{
"ipv6": false,
"fixed-cidr-v6": ""
}
然后重启docker服务:
sudo systemctl restart docker
再查看
然后再telnet 主机IP 3306就可以了。
该方法同样可以解决redis等其他中间件问题。重点是这个网络问题。
这里补充一下,有一些细节配置还是需要注意的。例如设置mysql或者redis监听:0.0.0.0
version: '3'
services:
#创建mysql数据库
szxc-mysql:
image: "image.sd001.cn:30003/base/mysql:8.0.12"
privileged: true
environment:
- "MYSQL_ROOT_PASSWORD=Dict@2024"
- "TZ=Asia/Shanghai"
volumes:
- "/szxc/mysql:/var/lib/mysql"
container_name: szxc-mysql
command: --default-authentication-plugin=mysql_native_password --bind-address=0.0.0.0
#ports:
# - "3306:3306"
restart: always
network_mode: "host"
deploy:
resources:
limits:
memory: "2048M"
reservations:
memory: "20M"
#创建redis
szxc-redis:
image: "image.sd001.cn:30003/base/redis:6.0.9-alpine"
volumes:
- "/szxc/redis/data:/data"
environment:
- "TZ=Asia/Shanghai"
- "REDIS_PASSWORD=Dict@2024"
container_name: szxc-redis
command: redis-server --bind 0.0.0.0 --protected-mode no
#ports:
# - "6379:6379"
restart: always
network_mode: "host"
deploy:
resources:
limits:
memory: "2048M"
reservations:
memory: "20M"
如果没有配置0.0.0.0的监听,本身就没法远程访问。