这篇 Docker 攻略会从基础概念讲到实战操作,覆盖安装、命令、自定义镜像和多容器管理,新手跟着走就能上手,实用性拉满。
一、先搞懂 Docker 核心概念(别被术语吓住!)
首先得明确 Docker 不是虚拟机,它是更轻量的 "容器化工具",核心就 3 个东西:
- 镜像(Image):相当于应用的 "安装包 + 配置",是只读的模板,比如 "nginx 镜像""mysql 镜像"。
- 容器(Container):镜像跑起来的实例,是可操作的动态环境,一个镜像能开多个容器。
- 仓库(Repository):存镜像的地方,官方的叫 Docker Hub,就像手机的应用商店。
跟虚拟机比的话,Docker 优势很明显:启动只要几秒(虚拟机要几分钟)、占内存少(MB 级 vs GB 级),还能做到 "一次打包,到处运行",不用再担心 "我这能跑,你那跑不了" 的环境问题。
二、全系统安装指南(一步一步来)
1. Windows(Win10/11)
- 前提:Win10 专业版 / 企业版要开 "Hyper-V";家庭版得先装 WSL2(微软官网搜 "WSL2 安装",跟着输命令就行)。
- 步骤:
- 去 Docker 官网下 "Docker Desktop" 安装包;
- 双击安装,勾选 "Use WSL 2 instead of Hyper-V"(家庭版必选);
- 装完启动,右下角出现 Docker 图标,等它变绿就成了。
2. macOS
- 前提:Intel 芯片要 macOS 10.15+,M1/M2 芯片要 macOS 11+。
- 步骤:
- 官网下对应芯片的 Docker Desktop;
- 拖到 "应用程序" 文件夹,启动时输系统密码授权,等图标变绿就好。
3. Linux(以 Ubuntu 为例,最常用)
- 步骤:
- 先卸载旧版本(没装过也没事):
sudo apt-get remove docker docker-engine docker.io containerd runc - 装依赖:
sudo apt-get update && sudo apt-get install ca-certificates curl gnupg lsb-release - 加 Docker 官方密钥:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg - 配置仓库:
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null - 装 Docker Engine:
sudo apt-get update && sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin - 验证:输
sudo docker run hello-world,出现 "Hello from Docker!" 就成功了;想免 sudo(不用每次输密码),再输两句:sudo usermod -aG docker $USER→newgrp docker,重启终端就生效。
- 先卸载旧版本(没装过也没事):
三、必背的基础命令(用熟这些就够日常用)
1. 镜像操作(管 "安装包" 的)
| 命令 | 作用 | 例子 |
|---|---|---|
| docker pull 镜像名:标签 | 下镜像(标签默认 latest) | docker pull nginx:1.23 |
| docker images | 看本地所有镜像 | docker images -q(只显 ID) |
| docker rmi 镜像 ID / 名 | 删除镜像(先停容器) | docker rmi nginx:1.23 |
| docker save -o 文件名 镜像 | 导出镜像到本地 | docker save -o nginx.tar nginx:1.23 |
2. 容器操作(管 "运行实例" 的,最常用!)
重点记docker run,参数特别关键:
-d:后台运行(别占着终端);-p 宿主端口:容器端口:端口映射(比如-p 8080:80,浏览器输localhost:8080就能访问容器的 80 端口);-v 宿主目录:容器目录:挂载目录(数据持久化,比如把本地文件夹挂到 mysql 容器,删了容器数据也在);--name:给容器起名字(别用默认的随机名,不好记)。
常用命令例子:
- 启动 nginx 容器(后台运行,80 端口映射):
docker run -d -p 80:80 --name mynginx nginx - 看运行中的容器:
docker ps(加-a看所有,包括停了的); - 进容器操作(比如进 nginx 容器改配置):
docker exec -it mynginx /bin/bash(-it是交互模式); - 停容器:
docker stop mynginx;删容器:docker rm mynginx(删运行中的加-f); - 看容器日志(比如看 mysql 报错):
docker logs -f mynginx(-f实时刷新)。
四、进阶:自定义镜像(用 Dockerfile)
如果官方镜像满足不了需求(比如要装个带特定插件的 nginx),就自己写 Dockerfile 构建镜像。
1. Dockerfile 核心指令(记 5 个够用)
FROM:指定基础镜像(必须放第一行),比如FROM nginx:1.23;WORKDIR:设容器工作目录,后续命令都在这目录下,比如WORKDIR /app;COPY:把本地文件复制到镜像里,比如COPY index.html /usr/share/nginx/html/;RUN:构建镜像时执行命令(比如装依赖),比如RUN apt-get install -y vim;CMD:容器启动时执行的命令(只能有一条),比如CMD ["nginx", "-g", "daemon off;"]。
2. 实战:做个带自定义页面的 nginx 镜像
- 新建个文件夹,里面放两个文件:
Dockerfile和index.html(自己写个简单的 HTML 页面); - Dockerfile 内容:
dockerfile
FROM nginx:1.23 # 基础镜像
WORKDIR /usr/share/nginx/html # 切换到nginx的默认页面目录
COPY index.html ./ # 把本地index.html复制过来
EXPOSE 80 # 声明端口(只是说明,不是真映射)
- 构建镜像(
-t给镜像起名,.表示当前目录找 Dockerfile):docker build -t my-custom-nginx:v1 . - 启动镜像验证:
docker run -d -p 80:80 --name my-custom-nginx my-custom-nginx:v1,浏览器输localhost就能看到自己的页面。
五、多容器管理(Docker Compose,不用一个个启动了)
如果你的应用需要多个容器(比如前端 nginx + 后端 node + 数据库 mysql),用 Docker Compose 能一键启动所有容器,还能管理依赖(比如让 mysql 先启动,再启 node)。
1. 安装(Windows/macOS 装 Docker Desktop 时自带,Linux 要手动装)
Linux 装命令:
bash
sudo curl -L "https://github.com/docker/compose/releases/download/v2.23.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
验证:docker-compose --version,出版本号就成。
2. 实战:nginx+node+mysql 组合
- 新建个文件夹,结构如下:
plaintext
my-project/
├── docker-compose.yml # Compose配置文件(核心)
├── node-app/ # node后端项目
│ ├── app.js
│ ├── package.json
│ └── Dockerfile # node镜像的Dockerfile
└── nginx/
└── conf.d/
└── default.conf # nginx配置(反向代理node)
docker-compose.yml内容(重点看services,每个服务对应一个容器):
yaml
version: '3.8' # Compose版本,别太旧
services:
# mysql服务
mysql:
image: mysql:8.0 # 用官方mysql镜像
ports:
- "3306:3306"
environment: # 环境变量(设mysql密码、默认数据库)
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: test_db
volumes:
- mysql-data:/var/lib/mysql # 数据持久化(卷名mysql-data)
restart: always # 容器挂了自动重启
# node服务(依赖mysql)
node-app:
build: ./node-app # 用node-app文件夹里的Dockerfile构建镜像
ports:
- "3000:3000"
environment:
DB_HOST: mysql # 连接mysql的主机名,直接写服务名"mysql"(Compose会自动配网络)
DB_PASSWORD: 123456
depends_on: # 依赖mysql,确保mysql先启动
- mysql
restart: always
# nginx服务(反向代理node)
nginx:
image: nginx:1.23
ports:
- "80:80"
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d # 挂载nginx配置
depends_on:
- node-app
restart: always
volumes: # 定义卷(mysql-data会自动创建)
mysql-data:
- 启动所有服务:在
my-project目录下输docker-compose up -d(-d后台运行); - 停服务:
docker-compose down(加-v会删卷,数据就没了,慎用)。
六、新手常踩的坑(解决方法直接给)
- 端口被占用 :启动容器时提示 "port is already allocated",换个宿主端口,比如把
-p 80:80改成-p 8080:80; - 镜像拉得慢 :国内访问 Docker Hub 慢,配阿里云镜像加速器:
- 去阿里云搜 "容器镜像服务",找 "镜像加速器",复制自己的加速地址;
- Linux:新建
/etc/docker/daemon.json,写{"registry-mirrors": ["你的加速地址"]},然后sudo systemctl restart docker; - Windows/macOS:打开 Docker Desktop,Settings→Docker Engine,加同样的配置,重启 Docker。
- 挂载目录后看不到文件 :确保宿主目录用绝对路径(比如
/home/user/data,别用./data),Windows/macOS 还要在 Docker Desktop 里授权访问这个目录。
最后,要不要我帮你整理一份Docker 常用命令速查表?把镜像、容器、Dockerfile 的核心命令按场景分类,打印出来或存手机,用到时直接查,比翻攻略快多了。