您现在的位置是:首页 >技术交流 >docker下不同容器的网络互相访问问题网站首页技术交流

docker下不同容器的网络互相访问问题

ricardo.M.Yu 2024-06-26 00:01:02
简介docker下不同容器的网络互相访问问题

目录

背景

​编辑

docker网络模式

解决方法

mysql下 docker-compose下网络设置

nacos

效果


背景

我这边有两个容器,宿主机ip为 192.168.1.115,一个mysql,一个nacos,部署在主机上,使用的默认网络bridge,想从nacos里面来使用mysql的库,发现不能使用主机的ip,现状:

查看当前网络

docker network ls

是因为容器间网络不互通的问题,

docker网络模式

  • host模式:和宿主机共用一个Network
  • bridge模式:默认网络模式,实际是在iptables做了DNAT规则,实现端口转发功能
  • none模式:拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。没有办法联网,封闭的网络能很好的保证容器的安全性。
  • container模式:和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享

解决方法

思路为创建一个共用网络,

 创建网络

docker network create dev

删除网络

 docker network rm mysql_default

mysql下 docker-compose下网络设置

version: '3.1'
services:
  mysql:
    image: mysql:8.0.17
    restart: always
    container_name: mysql
    privileged: true
    ports:
      - 3306:3306
    environment:
      TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: 111333
    command:
      --max_connections=1000
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --explicit_defaults_for_timestamp=true
      --lower_case_table_names=1
      --max_allowed_packet=128M
    volumes:
      - /apps/mysql/config:/etc/mysql
      - /apps/mysql/logs:/var/log/mysql
      - /apps/mysql/data:/var/lib/mysql
      - /apps/mysql/mysql-files:/var/lib/mysql-files/
    networks:
      - dev
networks:
  dev:
    external: true

创建一个mysql容器,使用这个dev,启动

查看网络状态

docker inspect dev

 mysql,已经挂到了这个网络下

nacos

可以直接使用容器名称来代替ip:

db.url.0=jdbc:mysql://mysql:3306/nacos

version: '3'
services:
  nacos:
    restart: always
    image: nacos/nacos-server:v2.2.1
    # 容器名称
    container_name: nacos
    # 端口映射
    ports:
      - 8108:8848
      - 9848:9848
      - 9849:9849
    # 容器权限
    privileged: true
    # 参数设置
    environment:
      JVM_XMS: 128m
      JVM_XMX: 128m
      JVM_MS: 64m
      JVM_MMS: 64m
      MODE: standalone
      NACOS_REPLICAS: 1
      PREFER_HOST_MODE: ip
      SPRING_DATASOURCE_PLATFORM: mysql
      MYSQL_SERVICE_HOST: mysql
      MYSQL_SERVICE_DB_NAME: nacos
      MYSQL_SERVICE_PORT: 3306
      MYSQL_SERVICE_USER: root
      MYSQL_SERVICE_PASSWORD: 113355
    volumes:
      - /apps/nacos/logs:/home/nacos/logs
      - /apps/nacos/plugins:/home/nacos/plugins
      - /apps/nacos/data:/home/nacos/data
      - /apps/nacos/config/application.properties:/home/nacos/conf/application.properties
    networks:
      - dev
networks:
  dev:
    external: true
### If use MySQL as datasource:
spring.datasource.platform=mysql

### Count of DB:
db.num=1

### Connect URL of DB:
db.url.0=jdbc:mysql://mysql:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=113355

nacos.core.auth.plugin.nacos.token.secret.key=SecretKey012345678901234567890123456789012345678901234567890123456789

#
#nacos.core.auth.enabled=true
#nacos.core.auth.enable.userAgentAuthWhite=false
#nacos.core.auth.server.identity.key=自定义的值
#nacos.core.auth.server.identity.value=自定义的值

效果

启动后效果:

两个容器都已经加入的这个网络,并且可以使用容器名字访问

检查网络状态

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。