博文目录
文章目录
- Docker Desktop
- 准备
- 系统要求 (WSL 2 backend)
- 在 Windows 上打开 WSL 2 功能
- 先决条件
- 开启 WSL 2
- WSL
- 下载安装
- 启动
- 配置
- 使用
- 镜像 Image
- 卷积 Volumes
- 容器 Containers
- 命令
- Redis
- MySQL
- PostGreSQL
Docker Desktop
Overview of Docker Desktop
Docker Desktop 疑难解答 虚拟化
Docker Desktop for Windows, 可以在 Windows 上创建 Docker 环境, 支持在 CMD 中运行 docker 命令, 提供了简单的 GUI 界面, 方便管理镜像, 容器, 数据卷等内容
准备
在 Windows 安装 Docker Desktop 有两种选择
- WSL 2 backend
- Hyper-V backend and Windows containers
Docker Desktop 推荐使用 WSL 2 backend
, 因为 WSL 2 比 Hyper-V backend 有更好的性能. 后续内容都是基于 WSL 2 来说明
系统要求 (WSL 2 backend)
- WSL 版本 1.1.3.0 或更高
- Windows 11 64 位
- 21H2 或更高版本
- Windows 10 64 位
- 建议使用 22H2(内部版本 19045)或更高版本
- 最低要求 21H2(内部版本 19044)或更高版本
- 在 Windows 上打开 WSL 2 功能
在 Windows 上打开 WSL 2 功能
先决条件
- 具有二级地址转换 (SLAT) 的 64 位处理器, 只要电脑不是老古董, 通常都满足
- 空余的 4GB 系统内存
- 在 BIOS 中启用硬件虚拟化, 可通过如下方式确认是否已启用虚拟化
开启 WSL 2
开启 WSL 2 有两种方式
- 以管理员方式运行
wsl --install
并重启系统, 此命令将启用运行 WSL 所需的功能, 并默认安装 Linux 的 Ubuntu 发行版. Docker Desktop 其实并不依赖任何 Linux 发行版, 所以通过该命令安装的 Ubuntu 其实是不必要的 - 手动分步开启 WSL 2
- 启用
适用于 Linux 的 Windows 子系统
和虚拟机平台
两个可选功能, 如果是专业版或企业版系统, 还可以启用Hyper-V
可选功能, 然后必须重启系统 - 执行
wsl --update
更新 WSL 到当前最新版, 执行wsl --status
查看默认版本是否为 2, 如果不是则执行wsl --set-default-version 2
将默认版本设置为 2
- 启用
WSL
什么是 WSL
比较 WSL 版本
Docker Desktop WSL 2 backend on Windows
WSL 全称为 Windows Subsystem for Linux, 官网译为: 适用于 Linux 的 Windows 子系统 (WSL)
WSL 是 Windows 的一项功能,可用于在 Windows 计算机上运行 Linux 环境,而无需单独的虚拟机或双引导。 WSL 旨在为希望同时使用 Windows 和 Linux 的开发人员提供无缝高效的体验。
WSL 目前有两个模式, 分别是 WSL 1 和 WSL 2, WSL 2 使用最新最好的虚拟化技术在轻量级实用工具虚拟机 (VM) 内运行 Linux 内核. 简单来说, WSL 2 在大多情况下比 WSL 1 性能好兼容性好, 所以默认情况下都是使用 WSL 2 模式
Docker Desktop 不需要我们在 WSL 中安装任何 Linux 发行版。因为 Docker Desktop 自带两个专用的内部 Linux 发行版, 两者是 Docker Desktop 专用的, 不能用作其他用途
- docker-desktop, 用于运行 Docker 引擎 ( dockerd )
- docker-desktop-data, 用于存储容器和映像
# 查看 wsl 相关内容的版本
wsl --version
# 查看 wsl 当前状态
wsl --status
# 检查 wsl 各 Linux 发行版的运行模式是 wsl 1 还是 wsl 2
wsl -l -v
下载安装
官网下载
当前 Docker Desktop for Windows 版本是 4.28.0 (139021)
Docker Desktop 推荐使用 WSL 2 代替 Hyper-V, 默认勾选不要取消, 等待安装完成即可
启动
接收 Docker 协议
先选择不登录, 然后随便选两个角色, 就可以进入 Containers 面板
如果启动一直卡 Starting the Docker Engine
转圈, 可能是准备工作没有做好, 对照步骤检查一下
配置
其实也没什么好配置的, 镜像保存位置可以改一改, 这个内容我们也无法直接查看, 而且我只有一个 C 盘, 所以就不改了, 没有必要
有人会在 Docker Engine 配置项中配置镜像加速, 但是我体验下来感觉都不行, 都无法直接在 Docker Desktop 里搜索镜像, 结合我之前使用经验来看, 加速仓库的镜像不够新, 有些版本的镜像不存在, 而且现在拉取镜像好像不需要魔法速度就很快, 所以我觉得使用 Docker Desktop 搜索镜像的时候开一下魔法即可, 选择一个 Tag 版本, 然后通过命令行的方式去拉取镜像
使用
最佳实践
安装 Docker Desktop for Windows 后, 就可以像在 Linux 一样在 CMD 里执行 docker
命令, GUI 算是一个补充功能, 能简化一些操作, 但是一些复杂操作或者特殊操作或者是 GUI 无法做到的操作, 都可以通过命令行得方式来执行. GUI 和 CMD 都是 Docker Engine 的一个操作入口, 其状态是完全一致的
镜像 Image
在不开魔法的情况下, 搜索不到镜像, 即使配置了镜像加速也没有效果, 所以我推荐这里开魔法
打开魔法之后, 可以正常搜索到镜像, 比如第一个就是官方提供的 Redis 镜像
这里有一个问题, 提供的 Tag 列表里没有 latest, 可能是因为该列表只显示最近的几个 Tag 而不是完整 Tag 列表, 可以点开 Redis 去看详细信息
点开详情后, 我们看到是有 latest
Tag 的, 且 latest 版本就是 7.2.4
(一行的多个 Tag 都是同一个版本), 这时候我们可以关闭魔法, 通过 CMD 执行 docker pull redis:7.2.4
来拉取最新的 Redis 镜像, 速度非常快
拉取成功后, 在 Docker Desktop 的 Images 面板中就会显示出来
卷积 Volumes
在 Volumes 面板可以创建 Volume, 等效于执行 docker volume create
命令, 创建的 Volume 印射在 Windows 的 \\wsl.localhost\docker-desktop-data\data\docker\volumes
路径, 有读写权限, 可以通过 Windows 资源管理器 直接操作
docker run -v <host-path>:<container-path>
, Docker Desktop 建议 host-path 使用 Linux 容器中的路径而不是 Windows 路径, 这样可以充分利用文件系统性能. 由于我们不是直接使用 Linux 环境, 不确定 -v 参数指定 Linux 文件路径是否可行, 而 Volume 由 Docker 控制, 使用的是 Linux 容器中的路径, 而且也印射到了 Windows 资源管理器, 所以我认为使用 Volume 是比较好的方式
容器 Containers
在 Images 面板可以点击 Action 的 Run 按钮来创建并启动一个容器, 在这里, 我设置容器名称为 redis, 印射的主机端口为 6379, 印射的主机路径为一个名为 redis 的 volume, 而不是一个 Windows 路径, 印射的容器路径为 /data, 然后启动容器, 等效于执行如下命令, 使用的是 Redis 默认配置
docker run --name redis -p 6379:6379 -v redis:/data redis:7.2.4 redis-server
通常我们启动 Redis 容器会指定一个自定义的配置文件 redis.conf, 该配置文件放到 redis 这个 volume 下, 用于控制 Redis 的行为, 执行命令如下, 这种后面带参数的命令, 通过 GUI 无法做到, 所以需要通过 CMD 来执行
docker run -d --name redis -p 6379:6379 -v redis:/data redis:7.2.4 redis-server /data/redis.conf
在 Container 面板, 可以看到各容器的状态, 能够简单操作容器, 比如启动, 停止, 删除等
点到容器内, 可以直接看到容器执行日志 Logs
容器的信息 Inspect, 可以点击 Platform, Cmd, State 等标签直接跳转到信息的对应位置查看关键信息
容器的文件 Files, 可以看到容器内的文件系统
容器的状态 State, 可以看到容器的运行情况, 资源占用情况等信息
可以在容器的 Exec 里执行命令, 相当于执行了 docker exec -it redis /bin/bash
命令进入了容器, 进而在容器内部执行命令
命令
Redis
redis.conf, 放到卷 redis 中
# bind 127.0.0.1 # 解除只允许环回地址访问的限制
daemonize no # 修改为yes会使docker使用配置文件方式启动redis失败
save 900 1 # 如果上个900秒内有超过1次写操作,则保存快照
save 300 10
save 60 10000
requirepass Mrv587.. # 密码
docker run \
-d \
--name redis \
-p 6379:6379 \
-v redis:/data \
redis:7.2.4 \
redis-server /data/redis.conf
docker run -d --name redis -p 6379:6379 -v redis:/data redis:7.2.4 redis-server /data/redis.conf
MySQL
my.cnf, 放到卷 mysql.config 中
[mysql]
# 设置mysql客户端默认字符集
default-character-set=UTF8MB4
[mysqld]
# 设置3306端口
port=3306
# 服务端使用的字符集
character-set-server=UTF8MB4
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
docker run \
-d \
--name mysql \
-p 3306:3306 \
-v mysql:/var/lib/mysql \
-v mysql.config:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=Mrv587.. \
mysql:8.3.0
docker run -d --name mysql -p 3306:3306 -v mysql:/var/lib/mysql -v mysql.config:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=Mrv587.. mysql:8.3.0
PostGreSQL
docker run -d --name postgres -p 5432:5432 -e POSTGRES_PASSWORD=Mrv587.. -e ALLOW_IP_RANGE=0.0.0.0/0 -v postgres:/var/lib/postgresql/data postgres:16.2
修改 pg_hba.conf
里的 host all all all scram-sha-256
为 host all all all trust
才能连接