Docker在Windows下的安装及使用

一、前言

在Windows上安装Docker时,可以选择使用不同的后端。
其中两个常见的选择是:WSL 2(Windows Subsystem for Linux 2)和 Hyper-V 后端。此外,还可以选择使用Windows容器。
三者的区别了解即可,推荐用WSL 2,因为虚拟机太重了…懂的都懂。

1. WSL 2 后端:

  • 使用WSL 2后端时,Docker将与WSL 2集成,利用WSL 2提供的Linux内核。这使得Docker容器在Windows上运行时,实际上是在WSL 2中运行的,享受到了与Linux系统更为接近的环境。WSL 2能够提供更好的性能和与Linux相似的开发体验。
  • 优点:更轻量,性能较好,支持在Windows和Linux之间无缝切换。
  • 缺点:可能不支持所有Windows特性,对于某些特殊应用可能存在兼容性问题。

2. Hyper-V 后端:

  • 使用Hyper-V后端时,Docker容器将在Hyper-V虚拟机中运行,与主机Windows系统隔离。这种方式比较传统,类似于在虚拟机中运行Docker。
  • 优点:更好的隔离性,适用于需要强大隔离的场景。
  • 缺点:相对于WSL 2,可能稍显重量级,性能稍逊一些。

3. Windows容器:

  • Windows容器是一种与Hyper-V相似的隔离技术,允许在Windows上运行基于Windows的Docker容器。与Linux容器相比,Windows容器更适用于运行基于Windows的应用程序。
  • 优点:对于Windows应用程序的兼容性更好。
  • 缺点:相较于WSL 2,可能性能较差,并且一些Linux特性可能不支持。

Docker提供了GUI前端 Docker Desktop,下面会介绍。
本人电脑是Win10专业版,默认安装完是WSL 2(Windows Subsystem for Linux)。

在 cmd 中查看 wsl 版本信息:

1
2
3
4
5
6
wsl -l

wsl -v

wsl -l -v
12345

二、安装Docker

2.1 安装 docker desktop

官方下载地址:https://docs.docker.com/desktop/install/windows-install/

下载完成后进行安装,只能装在C盘,不支持更改安装目录。

可以在cmd中执行:docker version来验证是否安装成功。

2.2 修改 docker desktop 配置

1)开启WSL 2运行Docker,正常是默认开启的

2)修改资源存储目录:

3)配置国内镜像源,可以添加多个,json格式

1
2
3
4
5
6
"registry-mirrors": [
"https://mirror.ccs.tencentyun.com",
"http://hub-mirror.c.163.com",
"https://registry.docker-cn.com"
]
12345

三、使用Docker

Docker常用命令:https://blog.csdn.net/mst_sun/article/details/135133934

3.1 安装redis

先有镜像,后有容器。

第一步:拉取镜像

1
2
3
# 以redis:7.0.14版本为例,在cmd中运行以下命令
docker pull redis:7.0.14
12

第二步:创建挂载目录


1)创建挂载目录data
2)下载相应版本的redis.conf 文件:https://github.com/redis/redis/tags
3)修改 redis.conf 文件中的参数 bind 为 0.0.0.0

第三步:创建并运行容器

Linux 中换行输入符是 \
Windows cmd 中换行输入符是 ^

1
2
3
4
5
6
7
8
9
10
11
docker run --name redis-dev -d ^
--restart unless-stopped ^
-e TZ=Asia/Shanghai ^
-p 16379:6379 ^
-v D:\Develop\Docker\Data\redis\redis.conf:/etc/redis/redis.conf ^
-v D:\Develop\Docker\Data\redis\data:/data ^
redis:7.0.14 ^
redis-server /etc/redis/redis.conf ^
--requirepass 123456 ^
--appendonly yes
12345678910

参数解释:

1
2
3
4
5
6
7
8
9
10
11
12
--name redis-dev     #给容器命名为redis-dev
-d #后台运行容器
--restart unless-stopped #设置重启策略为在容器手动停止时以外的任何原因退出时重启
-e TZ=Asia/Shanghai #设置容器的时区
-p 16379:6379 #将容器的6379端口映射到主机的16379端口
-v D:\Develop\Docker\Data\redis\redis.conf:/etc/redis/redis.conf #将配置文件映射到容器
-v D:\Develop\Docker\Data\redis\data:/data #将数据目录映射到容器
redis:7.0.14 #使用版本为7.0.14的redis镜像
redis-server /etc/redis/redis.conf #使用容器内的redis配置启动服务
--requirepass #连接密码
--appendonly yes #开启持久化
1234567891011

第四步:验证


3.2 安装mysql

第一步、拉取镜像

1
2
3
# 以mysql8.0.35版本为例
docker pull mysql:8.0.35
12

第二步、创建docker网络

1
2
3
# 创建docker网络,便于容器可以通过网络与宿主机和其他容器通信
docker network create docker-network
12

第三步、创建挂载目录

第四步:创建并运行容器

1
2
3
4
5
6
7
8
9
10
11
docker run --name mysql-dev -d ^
--restart unless-stopped ^
-e TZ=Asia/Shanghai ^
--network docker-network ^
-v D:\Develop\Docker\Data\mysql\log:/var/log/mysql ^
-v D:\Develop\Docker\Data\mysql\data:/var/lib/mysql ^
-v D:\Develop\Docker\Data\mysql\conf:/etc/mysql/conf.d ^
-p 13306:3306 ^
-e MYSQL_ROOT_PASSWORD=123456 ^
mysql:8.0.35
12345678910

参数解释:

1
2
3
4
5
6
7
8
9
10
--name mysql-dev		#指定容器名称
-d #后台运行容器
--restart unless-stopped #设置重启策略为在容器手动停止时以外的任何原因退出时重启
-e TZ=Asia/Shanghai #设置容器时区
--network docker-network #将容器连接到自定义的 Docker网络中
-v #目录挂载
-p 13306:3306 #将容器的 3306端口映射到宿主机的 13306端口
-e MYSQL_ROOT_PASSWORD=123456 # mysql root用户的密码
mysql:8.0.35 #使用的mysql镜像版本
123456789

如果客户端连接时提示:Public Key Retrieval is not allowed,可以尝试将驱动参数allowPublicKeyRetrieval修改为true:

3.3 安装nacos

第一步、拉取镜像

1
2
3
# 以v2.2.3版本为例
docker pull nacos/nacos-server:v2.2.3
12

第二步、拷贝nacos目录及文件到宿主机

1)挂载目录前,先启动一次docker

1
2
3
4
5
6
7
8
# 只要启动后是running状态就可以
docker run --name nacos-dev -d ^
-e MODE=standalone ^
-p 18848:8848 ^
-p 19848:9848 ^
-p 19849:9849 ^
nacos/nacos-server:v2.2.3
1234567

2)拷贝nacos目录到宿主机

1
2
3
4
5
docker cp nacos-dev:/home/nacos/bin D:\Develop\Docker\Data\nacos
docker cp nacos-dev:/home/nacos/conf D:\Develop\Docker\Data\nacos
docker cp nacos-dev:/home/nacos/data D:\Develop\Docker\Data\nacos
docker cp nacos-dev:/home/nacos/logs D:\Develop\Docker\Data\nacos
1234

3)停止并删除容器

1
2
docker stop nacos-dev && docker rm nacos-dev
1

第三步:在mysql中执行nacos sql脚本

1)创建数据库:nacos(名称自定义)

2)执行sql脚本(mysql-schema.sql):

执行后会创建如下10几张表:

第四步:创建并以挂载目录的方式启动容器

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
docker run --name nacos-dev -d ^
--restart unless-stopped ^
--network docker-network ^
--privileged=true ^
-p 18848:8848 ^
-p 19848:9848 ^
-p 19849:9849 ^
-e PREFER_HOST_MODE=hostname ^
-e MODE=standalone ^
-e SPRING_DATASOURCE_PLATFORM=mysql ^
-e MYSQL_SERVICE_HOST=mysql-dev ^
-e MYSQL_SERVICE_PORT=3306 ^
-e MYSQL_SERVICE_DB_NAME=nacos ^
-e MYSQL_SERVICE_USER=root ^
-e MYSQL_SERVICE_PASSWORD=123456 ^
-e JVM_XMS=512m ^
-e JVM_XMX=512m ^
-e JVM_XMN=256m ^
-e MYSQL_SERVICE_DB_PARAM="characterEncoding=utf8&connectTimeout=10000&socketTimeout=30000&autoReconnect=true&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true" ^
-v D:\Develop\Docker\Data\nacos\bin:/home/nacos/bin ^
-v D:\Develop\Docker\Data\nacos\conf:/home/nacos/conf ^
-v D:\Develop\Docker\Data\nacos\data:/home/nacos/data ^
-v D:\Develop\Docker\Data\nacos\logs:/home/nacos/logs ^
nacos/nacos-server:v2.2.3
123456789101112131415161718192021222324

参数解释

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
--name nacos-dev		# 容器名称
-d # 后台运行容器
--restart unless-stopped #设置重启策略为在容器手动停止时以外的任何原因退出时重启
--network docker-network # 将容器连接到自定义的 Docker网络中
--privileged=true # 提供一些额外的权限给容器
-p 18848:8848 # 将容器的 8848端口映射到宿主机的 18848端口
-p 19848:9848 # 将容器的 9848端口映射到宿主机的 19848端口
-p 19849:9849 # 将容器的 9849端口映射到宿主机的 19849端口
-e PREFER_HOST_MODE=hostname # 设置 Nacos使用主机名模式
-e MODE=standalone # 设置 Nacos运行模式为单机模式
-e SPRING_DATASOURCE_PLATFORM=mysql # 设置数据源平台为 MySQL
-e MYSQL_SERVICE_HOST=mysql-dev # Mysql容器名
-e MYSQL_SERVICE_PORT=3306 # Mysql容器端口
-e MYSQL_SERVICE_DB_NAME=nacos # nacos数据库
-e MYSQL_SERVICE_USER=root # 连接Mysql用户
-e MYSQL_SERVICE_PASSWORD=123456 # 连接Mysql密码
-e JVM_XMS=512m # 设置 Java 虚拟机的初始堆大小为 512MB
-e JVM_XMX=512m # 设置 Java 虚拟机的最大堆大小为 512MB
-e JVM_XMN=256m # 设置 Java 虚拟机的新生代堆大小为 256MB
-e MYSQL_SERVICE_DB_PARAM="characterEncoding=utf8&connectTimeout=10000&socketTimeout=30000&autoReconnect=true&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true" # 设置MySQL连接的参数
-v D:\Develop\Docker\Data\nacos\bin:/home/nacos/bin # 挂载宿主机的 Nacos bin 目录到容器
-v D:\Develop\Docker\Data\nacos\conf:/home/nacos/conf # 挂载宿主机的 Nacos 配置目录到容器
-v D:\Develop\Docker\Data\nacos\data:/home/nacos/data # 挂载宿主机的 Nacos 数据目录到容器
-v D:\Develop\Docker\Data\nacos\logs:/home/nacos/logs # 挂载宿主机的 Nacos 日志目录到容器
nacos/nacos-server:v2.2.3 # 使用的 Nacos镜像版本
12345678910111213141516171819202122232425

第五步:验证

1)在浏览器中访问:http://localhost:18848/nacos
默认用户:nacos,密码:nacos

2)创建命名空间:

命名空间保存到了mysql,说明本次安装成功了。

3.4 安装minio

第一步、拉取镜像

1
2
docker pull minio/minio
1

第二步、创建挂载目录

第三步:创建并运行容器

1
2
3
4
5
6
7
8
9
10
docker run --name minio -d ^
-e TZ=Asia/Shanghai ^
-e "MINIO_ACCESS_KEY=minioadmin" ^
-e "MINIO_SECRET_KEY=minioadmin" ^
-p 9000:9000 ^
-p 9001:9001 ^
-v D:\Develop\Docker\Data\minio\data:/data ^
-v D:\Develop\Docker\Data\minio\config:/root/.minio ^
minio/minio:latest server /data --console-address ":9001"
123456789

第四步:验证
访问 http://127.0.0.1:9000http://127.0.0.1:9001
用户名、密码:minioadmin

3.5 安装xxl-job

官方文档:快速入门

第一步、拉取镜像

1
2
docker pull xuxueli/xxl-job-admin:2.4.0
1

第二步、执行初始化脚本
下载地址:tables_xxl_job.sql

第三步、创建挂载目录

配置文件下载:application.properties

修改 mysql 连接信息:

1
2
3
4
5
spring.datasource.url=jdbc:mysql://[IP 或 容器名]:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
1234

第四步:创建并运行容器

1
2
3
4
5
6
7
8
9
docker run --name xxl-job -d ^
--network docker-network ^
-e TZ=Asia/Shanghai ^
-e PARAMS="--spring.config.location=/application.properties" ^
-p 8081:8080 ^
-v D:\Develop\Docker\Data\xxl-job\logs:/data/applogs ^
-v D:\Develop\Docker\Data\xxl-job\conf\application.properties:/application.properties ^
xuxueli/xxl-job-admin:2.4.0
12345678

第五步:验证
http://localhost:8081/xxl-job-admin/
用户名:admin
密码:123456

新增一个任务:

查看数据库:

四、使用 docker-compose 管理容器

4.1 创建 docker-compose.yml 文件

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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
# 定义compose语义版本
version: '3.8'
# 定义服务
services:
redis:
image: redis:7.0.14
container_name: redis
# 重启策略:在容器手动停止时以外的任何原因退出时重启
restart: unless-stopped
# 启动redis服务;设置密码为123456;开启redis持久化
command: redis-server /etc/redis/redis.conf --requirepass 123456 --appendonly yes
# 设置容器时区、语言环境
environment:
TZ: Asia/Shanghai
LANG: en_US.UTF-8
volumes:
# 需要下载相应版本的redis.conf文件,下载地址:https://github.com/redis/redis/tags
- "D:\\Develop\\Docker\\Data\\redis\\redis.conf:/etc/redis/redis.conf"
# 挂载持久化数据目录
- "D:\\Develop\\Docker\\Data\\redis\\data:/data"
ports:
# 端口映射
- "6379:6379"
networks:
- docker-network

mysql:
image: mysql:8.0.35
container_name: mysql
restart: unless-stopped
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: 123456
MYSQL_ROOT_AUTH_PLUGIN: caching_sha2_password
LANG: en_US.UTF-8
ports:
- "3306:3306"
# 设置MySQL服务器的最大连接数、指定MySQL服务器的默认字符集、指定MySQL服务器的默认排序规则
command:
--max_connections=1000
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
volumes:
- "D:\\Develop\\Docker\\Data\\mysql\\log:/var/log/mysql"
- "D:\\Develop\\Docker\\Data\\mysql\\data:/var/lib/mysql"
- "D:\\Develop\\Docker\\Data\\mysql\\conf:/etc/mysql/conf.d"
networks:
- docker-network
healthcheck:
test: [ "CMD", "mysqladmin" ,"ping", "-h", "localhost" ]
retries: 10

nacos:
image: nacos/nacos-server:v2.2.3
container_name: nacos
restart: unless-stopped
volumes:
- "D:\\Develop\\Docker\\Data\\nacos\\bin:/home/nacos/bin"
- "D:\\Develop\\Docker\\Data\\nacos\\conf:/home/nacos/conf"
- "D:\\Develop\\Docker\\Data\\nacos\\data:/home/nacos/data"
- "D:\\Develop\\Docker\\Data\\nacos\\logs:/home/nacos/logs"
environment:
- PREFER_HOST_MODE=hostname
- MODE=standalone
- SPRING_DATASOURCE_PLATFORM=mysql
# 修改mysql连接信息
- MYSQL_SERVICE_HOST=mysql # 注意:因为是容器间通信,这里要设置mysql容器名,`127.0.0.1`或`localhost`不好使
- MYSQL_SERVICE_DB_NAME=nacos
- MYSQL_SERVICE_PORT=3306
- MYSQL_SERVICE_USER=root
- MYSQL_SERVICE_PASSWORD=123456
# 修改JVM参数
- JVM_XMS=256m #-Xms default: 1g
- JVM_XMX=256m #-Xmx default: 1g
- JVM_XMN=128m #-Xmn default: 512m
- JVM_MS=32m #-XX:MetaspaceSize default: 128m
- JVM_MMS=64m #-XX:MaxMetaspaceSize default: 320m
- MYSQL_SERVICE_DB_PARAM=characterEncoding=utf8&connectTimeout=10000&socketTimeout=30000&autoReconnect=true&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
ports:
- "8848:8848"
- "9848:9848"
- "9849:9849"
networks:
- docker-network
healthcheck:
test: ["CMD-SHELL", "echo 'ruok' | curl -s telnet://localhost:8848 || exit 1"]
retries: 10
depends_on:
mysql:
condition: service_healthy

minio:
image: minio/minio:latest
container_name: minio
restart: no
command: server /data --console-address ":9001"
environment:
TZ: Asia/Shanghai
LANG: en_US.UTF-8
volumes:
- "D:\\Develop\\Docker\\Data\\minio\\data:/data"
- "D:\\Develop\\Docker\\Data\\minio\\config:/root/.minio"
ports:
- "9000:9000"
- "9001:9001"
networks:
- docker-network

xxl-job:
image: xuxueli/xxl-job-admin:2.4.0
container_name: xxl-job
restart: no
environment:
TZ: Asia/Shanghai
LANG: en_US.UTF-8
PARAMS: '--spring.config.location=/application.properties'
volumes:
- "D:\\Develop\\Docker\\Data\\xxl-job\\logs:/data/applogs"
- "D:\\Develop\\Docker\\Data\\xxl-job\\conf\\application.properties:/application.properties"
ports:
- "8081:8080"
depends_on:
- mysql
networks:
- docker-network

networks:
docker-network:
external: true
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129

4.2 启动服务

1
2
3
# 进入 docker-compose.yml 所在目录,执行以下命令
docker-compose up -d
12