摘要:
本文是关于docker的专题讨论,作者用一组文档尽可能保证完整地阐述Docker到底是啥?如何使用?docker的使用范围等。相关的其它文章是:
Docker知识4:如何在win10下安装 / 使用ubuntu ?应用WSL2
docker知识5:在WSL2的ubuntu20.04环境安装使用docker_gongdiwudu的专栏-CSDN博客
1 Docker的C-S构成
学习docker,就要知道它的组织架构。这几个关联的概念需要切记:
1 属于官方管理的码头HUB
码头(docker hub):
码头是个大杂烩,任何人可以注册,生成镜像放上去,别人可以下载镜像,使用镜像
仓库(Repositories):
仓库是个私人建的,可以存放镜像的场所。
镜像(images):
就是任何人可以上载或下载的成品。
2 属于本地需要镜像管理、容器管理
客户端(docker engine,注意:windows的docker-desktop内涵docker engine)
有两个功能:1)与hub通信,数据交换。 2)管理本地的image和container
镜像(images)
本地生成的镜像数据包,从hub下载的镜像数据包。
容器(container)
通过镜像生成的实例对象。
DockerHub是一个大型互联网服务器,好比一个码头,个人可以注册后,在码头可以Create一个仓库,以便日后上载自己的镜像并存储。同时,该处有学习的资料、可以下载的软件,免费的公共镜像,都可以在码头上找到。入口(Docker Hub)。
docker-desktop就是win10版本的客户端,它既是你与Docker-Hub交互的基础平台,也是你本地加工自已的镜像的一个工厂。需要按照你在Docker-Hub的注册远程登入Docker-Hub。(注意:登入官方Docker-Hub有两个途径。浏览器登入,或客户端登入docker-desktop。)
ubuntu的客户端是无图形界面的,通过启动docker-engine进程后,远程登录Docker-HUB然后上传或下载。
下图描述了Docker的C-S结构。
docker是由Docker-HUB,Docker-Desktop构成的Client-Server网络结构。其分工是:
服务器端:
- Docker-HUB是服务器,内部存放大量映像供客户下载
- 自己注册后,也可以将自己的镜像上载到HUB上,供别人下载使用。
客户端:
- 可以登录服务器,
- 可以将本地镜像上载到HUB
- 可以从服务器下载镜像
- 可以制作本地镜像和容器。
2 客户端desktop的特征
( 以下客户端主要指的是win10下的版本,至于Ubuntu或其他linux则有Docker-engin对应指令完成)
- VPN直通
当连接到VPN时,Docker桌面网络可以工作。为此,Docker Desktop拦截来自容器的流量,并将其注入Windows,就好像它源于Docker应用程序一样。
- 端口映射
运行带有-p参数的容器时,例如:
$docker run -p 80:80-d nginx
Docker Desktop使容器(在本例中为nginx)中的端口80上运行的任何东西在localhost的端口80上可用。在本例中,主机端口和容器端口是相同的。如果需要指定不同的主机端口怎么办?例如,如果您的主机的端口80上已经运行了某些内容,则可以将容器连接到其他端口:
$docker run -p 8000:80-d nginx
现在,到localhost:8000的连接被发送到容器中的端口80。-p的语法是 HOST_ PORT : CLIENT_PORT。
- 代理
Docker Desktop允许您配置HTTP/HTTPS代理设置,并自动将这些设置传播到Docker。例如,如果将代理设置设置设置为http://proxy.example.com,Docker在拉动容器时使用此代理。
但是,代理设置不会传播到您开始的容器中。如果您希望为容器设置代理设置,则需要为它们定义环境变量,就像在Linux上所做的那样,例如:
> docker run -e HTTP_PROXY=https://proxy.example.com:3128 alpine env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=b7edf988b2b5
TERM=xterm
HOME=/root
HTTP_PROXY=http://proxy.example.com:3128
详细环境配置见 Set environment variables.
3 个人用法体验
本人安装了两个体系,win10的Docker-Desktop和win10的WSL2体系;
Docker-Desktop体系本质上也是linux内核,但用cmd做终端,效果始终赶不上ubuntu系统。对初学者也帮助不大。
而WSL2装Ubuntu-20就不一样了,除了没有Ubuntu图形界面,其他的基本和独立的Ubuntu系统没有两样。
所以建议用Win10的同学,安装一个docker-desktop学习一下就弃用吧,改用WSL2为好,干正事还是它好用。有关WSL2的技术的资料有参照博文1 和 参考博文2
4 相关网络特性
4.1已知的限制、用例和解决方法🔗
以下是Docker Desktop for Windows网络堆栈当前限制的摘要,以及一些解决方法的想法。
- Windows上没有docker0桥🔗
由于在Docker Desktop for Windows中实现网络的方式,您无法在主机上看到docker0接口。这个接口实际上在虚拟机中。
- 我不能ping我的容器
Docker Desktop for Windows无法将流量路由到基于Linux的容器。但是,您可以ping 基于的Windows容器。
- 无法给每个容器提供一个IP地址
无法从Windows主机访问docker(基于Linux)网桥网络。但是,可以访问基于Windows的容器。
4.2 从容器连接到主机上的服务
主机的IP地址正在更改(如果您没有网络访问权限,则没有IP地址)。我们建议您连接到特殊的DNS名称host.docker.internal,该名称解析为主机使用的内部IP地址。这是出于开发目的,在Docker Desktop for Windows之外的生产环境中不起作用。
也可以使用gateway.docker.internal访问网关。
如果您的计算机上安装了Python,请使用以下说明作为示例,从容器连接到主机上的服务:
- 1 运行以下命令在端口8000上启动一个简单的HTTP服务器。
python-m http.server 8000 或
python -m SimpleHTTPServer 8000
- 2 现在,运行一个容器,安装curl,并尝试使用以下命令连接到主机:
docker run --rm -it alpine sh
apk add curl
curl http://host.docker.internal:8000
exit
4.3 试图从Windows连接到容器
本地主机的端口转发localhost
; --publish
, -p
, or -P
所有都能工作。从Linux公开的端口被转发到主机。
我们目前的建议是发布一个端口,或者从另一个容器连接。即使在Linux上,如果容器位于覆盖网络上,而不是桥网络上,这也是您需要做的,因为这些都不是路由的。
运行nginxwebserver的命令如Getting Started中所示就是一个例子。
$ docker run -d -p 80:80 --name webserver nginx
为了澄清语法,以下两个命令都将容器的端口80发布到主机的端口8000:
$ docker run --publish 8000:80 --name webserver nginx
$ docker run -p 8000:80 --name webserver nginx
要发布所有端口,请使用-P标志。例如,以下命令启动容器(在分离模式下),并且-P标志将容器的所有公开端口发布到主机上的随机端口。
$ docker run -d -P --name webserver nginx