docker 网络

2023-12-13 08:19:43

docker 网络

桥接模式:用于连接两个不同网络段的设备,共享通信的一种方式。

桥接设备:工作在osi模型的第二层,数据链路层,转发数据帧,基于mac地址

类似于交换机,只能转发同一网段,通过泛洪广播来找目标设备的mac地址。学习。

关闭防火墙:

创建完docker之后,就会自动生成一个虚拟网卡

docker网络就是基于桥接模式实现的:

1,虚拟网络桥:安装开启docker之后,docker进程就会自动创建一 个虚拟网络桥(docker)是一个虚拟的网络设备,类似于物理网络设备的交换机。

2,分配唯一的ip地址,每次运行一个容器,docker进程都会分配唯一的且未被其他容器占用的ip地址给容器。这个IP地址是在桥接模式网络的子网中。

3、容器和主机通信:通过桥接模式,容器可以与主机直接通信,容器可以访问主机上的运行服务。主机也可以通过桥接网络docker:0来访问容器内部的进程(iptables的nat地址转换。在主机上做了地址转换。)

问题:docker的网桥的宿主机虚拟出来的,并不是一个真正存在的网络设备,外部网络无法寻址找到。外部网络无法直接访问docker:0分配给容器的ip地址。

可以给容器做一个端口映射

docker run -itd --name test1 -P nginx:1.22.0 /bin/bash

-P:在创建容器时。在宿主机和容器之间做一个端C ]映射。-P 随机分配一个端C 给宿主机,容器的端口是不变的

P从32768开始的。

进入容器开启一下服务

实际上,docker是在宿主机和容器之间做了一个iptables的NAT地址转换。

iptables

32768是宿主机的端口

80是容器提供的nginx80端口

也可以指定端口 -p

docker run -itd --name test2 -p 4300: 80 nginx:1.22.0 /bin/bash

-p:指定端口,人为设置固定的端口映射。

直接查看容器中服务的日志

做本机映射

宿主机的的端口不要被占用

直接输出

docker logs -f test3

docker的网络模式:

1,bridge默认,在创建docker是不需要指定网络类型,默认就是bridge

2,host模式:容器将不会虚拟出自己的网卡,也没有自己的IP地址。全部使用宿主机的IP地址和端口

创建容器的时候可以指定网络模式: --network host

共用模式,如果是单个容器有哪些,可以使用host模式。

3,container模式:容器和容器之间公用一个ip和端口还是宿主机的。两个服务不能同时存在

4,none模式:docker容器有自己的network-space,但是这个容器没有任何网络设置。这个容器没有网卡,没有ip,没有路由,只有lo回环网络,在none模式下,容器不可以联网。一般用于测试,应用程序是否正常

5,自定义网络:我们可以给创建一个自己创建的网段。

二,host模式

创建容器的时候可以指定网络模式: --network host

docker run -itd --name test1 --network host nginx

起nginx

无需指定端口,但是多个服务不行

特点:共用模式,如果是单个容器有哪些,可以使用host模式。

三,container模式

docker run -itd --name test2 --network=container:test1 nginx:latest /bin/bash

报错端口占用:

把占用服务的停掉

两个不能同时存在

每创建一个容器都会自动创建一个挂载点

四,none模式

进入:

只能在自己的容器当中自己玩

一般用于测试。

五:自定义网络

docker network ls

NETWORK IDI:这个是docker网络唯一的网络id

NAME:docker网络的名称

driver: docker网络的驱动程序

SCOPE:表示网络的作用范围。

在创建的时候直接指定ip地址:

在使用默认docker:0网桥时,创建容器是不能指定ip地址的,只能由docker网桥自动分配。

除非用户自定义的网络才可以给容器自定义ip地址。

要先创建一个自定义网络

docker network create --subnet=192.18.0.0/16 --opt "com.docker.network.bridge.name"="docker1" mynetwork

可以不加,但是网卡名称比较难以识别。

mynetwork:自定义网络的名称

创建完成之后就有了一个docker1网络

现在就可以自己创建一个自定义网络的容器

docker run -itd --name test4 --network mynetwork --ip 172.18.0.10 nginx:latest /bin/bash

任何证明有这个网段,直接访问。

docker的网络模式,

1,桥接模式,也是docker的默认模式。在创建时无需指定

2,host模式:容器不会有自己的网络设备,但是可以和宿主机共享ip和端口

3,container模式:容器和容器之间共享ip和端口

4,none模式:也没有自己的网络设备,有没有网卡,ip。只有一个回环地址。127.0.0.1不能联网。(测试容器的功能)

5,自定义网络:创建容器时,默认使用docker0网桥是无法给容器调用ip地址的,只能自动分配。自定义网络在创建容器时,可以给容器自动ip地址。

docker如何在创建容器时指定端口映射:

-P:随机指定

-p:自定义指定

32767:80 前面的宿主机的,后面的容器的端口。

docker logs 容器名/容器ID

docker logs --tail=10 -f test1

--tail=10 从尾部开始,只看最近10条。

/bin/bash 就是为了让容器后台有一个运行程序,保证容器不会退出

-d 后台守护运行,但是时间一长容器会自动退出

/bin/bash 就是容器的标准输出,docker logs捕获的cmd和entrypoint的标准输出。/bin/bash和捕获日志会冲突

数据卷:容器如何于宿主机之间进行数据共享

数据卷是一个供容器使用的特殊目录,在容器中,和宿主机的目录进行映射,主机和宿主机之间都可以对目录中的文件进行修改,双方都是同步生效。对镜像也没有影响。宿主机到容器实现数据迁移。

宿主机的目录和容器中目录进行挂载(映射关系)

创建容器的挂载卷:

两个路径必须是绝对路径

docker run -itd --name test1 -v /opt/test1:/opt/test centos:7 /bin/bash

docker run -itd --name mysql1 -v /opt/test1:/etc/mysql/conf.d/mysql.cnf mysql /bin/bash

test1:宿主机

前面的是宿主机

设置容器未只读模式

在容器目录后面加一个ro

docker run -itd --name test2 -v /opt/test2:/opt/test:ro centos:7 /bin/bash

容器和容器之间实现数据共享:

test1 test2 可以有一个或者多个映射目录,实现数据互传,数据同步。

数据卷容器:只提供挂载目录让另一个

docker run -itd --name test11 -v /opt/data1 -v /opt/data2 centos:7 /bin/bash

让另外一个来共享数据

docker run -itd --volumes-from test11 --name test12 centos:7 /bin/bash

能不能写呢?可以

容器互联:两个容器之间实现网络通信:

老版本:

docker run -itd -P --name test111 centos:7 /bin/bash

docker run -itd -P --name test222 --link test111:test222 centos:7 /bin/bash

两边安装

只能一边ping另一边

新版本:

docker run -itd --name nginx3 --net mynetwork --ip 192.18.0.11 nginx:1.22.0 /bin/bash

docker run -itd --name centos1 --net mynetwork --ip 172.18.0.12 centos:7/bin/bash

network 自定义网络来实现互ping

部署一个mysql的镜像,创建一个mysql的容器,用navicat 可以访问容器的mysql mysql的端口 33066---3306

创建一个数据卷。宿主机可以看到容器内的mysql的日志文件

指定IP和端口一起使用

文章来源:https://blog.csdn.net/weixin_51694382/article/details/134953963
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。