Docker 命令完全指南
Docker 是什么
Docker 是一个开源的容器化平台,它把应用及其运行环境打包成轻量、可移植的容器镜像。镜像在任意安装了 Docker 的主机上都能以一致的方式运行,解决了"在我机器上能跑"的经典问题。
核心概念:
- 镜像(Image):只读模板,包含运行应用所需的文件系统、依赖和配置。
- 容器(Container):镜像的运行实例,具有独立的进程、网络和文件系统视图。
- 仓库(Registry):存储和分发镜像的服务,Docker Hub 是默认公共仓库。
为什么要用 Docker
- 环境一致性:开发、测试、生产使用同一镜像,避免环境差异。
- 快速交付:秒级启动、分钟级构建,适合 CI/CD 流水线。
- 资源隔离:进程、网络和文件系统隔离,提高安全性。
- 弹性扩展:结合编排工具(如 Docker Compose、Kubernetes)可以快速扩容。
- 节省资源:容器共享宿主机内核,比虚拟机更轻量。
镜像操作常用命令
# 在 Docker Hub 搜索镜像
docker search nginx
# 拉取指定标签镜像
docker pull nginx:alpine
# 查看本地镜像列表
docker images
# 给镜像打标签
docker tag nginx:alpine myregistry/nginx:1.0
# 删除镜像
docker rmi nginx:alpine
# 构建镜像(Dockerfile 所在目录)
docker build -t myapp:1.0 .
# 推送镜像到仓库
docker push myregistry/nginx:1.0
容器操作常用命令
# 以后台方式运行容器
docker run -d -p 80:80 --name web nginx:alpine
# 查看运行中容器
docker ps
# 查看所有容器(含已停止)
docker ps -a
# 启动 / 停止 / 重启容器
docker start web
docker stop web
docker restart web
# 删除容器
docker rm web
# 查看容器日志
docker logs -f web
# 进入容器执行命令
docker exec -it web /bin/sh
# 查看容器详细信息
docker inspect web
常用参数详解
| 参数 | 说明 | 示例 |
|---|---|---|
-d |
后台运行(detached) | docker run -d nginx |
-p |
端口映射,主机端口:容器端口 |
-p 8080:80 |
-v |
挂载数据卷,主机路径:容器路径 |
-v /data:/app/data |
--name |
为容器指定名称 | --name web |
--restart |
重启策略:no、on-failure、always、unless-stopped |
--restart unless-stopped |
-e |
设置环境变量 | -e TZ=Asia/Shanghai |
--network |
指定容器网络 | --network bridge |
--rm |
停止后自动删除容器 | docker run --rm hello-world |
-u |
指定运行用户 | -u 1000:1000 |
-w |
设置工作目录 | -w /app |
--privileged |
授予容器扩展权限,生产环境慎用 | --privileged |
Dockerfile 编写基础
Dockerfile 是构建镜像的脚本。常用指令:
FROM:指定基础镜像。RUN:执行命令并提交为镜像层。COPY/ADD:拷贝文件到镜像。WORKDIR:设置工作目录。ENV:设置环境变量。EXPOSE:声明容器监听端口。CMD:容器启动时默认执行的命令。ENTRYPOINT:配置容器启动入口,常与CMD配合。
# Dockerfile
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
构建命令:
docker build -t my-node-app:1.0 .
Docker Compose 入门示例
Docker Compose 使用 YAML 文件定义多容器应用,一条命令即可启动整套服务。
# docker-compose.yml
services:
web:
image: nginx:alpine
container_name: web
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html:ro
restart: unless-stopped
app:
build: ./app
container_name: app
environment:
- NODE_ENV=production
- DB_HOST=db
depends_on:
- db
db:
image: postgres:16-alpine
container_name: db
environment:
- POSTGRES_USER=app
- POSTGRES_PASSWORD=secret
- POSTGRES_DB=mydb
volumes:
- db_data:/var/lib/postgresql/data
restart: unless-stopped
volumes:
db_data:
启动与常用命令:
# 前台启动
docker compose up
# 后台启动
docker compose up -d
# 停止并删除容器
docker compose down
# 查看服务日志
docker compose logs -f
# 重启某个服务
docker compose restart app
实用技巧与常见问题
1. 清理无用资源
# 删除所有停止的容器
docker container prune
# 删除悬空镜像
docker image prune
# 删除未使用数据卷
docker volume prune
# 一键清理
docker system prune -a
2. 查看资源占用
docker system df
docker stats
3. 拷贝文件到容器或宿主机
docker cp web:/etc/nginx/nginx.conf ./nginx.conf
docker cp ./local.conf web:/etc/nginx/conf.d/
4. 容器时区问题
docker run -e TZ=Asia/Shanghai ...
5. 日志过大
# 限制单个容器日志大小
docker run --log-opt max-size=10m --log-opt max-file=3 ...
6. 非 root 运行
RUN useradd -u 1000 -m appuser
USER appuser
7. 如何进入没有 bash 的镜像
docker exec -it web /bin/sh
8. 端口被占用
检查宿主机端口是否被占用,改用 -p 8080:80 等未被占用端口。
9. 容器无法访问外网
确认宿主机网络正常,必要时使用 --network host 临时排查(Linux 限定)。
10. 构建缓存
善用 RUN 分层顺序,将不常变化的依赖放在前面,可以显著减少构建时间。
评论功能基于 Giscus(GitHub Discussions)——在 repo 启用 Discussions 后,到 giscus.app 获取仓库 ID 填入
src/_data/site.json即可启用。