Docker网络配置与自定义IP容器通信

目录

前言

一、docker网络配置

[1. bridge 虚拟网桥](#1. bridge 虚拟网桥)

[2. host 网络模式](#2. host 网络模式)

[3. none 网络模式](#3. none 网络模式)

[4. 自定义container网络模式](#4. 自定义container网络模式)

二、自定义IP容器通信

[1. 自定义IP](#1. 自定义IP)

[2. 创建所需容器(mysql,tomcat)](#2. 创建所需容器(mysql,tomcat))

[3. 准备项目资源](#3. 准备项目资源)

[4. 构建Nginx实现负载均衡](#4. 构建Nginx实现负载均衡)


前言

当项目大规模使用 Docker 时,容器通信的问题也就产生了。要解决容器通信问题,必须先了解很多关于网络的知识。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker 同样有着很多不完善的地方,网络方面就是 Docker 比较薄弱的部分。因此,我们有必要深入了解 Docker 的网络知识,以满足更高的网络需求。

互联网是由许多小型网络构成的,每个网络上都有许多主机,这样便构成了一个有层次的结构。 IP地址在设计时就考虑到地址分配的层次特点,将每个IP地址都分割成网络号和主机号两部分,以便于 IP地址的寻址操作。

1、子网掩码

子网掩码用于划分网络和主机部分。子网掩码用来区分一个IP地址中的网络地址和主机地址部分,帮助进行网络分割和管理。

组成规则

  • 子网掩码由32位组成,通常表示为4个8位的数字(例如255.255.255.0)。
  • 在子网掩码中,连续的"1"代表网络部分,而连续的"0"则代表主机部分。
  • 例如,子网掩码255.255.255.0表示前24位是网络地址,最后8位是主机地址。

2、网关

网关通常指的是两个网络之间的接口设备,它可以在不同的网络或子网间转发数据。

作用

  • 网关可以将来自一个网络的数据包转发到另一个网络。
  • 它通常用于连接本地网络(LAN)和大型网络(如互联网)。

当一个网络中的设备需要与另一个网络中的设备通信时,数据包首先发送到网关。然后,网关判断如何将数据包发送到目的地。

3、子网掩码和网关的关系

  • 子网掩码用于确定网络的范围,而网关则用于在不同网络间转发数据。
  • 在配置网络设备(如路由器、电脑等)时,通常需要同时设置子网掩码和网关地址,以确保设备能正确地与其他网络通信。

算机的IP地址是互联网上每台计算机或设备唯一的标识符。 在目前广泛使用的两个版本中,IPv4 地址由32位组成,而IPv6地址由128位组成。下面将重点介绍IPv4地址,因为它更为常用。

IPv4地址:

组成 :IPv4地址由32位二进制数字组成,通常分为4个8位的部分,每部分称为一个八位字节(或octet)。例如,一个IPv4地址在二进制格式下可能看起来像这样:11000000.10101000.00000001.00000001

十进制表示 :为了便于阅读,IPv4地址通常转换为十进制格式,并用点分隔。例如,上面的二进制地址可以转换为十进制表示为:192.168.1.1

地址分类:IPv4地址分为几个类别:A、B、C、D和E类。

  • A类地址用于大型网络,其第一个八位字节的范围是0-127。
  • B类地址用于中型网络,其第一个八位字节的范围是128-191。
  • C类地址用于小型网络,其第一个八位字节的范围是192-223。
  • D类地址用于多播,E类地址保留用于实验。

网络地址和主机地址

在一个IP地址中,部分八位字节用来表示网络地址,其余部分表示主机地址。子网掩码用于区分这两部分。例如,在子网掩码255.255.255.0下,IP地址192.168.1.1的前三个八位字节表示网络地址,最后一个八位字节表示主机地址。

特殊地址

某些IP地址有特殊用途,例如127.0.0.1通常用作回环地址,用于指向本机。私有地址范围(如192.168.x.x, 10.x.x.x, 172.16.x.x - 172.31.x.x)在内部网络中使用,但不在互联网上路由。

IPv6地址:

组成:IPv6地址由128位二进制数字组成,通常分为8组,每组4个十六进制数字。

表示方式 :例如,一个IPv6地址可能看起来像这样:2001:0db8:85a3:0000:0000:8a2e:0370:7334

IPv6地址能够提供比IPv4更多的地址空间,应对互联网地址耗尽的问题。

一、docker网络配置

当你安装了docker,它会自动创建3个网络,可以使用docker network ls 命令来查看

  • bridge --网桥
  • host --主机(本地)
  • none --无网络
  • container --共享

当你运行一个容器的时候,可以使用--network参数来指定你的容器连接到哪一个网络。

查看容器网络指令:

  • ip addr
  • ifconfig

1. bridge 虚拟网桥

为每一个容器分配、设置IP等,当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上(默认模式)。

虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中:

从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。 在主机上创建一对虚拟网卡veth pair设备,Docker将veth pair设备的一端放在新创建的容器中,并命名 为eth0(容器的网卡),另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入 到docker0网桥中。
查看一个名为t1的容器(原tomcat)bridge网络信息:

docker inspect t1

可以看到它网桥是172.17.0.2,它的网关是172.17.0.1,网络模式是bridge。

示例:

运行一个镜像未指定网络模式(默认bridge)

cpp 复制代码
docker run -itd --name spring -p 8081:8080 spring:v1

注意:-p参数可以出现多次,绑定多个端口号 ,就意味着外部可以通过多个端口号访问到8080

2. host 网络模式

  • host 网络模式需要在创建容器时通过参数 --net host 或者 --network host 指定;
  • 采用 host 网络模式的 Docker Container,可以直接使用宿主机的 IP 地址与外界进行通信,若宿主机的 eth0 是一个公有 IP,那么容器也拥有这个公有 IP。同时容器内服务的端口也可以使用宿主机的端口,无需额外进行 NAT 转换;
  • host 网络模式可以让容器共享宿主机网络栈,这样的好处是外部主机与容器直接通信,但是容器的网络缺少隔离性。

示例:

运行一个镜像指定host网络模式

cpp 复制代码
docker run -itd --name spring2 --net=host spring:v1

这时只能通过主机端口8080才能访问了

3. none 网络模式

  • none 网络模式是指禁用网络功能,只有 lo 接口 local 的简写,代表 127.0.0.1,即 localhost 本地环回接口。在创建容器时通过参数 --net none 或者 --network none 指定;
  • none 网络模式即不为 Docker Container 创建任何的网络环境,容器内部就只能使用 loopback 网络设备,不会再有其他的网络资源。可以说 none 模式为 Docke Container 做了极少的网络设定,但是俗话说得好"少即是多",在没有网络配置的情况下,作为 Docker 开发者,才能在这基础做其他无限多可能的网络定制开发。这也恰巧体现了 Docker 设计理念的开放。

4. 自定义container网络模式

  • Container 网络模式是 Docker 中一种较为特别的网络的模式。在创建容器时通过参数 --net container:已运行的容器名称|ID 或者 --network container:已运行的容器名称|ID 指定;
  • 处于这个模式下的 Docker 容器会共享一个网络栈,这样两个容器之间可以使用 localhost 高效快速通信。

Container 网络模式即新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样两个容器除了网络方面相同之外,其他的如文件系统、进程列表等还是隔离的。

二、自定义IP容器通信

1. 自定义IP

需要先创建一个网络

cpp 复制代码
docker network create --gateway 172.18.0.1 --subnet 172.18.0.0/16(端口) net(网络名)

查看网络信息:docker inspect net

2. 创建所需容器(mysql,tomcat)

I. 创建tomcat容器(指定IP与网络)

cpp 复制代码
docker run -it --name tm \
-p 8080:8080 \
-v /test:/usr/local/tomcat/webapps \ 
--net net \
--ip 172.18.0.2 \ 
tomcat:8.5.20

II. 创建mysql容器(指定IP与网络)

创建存放mysel数据的文件夹

cpp 复制代码
mkdir -p /mysql/{conf,data}

并创建my.cnf配置文件到conf目录

my.cnf内容:

cpp 复制代码
[client]
default-character-set=utf8
 
[mysql]
default-character-set=utf8
 
[mysqld]
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
skip-host-cache
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
secure-file-priv=/var/lib/mysql-files
user=mysql

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
# default: sql_mode= STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
# modeified: 
sql_mode= STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
max_allowed_packet=10M
default-time_zone='+8:00'
default_authentication_plugin=mysql_native_password

1、创建mysql容器:

cpp 复制代码
docker run \
--name m1 \
-v /mysql/conf/my.cnf:/etc/my.cnf \
-v /mysql/data:/var/lib/mysql \
--privileged=true \
-e MYSQL_ROOT_PASSWORD=123456 \
--net net \
--ip 172.18.0.3 \
-d mysql/mysql-server:5.7

首先进入mysql容器进行登录,添加用户(远程连接)赋予权限,最后退出重启容器。

2、创建数据库

由于之前将mysql数据挂载到了var/lib/mysql,所以我们只需要把sql脚本放在宿主机目录即可,而挂载的目录也会生成一样的文件

运行sql脚本全操作:

查看数据表:show tables (退回mysql后记得重启哦

3. 准备项目资源

这是一个前后端分离项目,启动项目需要修改配置信息

application.yml:

项目资源:

Dockerfile:

1、构建镜像

docker build -t spring:v1.0 .

根据镜像创建启动容器并指定IP地址

docker run -itd --name s1 --net net --ip 172.18.0.101 spring:v1.0

docker run -itd --name s2 --net net --ip 172.18.0.102 spring:v1.0

docker run -itd --name s3 --net net --ip 172.18.0.103 spring:v1.0


查看日志 docker log s1**(已启动成功)**

4. 构建Nginx实现负载均衡

首先创建nginx的配置文件目录并将配置文件放入

mkdir -p  /soft/nginx/conf.d

静态资源:


default.conf:这里的服务器的集群和我们的Tomcat容器IP一致

XML 复制代码
#服务器的集群
upstream tomcatList {  
    server 172.18.0.101:8080 weight=1; 
    server 172.18.0.102:8080 weight=1; 
    server 172.18.0.103:8080 weight=1; 
} 
    
server {
 
    listen  80;
    server_name  www.ycxw.com;
 
    location / {
        root   /etc/nginx/html/;
        index  index.html index.htm;
    }
 
    error_page   500 502 503 504  /50x.html;
    
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
    
    location ~^/api/ {
        rewrite ^/api/(.*)$ /$1 break;
        proxy_pass  http://tomcatList;
        proxy_redirect default;
    }
 
}

构建nginx容器

XML 复制代码
docker run -itd \
--name n1 \
-v /test/nginx/conf.d:/etc/nginx/conf.d \
-v /test/nginx/html:/etc/nginx/html \
-p 80:80 \
--net net \
--ip 172.18.0.105 \
nginx

启动项目测试:

测试负载均衡:停了两台服务器

还能运行:

相关推荐
m0_6090004231 分钟前
向日葵好用吗?4款稳定的远程控制软件推荐。
运维·服务器·网络·人工智能·远程工作
suifen_3 小时前
RK3229_Android9.0_Box 4G模块EC200A调试
网络
铁松溜达py4 小时前
编译器/工具链环境:GCC vs LLVM/Clang,MSVCRT vs UCRT
开发语言·网络
m0_741768855 小时前
使用docker的小例子
运维·docker·容器
最新小梦8 小时前
Docker日志管理
运维·docker·容器
衍生星球8 小时前
【网络安全】对称密码体制
网络·安全·网络安全·密码学·对称密码
掘根8 小时前
【网络】高级IO——poll版本TCP服务器
网络·数据库·sql·网络协议·tcp/ip·mysql·网络安全
友友马9 小时前
『 Linux 』HTTP(一)
linux·运维·服务器·网络·c++·tcp/ip·http
2401_872514979 小时前
深入探究HTTP网络协议栈:互联网通信的基石
网络·网络协议·http