参考视频地址:40分钟的Docker实战攻略,一期视频精通Docker。感谢作者的辛苦付出。
本文是Docker学习相关视频笔记(一)与Docker学习相关视频笔记(二)的后续
4、Docker命令
4.8 Docker 网络
4.8.1 桥接模式
docker网络默认是bridge,也就是桥接模式,所有的容器默认都连接到这个网络,每个容器都分配了一个内部IP地址,一般是172.17开头的,在这个内部子网里面,容器可以通过内部IP地址互相访问,但容器网络与宿主机的网络是隔离的,
我们可以使用docker network create创建出子网,默认情况下创建出来的子网,也是属于桥接模式的一种,然后可以指定容器加入不同的子网,同一个子网的容器可以互相通信,而跨子网则不可以通信。
创建子网,还有一个好处是,同一个子网的容器,可以使用容器的名字互相访问,而不必使用内部IP地址。
我们来试一下,首先第一个命令创建一个叫做network1的子网,第二个命令创建并且运行一个MONGODB的容器,我们看到这里使用–network指定它加入子网一,启动MONGODB的时候,没有使用-p参数进行端口映射,也就是使用宿主机是没法访问到这个MONGODB的,我们先把它启动起来,
接下来启动一个叫做mongo express的容器,这个容器就是MONGODB的网页客户端,同样的把它加入到子网一里面,因为跟MONGODB属于同一个子网,所以它们之间是可以互相访问的,mongo express上面做了端口映射,我们注意到这里传了一个环境变量,这里没有传数据库容器在子网的IP地址,而是直接把名字告诉了他。
在浏览器输入服务器的IP地址,端口8081,
第一次访问的时候要登录一下,
这样成功登录进来,
我们可以创建数据库,数据库里面可以做查询,可以做新增等等等等的功能。
我们来看一下网络的拓扑结构,两个容器分配在同一个子网里面,它们可以互相通信,这里注意到我启动第二个容器mongo express的时候,没有告诉第二个容器,关于第一个容器在子网里面的IP地址,而是仅仅告诉了他第一个容器的名字,借助于docker内部的DNS机制,通过名字就可以在子网内进行互相的访问。
我们来看一下它的效果,这里我进入到第二个容器mongo express里面,然后在容器里面执行这个命令,ping后面接的是第一个容器的名字,我们看到这里打印出来了第一个容器的IP地址,换句话说,docker子网内部有一个DNS机制,可以把名字转换成IP地址。
接下来我又做了一个端口映射,让浏览器可以访问到mongo express,然后mongo express又可以通过内部子网访问到MONGODB,这样达成最终的效果,这样我们就看到了默认的桥接模式,还有创建子网的桥接模式。
4.8.2 host模式
接下来我们看另外一种网络模式,另外一种常见的网络是host模式,docker容器直接共享宿主机的网络,容器直接使用宿主机的IP地址,而且无需-p参数进行端口映射,容器内的服务直接运行在宿主机的端口上,通过宿主机的IP和端口就能访问到容器,host模式可以解决一些非常棘手的网络问题。
我们来使用host模式启动一个nginx,这里在启动参数加上–network,后面host,我们没有进行端口映射
在浏览器直接访问服务器的IP地址,加端口80就可以访问到Nginx,
我们进入容器内看一下它的IP地址,在容器内部查看IP地址,
我们需要装一些工具,首先apt update,然后装这个工具,apt install ip router2,然后就可以查IP地址了,ip addr show,
我们看到容器内显示的IP地址,主要是这个内网IP地址,跟我在云服务器的控制面板上看的内网IP地址,是一模一样的。从这个例子可以看出,docker容器使用host模式,它直接共享了宿主机的网络空间。
4.8.2 host模式
最后一种docker网络是None模式,也就是不联网,
docker network list展示出所有docker网络,首先有默认的桥接模式,host模式,还有None模式,最后一个是我们刚才创建的子网,当然这个子网也是属于桥接网络的一种,这三种默认网络是不能删除的,我们可以使用命令docker network remove命令,删除自定义的子网,比如把它删除掉,再使用list命令就看不到刚才的子网了。
4.9 Docker compose
有些时候,一个完整的应用可能是很多部分组成的,比如前端后端数据库等等,这时候怎么用docker把它们容器化呢,我们可以很自然的想到,把这些模块都打包在一起,做成一个巨大的容器。但这样只要有一个模块发生了故障,比如后端出现了内存泄漏,整个容器都有可能崩溃,并且可伸缩性差。如果想给系统扩容,只能把整个大容器再复制一份,而做不到针对某和模块的精准性扩容,多应用的最佳实践是,把每一个模块都打包成一个独立的容器,不过这样使用多容器增加了很多的使用成本,因为我们想创建多个容器,就得多次执行docker run,还得把它们之间的网络配置好,尝试管理这些容器的时候,很多地方都会出错,这时候一个容器编排技术就很有用,也就是docker compose。
docker compose使用YML文件管理多个容器,里面列出了容器之间是如何创建,以及如何协同工作的,我们可以简单的把docker compose文件理解成,一个或者多个的docker run命令,按照特定的格式列到了一个文件里面。
这是刚才视频里面展示的,使用docker命令创建MONGOD,比喻mongo express的例子,我们先创建一个子网,然后创建mongo dB和mongo express两个容器,并且把它们加入子网,右侧展示出的是对应的docker compose文件的写法,左右两边有非常工整的对应关系。
右侧最顶级的是services元素,每个服务也就是一个service都对应一个容器,左侧的杠杠内幕,也就是容器名在右侧就变成了service名,左侧的镜像名在右侧写在了image后面,也表示镜像名,接下来左边的杠E参数对应右边的environment,都是环境变量的意思,左侧的杠V对应右侧的volume,也就是挂载卷,左侧的杠P对应右边的pose,也就是端口映射,左右两边唯一一点区别,就是左边自定义了一个子网network1而右边没有,因为docker会为每一个compose文件,都自动创建一个子网,同一个compose文件里面,定义的所有容器都会自动加入同一个子网,不用我们操心。
docker compose 还有一个额外功能是,可以自定义容器的启动顺序,比如我们可以在mongo express下面加上depend on,他的意思是这个mongo express容器依赖数据库,所以程序会先把mongo dB的容器启动起来,再去启动mongo express的容器。
在AI时代也不用我们写docker compose文件了,我们只需要把想要执行的docker命令告诉AI,然后让它生成一个等价的docker compose文件就可以了。
我们来实战一下,首先使用vi命令,在服务器上创建一个docker compose文件,
把文件内容粘贴过来保存一下,
然后我们执行docker compose up,这样就是启动这个文件里面定义的所有容器,同样的我们可以在后面接杠D让它在后台运行,我们看到这个命令做了两件事,首先他创建了一个子网,然后创建了两个容器,这个容器的名字跟我们在compose文件里面,定义的service名字不太一样,它在前面加了一个前缀,还加了一个编号,用来更加方便的管理,我们执行docker PS命令,可以看到正在运行的容器.
在浏览器访问服务器的IP地址加端口8081。看到mongo express就在正常运行了,我们可以新增数据库等等做各种操作。
刚才我们看了compose up命令,与它相反的就是compose down,这个命令会停止并且删除容器,
我们使用docker ps -a看到容器不但被停止了,也被删除了。如果我们只想停止,但是不想删除容器,我们可以执行docker compose stop命令,这个命令只停止不删除,然后我们执行docker compose start命令,就可以把刚才stop命令停止的容器再启动起来。
如果容器已经在运行了,我们重复执行compose up命令,并不会启动新的容器,它没有任何的效果,我们执行docker compose命令的时候,它会自动识别当前目录,下面严格叫做docker compose的这个文件,如果我们把这个文件改一个名字,让它变成一个非标准的文件名,这样再使用docker compose命令,它就识别不到了,对于这种非标准的文件名,我们可以在docker compose后面接一个杠F,杠F指的是file,也就是指定文件名,接下来我们把非标准的文件名指定给它,当然这个文件名也可以在其他的目录下面,使用杠F命令就可以识别到对应的文件好,docker compose的内容就这么多,还是非常容易掌握的。
docker compose是一个轻量级的容器编排技术,它适合个人使用单机运行,对于企业级服务器集群大规模的容器编排需求,那就需要另外一个软件Kubernetes登场,Kubernetes的功能非常的复杂,这个有机会我们再聊。
5、总结
本期视频我们
(1)先介绍了docker的核心概念,主要有容器、镜像,还有镜像仓库,
(2)演示了如何在linux windows,还有Mac电脑上安装docker,
(3)使用docker pull命令下载镜像,以及如何配置镜像站,解决下载镜像的网络问题,
(4)接下来我们使用docker run命令创建并且运行了容器,介绍了docker run命令的几个重要参数:-p端口映射,-v挂载卷,-e设置环境变量等等,
(5)接下来介绍了如何进入容器内部进行调试,然后我们还看了docker的几种网络,分别是bridge模式,创建子网,host模式与NN模式,
(6)我们学习了什么是docker file,如何使用docker file创建镜像,以及如何把镜 像推送到docker hub上面,
(7)视频的最后,我们还介绍了一种轻量级的容器编排技术,Docker compose
这就是本期视频的全部内容了。
参考视频地址:40分钟的Docker实战攻略,一期视频精通Docker。感谢作者的辛苦付出。