相比于在 Linux 上直接安装软件,使用 Docker 有明显优势:它可以将应用及其依赖打包在独立的容器中,环境一致性强,避免了"在我电脑能跑,在你电脑不能跑"的问题,同时方便迁移和快速部署。
对于个人开发者而言,在 Windows 上安装 WSL2 和 Docker Desktop 的步骤,就可以轻松搭建完整的开发环境,实现跨平台开发与测试,大大提高效率和灵活性。
一、在 Windows 11 家庭版上安装 Docker
1. 启用 WSL 2
Windows 11 家庭版不支持 Hyper-V,因此需要通过 WSL 2 来运行 Docker。
-
启用 WSL 功能
打开 PowerShell(管理员权限),输入以下命令并回车:
powershellwsl --install该命令会启用 WSL 并安装默认的 Linux 发行版(通常是 Ubuntu)。
-
设置 WSL 2 为默认版本
powershellwsl --set-default-version 2
2. 安装 Docker Desktop
- 下载 Docker Desktop:访问 Docker 官网下载适用于 Windows 的安装程序。
- 安装 Docker Desktop:运行下载的安装程序,按照提示完成安装。
- 启动 Docker Desktop:首次启动时,Docker 会检测 WSL 2 并提示启用相关功能,确认即可。
3. 配置 Docker
- 登录 Docker 账户(可选):启动 Docker Desktop 后,可登录 Docker 账户以访问更多功能。
4. 验证安装
-
查看 Docker 版本:
powershelldocker --version -
运行测试容器:
powershelldocker run hello-world
5. 使用 Docker
- 可通过 Docker Desktop 或命令行管理容器和镜像。
- 若需在 WSL 2 中使用 Docker,确保 Docker Desktop 已启用 WSL 2 后端。
注意事项
- 硬件要求:确保系统支持虚拟化并已启用。
- WSL 2 更新:保持 WSL 2 和 Docker Desktop 为最新版本。
二、Docker 使用流程核心概念
| 项目 | 类型 | 作用 | 输入 | 输出 |
|---|---|---|---|---|
| Dockerfile | 配置文件 | 描述如何构建镜像 | 无(静态文件) | ------ |
| docker build | 命令 | 构建镜像 | Dockerfile + 上下文文件 | 镜像(Image) |
| docker run | 命令 | 运行容器 | 已有镜像 | 容器(Container) |
三、docker run 的 3 类核心参数
Docker 将应用及运行环境封装为隔离运行的进程,实现"一次构建,到处运行"。
隔离内容:
- 进程(PID Namespace)
- 网络(Network Namespace)
- 文件系统(Mount Namespace)
Docker 容器本质:
- 网络是隔离的,端口要用
-p才能被外部访问 - 容器之间要通信,需要加入到相同网络
- 容器文件系统是临时的,数据需要挂载到宿主机才能持久化
| 参数 | 解决的问题 |
|---|---|
| -p | 外部如何访问容器 |
| --network | 容器之间如何通信 |
| -v | 数据和配置如何保存 |
四、示例:docker 运行 Java JAR 包
目录结构:
java-docker-demo/
├── Dockerfile
└── app.jar
说明:
app.jar:已经打包好的 Java 程序Dockerfile:用于构建 Java 镜像- 当前目录就是构建上下文(build context)
Dockerfile:
dockerfile
# 使用官方 OpenJDK 17 运行环境作为基础镜像
FROM openjdk:17-jdk-slim
# 设置容器内工作目录为 /app
WORKDIR /app
# 将宿主机当前目录下的 app.jar 拷贝到容器的 /app/app.jar
COPY app.jar app.jar
# 设置 JVM 启动参数(可在 docker run 时被覆盖)
ENV JAVA_OPTS="-Xms256m -Xmx512m"
# 声明容器内 Java 程序监听的端口(仅声明,不映射)
EXPOSE 8080
# 容器启动时执行的命令
CMD ["sh", "-c", "java $JAVA_OPTS -jar app.jar"]
构建镜像:
bash
docker build \
-t java-app:1.0 \ # -t:给镜像命名,格式为 镜像名:版本号
. # . :构建上下文目录(包含 Dockerfile 和 app.jar)
运行容器:
bash
docker run \
-d \ # -d:后台运行容器
--name java-app \ # --name:指定容器名称
--network app-net \ # --network:加入名为 app-net 的 Docker 网络,用于容器间通信
-p 8080:8080 \ # -p:端口映射(宿主机端口:容器端口),供宿主机/外部访问
-v /opt/java-app/config:/app/config \ # -v:目录挂载(宿主机目录:容器目录)
-e JAVA_OPTS="-Xms512m -Xmx1g" \ # -e:设置环境变量,覆盖 Dockerfile 中的 ENV
java-app:1.0 # 使用的镜像名和版本
五、示例:docker 运行 Jenkins
拉取镜像:
bash
docker pull jenkins/jenkins
运行 Jenkins:
bash
docker run -d \
--name jenkins \
--restart=always \
--network=demo \
-p 8080:8080 \
-p 50000:50000 \
-v ~/docker/jenkins/jenkins_home:/var/jenkins_home \
jenkins/jenkins:lts