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删除所有容器

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值