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

目录

前言

一、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=0log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pidinit_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.mzph.cn/news/645736.shtml

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

相关文章

this指向问题以及修改函数的this指向方法

1、什么是this this表示对象 取决于函数调用(this表示对象>当前对象>当前环境对象>函数运行时环境对象) this就是函数运行时所在的环境对象(取决于函数调用>不同场合,this有不同的值) 函数的不同使用场…

PyTorch深度学习实战(32)——DCGAN详解与实现

PyTorch深度学习实战(32)——DCGAN详解与实现 0. 前言1. 模型与数据集分析1.1 模型分析1.2 数据集介绍 2. 构建 DCGAN 生成人脸图像小结系列链接 0. 前言 DCGAN (Deep Convolutional Generative Adversarial Networks) 是基于生成对抗网络 (Convolution…

PWN入门Protostar靶场Stack系列

Protostar靶场地址 https://exploit.education/protostar/溢出 源码分析 #include <stdlib.h> #include <unistd.h> #include <stdio.h>int main(int argc, char **argv) {volatile int modified; //定义一个变量char buffer[64]; //给…

Git 入门精讲

我们为什么要学习git&#xff1f; 就当下的发展而言&#xff0c;只要你从事开发就一定会接触git。作为最强大的分布式版本控制器&#xff0c;git 与 svn 有着本质上的区别。 Git是一种分布式版本控制系统&#xff0c;每个开发者都可以在本地维护完整的代码库&#xff0c;可以离…

c++ 加密与解密代码(普通加密 + 凯撒加密 + 图灵来了都解不开的加密)

当你和你的好朋友聊天的时候&#xff0c;你们的聊天内容很容易就被看出来&#xff0c;那么小天狼星这边可以给到一些建议~~ 一、用另一种语言 通常来说&#xff0c;使用除中文和其他常用语言外的语言是一个优秀的选择&#xff01; 例如&#xff1a;乌伯克语、阿亚帕涅科语。 …

智能泊车,再上热搜

编者按&#xff1a;相比于行车&#xff0c;低速可控场景&#xff0c;更有利于泊车功能快速迭代。同时&#xff0c;对于部分消费者来说&#xff0c;泊车智能化也是加分项。 智能泊车赛道&#xff0c;正在重新成为各路势力争夺的焦点。而上一次“高潮”&#xff0c;要追溯到2018年…

开源客户沟通平台Chatwoot账号激活问题

安装docker docker-compose 安装git clone https://github.com/chatwoot/chatwoot 下载之后根目录有一个docker-compose.production.yaml将其复制到一个目录 重命名 docker-compose.yaml 执行docker-compose up -d 构建 构建之后所有容器都安装好了 直接访问http://ip:3…

护眼台灯怎么选——明基、书客、孩视宝实测横评

最近护眼台灯的热度真是不小&#xff0c;许多博主纷纷推荐。考虑到孩子即将放寒假&#xff0c;市场上的产品也是五花八门&#xff0c;于是我决定认真研究一下&#xff0c;找出其中的水货和宝藏产品。我挑选了市场上口碑较好的3款产品进行深入评估&#xff0c;主要从照度、显色指…

Revit二次开发 设置材质

设置此处材质&#xff0c;需要在材质浏览器中创建材质&#xff0c;根据材质名字设置此材质。 代码如下&#xff1a; Material material new FilteredElementCollector(doc).OfClass(typeof(Material)).FirstOrDefault(x > x.Name "窗框") as Material; Element…

如何利用streamlit 將 gemini pro vision 進行圖片內容介紹

如何利用streamlit 將 gemini pro vision 進行圖片內容介紹 1.安裝pip install google-generativeai 2.至 gemini pro 取 api key 3.撰寫如下文章:(方法一) import json import requests import base64 import streamlit as st 讀取圖片檔案&#xff0c;並轉換成 Base64 編…

Android SeekBar 进度条圆角

先看下效果图&#xff1a; 之前&#xff1a; 优化后&#xff1a; 之前的不是圆角是clip切割导致的 全代码&#xff1a; <SeekBarandroid:layout_width"188dp"android:layout_height"wrap_content"android:background"null"android:focusa…

风速预测 | Python基于CEEMDAN-CNN-Transformer+ARIMA的风速时间序列预测

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 CEEMDAN-CNN-TransformerARIMA是一种用于风速时间序列预测的模型&#xff0c;结合了不同的技术和算法。收集风速时间序列数据&#xff0c;并确保数据的质量和完整性。这些数据通常包括风速的观测值和时间戳。CEEMDAN分…

使用Spring Boot实现基于HTTP的API

Spring Boot是一个用于简化Spring应用程序开发的框架&#xff0c;它提供了一系列的开箱即用的功能&#xff0c;使得快速构建RESTful Web服务和基于HTTP的API变得简单。以下是使用Spring Boot实现基于HTTP的API的步骤&#xff1a; 添加依赖&#xff1a;在Maven项目中&#xff0c…

企业能源消耗监测管理系统是否可以做好能源计量与能耗分析?

能源消耗与分析是能源科学管理的基础&#xff0c;也可促进能源管理工作的改善&#xff0c;在企业中能源管理系统的作用也愈加重要。 首先&#xff0c;能源计量是能源管理的基础&#xff0c;通过能源精准计老化&#xff0c;容易出现测量设备不准确以及其他一些人为因素原因导致…

pve7.x、8.x版本一键升级、换源、优化工具脚本推荐

每次安装完pve之后都需要、换各种debain源、pve源、lxc源等、去掉弹窗、合并local-lvm等一系列的工作。还有玩硬件直通的优化。 偶然发现网上有大佬编写的一键脚本&#xff0c;pve_source 官网地址pve_source - X86派 - 迷你硬件玩家集中地 需要注册登录后能看到最新的地址 …

Oracle BIEE 示例(一)数据透视表2

1 背景 版本:BIEE 12C 视图:数据透视表 实现内容(顺序与具体内容不一致): 2 空列显示(方法一) 2.1 问题 列为空时,标题栏不显示信息。 2.2 期望 即使数据为空,也要显示列名。 2.3 官方资料 2.3.1 操作步骤 2.3.1.1 要在分析级别关闭空值隐藏,请执行以下操作…

操作无法完成,因为文件已在Windows资源管理器中打开,如何解决?以及如何将哔哩哔哩下载好的视频导出到电脑中播放?— 以vivo手机为例

前言 想删除流氓软件的时候&#xff0c;提示操作无法完成&#xff0c;因为文件已在Windows资源管理器中打开&#xff0c;但打开任务管理器&#xff0c;似乎又没有符合的正在执行的程序&#xff0c;更别说打开让人看到头疼的资源监视器了&#xff0c;本文将用一招解决如上问题 …

从一个main.cpp文件开始构建Qt项目【浅析】

目录 操作步骤 编译阶段 尝试运行 操作步骤 最初只有一个main.cpp文件。 然后在Qt的mingw命令行中进行以下操作&#xff1a; 这样就会在main.cpp的路径下生成一个.pro文件&#xff1a; 用QC打开后是这个样子&#xff1a; 所以在这里 qmake -project 的作用就是生成一个.…

【开源】基于JAVA语言的假日旅社管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统介绍2.2 QA 问答 三、系统展示四、核心代码4.1 查询民宿4.2 新增民宿评论4.3 查询民宿新闻4.4 新建民宿预订单4.5 查询我的民宿预订单 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的假日旅社…

配置路由策略案例

知识改变命运&#xff0c;技术就是要分享&#xff0c;有问题随时联系&#xff0c;免费答疑&#xff0c;欢迎联系&#xff01; 厦门微思网络​​​​​​ https://www.xmws.cn 华为认证\华为HCIA-Datacom\华为HCIP-Datacom\华为HCIE-Datacom Linux\RHCE\RHCE 9.0\RHCA\ Oracle O…