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

news2024/11/17 3:32:34

目录

前言

一、docker网络配置

1. bridge 虚拟网桥

2. host 网络模式

3. none 网络模式

4. 自定义container网络模式

二、自定义IP容器通信

1. 自定义IP

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

3. 准备项目资源

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)

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

启动项目测试:

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

还能运行:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1409642.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

内推机会来啦!网络、云计算、数据库岗位招人,最高25K/月!

PaaS工程师任职要求: 1.熟练掌握Java开发语言,具备编程开发能力和脚本维护能力;懂微服务(springcloud);熟悉JavaScript语言。 2.熟悉docker镜像原理,dockerfile制作命令与流程;熟悉K…

独立站怎么建设对seo好?

现如今市面上就有不少开源的建站程序可供挑选,哪怕你不懂技术,不懂代码,也能建自己的独立站,效果比不少所谓的用自己技术开发的站都要好,本身做一个网站不难,但你做网站的目的是什么?是为了在搜…

常见の算法

前言本文主要使用Java 什么,是快乐星球#¥%……什么是算法? 算法是一组完成任务的指令。任何代码片段都可视为算法,但我们主要介绍常见算法 一、引入——二分查找 二分查找是一种算法,其输入是一个有序的元素列表。如…

51单片机ESP8266

一、MQTT透传AT固件 安信可提供的烧录WiFi固件工具: 链接: https://docs.ai-thinker.com/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B72 安信可提供的固件库链接: https://docs.ai-thinker.com/%E5%9B%BA%E4%BB%B6%E6%B1%87%E6%80%BB 经过测试,选择这个不可以…

6.jmeter非GUI命令及Beanshell组件

一、非GUI(界面)命令详解 1. -n 使用非gui方式,不能单独使用,必须和-t(指定jmeter的脚本)一起用。 #cmd命令行模式下,进入存放测试jmx文件的目录下 jmeter -n -t hello.jmx只会生成一个log日…

linux clickhouse 安装

1、官网下载clickhouse安装包 下载地址, clickhouse分lts和stable版本,lts是长期版本,一般选择安装lts版本。 其中clickhouse-server是clickhouse服务,就是用来访问数据存储数据,clickhouse-client是用来通过命令访问数…

Windows11 鼠标拖动文件到CMD控制终端窗口无效,无法显示具体文件路径

对于某些用户来说,他们可能会在Windows 11上遇到鼠标拖动文件到CMD控制终端时,无法显示具体文件路径的情况。 系统更新,习惯基础操作无效了,真的有点烦,不会提问就无计可施。 果然善于提问,才有果子吃 问…

Java日期和时间学习记录2

1、Java的LocalDate类当前时间往未来几天和过去时间几天 import java.time.LocalDate;public class Main {public static void main(String[] args) {// 获取当前日期LocalDate currentDate LocalDate.now();System.out.println("当前日期:" currentDa…

Go 定时器:如何避免潜在的内存泄漏陷阱

这篇文章将探讨的是 Go 中如何高效使用 timer,特别是与select 一起使用时,如何防止潜在的内存泄漏问题。 引出问题 先看一个例子,我们在 Go 中的 select 使用定时器,实现为消息监听加上超时能力。 核心代码,如下所示…

java安装,从java1.8升级到java11.0,java,javac,javaw,javaws,jdk,jre

最近在学习 PyFlink,需要安装Java11环境,但是本机已经安装了java1.8,在升级的过程中遇到了一些问题,在这里记录一下。 windows下安装JDK11 下载JDK11:https://www.oracle.com/java/technologies/downloads/#java11-w…

MyBatis入门基础篇

MyBatis基础篇 MyBatis是一款优秀的特久层框架,用于简化JDBC开发。其是Apache的一个开源项目iBatis,2010年这个项目由apache software foundation迁移到了google code,并且改名为MyBatis。2013年11月迁移到Github。由于MyBatis中的大部分API参数与数据库事务息息相…

详细介绍 Go 中如何实现 bitset

文章目录 bitset 结构元素位置代码实现构造函数BitSet 的方法基础方法containsclearadd 集合方法computeSize方法定义intersectuniondifference 遍历集合的元素总结 最近尝试在 B 站录些小视频,我的 B 站主页。录视频当是为了彻底搞懂某个知识点的最后一步吧&#x…

【C++】stack、queue的使用及模拟实现

目录 一、stack1.1 stack的使用1.2 stack的模拟实现 二、queue2.1 queue的使用2.2 queue的模拟实现 一、stack 1.1 stack的使用 stack是一种容器适配器,它的特点是后进先出,只能在容器的一端进行插入和删除操作。 stack的使用很简单,主要有…

代码随想录算法训练营31期day4,力扣24+19+02.07+142

24,动指针 class Solution { public:ListNode* swapPairs(ListNode* head) {//建立虚拟头结点auto dummynew ListNode(-1);dummy->nexthead;for(auto pdummy;p->next&&p->next->next;){auto ap->next;auto ba->next;p->nextb;a->n…

图像旋转角度计算并旋转

#!/usr/bin/python3 # -*- coding: utf-8 -*- import cv2 import numpy as np import timedef Rotate(img, angle0.0,fill0):"""旋转:param img:待旋转图像:param angle: 旋转角度:param fill:填充方式,默认0黑色填充:return: img: 旋转后…

【保驾护航】HarmonyOS应用开发者基础认证-题库

通过系统化的课程学习,熟练掌握DevEco Studio,ArkTS,ArkUI,预览器,模拟器,SDK等HarmonyOS应用开发的关键概念,具备基础的应用开发能力。 考试说明 1、考试需实名认证,请在考前于个…

林浩然的政治学奇幻漂流——幽默诙谐解读马基雅维利

林浩然的政治学奇幻漂流——幽默诙谐解读马基雅维利 Lin Haoran’s Whimsical Exploration of Machiavelli’s Political World 在一个阳光明媚的周末,我们的主人公林浩然同学决定穿越历史长河,踏上一场充满智识与笑声的探索之旅,目的地是文艺…

NineData和泽拓数据库产品Klustron完成产品兼容互认证

近日,云原生智能数据管理平台NineData和泽拓昆仑分布式数据库产品Klustron完成产品兼容互认证。经过严格的联合测试,双方软件完全相互兼容、功能完善、整体运行稳定且性能表现优异。 本次玖章算术与泽拓科技的携力合作,在双方共同的努力下&a…

nextjs中beforePopState使用

在某些情况下,希望监听popstate并在路由器对其进行操作之前执行某些操作。可以使用beforePopState。 在Next.js中,beforePopState是一个可选的生命周期函数,用于在浏览器的历史记录发生更改之前执行一些操作。具体来说,beforePopS…

DP读书:在常工院的2023年度总结

DarrenPig的年度总结 这是最好的时代,这是最坏的时代。——狄更斯 这是最好的时代,这是最坏的时代。——狄更斯 这是最好的时代,这是最坏的时代。——狄更斯 一、2023我的感受 不就是2023吗,不就是一年的经历吗,大家…