docker network实现容器间访问的简单配置

目录

环境:

安装docker

配置docker镜像加速

安装docker-compose

创建网络

配置应用

方式一、

主要关注点:

方式二、

链接方法:


环境:

阿里云服务器,centos8(docker更喜欢8)

这里是docker-compose直接启动的docker容器,非docker swarm集群。

以三个容器为例,nginx,msyql,java服务

前提安装docker及docker-compose

顺带顺一下docker的安装配置

 

安装docker

可以参考菜鸟教程:

https://www.runoob.com/docker/centos-docker-install.html

开机启动:

#开机启动
systemctl enable docker

#启动docker
systemctl start docker.service
#重启docker
systemctl restart docker.service
#停止docker
systemctl stop docker.service

配置docker镜像加速

添加自定义配置文件:

cd /etc/docker

vim daemon.json

vim daemon.json

添加一下内容: (这里只加了网易和百度云的镜像,如果你有阿里云的可以参考菜鸟教程中的吧阿里的仓库地址也加上)

{
  "registry-mirrors": [
    "https://hub-mirror.c.163.com",
    "https://mirror.baidubce.com"
  ]
}

重启docker:

systemctl restart docker.service

查看信息 执行

docker info

Registry Mirrors:

https://hub-mirror.c.163.com/

https://mirror.baidubce.com/

安装docker-compose

查看最新版本:https://github.com/docker/compose/releases

目前是:1.27.4

执行命令安装

`curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose`

 

以下进入正题:

创建网络

创建名为net-ehooyun的bridge网络,适用于单机内部。overlay网路是集群用的。

docker network create -d bridge net-ehooyun

详情或测试方法可以参照:

https://www.runoob.com/docker/docker-container-connection.html

配置DNS:

参照菜鸟:

https://www.runoob.com/docker/docker-container-connection.html

编辑上边提到的daemon.json ,加入dns配置即可

vim /etc/docker/daemon.json

编辑后内容如下:

{
  "registry-mirrors": [
    "https://imhqgpul.mirror.aliyuncs.com",
    "https://hub-mirror.c.163.com",
    "https://mirror.baidubce.com"
  ],
  "dns" : [
    "114.114.114.114",
    "8.8.8.8"
  ]
}

设置后,启动容器的 DNS 会自动配置为 114.114.114.114 和 8.8.8.8。

配置完,需要重启 docker 才能生效。

查看容器的 DNS 是否生效可以使用以下命令,它会输出容器的 DNS 信息:

docker run -it --rm  ubuntu  cat etc/resolv.conf

配置应用

开始配置应用的docker-compose文件

方式一、

三个服务在一个docker- compose文件中如下:

docker-compose.yml

version: '3.3'
services:
   nginx:
    image: nginx
#    hostname: nginx
    #image: nginx:1.19.1-alpine
    container_name: nginx
    restart: always
    privileged: true
    environment:
      - TZ=Asia/Shanghai 
    ports:
#      - 8080:80
      - 80:80
      - 443:443
    volumes:
      - /etc/localtime:/etc/localtime:ro
      #- /ehooyun/nginx/conf/nginx.conf:/etc/nginx/nginx.conf:ro
      - /ehooyun/nginx/conf.d:/etc/nginx/conf.d
      - /ehooyun/logs/nginx:/var/log/nginx
      - /ehooyun/nginx/dist:/opt/dist:ro
    networks:
      - net-ehooyun
      
  # 指定服务名称
   diamond:
    # 指定服务使用的镜像
    image: diamond
#    hostname: diamond
    # 指定容器名称
    container_name: diamond
    # 指定服务运行的端口
    ports:
    - target: 8080
      published: 8080
      mode: host
    # 指定容器中需要挂载的文件
    volumes:
      - /etc/localtime:/etc/localtime
      - /ehooyun/logs/diamond:/var/logs
    networks:
      - net-ehooyun
      
   mysql:
#    network_mode: "host"
#    hostname: mysql
    restart: always
    container_name: mysql
    image: mysql:5.7
    command: 
     --lower_case_table_names=1
     --character-set-server=utf8mb4
     --collation-server=utf8mb4_unicode_ci
     --explicit_defaults_for_timestamp=true
    environment:
      TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: qwe123123fasdfa
      #MYSQL_USER: 'ehoonyun'
      #MYSQL_PASS: 'ehooyun12123'
    ports:
     - 3306:3306
    volumes:
     - /ehooyun/mysql/data:/var/lib/mysql
     - /ehooyun/mysql/config:/etc/mysql/conf.d
     - /ehooyun/mysql/log:/var/log/mysql
    networks:
      - net-ehooyun
      
      
networks:
    net-ehooyun:
       external:  true

启动命令:

docker-compose -f /ehooyun/compose/docker-compose.yml up -d

启动所有服务后可以看java服务是否能连上myql

或者通过配置网络那还不的测试方法测试一下。进入容器使用ping mysql 或者curl mysql的方式来测试一下是否互通。

 

主要关注点:

  • 每个service的   

networks:
      - net-ehooyun

  • 最终的

networks:
    net-ehooyun:
       external:  true

就ok了,

方式二、

由于单个服务经常单独重启,所以我也为内个服务单独创建了compose文件,单独使用的话可以如下拆分:

mysql:

docker-compose-mysql.yml

version: '3.3'

services: 
  mysql:
#    network_mode: "host"
#    hostname: mysql
    restart: always
    container_name: mysql
    image: mysql:5.7
    command: 
     --lower_case_table_names=1
     --character-set-server=utf8mb4
     --collation-server=utf8mb4_unicode_ci
     --explicit_defaults_for_timestamp=true
    environment:
      TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: qwe12312331afadf
      #MYSQL_USER: 'ehoonyun'
      #MYSQL_PASS: 'ehooyun12123'
    ports:
     - 3306:3306
    volumes:
     - /ehooyun/mysql/data:/var/lib/mysql
     - /ehooyun/mysql/config:/etc/mysql/conf.d
     - /ehooyun/mysql/log:/var/log/mysql
    networks:
      - net-ehooyun
      
networks:
    net-ehooyun:
       external:  true

java:

docker-compose-diamond.yml

version: '3.3'

services:
  # 指定服务名称
  diamond:
    # 指定服务使用的镜像
    image: diamond
    hostname: diamond
    # 指定容器名称
    container_name: diamond
    # 指定服务运行的端口
    ports:
    - target: 8080
      published: 8080
      mode: host
    # 指定容器中需要挂载的文件
    volumes:
      - /etc/localtime:/etc/localtime
      - /ehooyun/logs/diamond:/var/logs
    networks:
      - custom_net
      
networks:
  custom_net:
   external:
      name: net-ehooyun

nginx: 

docker-compose-nginx.yml

version: '3'

services:
  nginx:
    image: nginx
    hostname: nginx
    #image: nginx:1.19.1-alpine
    container_name: nginx
    restart: always
    privileged: true
    environment:
      - TZ=Asia/Shanghai 
    ports:
#      - 8080:80
      - 80:80
      - 443:443
    volumes:
      - /etc/localtime:/etc/localtime:ro
      #- /ehooyun/nginx/conf/nginx.conf:/etc/nginx/nginx.conf:ro
      - /ehooyun/nginx/conf.d:/etc/nginx/conf.d
      - /ehooyun/logs/nginx:/var/log/nginx
      - /ehooyun/nginx/dist:/opt/dist:ro
    networks:
      - net-ehooyun
      
      
networks:
    net-ehooyun:
       external: true

 

链接方法:

访问的时候通过service名当做hostname访问即可。

比如java项目中写mysql地址就可以直接写mysql代替ip地址:

    url: jdbc:mysql://mysql:3306/diamond?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=CTT&allowMultiQueries=true

这样可以实现容器间互通,内网调用无需解析ip,提高速度。

这里发现可以不用指定hostname,这样就默认使用service名称来作为host访问。

docker常用命令:

docker ps // 查看所有正在运行容器
docker stop containerId // containerId 是容器的ID 
docker ps -a // 查看所有容器 $ docker ps -a -q // 查看所有容器ID 
docker stop $(docker ps -a -q) //  stop停止所有容器 
docker rm $(docker ps -a -q) //   remove删除所有容器

 

<think>我们正在讨论Docker网络,特别是如何通过自定义网络创建容器。根据引用内容,Docker默认有三种网络:bridge、host、none。但我们可以创建自定义网络来实现更灵活的网络配置。首先,创建自定义网络:```bashdockernetworkcreate--driverbridgemy-custom-network```这里我们创建了一个名为`my-custom-network`的桥接网络。然后,在运行容器时,使用`--network`参数指定自定义网络:```bashdockerrun-d--namemy-container--networkmy-custom-networknginx```这样,容器`my-container`就会连接到自定义网络`my-custom-network`上。引用[3]提到可以给容器分配静态IP,在自定义网络中也可以实现:```bashdockerrun-d--namestatic-container--networkmy-custom-network--ip172.20.0.10nginx```注意:只有在自定义网络中才能指定静态IP,而且IP必须在子网范围内。引用[2]提到,在自定义网络中,容器可以通过容器名称进行通信,因为Docker内置了DNS解析。例如,在同一个自定义网络中的容器`my-container`可以直接通过容器名称`static-container`访问它。验证容器网络配置:```bashdockerinspectstatic-container```可以查看容器的网络详细信息,包括IP地址、网关等。引用[4]指出,如果容器在创建时指定了自定义网络,它就不会加入默认的bridge网络(docker0)。引用[5]介绍了四种基础网络模式,并提到自定义网络属于bridge模式的一种扩展,提供了更好的隔离性和便利的容器通信。总结步骤:1.创建自定义网络(使用`dockernetworkcreate`)2.运行容器时使用`--network`指定该网络3.(可选)使用`--ip`指定静态IP(仅适用于自定义网络)4.容器通过容器名称直接通信这样,我们就实现了在自定义网络中创建容器,并可以根据需要配置容器网络属性。相关问题:1.如何查看Docker中已有的网络?2.如何删除自定义网络?3.如何将已运行的容器连接到自定义网络?4.自定义网络与默认的bridge网络有何区别?</think>### 如何在 Docker 中通过自定义网络创建容器Docker 中通过自定义网络创建容器主要分为两个步骤:**创建自定义网络**和**在自定义网络中启动容器**。以下是详细操作流程: #### 1. 创建自定义网络 ```bash # 创建自定义桥接网络 docker network create --driver bridge my-custom-network # 查看已创建的网络 docker network ls ``` - `--driver bridge`:指定网络驱动类型(默认为桥接模式) - `my-custom-network`:自定义网络名称(可任意指定) - 创建后可通过 `docker network inspect my-custom-network` 查看网络详情[^3] #### 2. 在自定义网络中创建容器 ```bash # 启动容器并加入自定义网络 docker run -d \ --name my-container \ --network my-custom-network \ nginx:latest # 可选:指定静态IP(需在子网范围内) docker run -d \ --name static-container \ --network my-custom-network \ --ip 172.20.0.10 \ nginx:latest ``` - `--network my-custom-network`:关键参数,指定容器加入的自定义网络 - `--ip`:仅在自定义网络中可指定静态IP(默认网络不支持)[^3] #### 3. 验证网络连接 ```bash # 进入容器测试网络连通性 docker exec -it my-container ping static-container # 查看容器网络配置 docker inspect my-container | grep IPAddress ``` **特性优势**: 1. **自动DNS解析**:同一网络内的容器可直接通过容器名通信(无需IP)[^2] 2. **网络隔离**:与默认`docker0`网络隔离,提升安全性[^5] 3. **灵活配置**:支持自定义子网、网关、IP范围等参数[^4] #### 工作示意图 ```mermaid graph LR A[宿主机] --> B[自定义网络 my-custom-network] B --> C[容器1] B --> D[容器2] C -. 容器名直连 .-> D ``` > **注意**:默认`bridge`网络不支持容器名解析,而自定义网络提供内置DNS服务,这是关键区别[^2][^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值