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=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.mfbz.cn/a/347185.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

垃圾回收小程序:环保与便捷的完美结合

一、引言 随着科技的发展,移动应用程序已经成为人们日常生活中不可或缺的一部分。其中,废品回收小程序以其独特的价值和功能,日益受到人们的关注和青睐。本文将探讨废品回收小程序开发的重要性、功能特点、技术实现和未来发展趋势。 二、废…

AOP切面

什么是Spring的AOP AOP在spring中又叫“面向切面编程”,它可以说是对传统我们面向对象编程的一个补充,从字面上顾名思义就可以知道,它的主要操作对象就是“切面”,所以我们就可以简单的理解它是贯穿于方法之中,在方法…

springboot家乡特色推荐系统源码和论文

在Internet高速发展的今天,我们生活的各个领域都涉及到计算机的应用,其中包括家乡特色推荐的网络应用,在外国家乡特色推荐系统已经是很普遍的方式,不过国内的管理网站可能还处于起步阶段。家乡特色推荐系统采用java技术&#xff0…

E3 基于Mysql的SQL应用和存储过程

一、实验目的: Mysql平台要求你熟练使用MySQL基本指令,完成对程序的控制与管理,并根据要求写存储过程。 二、实验要求: 1、基本硬件配置:英特尔Pentium III 以上,大于4G内存; 2、软件要求:Mysql; 3、时间:1小时; …

ggplot2 -- x轴相关操作

文章目录 刻度标签倾斜替换x轴刻度标签改变X刻度标签大小及颜色 演示数据集 library(ggplot2)# 示例数据 data <- data.frame(x 1:5,y c(3, 5, 2, 7, 4) ) data # x y #1 1 3 #2 2 5 #3 3 2 #4 4 7 #5 5 4刻度标签倾斜 p1 <- ggplot(data, aes(x x, y y)) geom_bar…

产品解读 | 新一代湖仓集存储,多模型统一架构,高效挖掘数据价值

星环科技TDH一直致力于给用户带来高性能、高可靠的一站式大数据基础平台&#xff0c;满足对海量数据的存储和复杂业务的处理需求。 同时在易用性方面持续深耕&#xff0c;降低用户开发和运维成本&#xff0c;让数据处理平民化&#xff0c;助力用户以更便捷、高效的方式去挖掘数…

【Kafka】Kafka安装:Linux本地和Docker

目录 Linux本地安装kafkajava环境配置Zookeeper的安装配置Kafka的安装与配置生产与消费 Docker安装kafkaZookeeper安装Kafka安装 Linux本地安装kafka java环境配置 1、上传jdk-8u261-linux-x64.rpm到服务器并安装&#xff1a; rpm -ivh jdk-8u261-linux-x64.rpm2、配置环境变…

WorkPlus移动应用管理平台,助力企业实现高效移动办公

在移动办公成为当今工作方式的主流趋势下&#xff0c;管理和运营企业移动应用成为了提高工作效率和数据安全的重要环节。而移动应用管理平台作为实现移动办公高效管理的关键工具&#xff0c;WorkPlus以其领先的性能和全面的功能&#xff0c;助力企业实现高效移动办公。 为何选…

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

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

如何使用Docker部署导航页工具Dashy并实现任意浏览器远程访问——“cpolar内网穿透”

文章目录 简介1. 安装Dashy2. 安装cpolar3.配置公网访问地址4. 固定域名访问 简介 Dashy 是一个开源的自托管的导航页配置服务&#xff0c;具有易于使用的可视化编辑器、状态检查、小工具和主题等功能。你可以将自己常用的一些网站聚合起来放在一起&#xff0c;形成自己的导航…

小红书商品笔记发布流程,如何避免盘营销

随着平台营销内容不断被管制&#xff0c;商品笔记慢慢出现在了人们的视野&#xff0c;这同时也意味着达人和品牌方们&#xff0c;可以名正言顺的在笔记内容中植入产品。商品链接的开通意味着&#xff0c;不管是达人还是品牌转化率都会进一步提升&#xff0c;今天来马文化传媒和…

AIGC:让生成式AI成为自己的外脑(文末送书)

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;数据结构、网络奇遇记 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. 什么是AIGC?二. AIGC如何运作&#xff1f;2.1 步骤一&#xff1a;收集数据2.…

仅使用 Python 创建的 Web 应用程序(前端版本)第06章_登录页面

从本章开始,我们将创建每个页面。 本栏的例子 可以访问这里, WTS 首先是登录页面。 完成后的图像如下 创建过程如下 No类型内容1Model创建继承BaseDataModel的数据类User、Session2MockDB创建用户表并添加管理员/成员用户3Service创建AuthAPIClient、UserAPIClient4Page定义…

利用Burp Suite观察https通联

对使用 HTTPS 协议的应用程序进行测试时&#xff0c;常使用 bp 观察流量&#xff0c;为能成功建立HTTPS联接&#xff0c;在将bp设置居代理的同时&#xff0c;还必须导入bp伪证书&#xff0c;这样才能修改请求和响应&#xff0c;加密和解密流量&#xff0c;成功模拟浏览的各种动…

Maven构建工具:Java项目的不可或缺之选

引言 在Java开发领域&#xff0c;构建工具是项目中至关重要的一环。Maven&#xff08;Maven Apache&#xff09;是一个强大的构建工具&#xff0c;用于管理项目的构建、依赖和文档等方面。本篇博文将介绍如何配置和使用Maven来构建和管理Java项目。 第一部分&#xff1a;Mave…

数据脱敏(三)脱敏算法-遮盖算法

脱敏算法篇使用阿里云数据脱敏算法为模板,使用算子平台快速搭建流程来展示数据 遮盖脱敏是一种数据脱敏技术&#xff0c;它的主要目的是通过隐藏或替换敏感信息来保护数据安全&#xff0c;同时保持数据的其他特性不变&#xff0c;以便于数据的进一步使用和分析。这种脱敏技术适…

九州金榜|过年期间如何合理规划孩子学习?

随着春节的临近&#xff0c;家家户户都沉浸在喜庆的氛围中。对于孩子们来说&#xff0c;过年意味着热闹、欢笑和丰盛的美食。然而&#xff0c;即使是过年&#xff0c;学习也不应被忽视。九州金榜家庭教育将和大家一起探讨如何合理安排过年期间孩子的学习。 一、保持学习持续性 …

探索编程世界的利器!选择哪个IDE,成就新手开发之路?

文章目录 一、IDE的概念和作用IDE是什么&#xff1f;为什么说选择一款IDE对开发者来说可以起到事半功倍的作用&#xff1f; 二、当下备受推崇的IDE有哪些&#xff1f;1. Visual Studio Code2. PyCharm3. IntelliJ IDEA 三、如何选择一个适合自己的IDE&#xff1f;四、IDE的使用…

React-Native项目 — 自定义字体的使用

系列文章目录 React-Native环境搭建&#xff08;IOS&#xff09;React-Native项目 — 关于IOS知识储备React-Native项目工程搭建&#xff08;开发模板搭建&#xff09;React-Native项目矢量图标库&#xff08;react-native-vector-icons&#xff09; 目录 系列文章目录前言一、…

Linux多线程——生产消费者模型

Gitee仓库&#xff1a;阻塞队列、环形队列 文章目录 1. 死锁1. 1 死锁概念1.2 死锁的四个必要条件1.3 解决死锁 2. 线程同步3. 条件变量3.1 举个例子3.2 接口 4. 生产消费者模型4.1 什么是生产消费者模型4.2 基于阻塞队列的生产消费模型4.3 环形队列&#xff08;信号量&#xf…