win 下 docker 遇到的问题

前言

由于之前实习使用docker,都是在MacLinux服务器下docker镜像容器,但目前我自己只有win11的系统,而且只想在win下完成操作,并排雷避坑,以部署Prometheus为例子

解决的问题:

  • 如何在win下使用Linux格式指令 - 用 WSL
  • 如何使用通用指令来创建并启动docker容器

例子:部署 Prometheus

常规操作

在当前目录下创建一个prometheus.yml的配置文件。在该文件中,我们将定义Prometheus的抓取目标。例如,可以在项目目录中创建一个名为prometheus.yml的文件,并添加以下内容:

1
2
3
4
5
6
7
8
global:
scrape_interval: 15s
evaluation_interval: 15s

scrape_configs:
- job_name: '\''prometheus'\''
static_configs:
- targets: ['\''localhost:9090'\'']

接下来,我们将使用Docker启动Prometheus。可以通过以下命令创建并允许一个Prometheus容器

1
2
3
4
5
docker run -d \
--name prometheus \
-p 9090:9090 \
-v ${PWD}/prometheus.yml:/etc/prometheus/prometheus.yml \
prom/prometheus

使用-d选项表示以后台模式运行容器,-p选项用于将本地端口映射到容器端口,-v选项用于将本地的配置文件挂载到容器中

但是常规安装Prometheus需要挂载配置文件地址,同时WindowsMacLinux路径方式还不太一样

简易版

虽然Prometheus官方镜像不支持直接通过命令行参数传入完整配置,但是可以使用echo + docker run + --entrypoint动态生成配置:

1.创建一个临时容器;

2.用echo把配置写到容器内 /etc/prometheus/prometheus.yml

3.然后启动Prometheus

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
docker run -d \
--name prometheus \
-p 9090:9090 \
--entrypoint sh \
-e TZ=Asia/Shanghai \
prom/prometheus:v2.51.1 \
-c 'echo "
global:
scrape_interval: 15s
evaluation_interval: 15s

scrape_configs:
- job_name: '\''prometheus'\''
static_configs:
- targets: ['\''localhost:9090'\'']

- job_name: '\''ysythread-app'\''
metrics_path: '\''/actuator/prometheus'\''
static_configs:
- targets: ['\''host.docker.internal:18080'\'']
scrape_interval: 10s
scrape_timeout: 5s
" > /etc/prometheus/prometheus.yml && /bin/prometheus --config.file=/etc/prometheus/prometheus.yml'

参数说明:

--entrypoint sh:先让容器以 shell 启动;

-c 'echo "... && /bin/prometheus ...':一口气完成写入配置并启动 Prometheus;

'\'' 是 Bash 里的转义方法,用于生成单引号 ‘;

host.docker.internal:18080表示Prometheus容器去访问宿主机18080端口的服务

整体是 shell 脚本拼接实现,不需要本地文件也能运行。

在 win 下的实际操作

开启虚拟化

我默认大家都是装好WSL的,因为我是很早之前就装过了,这个只演示我遇到的问题

  • Docker DesktopWindows 上依赖于 WSL 2 (Windows Subsystem for Linux 2) 或者 Hyper-V

  • 想要在win下使用docker,必须先开启电脑的虚拟化,否则会报Virtualization support not detected Docker Desktop requires virtualization support to run.的错误

  • 虽然我习惯于用PowerShell终端,但是为了适配,这里切换为wsl,启动Ubuntu,否则需要切换为PowerShell的语法,并且会启动失败,我已经尝试过了

Ubuntu代替PowerShell终端

  • 把对应Linux/mac指令输入Ubuntu中,弃用PowerShell很多语法不一样,比如\PowerShell中是 `)

  • 查看docker容器,发现成功启动

  • Prometheus可以成功打开,说明执行成功了