Docker容器与虚拟化技术:Docker容器操作、网络模式

news2025/1/19 17:18:16

目录

一、理论

1.Docker 容器操作

2.Docker 网络

二、实验

1.Docker 容器操作

2.Docker 网络

 2.Docker 的网络模式

三、问题

1. 批量删除所有容器未生效

2.使用bridge模式指定IP运行docker报错

3.未显示bridge网络模式名称

四、总结


一、理论

1.Docker 容器操作

(1)容器创建

就是将镜像加载到容器的过程。

新创建的容器默认处于停止状态,不运行任何程序,需要在其中发起一个进程来启动容器。

格式:docker create [选项] 镜像

常用选项:
-i:让容器开启标准输入
-t:让 Docker 分配一个伪终端 tty
-it :合起来实现和容器交互的作用,运行一个交互式会话 shell 

(2)查看容器的运行状态

docker ps -a			#-a 选项可以显示所有的容器

(3)启动容器

格式:docker start 容器的ID/名称

例:

docker start 12a87fc485f3
docker ps -a

(4)创建并启动容器

可以直接执行 docker run 命令, 等同于先执行 docker create 命令,再执行 docker start 命令。

注意:容器是一个与其中运行的 shell 命令共存亡的终端,命令运行容器运行, 命令结束容器退出。

当利用 docker run 来创建容器时, Docker 在后台的标准运行过程是:

检查本地是否存在指定的镜像。当镜像不存在时,会从公有仓库下载;
利用镜像创建并启动一个容器;
分配一个文件系统给容器,在只读的镜像层外面挂载一层可读写层;
从宿主主机配置的网桥接口中桥接一个虚拟机接口到容器中;
分配一个地址池中的 IP 地址给容器;
执行用户指定的应用程序,执行完毕后容器被终止运行。

docker run centos:7 /usr/bin/bash -c ls /
docker ps -a					#会发现创建了一个新容器并启动执行一条 shell 命令,之后就停止了

(5)在后台持续运行 docker run 创建的容器

需要在 docker run 命令之后添加 -d 选项让 Docker 容器以守护形式在后台运行。并且容器所运行的程序不能结束。

docker run -d centos:7 /usr/bin/bash -c "while true;do echo hello;done"
 
 
docker ps -a					#可以看出容器始终处于 UP,运行状态
 
docker run -itd --name test1 centos:7 /bin/bash

(6) 终止容器运行

格式:docker stop 容器的ID/名称

例:

方法一:
docker stop 容器id/名称
 
方法二:
docker kill  容器id/名称    #直接杀死进程

(7)容器的进入

需要进入容器进行命令操作时,可以使用 docker exec 命令进入运行着的容器。
格式:docker exec -it 容器ID/名称 /bin/bash
 
-i 选项表示让容器的输入保持打开;
-t 选项表示让 Docker 分配一个伪终端。

例:

docker start 2592d3fad0fb					#进入容器前,确保容器正在运行
docker exec -it 2592d3fad0fb /bin/bash
ls
exit				#退出容器后,容器仍在运行
docker ps -a

(8) 容器的导出与导入

用户可以将任何一个 Docker 容器从一台机器迁移到另一台机器。在迁移过程中,可以使用docker export 命令将已经创建好的容器导出为文件,无论这个容器是处于运行状态还是停止状态均可导出。可将导出文件传输到其他机器,通过相应的导入命令实现容器的迁移。

导出格式:docker export 容器ID/名称 > 文件名

例:

docker export 3800b511f1fd > centos7.tar
导入格式:cat 文件名 | docker import – 镜像名称:标签

例:

cat centos7tar | docker import - centos7:test			#导入后会生成镜像,但不会创建容器

(9)删除容器

格式:docker rm [-f] 容器ID/名称

例:

#删除已经终止状态的容器
docker rm 2592d3fad0fb				
 
#强制删除正在运行的容器
docker rm -f 2592d3fad0fb			

#批量停止容器 
docker ps -a | awk 'NR>=2{print "docker stop "$1}' | bash	
docker ps -a | awk 'NR>=2{print $1}'| xargs docker stop
		
#批量删除所有容器
docker ps -a | awk 'NR>=2{print "docker rm "$1}' | bash		
docker ps -a | awk 'NR>=2{print $1}'| xargs docker rm		

#批量删除镜像
 docker images | awk 'NR>=2{print "docker rmi "$3}' | bash	
docker images | grep none | awk '{print $3}' | xargs docker rmi		

#批量清理后台停止的容器
docker rm $(docker ps -a -q)		

 #查看日志
docker logs id号或者容器名   

2.Docker 网络

(1)  Docker 网络实现原理

① Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的 Container-IP 直接通信。

 Docker网桥是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络是无法寻址到的,这也意味着外部网络无法直接通过 Container-IP 访问到容器。如果容器希望外部访问能够访问到,可以通过映射容器端口到宿主主机(端口映射),即 docker run 创建容器时候通过 -p 或 -P 参数来启用,访问容器的时候就通过[宿主机IP]:[容器端口]访问容器。

docker run -d --name test3 -P nginx
#随机映射端口( 从32768开始)
docker run -d --name test4 -p 43000:80 nginx
#指定映射端口

浏览器访问验证:

http://192.168.204.140:43000 

http://192.168.204.140:32768

(2) Docker 的网络模式

①  Host:容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。

②  Container:创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围。

③   None:该模式关闭了容器的网络功能。

④   Bridge:默认为该模式,此模式会为每一个容器分配、设置IP等,并将容器连接到一个docker0虚拟网桥,通过docker0网桥以及iptables nat 表配置与宿主机通信。

⑤    自定义网络

(3)  指定容器的网络模式

●host模式:使用 --net=host 指定。

●none模式:使用 --net=none 指定。

●container模式:使用 --net=container:NAME_or_ID 指定。

●bridge模式:使用 --net=bridge 指定,默认设置,可省略。

安装Docker时,它会自动创建三个网络,bridge(创建容器默认连接到此网络)、 none 、host

docker network ls				#查看docker网络列表

(4)  网络模式详解

host模式

相当于Vmware中的桥接模式,与宿主机在同一个网络中,但没有独立IP地址。

        Docker使用了Linux的Namespaces技术来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离文件系统,Network Namespace隔离网络等。

        一个Network Namespace提供了一份独立的网络环境,包括网卡、路由、iptable规则等都与其他的Network Namespace隔离。 一个Docker容器一般会分配一个独立的Network Namespace。 但如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace, 而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡、配置自己的IP等,而是使用宿主机的IP和端口。

container模式

 在理解了host模式后,这个模式也就好理解了。这个模式指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信。

#--name 选项可以给容器创建一个自定义名称
[root@localhost ~]# docker run -itd --name test1 centos:7 /bin/bash			

[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE      COMMAND       CREATED         STATUS         PORTS     NAMES
12656b5d6a80   centos:7   "/bin/bash"   4 seconds ago   Up 4 seconds             test1
[root@localhost ~]# docker inspect -f '{{.State.Pid}}' 12656b5d6a80
6023

#查看容器的进程、网络、文件系统等命名空间编号
[root@localhost ~]# ls -l /proc/6023/ns
总用量 0
lrwxrwxrwx 1 root root 0 8月  15 16:20 ipc -> ipc:[4026532623]
lrwxrwxrwx 1 root root 0 8月  15 16:20 mnt -> mnt:[4026532621]
lrwxrwxrwx 1 root root 0 8月  15 16:18 net -> net:[4026532626]
lrwxrwxrwx 1 root root 0 8月  15 16:20 pid -> pid:[4026532624]
lrwxrwxrwx 1 root root 0 8月  15 16:20 user -> user:[4026531837]
lrwxrwxrwx 1 root root 0 8月  15 16:20 uts -> uts:[4026532622]
[root@localhost ~]# docker run -itd --name test2 --net=container:12656b5d6a80 centos:7 /bin/bash
40de9c07eebc27ccee08751c9ac533d374997d4ac00e848c220c28222ab0db82
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE      COMMAND       CREATED         STATUS         PORTS     NAMES
40de9c07eebc   centos:7   "/bin/bash"   2 seconds ago   Up 2 seconds             test2
12656b5d6a80   centos:7   "/bin/bash"   5 minutes ago   Up 5 minutes             test1
[root@localhost ~]# docker inspect -f '{{.State.Pid}}' 40de9c07eebc
6161


#查看可以发现两个容器的 net namespace 编号相同
[root@localhost ~]# ls -l /proc/6161/ns
总用量 0
lrwxrwxrwx 1 root root 0 8月  15 16:25 ipc -> ipc:[4026532742]
lrwxrwxrwx 1 root root 0 8月  15 16:25 mnt -> mnt:[4026532740]
lrwxrwxrwx 1 root root 0 8月  15 16:25 net -> net:[4026532626]
lrwxrwxrwx 1 root root 0 8月  15 16:25 pid -> pid:[4026532743]
lrwxrwxrwx 1 root root 0 8月  15 16:25 user -> user:[4026531837]
lrwxrwxrwx 1 root root 0 8月  15 16:25 uts -> uts:[4026532741]

none模式

   使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。 也就是说,这个Docker容器没有网卡、IP、路由等信息。这种网络模式下容器只有lo回环网络,没有其他网卡。这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性。

④ Bridge模式

bridge模式是docker的默认网络模式,不写--net参数,就是bridge模式。

        相当于Vmware中的 nat 模式,容器使用独立network Namespace,并连接到docker0虚拟网卡。通过docker0网桥以及iptables nat表配置与宿主机通信,此模式会为每一个容器分配Network Namespace、设置IP等,并将一个主机上的 Docker 容器连接到一个虚拟网桥上。    

1)当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。

2)从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备。veth设备总是成对出现的,它们组成了一个数据的通道,数据从一个设备进入,就会从另一个设备出来。因此,veth设备常用来连接两个网络设备。

3)Docker将veth pair 设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中, 以veth*这样类似的名字命名,并将这个网络设备加入到docker0网桥中。可以通过 brctl show 命令查看。

4)使用 docker run -p 时,docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL 查看。

(5)  自定义网络

直接使用bridge,无法支持指定IP运行docker

可以先自定义网络,再使用指定IP运行docker


#可以先自定义网络,再使用指定IP运行docker
docker network create --subnet=172.18.0.0/16 --opt "com.docker.network.bridge.name"="docker1"  mynetwork

#mynetwork 为执行 docker network list 命令时,显示的bridge网络模式名称。
docker run -itd --name test4 --net mynetwork --ip 172.18.0.10 centos:7 /bin/bash

进入容器后无法使用ifconfig命令查看ip地址,需手动安装组件才能使用此命令

yum install -y net-tools

二、实验

1.Docker 容器操作

(1)容器创建

就是将镜像加载到容器的过程。

新创建的容器默认处于停止状态,不运行任何程序,需要在其中发起一个进程来启动容器。

(2)查看容器的运行状态

(3)启动容器

(4)创建并启动容器

可以直接执行 docker run 命令, 等同于先执行 docker create 命令,再执行 docker start 命令。

(5)在后台持续运行 docker run 创建的容器

需要在 docker run 命令之后添加 -d 选项让 Docker 容器以守护形式在后台运行。并且容器所运行的程序不能结束。

一直在运行

容器在后台一直执行命令

 运行中

(6) 终止容器运行

(7)容器的进入

需要进入容器进行命令操作时,可以使用 docker exec 命令进入运行着的容器。

(8) 容器的导出与导入

用户可以将任何一个 Docker 容器从一台机器迁移到另一台机器。在迁移过程中,可以使用docker export 命令将已经创建好的容器导出为文件,无论这个容器是处于运行状态还是停止状态均可导出。可将导出文件传输到其他机器,通过相应的导入命令实现容器的迁移。

导入后会生成镜像,但不会创建容器

(9)删除容器

删除已经终止状态的容器

 强制删除正在运行的容器

 批量停止容器

 批量删除所有容器

 批量删除镜像

2.Docker 网络

(1)Docker 网络实现原理

随机映射端口( 从32768开始)

 指定映射端口

 浏览器访问验证:

 

 2.Docker 的网络模式

(1)查看docker网络列表

安装Docker时,它会自动创建三个网络,bridge(创建容器默认连接到此网络)、 none 、host

(2)container模式

运行容器test1

 查看容器进程号

查看容器的进程、 网络、文件系统等命名空间编号

 运行容器test2

 查看可以发现两个容器的 net namespace 编号相同

(3)自定义网络

创建自定义网络

显示bridge网络模式名称

 直接使用bridge模式指定IP运行docker

三、问题

1. 批量删除所有容器未生效

(1)查看

 (2)原因分析

先中止,然后删除已经终止状态的容器:docker rm

强制删除正在运行的容器:docker rm -f

(3)生效

2.使用bridge模式指定IP运行docker报错

(1) 报错

 (2)原因分析

直接使用bridge模式,是无法支持指定IP运行docker的

(3)解决方法

可以先自定义网络,再使用指定IP运行docker

3.未显示bridge网络模式名称

(1)显示网卡名

docker1 为执行 ifconfig -a 命令时,显示的网卡名,如果不使用 --opt 参数指定此名称,那你在使用 ifconfig -a 命令查看网络信息时,看到的是类似 br-110eb56a0b22 这样的名字,这显然不怎么好记。

 (2)mynetwork 为执行 docker network list 命令时,显示的bridge网络模式名称

四、总结

直接执行 docker run 命令, 等同于先执行 docker create 命令,再执行 docker start 命令。

执行docker rm -f 命令,等同于先先执行 docker stop ,再执行docker rm命令

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

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

相关文章

TVP助力数智化转型:数字物业与产业园区智慧化高质量发展

引言 数字化技术的蓬勃发展,为传统行业转型提供了前所未有的机遇。相较于早期的基础数字化,现如今数字化转型已逐步踏入更深层次。在各个领域,将数字技术与实际应用有机融合已日益显得迫切。如何在这一浪潮中巧妙融合数字技术与传统行业&…

cesium加载wms服务

成果图 源码 cesium加载不用像其他api一样加那么多参数,最终请求路径上发现他也是把那些参数都加上了,应该是有默认的参数吧 var wmsLayer new Cesium.WebMapServiceImageryProvider({url: http://你的地址/pjgeoserver/services/wms,layers: services…

Golang协程,通道详解

进程、线程以及并行、并发 关于进程和线程 进程(Process)就是程序在操作系统中的一次执行过程,是系统进行资源分配和调度的基本单位,进程是一个动态概念,是程序在执行过程中分配和管理资源的基本单位,每一…

leetcode611. 有效三角形的个数(java)

有效三角形的个数 有效三角形的个数排序加二分排序 双指针 上期算法 有效三角形的个数 给定一个包含非负整数的数组 nums ,返回其中可以组成三角形三条边的三元组个数。 示例 1: 输入: nums [2,2,3,4] 输出: 3 解释:有效的组合是: 2,3,4 (使用第一个 2) 2,3,4 (使…

python进阶做题日记365-1,

第一天: 1:题目名称:代写匿名信时间限制:1000ms内存限制:256M 题目描述小Q想要匿名举报XX领导不务正业! 小Q害怕别人认出他的字迹。 他选择从报纸上剪裁下来英文字母组成自己的举报信。 现在小Q找来了报纸…

【分布式存储】数据存储和检索~倒排索引pageRank

为什么需要倒排索引 通过前两篇的文章介绍,B树主要针对的是读多写少的场景,而LSM针对的是写多读少的场景,其实在日常开发中,我们会将数据存储到搜索引擎中,然后进行数据的搜索,这种场景其实针对的是快速根…

AI幕后的关键技术之一——HBM

半导体产业步入下行周期之际,2023年ChatGPT的“走红”为产业带来新的发展方向:AI人工智能。 ChatGPT正掀起一场声势浩大的AI浪潮,AI时代下,为满足海量数据存储以及日益增长的繁重计算要求,半导体存储器领域也迎来新的变…

shell第九章iptables防火墙

防火墙:隔离功能 部署点:部署在网络边缘,或者主机边缘,在工作中,防火墙的主要作用,决定那些数据可以被外网访问,以及哪些数据可以进入内网访问 讨论防火墙,主要就是在网络层进行讨…

无涯教程-Perl - setsockopt函数

描述 此函数将SocketoptionsOPTNAME的值设置为SOCKET上指定级别的OPTVAL值。您需要导入Socket模块,以获取Tabl中显示的OPTNAME的有效值 语法 以下是此函数的简单语法- setsockopt SOCKET, LEVEL, OPTNAME, OPTVAL返回值 如果失败,此函数返回undef;如果成功,则返…

java.lang.NoClassDefFoundError: org/apache/tez/dag/api/TezConfiguration

错误: java.lang.NoClassDefFoundError: org/apache/tez/dag/api/TezConfigurationat org.apache.hadoop.hive.ql.exec.tez.TezSessionPoolSession$AbstractTriggerValidator.startTriggerValidator(TezSessionPoolSession.java:74)at org.apache.hadoop.hive.ql.e…

数据集成革新:去中心化微服务集群的无限潜能

在当今数据密集型的业务环境下,传统的集中式架构已经难以满足高可用性和高并发性的要求。而去中心化微服务集群则通过分散式的架构,将系统划分为多个小型的、独立部署的微服务单元,每个微服务负责特定的业务功能,实现了系统的高度…

bytesec靶场

靶场下载 https://www.vulnhub.com/entry/hacknos-os-bytesec,393/ 下载完成后进入配置修改网卡 教程 配置 第一步:启动靶机时按下 shift 键, 进入以下界面 第二步:选择第二个选项,然后按下 e 键,进入编辑界面 将…

python快速两两元素求相似矩阵

目录 1. 计算相似度矩阵2. 基于sklearn 1. 计算相似度矩阵 计算相似度矩阵的方法有很多种,发现了sklearn中直接有通过计算余弦相似度得到相似度矩阵的方法 1 sklearn.metrics.pairwise.cosine_similarity # 余弦相似度 2 sklearn.metrics.pairwise.pairwise_distan…

【NetCore】09-中间件

文章目录 中间件:掌控请求处理过程的关键1. 中间件1.1 中间件工作原理1.2 中间件核心对象 2.异常处理中间件:区分真异常和逻辑异常2.1 处理异常的方式2.1.1 日常错误处理--定义错误页的方法2.1.2 使用代理方法处理异常2.1.3 异常过滤器 IExceptionFilter2.1.4 特性过…

NTN(六) switchover

NTN中的switchover包括feeder link switchover和 serving link switch。所谓feeder link switchover就是将feeder link从source NTN 网关更改为特定 NTN payload的target NTN 网关的过程。 feeder link switchover是网络层过程。 而service link switch则是指serving NTN paylo…

OpenCV分析tfboys十周年演唱会灯牌大战结果

前言 在Android音视频开发中,网上知识点过于零碎,自学起来难度非常大,不过音视频大牛Jhuster提出了《Android 音视频从入门到提高 - 任务列表》,结合我自己的工作学习经历,我准备写一个音视频系列blog。本文是音视频系…

【代码质量】认知复杂度(COGNITIVE COMPLEXITY)一种衡量可理解性的新方法

白皮书地址 摘要:圈复杂度最初是作为“可测试性和模块控制流的“可维护性”。虽然它擅长于衡量前者,但它的数学模型不能产生一个令人满意的值来衡量后者。本文描述一种打破数学度量模型的新度量模型来评估代码,以弥补圈复杂度的缺点&#xf…

【科研论文配图绘制】task1 掌握科研绘图的基本知识

【科研论文配图绘制】task1 掌握科研绘图的基本知识 写在最前 8月份Datawhale组队学习,写下该博客记录学习内容 1.科研论文配图的分类与构成 2.科研论文配图的格式和尺寸 3.科研论文配图中的字体和字号设置 4.科研论文配图的版式设计、结构布局和颜色搭配 占个…

【校招VIP】CSS校招考点之选择器优先级

考点介绍: 选择器是CSS的基础,也是校招中的高频考点,特别是复合选择器的执行优先级,同时也是实战中样式不生效的跟踪依据。 因为选择器的种类较多,很难直接记忆,可以考虑选择一个相对值,比如id类…

day4 IO模型

IO多路复用 1.select函数 服务器: 客户端 poll函数 客户端: