Docker 是一个开源的容器化平台,它允许开发者将应用程序及其依赖项打包到轻量级、可移植的容器中。

1. Docker 基础命令

1.1 查看 Docker 版本和信息

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 查看 Docker 版本
docker --version
docker version

# 查看 Docker 系统信息
docker info

# 查看 Docker 帮助
docker --help
docker <command> --help

1.2 登录和登出 Docker Hub

1
2
3
4
5
6
7
8
# 登录 Docker Hub
docker login

# 登录指定仓库
docker login registry.example.com

# 登出
docker logout

2. 镜像管理命令

2.1 搜索和拉取镜像

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 搜索镜像
docker search nginx
docker search --limit 10 nginx

# 拉取镜像
docker pull nginx
docker pull nginx:1.20
docker pull nginx:latest

# 从指定仓库拉取
docker pull registry.example.com/nginx:latest

2.2 查看和管理镜像

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
# 列出本地镜像
docker images
docker image ls

# 查看镜像详细信息
docker inspect nginx:latest

# 查看镜像历史
docker history nginx:latest

# 删除镜像
docker rmi nginx:latest
docker image rm nginx:latest

# 强制删除镜像
docker rmi -f nginx:latest

# 删除所有未使用的镜像
docker image prune
docker image prune -a  # 删除所有未被容器使用的镜像

2.3 构建镜像

1
2
3
4
5
6
7
8
9
# 从 Dockerfile 构建镜像
docker build -t myapp:latest .
docker build -t myapp:v1.0 -f Dockerfile.prod .

# 构建时传递参数
docker build --build-arg VERSION=1.0 -t myapp:latest .

# 不使用缓存构建
docker build --no-cache -t myapp:latest .

2.4 标记和推送镜像

1
2
3
4
5
6
7
# 给镜像打标签
docker tag myapp:latest username/myapp:latest
docker tag myapp:latest registry.example.com/myapp:v1.0

# 推送镜像到仓库
docker push username/myapp:latest
docker push registry.example.com/myapp:v1.0

2.5 保存和加载镜像

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 将镜像保存为 tar 文件
docker save -o myapp.tar myapp:latest
docker save myapp:latest > myapp.tar

# 从 tar 文件加载镜像
docker load -i myapp.tar
docker load < myapp.tar

# 导出容器为镜像
docker export container_name > container.tar

# 从导出文件创建镜像
docker import container.tar myapp:imported

3. 容器管理命令

3.1 运行容器

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# 基本运行
docker run nginx

# 后台运行
docker run -d nginx

# 交互式运行
docker run -it ubuntu:20.04 /bin/bash

# 指定容器名称
docker run --name my-nginx -d nginx

# 端口映射
docker run -d -p 8080:80 nginx
docker run -d -p 127.0.0.1:8080:80 nginx

# 环境变量
docker run -d -e MYSQL_ROOT_PASSWORD=password mysql:8.0

# 挂载数据卷
docker run -d -v /host/path:/container/path nginx
docker run -d -v my-volume:/var/lib/mysql mysql:8.0

# 网络设置
docker run -d --network my-network nginx

# 资源限制
docker run -d --memory=512m --cpus=1.0 nginx

# 自动重启
docker run -d --restart=always nginx
docker run -d --restart=unless-stopped nginx

# 完整示例
docker run -d \\
  --name my-app \\
  -p 8080:80 \\
  -e ENV=production \\
  -v /host/data:/app/data \\
  --restart=unless-stopped \\
  --memory=1g \\
  --cpus=2.0 \\
  myapp:latest

3.2 查看和管理容器

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
# 列出运行中的容器
docker ps

# 列出所有容器(包括停止的)
docker ps -a

# 查看容器详细信息
docker inspect container_name

# 查看容器日志
docker logs container_name
docker logs -f container_name  # 实时查看
docker logs --tail 100 container_name  # 查看最后100行
docker logs --since 2023-01-01 container_name  # 查看指定时间后的日志

# 查看容器进程
docker top container_name

# 查看容器资源使用情况
docker stats
docker stats container_name

3.3 容器操作

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 启动容器
docker start container_name

# 停止容器
docker stop container_name
docker stop -t 30 container_name  # 30秒后强制停止

# 重启容器
docker restart container_name

# 暂停和恢复容器
docker pause container_name
docker unpause container_name

# 强制杀死容器
docker kill container_name
docker kill -s SIGTERM container_name

# 删除容器
docker rm container_name
docker rm -f container_name  # 强制删除运行中的容器

# 删除所有停止的容器
docker container prune

3.4 进入容器

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 进入运行中的容器
docker exec -it container_name /bin/bash
docker exec -it container_name /bin/sh

# 以指定用户身份进入
docker exec -it -u root container_name /bin/bash

# 在容器中执行命令
docker exec container_name ls -la
docker exec -d container_name touch /tmp/test.txt

# 附加到容器(不推荐)
docker attach container_name

3.5 容器文件操作

1
2
3
4
5
6
7
8
# 从容器复制文件到主机
docker cp container_name:/path/to/file /host/path/

# 从主机复制文件到容器
docker cp /host/path/file container_name:/path/to/

# 复制目录
docker cp container_name:/app/logs/ ./logs/

4. 网络管理命令

4.1 网络基础操作

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 列出网络
docker network ls

# 查看网络详细信息
docker network inspect bridge

# 创建网络
docker network create my-network
docker network create --driver bridge my-bridge
docker network create --driver overlay my-overlay

# 创建自定义网络
docker network create \\
  --driver bridge \\
  --subnet=172.20.0.0/16 \\
  --ip-range=172.20.240.0/20 \\
  --gateway=172.20.0.1 \\
  my-custom-network

# 删除网络
docker network rm my-network

# 清理未使用的网络
docker network prune

4.2 容器网络连接

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 将容器连接到网络
docker network connect my-network container_name

# 断开容器网络连接
docker network disconnect my-network container_name

# 运行容器时指定网络
docker run -d --network my-network nginx

# 指定容器在网络中的IP
docker run -d --network my-network --ip 172.20.0.10 nginx

5. 数据卷管理命令

5.1 数据卷操作

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 列出数据卷
docker volume ls

# 创建数据卷
docker volume create my-volume

# 查看数据卷详细信息
docker volume inspect my-volume

# 删除数据卷
docker volume rm my-volume

# 清理未使用的数据卷
docker volume prune

5.2 使用数据卷

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# 挂载命名数据卷
docker run -d -v my-volume:/var/lib/mysql mysql:8.0

# 挂载主机目录
docker run -d -v /host/path:/container/path nginx

# 只读挂载
docker run -d -v /host/path:/container/path:ro nginx

# 使用 --mount 语法(推荐)
docker run -d \\
  --mount type=volume,source=my-volume,target=/var/lib/mysql \\
  mysql:8.0

docker run -d \\
  --mount type=bind,source=/host/path,target=/container/path,readonly \\
  nginx

6. Docker Compose 命令

6.1 基础操作

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 启动服务
docker-compose up
docker-compose up -d  # 后台运行

# 停止服务
docker-compose down
docker-compose down -v  # 同时删除数据卷

# 查看服务状态
docker-compose ps

# 查看日志
docker-compose logs
docker-compose logs -f service_name

# 重启服务
docker-compose restart
docker-compose restart service_name

# 构建镜像
docker-compose build
docker-compose build --no-cache

# 拉取镜像
docker-compose pull

# 执行命令
docker-compose exec service_name /bin/bash

# 运行一次性命令
docker-compose run service_name command

# 扩展服务
docker-compose up --scale web=3

6.2 配置和验证

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 验证配置文件
docker-compose config

# 查看配置
docker-compose config --services
docker-compose config --volumes

# 使用指定配置文件
docker-compose -f docker-compose.prod.yml up

# 使用多个配置文件
docker-compose -f docker-compose.yml -f docker-compose.override.yml up

7. 系统信息和清理命令

7.1 系统信息

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 查看 Docker 系统信息
docker system info

# 查看磁盘使用情况
docker system df
docker system df -v  # 详细信息

# 查看系统事件
docker system events
docker system events --since 2023-01-01

7.2 系统清理

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 清理系统(删除未使用的容器、网络、镜像等)
docker system prune
docker system prune -a  # 包括未使用的镜像
docker system prune -f  # 强制清理,不询问

# 分别清理不同资源
docker container prune  # 清理停止的容器
docker image prune      # 清理未使用的镜像
docker network prune    # 清理未使用的网络
docker volume prune     # 清理未使用的数据卷

# 清理所有资源
docker system prune -a --volumes

8. 实用技巧和最佳实践

8.1 常用组合命令

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
# 停止所有容器
docker stop $(docker ps -q)

# 删除所有容器
docker rm $(docker ps -aq)

# 删除所有镜像
docker rmi $(docker images -q)

# 删除悬空镜像
docker rmi $(docker images -f \"dangling=true\" -q)

# 查看容器IP地址
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name

# 查看容器端口映射
docker port container_name

# 实时监控容器资源使用
watch docker stats

8.2 Dockerfile 最佳实践

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 使用官方基础镜像
FROM node:16-alpine

# 设置工作目录
WORKDIR /app

# 复制依赖文件并安装(利用缓存)
COPY package*.json ./
RUN npm ci --only=production

# 复制应用代码
COPY . .

# 创建非root用户
RUN addgroup -g 1001 -S nodejs
RUN adduser -S nextjs -u 1001
USER nextjs

# 暴露端口
EXPOSE 3000

# 健康检查
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \\
  CMD curl -f http://localhost:3000/health || exit 1

# 启动命令
CMD [\"npm\", \"start\"]

8.3 安全建议

  1. 不要以 root 用户运行容器
1
docker run -u 1000:1000 myapp
  1. 限制容器资源
1
docker run --memory=512m --cpus=1.0 myapp
  1. 使用只读文件系统
1
docker run --read-only --tmpfs /tmp myapp
  1. 扫描镜像漏洞
1
docker scan myapp:latest

8.4 调试技巧

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 查看容器启动失败原因
docker logs container_name

# 进入容器调试
docker run -it --entrypoint /bin/bash myapp:latest

# 查看容器文件系统变化
docker diff container_name

# 创建容器但不启动
docker create --name debug-container myapp:latest

# 从失败的容器创建镜像
docker commit container_name debug-image:latest

8.5 性能优化

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# 使用多阶段构建减小镜像大小
# 在 Dockerfile 中
FROM node:16 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build

FROM node:16-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
CMD [\"node\", \"dist/index.js\"]

# 使用 .dockerignore 文件
echo \"node_modules\\n.git\\n*.log\" > .dockerignore

9. 注意事项

  • 始终使用具体的镜像标签而不是 latest
  • 定期清理未使用的资源以节省磁盘空间
  • 使用 Docker Compose 管理多容器应用
  • 遵循安全最佳实践,不要以 root 用户运行容器
  • 利用多阶段构建优化镜像大小