Docker学习轨迹二(docker常用命令)
2021/11/10 23:44:10
本文主要是介绍Docker学习轨迹二(docker常用命令),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
Docker常用命令
- Docker镜像(image)
- Docker Hub地址
- Docker镜像常用命令
- pull命令
- images命令
- save命令
- load命令
- search命令(了解)
- inspect命令
- history命令
- tag命令
- rmi 命令
- 清理镜像
- Docker容器(container)
- docker容器常用命令
- 新建并启动容器
- 容器日志
- 删除容器
- 列出容器
- 创建容器
- 启动、重启、终止容器
- 进入容器
- 查看容器
- 更新容器
- 杀掉容器
- docker常用命令汇总(图)
- Docker网络
- docker网络理论部分
- docker网络模式
- host模式
- Container网络模式
- none模式
- bridge模式
- macvlan 网络模式
- overlay 网络模式
- bridge网络
- docker0详解
- 多容器之间通讯
- 新建bridge网络
- none、host网络模式
- none网络
- host网络
- 网络命令汇总
- 查看网络
- 创建网络
- 网络删除
- 查看网络详细信息
- 使用网络
- 网络连接与断开
Docker镜像(image)
Docker Hub地址
Docker Hub 类似与maven远程仓库地址
https://hub.docker.com/
作为一名研发人员,则可以将镜像理解为类(Class)。是一个应用程序。
首先需要先从镜像仓库服务中拉取镜像。常见的镜像仓库服务是 Docker Hub,但是也存在其他镜像仓库服务。
拉取操作会将镜像下载到本地 Docker 主机,可以使用该镜像启动一个或者多个容器。
镜像由多个层组成,每层叠加之后,从外部看来就如一个独立的对象。镜像内部是一个精简的操作系统(OS),同时还包含应用运行所必须的文件和依赖包。
因为容器的设计初衷就是快速和小巧,所以镜像通常都比较小。
前面多次提到镜像就像停止运行的容器(类)。实际上,可以停止某个容器的运行,并从中创建新的镜像。
Docker镜像常用命令
pull命令
-
下载镜像的命令。镜像从远程镜像仓库服务的仓库中下载。默认情况下,镜像会从 Docker Hub 的仓库中拉取。
-
通过下载过程,可以看到,一个镜像一般是由多个层组成,类似 f7e2b70d04ae 这样的串表示层的唯一 ID。
常用参数
-a, --all-tags=true|false : 是否获取仓库中所有镜像,默认为否; --disable-content-trust : 跳过镜像内容的校验,默认为 true;
使用pull命令下载镜像
#tomcat镜像下载 #https://hub.docker.com/_/tomcat docker pull tomcat:9.0.20-jre8 docker pull tomcat:9.0.20-jre8-slim docker pull tomcat:9.0.20-jre8-alpine #centos镜像下载 #https://hub.docker.com/_/centos docker pull centos:7.8.2003 #ubuntu镜像下载 #https://hub.docker.com/_/ubuntu docker pull ubuntu:20.04 #debian镜像下载 #https://hub.docker.com/_/debian docker pull debian:10.6 docker pull debian:10.6-slim
问题一:
如果多个不同的镜像中,同时包含了同一个层,这样重复下载,是不是会导致存储空间的浪费?
答:实际上,Docker 并不会这么傻会去下载重复的层,Docker 在下载之前,会去检测本地是否会有同样 ID的层,如果本地已经存在了,就直接使用本地的就好了。
问题二:
不同仓库中,可能也会存在镜像重名的情况发生, 这种情况咋办?
答:从严格意义上讲,我们在使用 pull命令时,还需要在镜像前面指定仓库地址(Registry), 如果不指定,则Docker 会使用您默认配置的仓库地址。
例如:当我执行 docker pull tomcat:9.0.20-jre8命令时,实际上相当于docker pull docker.hub/tomcat:9.0.20-jre8,如果您未自定义配置仓库,则默认在下载的时候,会在镜像前面加上DockerHub 的地址。Docker 通过前缀地址的不同,来保证不同仓库中,重名镜像的唯一性。
images命令
#通过以下两个命令,列出本机已有的镜像 docker images docker image ls
[root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx 1.19.3-alpine 4efb29ff172a 11 months ago 21.8MB
各个选项说明:
- REPOSITORY:表示镜像的仓库源
- TAG:镜像的标签
- IMAGE ID:镜像ID
- CREATED: 镜像创建时间
- SIZE:镜像大小
save命令
保存一个镜像
docker save [REPOSITORY]:[TAG] -o [FileName]
或
docker save [REPOSITORY]:[TAG] > [FileName]
#创建一个文件夹 mkdir -p /data cd /data #将镜像保存到该文件夹 docker save nginx:1.19.3-alpine -o nginx-1.19.3-alpine.tar 或 docker save nginx:1.19.3-alpine > nginx-1.19.3-alpine.tar
常用参数
- o :输出到的文件
多个镜像
mkdir -p /data cd /data docker save \ ubuntu:20.04 \ alpine:3.12.1 \ debian:10.6-slim \ centos:7.8.2003 \ -o linux.tar docker save \ tomcat:9.0.20-jre8-alpine \ tomcat:9.0.20-jre8-slim \ tomcat:9.0.20-jre8 \ -o tomcat9.0.20.tar
load命令
从本地导入镜像
docker load -i linux.tar #或 docker load < linux.tar
常用参数
- –input , -i : 指定导入的文件。
- –quiet , -q : 精简输出信息。
search命令(了解)
查找镜像仓库的指定镜像(不过不推荐使用,因为不够直观,建议直接去仓库官网寻找)
docker search tomcat
常用参数
- -f, --filter filter : 过滤输出的内容;
- –limit int :指定搜索内容展示个数;
- –no-index : 不截断输出内容;
- –no-trunc :不截断输出内容;
inspect命令
- 通过 docker inspect 命令,我们可以获取镜像的详细信息,其中,包括创建者,各层的数字摘要
等。
docker inspect tomcat:9.0.20-jre8-alpine
- docker inspect 返回的是 JSON格式的信息,如果您想获取其中指定的一项内容,可以通过 -f 来指定,如获取镜像大小
docker inspect -f {{".Size"}} tomcat:9.0.20-jre8-alpine
history命令
从前面的命令中,我们了解到,一个镜像是由多个层组成的,那么,我们要如何知道各个层的具体内容呢?
通过 docker history命令,可以列出各个层的创建信息,例如:查看 tomcat:9.0.20-jre8-alpine的各层
信息
docker history tomcat:9.0.20-jre8-alpine
tag命令
标记本地镜像,将其归入某一仓库。先简单熟悉一下。
docker tag tomcat:9.0.20-jre-alpine myself/tomcat:9
rmi 命令
删除镜像命令
docker rmi tomcat:9.0.20-jre8-alpine #或 docker image rm tomcat:9.0.20-jre8-alpine
常用参数
- -f, -force : 强制删除镜像,即便有容器引用该镜像;
- -no-prune : 不要删除未带标签的父镜像;
使用ID删除镜像
除了通过标签名称来删除镜像,我们还可以通过制定镜像 ID, 来删除镜像。一旦制定了通过 ID 来删除镜像,它会先尝试删除所有指向该镜像的标签,然后在删除镜像本身。
docker rmi ee7cbd482336
镜像删除的限制
删除镜像很简单,但也不是我们何时何地都能删除的,它存在一些限制条件。当通过该镜像创建的容器未被销毁时,镜像是无法被删除的。但是我们可以通过添加 -f 子命令,也就是强制删除,移除掉该镜像。但是,我们一般不推荐这样暴力的做法,正确的做法应该是:
- 先删除引用这个镜像的容器;
- 再删除这个镜像。
清理镜像
我们在使用 Docker 一段时间后,系统一般都会残存一些临时的、没有被使用的镜像文件,可以通过以下命令进行清理。执行完命令后,还是告诉我们释放了多少存储空间!
docker image prune
常用参数
- –a, --all : 删除所有没有用的镜像,而不仅仅是临时文件;
- -f, --force :强制删除镜像文件,无需弹出提示确认;
Docker容器(container)
容器是镜像的运行时实例。正如从虚拟机模板上启动 VM 一样,用户也同样可以从单个镜像上启动一个或多个容器。虚拟机和容器最大的区别是容器更快并且更轻量级——与虚拟机运行在完整的操作系统之上相比,容器会共享其所在主机的操作系统/内核。下图为使用单个 Docker镜像启动多个容器的示意图。
- Docker容器类似于一个轻量级的沙箱,Docker利用容器来运行和隔离应用。
- 容器是镜像的一个运行实例。
- 可以将其启动、开始、停止、删除,而这些容器都是彼此相互隔离的、互不可见的。
- 可以把容器看做是一个简易版的Linux系统环境(包括root用户权限、进程空间、用户空间和网络空间等)以及运行在其中的应用程序打包而成的盒子。
- 容器是基于镜像启动起来的,容器中可以运行一个或多个进程。
- 镜像是Docker生命周期中的构建或打包阶段,而容器则是启动或执行阶段。
- 镜像自身是只读的。容器从镜像启动的时候,会在镜像的最上层创建一个可写层。
docker容器常用命令
新建并启动容器
语法
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
运行容器
docker run -it --rm -p 8080:8080 tomcat:9.0.20-jre8-alpine
常用参数
docker run命令常用参数比较多,这里仅仅列出开发岗常用参数。
- -d, --detach=false: 后台运行容器,并返回容器ID
- -i, --interactive=false: 以交互模式运行容器,通常与 -t 同时使用
- -P, --publish-all=false: 随机端口映射,容器内部端口随机映射到主机的端口。不推荐各位小伙伴使用该参数
- -p, --publish=[]: 指定端口映射,格式为:主机(宿主)端口:容器端口,推荐各位小伙伴们使用
- -t, --tty=false: 为容器重新分配一个伪输入终端,通常与 -i 同时使用
- –name=“nginx-lb”: 为容器指定一个名称
- -h , --hostname=“laosiji”: 指定容器的hostname
- -e , --env=[]: 设置环境变量,容器中可以使用该环境变量
- –net=“bridge”: 指定容器的网络连接类型,支持bridge/host/none/container: 四种类型
- –link=[]: 添加链接到另一个容器;不推荐各位小伙伴使用该参数
- -v, --volume : 绑定一个卷
- –privileged=false: 指定容器是否为特权容器,特权容器拥有所有的capabilities
- –restart=no:指定容器停止后的重启策略
no:容器退出时不重启
on-failure:容器故障退出(返回值非零)时重启
always:容器退出时总是重启,推荐各位小伙伴们使用 - –rm=false: 指定容器停止后自动删除容器,不能以docker run -d启动的容器
容器日志
语法
docker logs [OPTIONS] CONTAINER
执行命令
docker run -itd --name tomcat9 -p 8080:8080 tomcat:9.0.20-jre8-alpine docker logs -f tomcat9
常用参数
- -f : 跟踪日志输出
- –tail :仅列出最新N条容器日志
删除容器
docker rm :删除一个或多个容器。docker rm 命令只能删除处于终止或退出状态的容器,并不能删除处于运行状态的容器。
语法
docker rm [OPTIONS] CONTAINER [CONTAINER...]
执行命令
docker run -itd --name tomcat9 -p 8080:8080 tomcat:9.0.20-jre8-alpine #需要先停止运行的容器再删除,否则无法删除容器 docker stop tomcat9 #按照容器名称删除 docker rm tomcat9 #按照容器ID删除 docker rm 8dd95a95e687
常用参数
- -f:通过SIGKILL信号强制删除一个运行中的容器
- -l: 移除容器间的网络连接,而非容器本身
- -v:删除与容器关联的卷
列出容器
语法
docker ps [OPTIONS]
执行命令
#启动容器 docker run -itd --name tomcat99 -p 8080:8080 tomcat:9.0.20-jre8-alpine #查看运行中的容器 docker ps #查看所有容器 docker ps -a
输出详情介绍:
CONTAINER ID: 容器 ID。
IMAGE: 使用的镜像。
COMMAND: 启动容器时运行的命令。
CREATED: 容器的创建时间。
STATUS: 容器状态。
状态有7种:
created(已创建)
restarting(重启中)
running(运行中)
removing(迁移中)
paused(暂停)
exited(停止)
dead(死亡)
PORTS: 容器的端口信息和使用的连接类型(tcp\udp)。
NAMES: 自动分配的容器名称。
常用参数
- -a:显示所有的容器,包括未运行
- -q:只显示容器编号
实用技巧
#停止所有运行容器 docker stop $(docker ps -qa) #删除所有的容器 docker rm $(docker ps -aq) docker rm $(docker stop $(docker ps -q)) #删除所有的镜像 docker rmi $(docker images -q)
创建容器
docker create :创建一个容器但不启动它
语法
docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
执行命令
docker create -it -name tomcat9 -p 8080:8080 tomcat: 9.0.20-jre8-alpine
常用参数
大部分参数用法与docker run命令相同
启动、重启、终止容器
docker start:启动一个或多个被停止的容器
docker stop:停止一个运行中的容器
docker restart:重启容器
语法
docker start [OPTIONS] CONTAINER [CONTAINER...] docker stop [OPTIONS] CONTAINER [CONTAINER...] docker restart [OPTIONS] CONTAINER [CONTAINER...]
执行命令
docker start tomcat9 docker stop tomcat9 docker restart tomcat9
进入容器
docker exec:在运行的容器中执行命令。早期有attach命令,对于阻塞命令会去 等待,所以不方便, 在docker 1.3.0后提供了exec 可以在容器内直接执行任意命令
语法
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
执行命令
#有bash命令的linux系统,例如centos #启动tomcat容器 docker run -itd -name tomcat9 -p 8080:8080 tomcat:9.0.20-jre8-slim #进入tomcat容器 docker exec -it tomcat9 /bin/bash #没有bash命令的linux系统,例如:alpine系统 #启动tomcat容器 docker run -itd -name tomcat9.1 -p 8080:8080 tomcat:9.0.20-jre8-slim #进入tomcat容器 docker exec -it tomcat9.1 sh
常用参数
- -i:即使没有附加也保持STDIN打开
- -t:分配一个伪终端
查看容器
docker inspect:获取容器/镜像的元数据
语法
docker inspect [OPTIONS] NAME|ID [NAME|ID...]
执行命令
docker run -it --name tomcat9 -p 8080:8080 tomcat:9.0.20-jre8-alpine docker inspect tomcat9
常用参数
- -f:返回指定值的模板文件
- -s:显示总的文件大小
- –type:为指定类型返回JSON。
更新容器
docker update:可以动态的更新容器配置。可以更新一个或多个容器配置。多个容器名称或ID之间使用空格分割。但update命令并不是很成熟,有很多配置项不能动态更新。推荐大家还是rm容器以后,再重新run一个新的容器。
语法
docker update [OPTIONS] CONTAINER [CONTAINER...]
执行命令
docker run -ti --name tomcat9 -p 8080:88080 tomcat:9.0.20-jre8-alpine #更新容器restart策略 docker update --restart always tomcat9
杀掉容器
docker kill:杀掉一个运行中的容器
语法
docker kill [OPTIONS] CONTAINER [CONTAINER...]
执行命令
docker run -itd --name tomcat9 -p 8080:8080 tomcat:9.0.20-jre8-alpine #杀掉容器 docker kill tomcat9 #查看启动的容器 docker ps #查看所有容器 docker ps -a #启动容器 docker start tomcat9
常用命令
- -s:向容器发送一个信号
docker常用命令汇总(图)
Docker网络
当你开始大规模使用docker时,你会发现需要了解很多关于网络的知识。docker作为目前最火的轻量级容器技术,有很多令人称道的功能,如docker的镜像管理。然而,docker同样有着很多不完善的地方,网络方面就是Docker比较薄弱的部分。因此,作为一名运维工程师有必要深入了解docker的网络知识,以满足更高的网络需求。作为一名微服开发工程师,简单了解docker网络环节即可。
docker安装后会自动创建三种网络:
- bridge
- host
- none
docker network ls
docker网络理论部分
docker使用Linux桥接网卡,在宿主机虚拟一个docker容器网桥(docker0),docker启动一个容器时会根据docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。
docker网桥是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络是无法寻址到的,这也意味着外部网络无法通过直接Container-IP访问到容器。如果容器希望外部访问能够访问到,可以通过映射容器端口到宿主主机(端口映射),即docker run创建容器时候通过 -p 或 -P 参数来启用,访问容器的时候就通过**[宿主机IP]:[容器端口]**访问容器。
#使用命令查看docker网络部分 docker info
docker网络模式
host模式
相当于Vmware中的NAT模式,与宿主机在同一个网络中,但没有独立IP地址。
如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。
使用host模式的容器可以直接使用宿主机的IP地址与外界通信,容器内部的服务端口也可以使用宿主机的端口,不需要进行NAT,host最大的优势就是网络性能比较好,但是docker host上已经使用的端口就不能再用了,网络的隔离性不好。
host网络模式需要在容器创建时指定–network=host
host 模式是 bridge 桥接模式很好的补充。采用 host 模式的 Docker Container,可以直接使用宿主机的 IP地址与外界进行通信,若宿主机的 eth0 是一个公有 IP,那么容器也拥有这个公有IP。同时容器内服务的端口也可以使用宿主机的端口,无需额外进行 NAT 转换。
host模式可以让容器共享宿主机网络栈,这样的好处是外部主机与容器直接通信,但是容器的网络缺少隔离性。
Host 网络模式的缺陷:
最明显的是 Docker Container 网络环境隔离性的弱化。即容器不再拥有隔离、独立的网络环境。
另外,使用 host 模式的 Docker Container 虽然可以让容器内部的服务和传统情况无差别、无改造的使用,但是由于网络隔离性的弱化,该容器会与宿主机共享竞争网络栈的使用;
另外,容器内部将不再拥有所有的端口资源,原因是部分端口资源已经被宿主机本身的服务占用,还有部分端口已经用以 bridge 网络模式容器的端口映射。
Container网络模式
一种特殊host 网络模式
Container 网络模式是 Docker 中一种较为特别的网络的模式。在容器创建时使用–network=container:vm1指定。(vm1指定的是运行的容器名)
处于这个模式下的 Docker 容器会共享一个网络环境,这样两个容器之间可以使用localhost高效快速通信。
Container网络模式的缺陷
它并没有改善容器与宿主机以外世界通信的情况(和桥接模式一样,不能连接宿主机以外的其他设备)。
这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo 网卡设备通信。
none模式
使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。
这种网络模式下容器只有lo回环网络,没有其他网卡。none模式可以在容器创建时通过–network=none来指定。这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性。
bridge模式
默认的网络模式。bridge模式下容器没有一个公有ip,只有宿主机可以直接访问,外部主机是不可见的,但容器通过宿主机的NAT规则后可以访问外网。
Bridge 桥接模式的实现步骤主要如下:
- Docker Daemon 利用 veth pair 技术,在宿主机上创建两个虚拟网络接口设备,假设为veth0 和veth1。而veth pair 技术的特性可以保证无论哪一个 veth 接收到网络报文,都会将报文传输给另一方。
- Docker Daemon 将 veth0 附加到 Docker Daemon 创建的 docker0网桥上。保证宿主机的网络报文可以发往 veth0;
- Docker Daemon 将 veth1 添加到 Docker Container 所属的 namespace 下,并被改名为eth0。如此一来,保证宿主机的网络报文若发往 veth0,则立即会被 eth0 接收,实现宿主机到Docker Container网络的联通性;同时,也保证 Docker Container 单独使用 eth0,实现容器网络环境的隔离性。
bridge桥接模式的缺陷:
1.最明显的是,该模式下 Docker Container 不具有一个公有 IP,即和宿主机的 eth0 不处于同一个网段。导致的结果是宿主机以外的世界不能直接和容器进行通信。
2.虽然 NAT 模式经过中间处理实现了这一点,但是 NAT 模式仍然存在问题与不便,如:容器均需要在宿主机上竞争端口,容器内部服务的访问者需要使用服务发现获知服务的外部端口等。
3.另外 NAT 模式由于是在三层网络上的实现手段,故肯定会影响网络的传输效率。
注意:
veth设备是成双成对出现的,一端是容器内部命名为eth0,一端是加入到网桥并命名的veth(通常命名为veth),它们组成了一个数据传输通道,一端进一端出,veth设备连接了两个网络设备并实现了数据通信
macvlan 网络模式
macvlan网络模式,最主要的特征就是他们的通信会直接基于mac地址进行转发。
这时宿主机其实充当一个二层交换机。Docker会维护着一个MAC地址表,当宿主机网络收到一个数据包后,直接根据mac地址找到对应的容器,再把数据交给对应的容器。
容器之间可以直接通过IP互通,通过宿主机上内建的虚拟网络设备(创建macvlan网络时自动创建),
但与主机无法直接利用IP互通。
应用场景:由于每个外来的数据包的目的mac地址就是容器的mac地址,这时每个容器对于外面网络来
说就相当于一个真实的物理网络设备。因此当需要让容器来的网络看起来是一个真实的物理机时,使用
macvlan模式
Macvlan是一个新的尝试,是真正的网络虚拟化技术的转折点。Linux实现非常轻量级,因为与传统的
Linux Bridge隔离相比,它们只是简单地与一个Linux以太网接口或子接口相关联,以实现网络之间的分
离和与物理网络的连接。
Macvlan提供了许多独特的功能,并有充足的空间进一步创新与各种模式。这些方法的两个高级优点是
绕过Linux网桥的正面性能以及移动部件少的简单性。删除传统上驻留在Docker主机NIC和容器接口之间
的网桥留下了一个非常简单的设置,包括容器接口,直接连接到Docker主机接口。由于在这些情况下没有端口映射,因此可以轻松访问外部服务。
overlay 网络模式
Overlay 网络,也成为覆盖网络。主要用于docker集群部署。
Overlay 网络的实现方式和方案有多种。docker自身集成了一种,基于VXLAN隧道技术实现。
Overlay 网络主要实现跨主机容器之间的通信。
应用场景:需要管理成百上千个跨主机的容器集群的网络时。
bridge网络
bridge网络的表现形式就是docker0这个网络接口。容器默认都是通过docker0这个接口进行通信。也可以通过docker0和本机的以太网接口连接,这样容器内部才能访问互联网。
#查看docker0网路: #在默认的环境中,一个名为docker0的Linux bridge 自动被创建好了,其上有一个docker0 内部接口。 ip a #查看docker网络 docker network ls #查看bridge网络详情,主要关注containers节点信息 docker network inspect bridge
docker0详解
运行一个镜像 docker run -itd --name nginx nginx:1.19.3-alpine 查看bridge网络详情。主要关注Containers节点信息, 发现nginx容器默认使用bridge网络。 docker network inspect bridge
容器创建时IP地址的分配
查看虚拟机的网络配置,发现多出一块网卡 ip a
docker创建一个容器时,会执行以下操作:
-
创建一对虚拟接口/网卡,也就是 veth pair,分别放到本地主机和新容器中;
-
本地主机一端桥接到默认的docker0或指定的网桥上,并具有一个唯一的名字,如vetha596da4;
-
网卡一端放到新容器中,并修改名字作为eth0,这个网卡/接口只在容器的名字空间可见。
-
从网桥可用地址网段中(也就是与该bridge对应的network)获取一个空闲的地址分配给容器的eth0,并配置默认路由到桥接网卡vetha596da4;
-
完成这些后,容器就可以使用eth0 虚拟网卡来连接其他容器和其他网络;
-
如果容器运行时不指定 --network,创建的容器都会默认挂到docker0 上
,使用本地主机上的docker0接口的IP作为所有容器的默认网关。第一种方式: docker exec -it nginx1 sh ip a 第二种方式: docker exec -it nginx1 ip a
安装brctl
yum install -y bridge-utils
运行命令
brctl show
多容器之间通讯
#启动两个容器 docker run -itd --name nginx1 nginx:1.19.3-alpine docker run -itd --name nginx2 nginx:1.19.3-alpine #查看bridge网络详情(新建的容器默认使用bridge网络模式) docker network inspect bridge #进入nginx1容器 docker exec -it nginx1 sh ping 172.17.0.2 #进入nginx2容器 docker exec -it nginx2 sh ping 172.17.0.2 ping www.baidu.com ping nginx1
容器IP地址会发生变化
docker stop nginx1 nginx2 #先启动nginx2再启动nginx1 docker start nginx2 docker start nginx1 docker network inspect bridge
link容器
学习docker run命令的link参数
- –link=[] :添加连接到另一个容器;不推荐使用
使用link的场景:在企业开发环境中,我们有一个mysql的服务的容器mysql_1,还有一个web应用程序web_1,肯定web_1这台容器肯定要连接mysql_1这个数据库。前面网络命名空间的知识告诉我们,两个容器需要能通信,需要知道对方的具体的IP地址。生产环境还比较好,IP地址很少变化,但是在我们内部测试环境,容器部署的IP地址是可能不断变化的,所以,开发人员不能在代码中写死数据库的IP地址。这个时候,我们就可以利用容器之间link来解决这个问题。下面,我们来介绍如何通过容器名称来
进行ping,而不是通过IP地址。
docker rm -f nginx2 docker run -itd --name nginx2 --link nginx1 nginx:1.19.3-alpine docker exec -it nginx2 sh ping 172.17.0.2 ping www.baidu.com ping nginx1
- 上面link命令,是在nginx2容器启动时link到nginx1容器,因此,在nginx2容器里面可以ping通nginx1容器名,link的作用相当于添加了DNS解析。这里提醒下,在nginx1容器里去ping nginx2
- 容器是不通的,因为link关系是单向的,不可逆。
- 实际工作中,docker官网已经不推荐我们使用link参数。
- docker用其他方式替换掉link参数
新建bridge网络
docker network create -d bridge myBridge
上面命令参数-d 是指DRIVER的类型,后面的lagou-bridge是network的自定义名称,这个和docker0是类似的。下面开始介绍,如何把容器连接到lagou-bridge这个网络。
启动一个nginx的容器nginx3,并通过参数network connect来连接lagou-bridge网络。在启动容器nginx3之前,我们查看目前还没有容器连接到了lagou-bridge这个网络上
brctl show docker network ls docker network inspect myBridge docker run -itd --name nginx3 --network myBridge nginx:1.19.3-alpine brctl show docker network inspect lmyBridge
把一个运行中的容器连接到myBridge
docker network connect lagou-bridge nginx2 docker network inspect lagou-bridge docker exec -it nginx2 sh ping nginx3 docker exec -it nginx3 sh ping nginx2
none、host网络模式
none网络
启动一个ngnix的容器nginx1,并且连接到none网络。然后执行docker network inspect none,看看容器信息
docker run -itd --name nginx1 --network none nginx:1.19.3-alpine docker network inspect none
注意,容器使用none模式,是没有物理地址和IP地址。我们可以进入到nginx1容器里,执行ip a命令看看。只有一个lo接口,没有其他网络接口,没有IP。也就是说,使用none模式,这个容器是不能被其他容器访问。这种使用场景很少,只有项目安全性很高的功能才能使用到。例如:密码加密算法容器。
docker exec -it nginx1 sh ip a
host网络
前面学习none网络模式特点就是,容器没有IP地址,不能和其他容器通信。下面来看看host网络是什么特点。我们使用前面命令,启动一个nginx的nginx2容器,连接到host网络。然后docker network inspect host, 看看容器信息。
docker run -itd --name nginx2 --network host nginx:1.19.3-alpine docker network inspect host
这里来看,也不显示IP地址。那么是不是和none一样,肯定不是,不然也不会设计none和host网络进行区分。下面我们进入nginx2容器,执行ip a看看效果。我们在容器里执行ip a,发现打印内容和在linux本机外执行ip a是一样的。
docker exec -it nginx2 sh ip a
容器使用了host模式,说明容器和外层linux主机共享一套网络接口。VMware公司的虚拟机管理软件,其中网络设置,也有host这个模式,作用也是一样,虚拟机里面使用网络和你自己外层机器是一模一样的。这种容器和本机使用共享一套网络接口,缺点还是很明显的,例如我们知道web服
务器一般端口是80,共享了一套网络接口,那么你这台机器上只能启动一个nginx端口为80的服务器了。否则,出现端口被占用的情况。
网络命令汇总
docker network --help
- connect Connect a container to a network
- create Create a network
- disconnect Disconnect a container from a network
- inspect Display detailed information on one or more networks
- ls List networks
- prune Remove all unused networks
- rm Remove one or more networks
查看网络
#查看网络 docker network ls
作用:
查看已经建立的网络对象
命令格式:
docker network ls [OPTIONS]
命令参数(OPTIONS):
-f, --filter filter 过滤条件(如 'driver=bridge’)
–format string 格式化打印结果
–no-trunc 不缩略显示
-q, --quiet 只显示网络对象的ID
注意:
默认情况下,docker安装完成后,会自动创建bridge、host、none三种网络驱动
命令演示
docker network ls
docker network ls --no-trunc
docker network ls -f ‘driver=host’
创建网络
创建网络 – docker network create
作用:
创建新的网络对象
命令格式:
docker network create [OPTIONS] NETWORK
命令参数(OPTIONS):
-d, --driver string 指定网络的驱动(默认 “bridge”)
–subnet strings 指定子网网段(如192.168.0.0/16、172.88.0.0/24)
–ip-range strings 执行容器的IP范围,格式同subnet参数
–gateway strings 子网的IPv4 or IPv6网关,如(192.168.0.1)
注意:
host和none模式网络只能存在一个
docker自带的overlay 网络创建依赖于docker swarm(集群负载均衡)服务
192.168.0.0/16 等于 192.168.0.0~192.168.255.255192.168.8.0/24
172.88.0.0/24 等于 172.88.0.0~172.88.0.255
命令演示
docker network ls
docker network create -d bridge my-bridge
docker network ls
网络删除
创建网络 – docker network create
作用
创建新的网络对象
命令格式:
docker network rm NETWORK [NETWORK…]
命令参数(OPTIONS):
无
查看网络详细信息
查看网络详细信息 docker network inspect
作用
查看一个或多个网络的详细信息
命令格式:
命令格式:
docker network inspect [OPTIONS] NETWORK [NETWORK…]
或者 docker inspect [OPTIONS] NETWORK [NETWORK…]
命令参数(OPTIONS):
-f, --format string 根据format输出结果
使用网络
查看网络详细信息 docker network inspect
作用
为启动的容器指定网络模式
命令格式:
docker run/create --network NETWORK
命令参数(OPTIONS):
无
注意:
默认情况下,docker创建或启动容器时,会默认使用名为bridge的网络
网络连接与断开
网络连接与断开 – docker network connect/disconnect
作用
将指定容器与指定网络进行连接或者断开连接
命令格式:
docker network connect [OPTIONS] NETWORK CONTAINER
docker network disconnect [OPTIONS] NETWORK CONTAINER
命令参数(OPTIONS):
-f, --force 强制断开连接(用于disconnect)
这篇关于Docker学习轨迹二(docker常用命令)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-14Docker端口:你真的公开了哪些东西?
- 2024-11-14用DOCKER在家里的实验室里搞些酷炫的玩意儿
- 2024-11-05掌握Docker:高效安全的十大最佳实践
- 2024-11-05在 Docker Compose 中怎么设置端口映射-icode9专业技术文章分享
- 2024-11-05在 Docker Compose 中怎么设置环境变量-icode9专业技术文章分享
- 2024-11-04Docker环境部署项目实战:新手入门教程
- 2024-11-04Docker环境部署资料:新手入门教程
- 2024-11-01Docker环境部署教程:新手入门指南
- 2024-11-01超越Docker:苹果芯片上的模拟、编排和虚拟化方案讲解
- 2024-11-01Docker环境部署:新手入门教程