Docker 从零到实战:Windows & Linux 安装、命令与配置全攻略
前言
Docker 是现在开发和运维的“必备技能”。它能把你的程序和整个运行环境打包成一个轻量级的容器,在任何机器上都跑得一模一样,再也不用担心“我电脑上能跑,服务器上就报错”。
本文面向纯新手,把 Docker 的安装、常用命令、核心配置和实战用法一次性讲透。覆盖 Linux 的yum安装、二进制解压安装和 Windows 上的安装,全程复制即用。
适用系统:CentOS 7+ / RHEL 7+ / Ubuntu 18+ / Windows 10/11(含 WSL2)
一、Docker 到底是什么?
把 Docker 理解成轻量级虚拟机就行,但比传统虚拟机快得多、占用资源少得多。
| 对比维度 | 传统虚拟机 | Docker 容器 |
|---|---|---|
| 启动速度 | 分钟级 | 秒级 |
| 资源占用 | 每个 VM 要独占几 GB 内存 | 共享宿主机内核,一个容器几十 MB |
| 隔离性 | 全虚拟化,强隔离 | 进程级隔离,够用 |
| 迁移发布 | 复杂,要导出镜像再导入 | 一个 Dockerfile 或镜像就能带走 |
核心概念三件套:
- 镜像(Image):一个只读的模板,比如包含
Ubuntu + Nginx的文件系统快照。 - 容器(Container):镜像的运行时实例,你可以进容器里面执行命令。
- 仓库(Registry):放镜像的地方,Docker Hub 是官方公共仓库,公司内部也可以搭私有仓库。
二、Linux 安装 Docker
环境检查
- 内核版本 >= 3.10(
uname -r可查看) - 64 位系统(CentOS 7+ 默认满足)
方法一:yum 安装(官方推荐,最省心)
1. 卸载旧版本(如果有)
sudoyum removedockerdocker-client docker-client-latest docker-common\docker-latest docker-latest-logrotate docker-logrotate\docker-engine2. 安装必要依赖并添加官方仓库
sudoyuminstall-yyum-utilssudoyum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo3. 安装 Docker Engine
sudoyuminstall-ydocker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin这里会同时安装
docker-compose-plugin,让你可以使用docker compose命令(V2 版)。
4. 启动并设置开机自启
sudosystemctl startdockersudosystemctlenabledockersudosystemctl statusdocker# 确认 active (running)5. 允许当前用户直接使用 docker(不用每次 sudo)
sudogroupadddocker# 如果组已存在会提示,忽略sudousermod-aGdocker$USER# 把你自己加入 docker 组newgrpdocker# 刷新组权限(或重新登录)测试:docker run hello-world,看到欢迎信息就说明安装成功。
方法二:二进制解压安装(离线、无网络、不用 yum)
适用于不能联网、没有包管理器、或者你需要多版本并存的环境。
1. 下载官方静态二进制包
访问 https://download.docker.com/linux/static/stable/ ,选择对应架构(x86_64、aarch64),复制最新版本的.tgz链接。
例如:
cd/tmpwgethttps://download.docker.com/linux/static/stable/x86_64/docker-24.0.7.tgz2. 解压并移动到系统路径
tar-zxvfdocker-24.0.7.tgzsudocpdocker/* /usr/bin/# 将 docker, dockerd 等二进制文件放到 /usr/bin3. 手动启动 Docker 守护进程(临时测试)
sudodockerd&会输出一堆日志,按回车回到终端。此时另开一个终端执行docker version验证。
4. 配置为 systemd 服务(生产必需)
创建 service 文件:
sudovi/etc/systemd/system/docker.service写入以下内容:
[Unit] Description=Docker Application Container Engine Documentation=https://docs.docker.com After=network-online.target firewalld.service Wants=network-online.target [Service] Type=notify ExecStart=/usr/bin/dockerd ExecReload=/bin/kill -s HUP $MAINPID LimitNOFILE=infinity LimitNPROC=infinity TimeoutStartSec=0 Delegate=yes KillMode=process Restart=on-failure StartLimitBurst=3 StartLimitInterval=60s [Install] WantedBy=multi-user.target然后:
sudosystemctl daemon-reloadsudosystemctl startdockersudosystemctlenabledockersudosystemctl statusdocker5. 创建 docker 用户组(同上)
sudogroupadddockersudousermod-aGdocker$USER三、Windows 安装 Docker
方案:Docker Desktop for Windows(最易用)
Docker Desktop 封装了 WSL2 后端,让 Windows 原生支持 Linux 容器。
1. 开启 WSL2 和虚拟机平台
以管理员身份打开 PowerShell,执行:
dism.exe/online/enable-feature/featurename:Microsoft-Windows-Subsystem-Linux/all/norestart dism.exe/online/enable-feature/featurename:VirtualMachinePlatform/all/norestart重启电脑。
下载并安装 WSL2 内核更新包:https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi
设置 WSL2 为默认版本:
wsl--set-default-version 22. 下载并安装 Docker Desktop
从 https://www.docker.com/products/docker-desktop/ 下载Docker Desktop Installer.exe,双击安装,勾选Use WSL 2 instead of Hyper-V(推荐)。
安装完成后,启动 Docker Desktop,等待鲸鱼图标不再转圈。
3. 验证
打开 PowerShell 或 CMD:
dockerrun hello-world看到欢迎信息就 OK 了。
4. Windows 下的终端建议
强烈建议使用Windows Terminal+WSL2内的 Ubuntu 发行版来操作 Docker。
在 WSL2 的 Ubuntu 里直接使用 Docker,就和 Linux 完全一样了(Docker Desktop 已自动配置好)。
如果不想依赖 Docker Desktop,Windows Server 上也可以装原生 Docker Engine,但新手先用 Desktop 足矣。
四、Docker 常用命令速查表
1. 镜像管理
| 命令 | 说明 |
|---|---|
docker images | 列出本地所有镜像 |
docker pull 镜像名:标签 | 从仓库拉取镜像,如docker pull nginx:latest |
docker rmi 镜像ID | 删除镜像(需先删除使用它的容器) |
docker tag 源镜像 新名字:标签 | 给镜像打标签 |
docker save -o nginx.tar nginx:latest | 把镜像导出成 tar 文件 |
docker load -i nginx.tar | 从 tar 文件导入镜像 |
2. 容器生命周期
| 命令 | 说明 |
|---|---|
docker run -d --name web -p 80:80 nginx | 最常用:以后台模式启动一个叫 web 的容器,映射端口 80 |
docker ps | 查看正在运行的容器 |
docker ps -a | 查看所有容器(包括已停止的) |
docker stop 容器名 | 停止容器 |
docker start 容器名 | 启动已停止的容器 |
docker restart 容器名 | 重启容器 |
docker rm 容器名 | 删除已停止的容器(运行中的需先 stop) |
docker exec -it 容器名 /bin/bash | 进入容器的 bash 交互终端(有些镜像用/bin/sh) |
docker logs 容器名 | 查看容器输出日志 |
docker logs -f 容器名 | 实时跟踪日志 |
3.docker run核心参数解释
dockerrun-d\# -d: 后台运行--namemyapp\# 给容器起个名字-p8080:80\# 端口映射:宿主机端口:容器端口-v/data:/usr/share/nginx/html\# 挂载目录:宿主机目录:容器目录-eMYSQL_ROOT_PASSWORD=123456\# 设置环境变量--restart=always\# 退出时自动重启nginx:latest# 镜像名:标签4. 网络与数据卷
| 命令 | 说明 |
|---|---|
docker network ls | 查看网络列表 |
docker network create mynet | 创建自定义桥接网络 |
docker volume ls | 查看数据卷列表 |
docker volume create mydata | 创建命名卷 |
docker inspect 容器名 | 查看容器的所有配置细节(IP、挂载点等) |
五、Docker Compose:一键启动多个服务
真实项目中往往有多个容器(比如 web + db + redis),一个一个敲docker run太麻烦。
Docker Compose 用一个docker-compose.yml文件定义所有服务,一句命令全启动。
1. 写一个简单的 compose 文件
新建docker-compose.yml:
version:'3.8'services:web:image:nginx:latestports:-"80:80"volumes:-./html:/usr/share/nginx/htmlnetworks:-app-netredis:image:redis:7networks:-app-netnetworks:app-net:driver:bridge2. 常用 Compose 命令
| 命令 | 说明 |
|---|---|
docker compose up -d | 后台启动所有服务 |
docker compose down | 停止并删除所有服务(网络、容器) |
docker compose ps | 查看 compose 管理的容器状态 |
docker compose logs -f | 查看所有服务的实时日志 |
docker compose restart web | 重启 web 服务 |
docker compose exec web bash | 进入 web 服务容器内部 |
新版 Docker 已经内置了 compose 插件,直接用
docker compose即可(中间没有横杠)。
六、Dockerfile:自己打包镜像
Dockerfile 是一份脚本,告诉 Docker 如何一步步构建镜像。
一个简单的静态网站 Dockerfile
在项目根目录下新建Dockerfile:
# 1. 基础镜像 FROM nginx:alpine # 2. 维护者信息(可选) LABEL maintainer="you@example.com" # 3. 把本地的 index.html 复制到容器内 Nginx 的默认目录 COPY index.html /usr/share/nginx/html/ # 4. 暴露 80 端口 EXPOSE 80同一目录下准备一个index.html文件,然后构建并运行:
dockerbuild-tmy-web:v1.# -t 指定镜像名:标签, . 表示当前目录dockerrun-d-p8080:80 my-web:v1访问http://IP:8080即可看到你的网页。
常用 Dockerfile 指令
| 指令 | 说明 |
|---|---|
FROM | 指定基础镜像 |
COPY/ADD | 复制文件到镜像;ADD还支持自动解压 tar |
RUN | 在构建时执行命令,如RUN apt update && apt install -y curl |
CMD | 容器启动时默认执行的命令 |
WORKDIR | 设置工作目录 |
ENV | 设置环境变量 |
EXPOSE | 声明容器监听端口(文档作用,实际映射靠-p) |
七、核心配置详解:daemon.json
Docker 的全局配置都放在/etc/docker/daemon.json中(Linux),Windows 上可通过 Docker Desktop 的 Settings → Docker Engine 界面修改。
完整配置示例及说明
{"registry-mirrors":["https://mirror.example.com"],"insecure-registries":["192.168.1.100:5000"],"data-root":"/data/docker","log-driver":"json-file","log-opts":{"max-size":"10m","max-file":"3"},"storage-driver":"overlay2","iptables":true,"live-restore":true,"dns":["8.8.8.8","114.114.114.114"]}| 配置项 | 作用 |
|---|---|
registry-mirrors | 镜像加速器(阿里云、腾讯云等提供,大幅加快 pull 速度) |
insecure-registries | 允许使用 HTTP 的私有仓库(无 TLS) |
data-root | 修改 Docker 数据目录(镜像、容器存放位置),默认在/var/lib/docker |
log-driver | 日志驱动,默认json-file;还可为syslog、journald等 |
log-opts | 日志轮转,防止日志占满磁盘,单个文件最大 10M,最多保留 3 个 |
storage-driver | 存储驱动,overlay2是目前最佳选择 |
live-restore | 即使 Docker 守护进程重启,容器也能继续运行(热更新守护进程时很有用) |
dns | 容器默认 DNS 服务器 |
修改后需要重启 Docker 服务:sudo systemctl restart docker。
配置镜像加速(阿里云为例)
登录阿里云容器镜像服务,获取专属加速器地址。
修改
/etc/docker/daemon.json:{"registry-mirrors":["https://你的ID.mirror.aliyuncs.com"]}sudo systemctl restart docker
注意:
daemon.json格式必须严格符合 JSON 标准,最后一个键值对末尾不能有逗号。
八、实战:用 Docker 快速部署 Nginx + 挂载本地网页
这个例子让你一次性弄懂端口映射、挂载目录、后台运行。
# 1. 创建本地网页目录mkdir~/mywebsiteecho"Hello Docker">~/mywebsite/index.html# 2. 启动容器,将本地目录挂进去dockerrun-d--namemy-nginx\-p80:80\-v~/mywebsite:/usr/share/nginx/html:ro\--restart=always\nginx:alpine-v ~/mywebsite:/usr/share/nginx/html:ro:把宿主机的~/mywebsite挂载到容器里 Nginx 的网站根目录,ro表示只读。- 现在访问
http://服务器IP就能看到 “Hello Docker”。
修改本地的index.html,浏览器刷新立刻生效,不用重启容器。
九、新手避坑 & 排错指南
端口映射后外网不通
- 先检查 firewalld/iptables 是否放行了宿主机端口。
- 云服务器记得在安全组同时放行。
容器启动后立刻退出
- 用
docker logs 容器名查看错误日志。 - 可能原因:前台没有常驻进程,比如你只是运行
echo就结束了。
- 用
docker run提示权限不足- 要么加
sudo,要么把当前用户加入docker组并重新登录。
- 要么加
目录挂载后容器内文件消失
- 挂载会覆盖容器内该目录原有的内容,这是正常现象。如果需要原文件的备份,可在启动前用
docker cp复制出来。
- 挂载会覆盖容器内该目录原有的内容,这是正常现象。如果需要原文件的备份,可在启动前用
Windows 下路径格式
- CMD 中用反斜杠但最好用正斜杠并加引号:
-v "C:/Users/me/html:/usr/share/nginx/html" - WSL2 里用
/mnt/c/Users/me/html即可。
- CMD 中用反斜杠但最好用正斜杠并加引号:
daemon.json修改后启动失败- 肯定是 JSON 格式错误(逗号、引号问题)。用
python3 -m json.tool /etc/docker/daemon.json校验一下。
- 肯定是 JSON 格式错误(逗号、引号问题)。用
附录:常用命令速查卡片
| 任务 | 命令 |
|---|---|
| 拉取镜像 | docker pull nginx:alpine |
| 后台运行容器 | docker run -d --name web -p 80:80 nginx:alpine |
| 停止/启动容器 | docker stop web/docker start web |
| 进入运行中的容器 | docker exec -it web /bin/sh |
| 查看容器日志 | docker logs -f web |
| 删除所有停止的容器 | docker container prune |
| 删除无用的镜像 | docker image prune -a |
| 用 compose 启动 | docker compose up -d |
| 构建镜像 | docker build -t 名字:标签 . |
| 查看磁盘占用 | docker system df |
| 全面清理(慎用) | docker system prune -a --volumes |
掌握上述内容后,你就已经可以用 Docker 独立搭建环境、部署项目、排查常见问题了。
接下来建议亲手完成:
- 用 Docker 跑一个 Nginx + Tomcat + MySQL 的组合环境(用 Compose 编排)
- 写一个 Dockerfile 把自己的网页打包成镜像
- 把镜像推送到 Docker Hub 或私有仓库
有任何具体报错或场景,随时可以把日志贴出来一起分析。加油!