赞
踩
目录
当项目大规模使用 Docker 时,容器通信的问题也就产生了。要解决容器通信问题,必须先了解很多关于网络的知识。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker 同样有着很多不完善的地方,网络方面就是 Docker 比较薄弱的部分。因此,我们有必要深入了解 Docker 的网络知识,以满足更高的网络需求。
互联网是由许多小型网络构成的,每个网络上都有许多主机,这样便构成了一个有层次的结构。 IP地址在设计时就考虑到地址分配的层次特点,将每个IP地址都分割成网络号和主机号两部分,以便于 IP地址的寻址操作。
1、子网掩码
子网掩码用于划分网络和主机部分。子网掩码用来区分一个IP地址中的网络地址和主机地址部分,帮助进行网络分割和管理。
组成规则:
2、网关
网关通常指的是两个网络之间的接口设备,它可以在不同的网络或子网间转发数据。
作用:
当一个网络中的设备需要与另一个网络中的设备通信时,数据包首先发送到网关。然后,网关判断如何将数据包发送到目的地。
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,它会自动创建3个网络,可以使用 docker network ls 命令来查看
当你运行一个容器的时候,可以使用--network参数来指定你的容器连接到哪一个网络。
查看容器网络指令:
- ip addr
- ifconfig
为每一个容器分配、设置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
--net host
或者 --network host
指定;示例:
运行一个镜像指定host网络模式
docker run -itd --name spring2 --net=host spring:v1
这时只能通过主机端口8080才能访问了
--net none
或者 --network none
指定;--net container:已运行的容器名称|ID
或者 --network container:已运行的容器名称|ID
指定;Container 网络模式即新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样两个容器除了网络方面相同之外,其他的如文件系统、进程列表等还是隔离的。
需要先创建一个网络
docker network create --gateway 172.18.0.1 --subnet 172.18.0.0/16(端口) net(网络名)
查看网络信息:docker inspect net
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后记得重启哦)
这是一个前后端分离项目,启动项目需要修改配置信息
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(已启动成功)
首先创建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
启动项目测试:
测试负载均衡:停了两台服务器
还能运行:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。