Docker网络配置与自定义IP容器通信
作者: 云村小威
前言
当项目大规模使用 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)
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网络模式
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
需要先创建一个网络
docker network create --gateway 172.18.0.1 --subnet 172.18.0.0/16(端口) net(网络名)
查看网络信息:docker inspect net
2. 创建所需容器(mysql,tomcat)
I. 创建tomcat容器(指定IP与网络)
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数据的文件夹
mkdir -p /mysql/{conf,data}
并创建my.cnf配置文件到conf目录
my.cnf内容:
[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容器:
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一致
#服务器的集群 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容器
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
启动项目测试:
测试负载均衡:停了两台服务器
还能运行:
到此这篇关于Docker网络配置与自定义IP容器通信的文章就介绍到这了,更多相关Docker 自定义IP容器通信内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!