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

目录

一、理论

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网络模式名称

4.Docker中create,start,run三种命令关系

(1)create

 docker create <image-id>命令可以理解为为指定镜像添加一个读写层,就构成了容器,正如上面所说容器=镜像+读写层。但此时容器并未运行起来。如下图:

(2)start

docker start <container-id>命令是为容器的文件系统创建了一个进程隔离空间,注意:每个容器只能有一个进程隔离空间,因为进程隔离所以外部的信息访问不到内部的,这时候就需要端口映射,将容器内的正在运行端口映射到外部Linux系统上。这样就可以通过访问Linux的端口从而访问到Docker中这个端口通常是我们项目接受请求的端口,比如MySQL要运行在Docker上需要映射3306端口等。这时候容器是属于运行起来了的状态。项目可以正常接收请求和发布请求了。

(3)run

docker run <image-id>这个命令相当于create+start,即如下图:

四、总结

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

docker run = docker create + docker start

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

docker rm -f = docker stop + docker rm

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

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

相关文章

Codeforces Round 893 (Div. 2) D.Trees and Segments

原题链接&#xff1a;Problem - D - Codeforces 题面&#xff1a; 大概意思就是让你在翻转01串不超过k次的情况下&#xff0c;使得a*&#xff08;0的最大连续长度&#xff09;&#xff08;1的最大连续长度&#xff09;最大&#xff08;1<a<n&#xff09;。输出n个数&…

【C++精华铺】8.C++模板初阶

目录 1. 泛型编程 2. 函数模板 2.1 函数模板的概念及格式 2.2 函数模板的原理 2.3 模板的实例化 2.4 模板参数的匹配原则 3. 类模板 3.1 类模板格式 3.2 类模板的实例化 1. 泛型编程 什么是泛型编程&#xff1f;泛型编程是避免使用某种具体类型而去使用某种通用类型来进行…

VirtualBox安装CentOS8.5

0 环境 win10 virtualbox版本 版本 7.0.10 r158379 (Qt5.15.2) 1.镜像下载 阿里镜像站 https://developer.aliyun.com/mirror/ 1.1 找到安装包下载地址 1.2 找到8.5版本 1.3 iso 再然后 1.4 选择安装包 我这里选的是最小安装包&#xff0c;centOS8.5最小安装版本&#…

VBA技术资料MF44:VBA_把数据从剪贴板粘贴到Excel

【分享成果&#xff0c;随喜正能量】人皆知以食愈饥&#xff0c;莫知以学愈愚,生命中所有的不期而遇都是你努力的惊喜.人越纯粹&#xff0c;就越能感受到美。大江、大河、大海、大山、大自然&#xff0c;这些风景从来都不会受“属于谁”的污染&#xff0c;人人都感受到它们的美…

Vue3和Vue2对比学习之全局 API 应用实例

文章目录 0.前言1.参考文档2.详细说明2.1 全局 API 应用实例 非兼容2.2 一个新的全局 API&#xff1a;createAppconfig.productionTip 移除config.ignoredElements 替换为 config.isCustomElementVue.prototype 替换为 config.globalPropertiesVue.extend 移除类型推断组件继承…

Jmeter 连接 MySQL 数据库脚本

1、创建线程组 2、创建 JDBC Connection Configuration 3、创建 JDBC Request 4、最终创建的目录 5、重点来了 5.1 在百度中下载个 MySQL-connector-Java-8.0.28.jar&#xff0c;放在 jmeter 的 bin 目录下 5.2 在测试计划中&#xff0c;将 jar 包添加到脚本中 5.3 输入参…

pycorrector一键式文本纠错工具,整合了BERT、MacBERT、ELECTRA、ERNIE等多种模型,让您立即享受纠错的便利和效果

pycorrector&#xff1a;一键式文本纠错工具&#xff0c;整合了Kenlm、ConvSeq2Seq、BERT、MacBERT、ELECTRA、ERNIE、Transformer、T5等多种模型&#xff0c;让您立即享受纠错的便利和效果 pycorrector: 中文文本纠错工具。支持中文音似、形似、语法错误纠正&#xff0c;pytho…

拿捏--->打印爱心(小心机表白)

文章目录 题目描述算法思路代码示例思路一思路二 题目描述 利用java语言编写算法在控制台打印爱心算法 算法思路代码示例 思路一 打印心形主要分为上下两部分&#xff0c;如图&#xff1a; 下边主要是一个倒立三角形&#xff0c;容易打印。 上边可以分为左右两部分&#…

python运算符

算术运算符 以下假设变量&#xff1a; a10&#xff0c;b20&#xff1a; 加 - 两个对象相加a b 输出结果 30-减 - 得到负数或是一个数减去另一个数a - b 输出结果 -10*乘 - 两个数相乘或是返回一个被重复若干次的字符串a * b 输出结果 200/除 - x除以y b / a 输出结果 2&…

如何快速优化 CnosDB 数据库性能与延迟:使用 Jaeger 分布式追踪系统

在正式的生产环境中&#xff0c;数据库的性能和延迟对于确保系统的稳定和高效运行至关重要。特别是在与 CnosDB 数据库进行交互时&#xff0c;更深入地了解其表现变得尤为重要。这时Jaeger 分布式追踪系统发挥了巨大的作用。在本篇博客中&#xff0c;我们将深入探讨如何通过使用…

使用Docker搭建MySQL主从复制(一主一从)

Docker安装MySQL docker pull mysql:5.7 docker images mysql安装步骤 1.新建主服务器容器实例3307 docker run -p 3307:3306 --name mysql-master -v /usr/local/docker/mysql5.7/data/mysql-master/logs:/var/log/mysql -v /usr/local/docker/mysql5.7/data/mysql-master/…

LangChain源码逐行解密之系统(二)

LangChain源码逐行解密之系统 20.2 serapi.py源码逐行剖析 我们可以看一下Google查询的例子,在LangChain中有多种实现的方式。 如图20-5所示,在utilities的serpapi.py代码文件中实现了SerpAPIWrapper。 图20- 5 utilities的serpapi.py的SerpAPIWrapper 在langchain目录的se…

《vue3实战》运用radio单选按钮或Checkbox复选框实现单选多选的试卷制作

文章目录 目录 系列文章目录 1.《Vue3实战》使用axios获取文件数据以及走马灯Element plus的运用 2.《Vue3实战》用路由实现跳转登录、退出登录以及路由全局守护 3.《vue3实战》运用Checkbox复选框实现单选多选的试卷展现&#xff08;本文&#xff09; 文章目录 前言 radio是什…

等保案例 6

用户简介 江苏省监狱管理局是江苏省司法厅管理下的副厅级部门管理机构&#xff0c;是主管全省监狱工作的机关。随着信息化的发展&#xff0c;江苏省监狱管理局的监狱业务对网络和信息系统的依赖不断增加&#xff0c;网络流转的信息量不断增大&#xff0c;信息化建设的需求也日…

Zabbix-6.4.4 邮箱告警SMS告警配置

目录 ​------------------------- # 邮箱告警 ---------------------------------- 1.安装mailx与postfix软件包 2.修改mailx配置文件 3. 创建文件夹 4. 编写mail-send.sh脚本 5. 将该脚本赋予执行权限 6. 进入web界面进行设置—> Alerts —> Media Types 7. 添…

【Linux】Linux启动/查看/结束进程命令(详细讲解)

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

基线与基线检查

目录 一、什么是基线 二、安全基线与配置核查 三、常见安全配置问题 四、配置检查目的 五、配置检查标准 六、基线检查标准 七、安全基线与漏扫的异同 相同点 不同点 八、安全基线体系 九、安全配置核查关注什么 口令策略 文件权限 用户账户 系统服务 认证授权 网络通…

人工智能原理(9)

目录 一、人工神经元模型 1、概念 2、分类 二、感知器的结构 三、反向传播网络 四、自组织映射神经网络 五、离散HOPFIELD网络 1、离散Hopfield网络结构 2、离散Hopfield网络的稳定性 3、离散Hopfield网络学习算法 六、脉冲耦合神经网络 一、人工神经元模型 1、概念…

6G 特点及表现

6G R&D Vision: Requirements and Candidate Technologies 5G已经提出来了大移动带宽&#xff0c;低时延和大规模机器互联&#xff0c;在这个基础上&#xff0c;6G加上了高可靠性&#xff0c;高定位精度和高智能化。 6G的主要候选技术&#xff0c;包括(子) THz 通信&#x…

在 SHELL 脚本中调用另一个 SHELL 脚本(报错: go: not found)

文章目录 在 SHELL 脚本中调用另一个 SHELL 脚本&#xff08;报错&#xff1a; go: not found&#xff09;在 SHELL 脚本中调用另一个 SHELL 脚本一个脚本sudo调另外一个脚本&#xff0c;报错&#xff08;报错&#xff1a; go: not found&#xff09; 在 SHELL 脚本中调用另一个…