IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> docker网络 -> 正文阅读

[系统运维]docker网络

一、网络

看docker info可以看到可用的网络

[root@localhost ~]# docker info

在这里插入图片描述

当你开始大规模使用Docker时,你会发现需要了解很多关于网络的知识。Docker作为目前最火的轻量级容器技术,有很多令人称道的功能,如Docker的镜像管理。然而,Docker同样有着很多不完善的地方,网络方面就是Docker比较薄弱的部分。因此,我们有必要深入了解Docker的网络知识,以满足更高的网络需求。本文首先介绍了Docker自身的4种网络工作方式,然后介绍一些自定义网络模式。
安装Docker时,它会自动创建三个网络,bridge(创建容器默认连接到此网络)、 none 、host

网络模式简介
Host容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
Bridge此模式会为每一个容器分配、设置IP等,并将容器连接到一个docker0虚拟网桥,通过docker0网桥以及Iptables nat表配置与宿主机通信。
None该模式关闭了容器的网络功能。
Container创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围。
自定义网络
[root@localhost ~]# docker network ls

在这里插入图片描述

启动一个容器后

[root@localhost ~]# docker run -itd nginx:latest /bin/bash
5cfdc7971cbe6b6fa3c2aca728b384490e2e17db200beec119b1e60b29814672
[root@localhost ~]# ifconfig

在这里插入图片描述

[root@localhost ~]# docker inspect 5cfdc7971cbe

在这里插入图片描述

1、bridge模式

在这里插入图片描述

Docker 容器默认使用 bridge 模式的网络。其特点如下:
使用一个 linux bridge,默认为 docker0
使用 veth 对,一头在容器的网络 namespace 中,一头在 docker0 上
该模式下Docker Container不具有一个公有IP,因为宿主机的IP地址与veth pair的 IP地址不在同一个网段内
Docker采用 NAT 方式,将容器内部的服务监听的端口与宿主机的某一个端口port 进行“绑定”,使得宿主机以外的世界可以主动将网络报文发送至容器内部
外界访问容器内的服务时,需要访问宿主机的 IP 以及宿主机的端口 port
NAT 模式由于是在三层网络上的实现手段,故肯定会影响网络的传输效率。
容器拥有独立、隔离的网络栈;让容器和宿主机以外的世界通过NAT建立通信
可以自己创建的docker 网桥的IP可以自己设定,顺序不固定
iptables 的 SNTA 规则,使得从容器离开去外界的网络包的源 IP 地址被转换为 Docker 主机的IP地址:
相同两个容器如果端口相同,则通过iptables端口映射暴露不同端口

2、host模式

Host 模式并没有为容器创建一个隔离的网络环境。而之所以称之为host模式,是因为该模式下的 Docker 容器会和 host 宿主机共享同一个网络 namespace,故 Docker Container可以和宿主机一样,使用宿主机的eth0,实现和外界的通信。换言之,Docker Container的 IP 地址即为宿主机 eth0 的 IP 地址。
host容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network
Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。
使用host模式的容器可以直接使用宿主机的IP地址与外界通信,容器内部的服务端口也可以使用宿主机的端口,不需要进行NAT,host最大的优势就是网络性能比较好,但是dockerhost 上已经使用的端口就不能再用了,网络的隔离性不好。

其特点包括:

这种模式下的容器没有隔离的 network namespace
容器的 IP 地址同 Docker host 的 IP 地址
需要注意容器中服务的端口号不能与 Docker host 上已经使用的端口号相冲突
host 模式能够和其它模式共存
在这里插入图片描述

3、container 模式(overlay)

定义:

Container 网络模式是 Docker 中一种较为特别的网络的模式。处于这个模式下的 Docker 容器会共享其他容器的网络环境,因此,至少这两个容器之间不存在网络隔离,而这两个容器又与宿主机以及除此之外其他的容器存在网络隔离。
在这里插入图片描述
container创建的容器不会创建自己的网卡、设置IP等,而是和一个指定地容器共享IP、端口范围
这个模式指定新创建的容器和已经存在的一个容器共享一个network namespace,而不是和宿主机共享,新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定地容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表还是隔离的。(★★两个容器的进程可以通过lo0网卡设备通信)

4、none 模式

定义:

网络模式为 none,即不为 Docker 容器构造任何网络环境。一旦Docker 容器采用了none 网络模式,那么容器内部就只能使用loopback网络设备,不会再有其他的网络资源。Docker Container的none网络模式意味着不给该容器创建任何网络环境,容器只能使用127.0.0.1的本机网络。
使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。
这种网络模式下容器只有lo回环网络,没有其他网卡。none模式可以在容器创建时通过–network=none来指定。这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性。
在这里插入图片描述
1、可以做仓库使用
2、可以用作挂载

5、操作

指定分配容器IP地址

[root@localhost ~]# docker run -itd --name local01 --network bridge --ip 172.17.0.10 centos:7 /bin/bash
5406c0c18478d880c662fa0dca8a26b7395663ba281f86710c6550096b344dee
docker: Error response from daemon: user specified IP address is supported on user defined networks only

创建成功,但是启动不成功,因为分配方式不合法。
在这里插入图片描述

自定义网络固定IP

默认创建的是bridge模式 如果要指定模式在creste后加上–network 模式

[root@localhost ~]# docker network create --subnet=172.18.0.0/16 mynetwork
64627412d0d14353d0b7d43f5b9ac4e7184a40c7261a481bc25a09143fa0ca27

在这里插入图片描述
在这里插入图片描述

[root@localhost ~]# docker run -itd --name test02 --net mynetwork --ip 172.18.0.100 nginx:latest /bin/bash
52bb5b238f3f68fe6bafa76b8698f6d358faaff88c9e5fd4c9ae5d4039cd7c5f
[root@localhost ~]# docker inspect test02

在这里插入图片描述
在这里插入图片描述

暴露端口

-p 自定义端口(宿主机端口:容器内端口)
-P随机端口( -P 491.53起始49153到65535)
docker run -itd -p 333:80 nginx /bin/bash ( docker 0)
docker run -itd -P nginx /bin /bash
在这里插入图片描述

[root@localhost ~]# docker run -itd -p 333:80 nginx:latest /bin/bash
4461bcc1b335328e6ed92858b6627186961bba5ef85ae32c7ef22f86f31f3cc0

在这里插入图片描述

[root@localhost ~]# curl 192.168.133.50:333
curl: (7) Failed connect to 192.168.133.50:333; Connection refused          访问拒绝因为没有开启
[root@localhost ~]# docker exec -it 4461bcc1b335 /bin/bash -c nginx        进入容器启动nginx
2022/01/12 11:39:19 [notice] 7#7: using the "epoll" event method
2022/01/12 11:39:19 [notice] 7#7: nginx/1.21.5
2022/01/12 11:39:19 [notice] 7#7: built by gcc 10.2.1 20210110 (Debian 10.2.1-6) 
2022/01/12 11:39:19 [notice] 7#7: OS: Linux 3.10.0-693.el7.x86_64
2022/01/12 11:39:19 [notice] 7#7: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2022/01/12 11:39:19 [notice] 14#14: start worker processes
或者
[root@localhost ~]# docker exec -it 4461bcc1b335 /bin/bash -c ls
bin   dev		   docker-entrypoint.sh  home  lib64  mnt  proc  run   srv  tmp  var
boot  docker-entrypoint.d  etc			 lib   media  opt  root  sbin  sys  usr

[root@localhost ~]# curl 192.168.133.50:333                           访问成功
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

在这里插入图片描述
在这里插入图片描述

[root@localhost ~]# docker run -itd -P --name nginx01 nginx:latest /bin/bash
6cc966f838d498e516c422545d7ce6b25c01c2dc97f02c9e4bf850f1d27f65de

在这里插入图片描述
启始端口为49153,分配随之增长,如果其中一个被删除,则端口号暂被封存不在使用

[root@localhost ipv4]# docker run -itd -P --name nginx03 nginx:latest /bin/bash
5e34a3f25e8a589a6fde1fa368e309664194c87d4d451ddf33307fe1a6279be7

在这里插入图片描述

[root@localhost ~]# docker rm -f nginx03
nginx03
[root@localhost ~]# docker run -itd -P --name nginx04 nginx:latest /bin/bash
e5662ed3eccf9682f4b407f6f739bcece613d636b59651841a1e9f7f08959085

在这里插入图片描述
#在宿主机环境执行容器内命令
docker exec -it 容器ID /bin/bash -c ‘nginx’
docker exec 容器工D/容器name 执行的命令

[root@localhost ~]# docker exec -it 4461bcc1b335 /bin/bash -c ls

扩展题

#面试题
怎么把宿主机的文件传入到容器内部1、linux怎么复制
cp原文件路径目标文件路径
docker cp / opt/abc 容器id:/opt /abc

[root@localhost ~]# docker run -itd --name centos01 centos:7 /bin/bash     启动一个cengtos容器
74ded2da3d925c5c7f06511b65edab054fc34a8230eb4f7063832ead0a137c6e

在这里插入图片描述
进入容器

[root@localhost ~]# docker exec -it centos01 /bin/bash
[root@b92ada4177d3 ~]# cd /zhou                                      在容器里建立一个文件
[root@b92ada4177d3 zhou]# touch 1.txt
[root@b92ada4177d3 zhou]# ls
1.txt
[root@localhost opt]# ls
[root@localhost opt]# docker cp centos01:/zhou/1.txt /opt
[root@localhost opt]# ls
1.txt
[root@localhost opt]# cat 1.txt
this is a test 
[root@localhost opt]# docker cp /opt/1.txt centos01:/zhou
[root@b92ada4177d3 zhou]# cat 1.txt                     容器里的文件已经有了我们添加的内容
this is a test 

在这里插入图片描述

[root@b92ada4177d3 zhou]# yum install -y net-tools                 安装net工具

在这里插入图片描述
在这里插入图片描述
#进入容器没有systemctl命令解决:添加–privileged=true(指定此容器是否为特权容器),
使用此参数,则不能用attach示例:

docker run -itd --name test3 --privileged=true centos /sbin/init

/ sbin/init内核启动时主动呼叫的第一个进程

[root@localhost ~]# docker run -itd --name centos02 --privileged=true centos:7 /sbin/init
013fa7579c737a34dbd9c67d7a8a77cf835537cf1c5d0e4c20d796487057b8ce

在这里插入图片描述

[root@localhost ~]# docker exec -it centos02 /bin/bash
[root@013fa7579c73 /]# yum install httpd -y

在这里插入图片描述
因为没有做映射端口,所以不能被外界看到
在这里插入图片描述
docker中,假设,我运行了一个业务容器,需要暴露3个端口,启动之后,发现自己少加了一个端口,那么,如何动态添加端口(如何对已运行的容器,添加/修改端口)我们可以修改
/var/lib/docker/container/[container id]/中的两个文件
1、 hostconfig.json portbinding:{}修改端口或添加端口
2、修改config.v2.json文件,修改对应的Ports{}来添加/修改端口
最后,重教守护进程

添加端口
在这里插入图片描述

[root@localhost ~]# cd /var/lib/docker/containers/
[root@localhost containers]# ls
013fa7579c737a34dbd9c67d7a8a77cf835537cf1c5d0e4c20d796487057b8ce  b92ada4177d35e1ebda0285361ee296550a332e5987d97be51c99d8c1eb1646a
[root@localhost containers]# cd 013fa7579c737a34dbd9c67d7a8a77cf835537cf1c5d0e4c20d796487057b8ce/
[root@localhost 013fa7579c737a34dbd9c67d7a8a77cf835537cf1c5d0e4c20d796487057b8ce]# ls

在这里插入图片描述

[root@localhost 013fa7579c737a34dbd9c67d7a8a77cf835537cf1c5d0e4c20d796487057b8ce]# vim config.v2.json 

在这里插入图片描述

[root@localhost 013fa7579c737a34dbd9c67d7a8a77cf835537cf1c5d0e4c20d796487057b8ce]# vim hostconfig.json 

在这里插入图片描述

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-01-14 02:25:19  更:2022-01-14 02:26:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 6:43:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码