安装 Docker

本文介绍怎么在 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 的方式有:

这么麻烦的原因是因为官方不单独提供 docker.exe 的最新版本了,https://github.com/docker/cli/issues/2281

为了方便,本文是先使用别人编译好的版本,文章最后再介绍怎么从源码中编译~

添加系统的 环境变量

  1. 右击 我的电脑 (win10是 此电脑)
  2. 属性
  3. 高级系统设置
  4. 环境变量
  5. 找到并双击 Path
  6. 点击 浏览,然后选择 docker.exe 所在的文件夹

docker.exe 添加到 Windows 系统的环境变量 PATH 中后,
打开 cmd,输入 docker version 如有以下类似内容输出,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
>docker version

Client:
Version: 19.03.12
API version: 1.40
Go version: go1.13.12
Git commit: 0ed913b8-
Built: 07/28/2020 16:36:03
OS/Arch: windows/amd64
Experimental: false
error during connect: Get http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.40/version:
open //./pipe/docker_engine: The system cannot find the file specified.
In the default daemon configuration on Windows,
the docker client must be run elevated to connect.
This error may also indicate that the docker daemon is not running.

则说明 Windows 下 Docker 客户端安装成功,
有个错误信息是因为我们现在还没有设置 Docker 的服务端地址,Docker 客户端连接不到 Docker 的服务端。

在 Ubuntu 中安装 Docker

本文接下来参照官方文档-Install Docker Engine on Ubuntu介绍怎么在 Ubuntu20 上安装 Docker,
对于其他版本,请自行阅读 官方文档-Install Docker Engine

卸载旧版本

旧版本的 Docker 称为 dockerdocker.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
2
3
4
5
6
7
8
$ sudo apt-get update

$ sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common

为了确认所下载软件包的合法性,需要添加 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
2
3
4
5
6
$ sudo apt-key fingerprint 0EBFCD88

pub rsa4096 2017-02-22 [SCEA]
9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88
uid [ unknown] Docker Release (CE deb) <docker@docker.com>
sub rsa4096 2017-02-22 [S]

然后,我们需要向 source.list 中添加 Docker 软件源:

1
2
3
4
$ sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"

更新 apt 软件包索引,并安装 Docker Engine

1
2
3
$ sudo apt-get update

$ sudo apt-get install docker-ce docker-ce-cli containerd.io

检验 Docker Engine 是否正确安装:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
$ sudo docker run hello-world

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
xxxxxxxxxxxx: Pull complete
Digest: sha256:xxx...
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/

For more examples and ideas, visit:
https://docs.docker.com/get-started/

查看 Docker 客户端与服务端的版本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
$ sudo docker version

Client: Docker Engine - Community
Version: 19.03.12
API version: 1.40
Go version: go1.13.10
Git commit: 48a66213fe
Built: Mon Jun 22 15:45:44 2020
OS/Arch: linux/amd64
Experimental: false

Server: Docker Engine - Community
Engine:
Version: 19.03.12
API version: 1.40 (minimum version 1.12)
Go version: go1.13.10
Git commit: 48a66213fe
Built: Mon Jun 22 15:44:15 2020
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.2.13
GitCommit: 7ad184331fa3e55e52b890ea95e65ba581ae3429
runc:
Version: 1.0.0-rc10
GitCommit: dc9208a3303feef5b3839f4323d9beb36df0a9dd
docker-init:
Version: 0.18.0
GitCommit: fec3683

至此,Docker 的安装完毕,
接下来折腾一下怎么让 Windows 系统上的 Docker 客户端连接 Ubuntu 上 Docker 的守护进程吧~
要这样折腾的原因是:好好体验 Docker 的 C/S 架构

Docker 的架构

让 Docker 客户端与服务端的通信

在 Windows 系统上新开一个 cmd 窗口:

1
2
3
4
5
6
7
8
9
10
11
12
> docker -H tcp://192.168.86.101:2375 version
Client:
Version: 19.03.12
API version: 1.40
Go version: go1.13.12
Git commit: 0ed913b8-
Built: 07/28/2020 16:36:03
OS/Arch: windows/amd64
Experimental: false
error during connect: Get http://192.168.86.101:2375/v1.40/version:
dial tcp 192.168.86.101:2375:
connectex: No connection could be made because the target machine actively refused it.

其中,192.168.86.101 是我的 Ubuntu 系统 IP 地址,需要替换成你的~

拒绝的原因是因为 Docker 服务端的守护进程默认不允许远程 tcp 连接,
如果我们要支持远程连接就必须要加上 tcp 连接方式~

使用 sudo vim /etc/docker/daemon.json 命令,
/etc/docker/daemon.json 的内容修改成如下:

1
2
3
4
5
6
7
8
9
10
11
12
{
"hosts": [
"tcp://0.0.0.0:2375",
"unix:///var/run/docker.sock"
],
"registry-mirrors": [
"https://hub-mirror.c.163.com",
"https://reg-mirror.qiniu.com",
"https://registry.docker-cn.com"

]
}

Docker 的客户端 与 Docker 服务端守护进程通信,有三种 socket 连接方式:

  • unix:///var/run/docker.sock
  • tcp://host:port
  • fd://socketfd

通过配置 /etc/docker/daemon.jsonhosts,开启了两种。

另外,registry-mirrors 是配置仓库地址,鉴于国内网络问题,国内从 Docker Hub 拉取镜像有时会十分缓慢,此时可以配置镜像加速器。

重启 Docker 服务

1
$ sudo systemctl daemon-reload

1
2
3
4
$ sudo systemctl restart docker

Job for docker.service failed because the control process exited with error code.
See "systemctl status docker.service" and "journalctl -xe" for details.

使用 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
2
#ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
ExecStart=/usr/bin/dockerd

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
$ docker -H tcp://127.0.0.1:2375 version

Client: Docker Engine - Community
Version: 19.03.12
API version: 1.40
Go version: go1.13.10
Git commit: 48a66213fe
Built: Mon Jun 22 15:45:44 2020
OS/Arch: linux/amd64
Experimental: false

Server: Docker Engine - Community
Engine:
Version: 19.03.12
API version: 1.40 (minimum version 1.12)
Go version: go1.13.10
Git commit: 48a66213fe
Built: Mon Jun 22 15:44:15 2020
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.2.13
GitCommit: 7ad184331fa3e55e52b890ea95e65ba581ae3429
runc:
Version: 1.0.0-rc10
GitCommit: dc9208a3303feef5b3839f4323d9beb36df0a9dd
docker-init:
Version: 0.18.0
GitCommit: fec3683

这里特别的是,我们没有用 sudo docker,只是用了 docker
目前,没有用 sudo,一般都会提示:

1
2
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: 
Get http://%2Fvar%2Frun%2Fdocker.sock/v1.40/version: dial unix /var/run/docker.sock: connect: permission denied

原因和解决方法查看参考资料

接下来用 Windows 系统上的 Docker 客户端与 Ubuntu 上 Docker 的守护进程通信。

在 Windows 系统上新开一个 cmd 窗口:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
>docker -H tcp://192.168.86.101:2375 version

Client:
Version: 19.03.12
API version: 1.40
Go version: go1.13.12
Git commit: 0ed913b8-
Built: 07/28/2020 16:36:03
OS/Arch: windows/amd64
Experimental: false

Server: Docker Engine - Community
Engine:
Version: 19.03.12
API version: 1.40 (minimum version 1.12)
Go version: go1.13.10
Git commit: 48a66213fe
Built: Mon Jun 22 15:44:15 2020
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.2.13
GitCommit: 7ad184331fa3e55e52b890ea95e65ba581ae3429
runc:
Version: 1.0.0-rc10
GitCommit: dc9208a3303feef5b3839f4323d9beb36df0a9dd
docker-init:
Version: 0.18.0
GitCommit: fec3683

为了不想每次都输入 -H 参数,那么可以在客户端机器加上环境变量,
接下来,在 Windows 系统上需要添加 环境变量 DOCKER_HOST

  1. 右击 我的电脑 (win10 是 此电脑)
  2. 属性
  3. 高级系统设置
  4. 环境变量
  5. 点击 新建
  6. 变量名(N) 填入:DOCKER_HOST
  7. 变量值(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客户端连接远程docker的守护进程

Docker客户端与守护进程——CS模式简介

Docker Tips: 关于/var/run/docker.sock

关于 /var/run/docker.sock

docker 的 /var/run/docker.sock 参数

Dokcer使用总结(Dockerfile、Compose、Swarm)

Docker启动Get Permission Denied

疑惑

在没有安装 Docker 前 Ubuntu 系统开机后,显示:

1
2
3
4
System 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
2
3
4
System load:  1.4                Processes:                253
Usage of /: 26.1% of 18.57GB Users logged in: 0
Memory usage: 18% IPv4 address for docker0: 172.17.0.1
Swap usage: 0% IPv4 address for ens32: 192.168.86.101
觉得文章对您有帮助,请我喝瓶肥宅快乐水可好 (๑•̀ㅂ•́)و✧
  • 本文作者: 阿彬~
  • 本文链接: https://iweixubin.github.io/posts/docker/install/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 免责声明:本媒体部分图片,版权归原作者所有。因条件限制,无法找到来源和作者未进行标注。
         如果侵犯到您的权益,请与我联系删除