本文介绍怎么在 Windows 中只安装 Docker Client 客户端,在 Ubuntu 中安装 Docker Server 服务端,
至于 Docker 的原理和机制,在以后的章节会配合 Docker 命令再细说~
为什么选择 Windows 作为 Docker 的客户端,
因为本人是 .Net 程序员,而 .Net 的开发工具 Visual Studio 要支持 Docker 需要提供 Docker 命令行。
另外,很多教程都是在同一台电脑上直接安装 Docker 的客户端和服务端,然后就开始讲解 Docker 的各种操作,
这样不能很好地体验 Docker 是使用传统的 C/S 架构模式(Cilent-Server),用户是通过 Docker Client 与 Docker Daemon 建立通信。
还有一般开发流程都是在 Windows 上写代码,然后发送到 Docker Server 服务端制作成 Docker Image 镜像,
当然更好的方法是,签入代码到 svn 或 git 的时候,有自动制作 Image 镜像脚本~
为什么选择 Ubuntu,因为 Ubuntu ,因为 Docker 社区版本对 Ubuntu 的支持最完善
Platform | x86_64 / amd64 | ARM | ARM64 / AARCH64 |
---|---|---|---|
CentOS | ✔ | ✔ | |
Debian | ✔ | ✔ | ✔ |
Fedora | ✔ | ✔ | |
Raspbian | ✔ | ✔ | |
Ubuntu | ✔ | ✔ | ✔ |
以上表格来自 官方文档
.Net 拥有了跨平台的能力,那么作为 .Net 程序员学习 Linux 是不错的技术投资,在众多 Linux 版本中我推荐 Ubuntu 或者 CentOS,
理由是 Ubuntu 敢于加入新技术,而 CentOS 是 RHEL(Red Hat Enterprise Linux) 的再编译版本。
RHEL 是很多企业采用的 Linux 发行版本,需要向 Red Hat 付费才可以使用,并能得到付过费用的服务和技术支持和版本升级。
CentOS 可以像 RHEL 一样的构筑 Linux 系统环境,但不需要向 Red Hat 付任何的产品和服务费用。因为是企业级版本,所以保守,但很稳定。
在 Windows 中安装 Docker Client
本文不使用 Docker Desktop for Windows 的安装方式,因为这种安装方式会在 Windows 上安装 VirtualBox 等很多工具,我们仅仅要的只是 Docker Client 客户端,这样也贴切我们开发流程
目标是将 docker.exe
添加到 Windows 系统的环境变量 PATH
中,从而达到能使用 docker 命令行~
得到 docker.exe
的方式有:
- 到官网 https://download.docker.com/win/static/stable/x86_64 下载,版本比较老
- 自己下载源码 https://github.com/docker/cli 后编译
- 下载编译好的新版本 https://github.com/StefanScherer/docker-cli-builder/releases
- 安装 Docker Desktop for Windows 后,找到安装目录,将
docker.exe
复制到其它位置
这么麻烦的原因是因为官方不单独提供 docker.exe
的最新版本了,https://github.com/docker/cli/issues/2281
为了方便,本文是先使用别人编译好的版本,文章最后再介绍怎么从源码中编译~
添加系统的 环境变量
- 右击
我的电脑
(win10是此电脑
) 属性
高级系统设置
环境变量
- 找到并双击
Path
- 点击
浏览
,然后选择docker.exe
所在的文件夹
将 docker.exe
添加到 Windows 系统的环境变量 PATH
中后,
打开 cmd
,输入 docker version
如有以下类似内容输出,
1 | >docker version |
则说明 Windows 下 Docker 客户端安装成功,
有个错误信息是因为我们现在还没有设置 Docker 的服务端地址,Docker 客户端连接不到 Docker 的服务端。
在 Ubuntu 中安装 Docker
本文接下来参照官方文档-Install Docker Engine on Ubuntu介绍怎么在 Ubuntu20 上安装 Docker,
对于其他版本,请自行阅读 官方文档-Install Docker Engine
卸载旧版本
旧版本的 Docker 称为 docker
、docker.io
或 docker-engine。如果安装过,请先卸载它们:
1 | $ sudo apt-get remove docker docker-engine docker.io containerd runc |
目录 /var/lib/docker/
还保留着 images(镜像), containers(容器), volumes(卷), and networks(网络)。
Docker Engine 包现在称之为 docker-ce
/var/lib/docker/
看是否需要删除,还有自己创建的相关配置文件。
使用软件源安装
为了确保安装所需不被被篡改,因此安装一下的包以使用 https
由于 apt
源使用 HTTPS 以确保软件下载过程中不被篡改。因此,我们首先需要添加使用 HTTPS 传输的软件包以及 CA 证书。
1 | $ sudo apt-get update |
为了确认所下载软件包的合法性,需要添加 Docker 官方提供的软件源 GPG 密钥。
1 | $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - |
验证密钥是否正确,
对比密钥指纹是否是:9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88
1 | $ sudo apt-key fingerprint 0EBFCD88 |
然后,我们需要向 source.list 中添加 Docker 软件源:
1 | $ sudo add-apt-repository \ |
更新 apt
软件包索引,并安装 Docker Engine
1 | $ sudo apt-get update |
检验 Docker Engine 是否正确安装:
1 | $ sudo docker run hello-world |
查看 Docker 客户端与服务端的版本:
1 | $ sudo docker version |
至此,Docker 的安装完毕,
接下来折腾一下怎么让 Windows 系统上的 Docker 客户端连接 Ubuntu 上 Docker 的守护进程吧~
要这样折腾的原因是:好好体验 Docker 的 C/S 架构
让 Docker 客户端与服务端的通信
在 Windows 系统上新开一个 cmd 窗口:
1 | > docker -H tcp://192.168.86.101:2375 version |
其中,192.168.86.101
是我的 Ubuntu 系统 IP 地址,需要替换成你的~
拒绝的原因是因为 Docker 服务端的守护进程默认不允许远程 tcp 连接,
如果我们要支持远程连接就必须要加上 tcp 连接方式~
使用 sudo vim /etc/docker/daemon.json
命令,
将 /etc/docker/daemon.json
的内容修改成如下:
1 | { |
Docker 的客户端 与 Docker 服务端守护进程通信,有三种 socket 连接方式:
- unix:///var/run/docker.sock
- tcp://host:port
- fd://socketfd
通过配置 /etc/docker/daemon.json
的 hosts
,开启了两种。
另外,registry-mirrors
是配置仓库地址,鉴于国内网络问题,国内从 Docker Hub 拉取镜像有时会十分缓慢,此时可以配置镜像加速器。
重启 Docker 服务1
$ sudo systemctl daemon-reload
1 | $ sudo systemctl restart docker |
使用 sudo systemctl restart docker
时会提示错误,
可以按提示使用 systemctl status docker.service
命令查看详细信息。
原因是因为服务启动 dockerd 给了参数,-H
我们现在要修改成启动时去读取我们配置的 /etc/docker/daemon.json
文件
通过 sudo vim /lib/systemd/system/docker.service
命令,
将 /lib/systemd/system/docker.service
的内容修改成:
1 | #ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock |
将 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
添加 #
注释掉,
添加多一行 ExecStart=/usr/bin/dockerd
重启 Docker 服务:1
2
3$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
在 Ubuntu 的命令行中使用 docker -H tcp://127.0.0.1:2375 version
:
1 | $ docker -H tcp://127.0.0.1:2375 version |
这里特别的是,我们没有用 sudo docker
,只是用了 docker
,
目前,没有用 sudo
,一般都会提示:
1 | Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: |
原因和解决方法查看参考资料
接下来用 Windows 系统上的 Docker 客户端与 Ubuntu 上 Docker 的守护进程通信。
在 Windows 系统上新开一个 cmd 窗口:
1 | >docker -H tcp://192.168.86.101:2375 version |
为了不想每次都输入 -H
参数,那么可以在客户端机器加上环境变量,
接下来,在 Windows 系统上需要添加 环境变量 DOCKER_HOST
:
- 右击
我的电脑
(win10 是此电脑
) 属性
高级系统设置
环境变量
- 点击
新建
变量名(N)
填入:DOCKER_HOST变量值(V)
填入:tcp://192.168.86.101:2375
192.168.86.101
是我虚拟机上 Ubuntu 的 IP 地址,请自行修改。
至此,Windows 上 Docker 客户端与 Ubuntu 上的 Docker 安装完毕。
.Net 程序员的倔强
为什么一定要在 Windows 上安装 Docker 客户端?
你可以在 Visual Studio 上创建一个.Net Core 项目,
然后右击该项目 添加
→ Docker 支持
→ 目标系统 Linux
这个时候项目下就会多一个 Dockerfile
文件,
可以看看文件内容,是不是每个单词都懂,但连起来就不知道什么意思了,这是我们以后要学习的内容。
现在右击 Dockerfile
文件,选择 生成 Docker 映像
,
Visual Studio 就会调用 Docker 的客户端命令在 Ubuntu 系统上生成镜像了。
参考资料
Docker Tips: 关于/var/run/docker.sock
docker 的 /var/run/docker.sock 参数
Dokcer使用总结(Dockerfile、Compose、Swarm)
疑惑
在没有安装 Docker 前 Ubuntu 系统开机后,显示:1
2
3
4System load: 0.44 Processes: 250
Usage of /: 23.4% of 18.57GB Users logged in: 0
Memory usage: 14% IPv4 address for ens32: 192.168.86.101
Swap usage: 0%
在安装完 Docker 重启 Ubuntu 系统,
多出的 IPv4 address for docker0: 172.17.0.1
是啥??
1 | System load: 1.4 Processes: 253 |