DevOps文化 & SRE实战分享平台

0%

基于Windows Server 2019 Core安装与配置Docker


文章声明:此文基于木子实操撰写
生产环境:Windows Server 2019 Core, Docker 19.03.5
问题关键字:基于Windows Server 2019 Core安装与配置Docker


前述

这是一篇基础教程,主要简单介绍基于Windows Server 2019 Core安装与配置Docker。
在Windows上Docker有两种工作模式:

  • 纯Docker容器模式,Windows Server Containers(强烈推荐),其容器进程直接在宿主机节点OS上运行。Windows Server容器通过进程和名称空间隔离提供隔离。但是,它们仍与容器主机和所有其他容器共享内核。这类似于Linux的操作方式。所以这种模式也决定了,它只能够跑Windows类容器。
  • Hyper-V虚拟化的容器模式,Hyper-V Containers。使用Hyper-V隔离,您可以将容器可视化为小型轻量级虚拟机。容器不必与容器主机或其他容器共享内核。

相对于纯Docker模式而言,Hyper-V虚拟化的Docker容器模式多了一个虚拟化层的开销,因此不建议在生产环境使用。


另外为了更好的让Windows治理于Docker的工作,强烈建议使用Windows Server Core 2019做为宿主节点。

安装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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# 启用Windows Containers功能(要在宿主机上运行容器,我们需要启用Containers功能)
PS C:\Windows\system32> Install-WindowsFeature -Name Containers

# Windows Server许可包括Docker Enterprise的许可费用,因此您可以运行带有Microsoft和Docker容器生产支持的企业版。
# 最新的Docker Enterprise引擎为19.03版,您可以使用PowerShell明确安装:
PS C:\Windows\system32> Install-Module -Name DockerMsftProvider -Repository PSGallery -Force

# 列出Docker包,目前最新版本支持是19.03.5
PS C:\Windows\system32> Get-Package -Name docker
Name Version Source ProviderName
---- ------- ------ ------------
docker 19.03.5 DockerDefault DockerMsftProvider

# 安装最新版本的Docker包
PS C:\Windows\system32> Install-Package -Name docker -ProviderName DockerMsftProvider -Force -RequiredVersion 19.03.5

Name Version Source Summary
---- ------- ------ -------
Docker 19.03.5 DockerDefault Contains Docker EE for use with Windows Server.

# 安装以后,系统默认会将Docker设置为Windows服务,我们可以使用命令行启动Docker服务
PS C:\Windows\system32> Start-Service docker

# 查看服务状态
PS C:\Windows\system32> get-service docker

Status Name DisplayName
------ ---- -----------
Running docker Docker Engine

# 查看Docker版本信息
PS C:\Windows\system32> docker info
Client:
Debug Mode: false
Plugins:
cluster: Manage Docker clusters (Docker Inc., v1.2.0)
Server:
Containers: 1
Running: 0
Paused: 0
Stopped: 1
Images: 1
Server Version: 19.03.5
Storage Driver: windowsfilter
Windows:
Logging Driver: json-file
Plugins:
Volume: local
Network: ics internal l2bridge l2tunnel nat null overlay private transparent
Log: awslogs etwlogs fluentd gcplogs gelf json-file local logentries splunk syslog
Swarm: inactive
Default Isolation: process
Kernel Version: 10.0 17763 (17763.1.amd64fre.rs5_release.180914-1434)
Operating System: Windows Server 2019 Datacenter Version 1809 (OS Build 17763.1098)
OSType: windows
Architecture: x86_64
CPUs: 8
Total Memory: 32GiB
Name: k8s-win-w01
ID: T2JO:PFV7:YJPH:MTFD:KZ2J:CKY4:R7XK:FGHH:LLH7:CFZ5:FCIT:4PBG

# 这里我们可以看到Docker根目录在C:\ProgramData\docker,所以正常我们修改Docker配置也是在这个目录下操作。
# 不管是通过GUI还是命令行,都是通过修改daemon.json来修改对应的参数配置
# Linux上配置文件的默认位置是 /etc/docker/daemon.json
# Windows上配置文件的默认位置是 %programdata%\docker\config\daemon.json
Docker Root Dir: C:\ProgramData\docker
Debug Mode: false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false

网络配置说明

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
PS C:\Users\Administrator> ipconfig
Windows IP 配置
以太网适配器 以太网:
连接特定的 DNS 后缀 . . . . . . . :
本地链接 IPv6 地址. . . . . . . . : fe80::a9f2:61fa:e18b:544c%7
IPv4 地址 . . . . . . . . . . . . : 192.168.201.198
子网掩码 . . . . . . . . . . . . : 255.255.254.0
默认网关. . . . . . . . . . . . . : 192.168.200.1

# 容器网络,此网络已经开启DHCP功能
以太网适配器 vEthernet (nat):
连接特定的 DNS 后缀 . . . . . . . :
本地链接 IPv6 地址. . . . . . . . : fe80::30a0:6f3:1df3:64c6%9
IPv4 地址 . . . . . . . . . . . . : 192.168.224.1
子网掩码 . . . . . . . . . . . . : 255.255.240.0
默认网关. . . . . . . . . . . . . :

# 查看Docker网络
PS C:\Users\Administrator> docker network ls
NETWORK ID NAME DRIVER SCOPE
7406d6a20c60 nat nat local
2bf2aa805214 none null local

# 需要注意的一点是,当我们在daemon.json将桥接网络设置为空以后,您单独启动容器是没有IP地址的。"bridge": "none"
PS C:\Users\Administrator> docker network ls
NETWORK ID NAME DRIVER SCOPE
f2710624b466 none null local

修改Daemon.json配置

通过编辑daemon.json文件,我们可以修改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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# 修改配置
PS C:\Users\Administrator> cat C:\ProgramData\docker\config\daemon.json
{
"registry-mirrors": ["https://dockerhub.azk8s.cn","https://harbor.oubayun.com"],
"insecure-registries":["docker.mirrors.ustc.edu.cn","dockerhub.azk8s.cn"],
"data-root": "d:\\docker",
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "10"
},
"bridge": "none",
"max-concurrent-downloads": 10,
"max-concurrent-uploads": 10,
"debug": false
}

# 修改以后配置如下:
PS C:\ProgramData\docker\config> docker info
Client:
Debug Mode: false
Plugins:
cluster: Manage Docker clusters (Docker Inc., v1.2.0)

Server:
Containers: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 19.03.5
Storage Driver: windowsfilter
Windows:
Logging Driver: json-file
Plugins:
Volume: local
Network: ics internal l2bridge l2tunnel nat null overlay private transparent
Log: awslogs etwlogs fluentd gcplogs gelf json-file local logentries splunk syslog
Swarm: inactive
Default Isolation: process
Kernel Version: 10.0 17763 (17763.1.amd64fre.rs5_release.180914-1434)
Operating System: Windows Server 2019 Datacenter Version 1809 (OS Build 17763.1098)
OSType: windows
Architecture: x86_64
CPUs: 8
Total Memory: 32GiB
Name: k8s-win-w01
ID: 4IFQ:SKE7:QFPX:HG2Y:2ZHH:FI2O:JXOJ:DME4:DVL2:P2QU:JZ47:4GNQ
Docker Root Dir: D:\docker
Debug Mode: false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
docker.mirrors.ustc.edu.cn
dockerhub.azk8s.cn
127.0.0.0/8
Registry Mirrors:
https://dockerhub.azk8s.cn/
https://harbor.oubayun.com/
Live Restore Enabled: false

Windows镜像下载

Windows镜像可以通过Hub Docker进行下载。
以Windows IIS为例,需要注意的一点是,Windows 10、Windows 2019、Windows 2016的镜像都不相同。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Windows 10 1909版本IIS镜像
docker pull mcr.microsoft.com/windows/servercore/iis:windowsservercore-1909
# Windows 10 1903版本IIS镜像
docker pull mcr.microsoft.com/windows/servercore/iis:windowsservercore-1903
# Windows Server 2019版本IIS镜像
docker pull mcr.microsoft.com/windows/servercore/iis:windowsservercore-ltsc2019
# Windows Server 2016版本IIS镜像
docker pull mcr.microsoft.com/windows/servercore/iis:windowsservercore-ltsc2016
# nanoserver镜像
PS C:\Users\Administrator> docker pull mcr.microsoft.com/windows/nanoserver:1809
# 查看镜像信息
PS C:\Users\Administrator> docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mcr.microsoft.com/windows/nanoserver 1809 716bb79b7dcd 11 days ago 251MB

Windows容器常规操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 启动并进入容器
PS C:\Users\Administrator> docker run -it mcr.microsoft.com/windows/nanoserver:1809 cmd

# 后台启动容器
PS C:\Users\Administrator> docker run -d mcr.microsoft.com/windows/nanoserver:1809 cmd /c ping 127.0.0.1 -t
PS C:\Users\Administrator> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a85b4f46a81d mcr.microsoft.com/windows/nanoserver:1809 "cmd /c ping 127.0.0…" 53 seconds ago Up 52 seconds cool_galileo

# 获取运行状态的容器
docker ps -a -f status=running

# 获取容器的IP地址
docker inspect -f "{{ .NetworkSettings.Networks.nat.IPAddress }}" nano_iis

# 进入容器进行远程会话
$container= docker inspect --format="{{.Id}}" nano_iis
$sesion = New-PSSession -ContainerId $container -RunAsAdministrator

编写IIS Dockerfile

原生下载下来的Windows IIS镜像是没有website的,需要我们自己将对应站点重新打包进去。构建IIS镜像,我们不需要设置ENTRYPOINT,因为microsoft/iis基本映像已经包含一个入口点应用程序,该应用程序监视IIS万维网发布服务(W3SVC)的状态。下面是一个简单的Windows Docker镜像打包。

1
2
3
4
5
6
7
8
# 基础Docker镜像
FROM mcr.microsoft.com/windows/servercore/iis:windowsservercore-ltsc2019
# 清空C:\inetpub\wwwroot\站点目录
RUN powershell -NoProfile -Command Remove-Item -Recurse C:\inetpub\wwwroot\*
# 设置当前工作目录
WORKDIR /inetpub/wwwroot
# 复制Web站点至当前工作目录
COPY website/ .

打包镜像

1
docker build -t iis-site .

启动站点

1
docker run -d -p 80:80 --name test-web-site iis-site

注: 最后简单说一句,如果您是用Windows Server 2019带桌面体验的部署Docker Desktop也是可以正常使用的。

参考文献

[1] 在Windows Server上部署Docker:https://docs.microsoft.com/zh-cn/virtualization/windowscontainers/deploy-containers/deploy-containers-on-server

三平台同步更新:
博客: https://www.oubayun.com
知乎: 欧巴云
微信公众号: 欧巴云

坚持原创技术分享,您的支持与鼓励,是我持续创作的动力!