本文整理了Docker的常用命令、参数和使用场景,方便快速查阅和使用。

Docker常用命令

镜像命令

列出所有镜像

1
docker images

搜索镜像

1
docker search 镜像名

拉取镜像

1
docker pull 镜像名

容器命令

列出所有容器

1
docker ps -a

运行容器

1
docker run -d --name 容器名 镜像名

启动容器

1
docker start 容器名

停止容器

1
docker stop 容器名

删除容器

1
docker rm 容器名

网络命令

列出所有网络

1
docker network ls

创建网络

1
docker network create 网络名

删除网络

1
docker network rm 网络名

数据卷命令

列出所有数据卷

1
docker volume ls

创建数据卷

1
docker volume create 数据卷名

删除数据卷

1
docker volume rm 数据卷名

其他命令

查看容器日志

1
docker logs 容器名

进入容器

1
docker exec -it 容器名 bash

查看容器端口映射

1
docker port 容器名

查看容器资源占用情况

1
docker stats 容器名

系统命令

查看Docker版本

1
docker version

查看Docker信息

1
docker info

清理未使用的资源

1
docker system prune

Dockerfile指令

FROM

指定基础镜像

1
FROM ubuntu:20.04

WORKDIR

设置工作目录

1
WORKDIR /app

COPY

复制文件到容器

1
COPY . /app

ADD

复制文件到容器(支持URL和自动解压)

1
ADD https://example.com/file.tar.gz /app/

RUN

执行命令

1
RUN apt-get update && apt-get install -y nodejs

ENV

设置环境变量

1
ENV NODE_ENV=production

EXPOSE

声明容器监听的端口

1
EXPOSE 8080

CMD

容器启动时执行的命令

1
CMD ["node", "app.js"]

ENTRYPOINT

容器启动时执行的命令(不可被覆盖)

1
ENTRYPOINT ["node", "app.js"]

VOLUME

声明数据卷

1
VOLUME ["/data"]

Docker Compose命令

启动服务

1
docker-compose up -d

停止服务

1
docker-compose down

查看服务状态

1
docker-compose ps

查看服务日志

1
docker-compose logs -f

重新构建服务

1
docker-compose build

Docker Compose配置示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
version: '3'

services:
web:
build: .
ports:
- "8080:80"
volumes:
- ./app:/app
depends_on:
- db
environment:
- NODE_ENV=development

db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=myapp

volumes:
db_data:

常用运行参数

端口映射

1
docker run -p 8080:80 nginx

挂载数据卷

1
docker run -v /host/path:/container/path nginx

设置环境变量

1
docker run -e MYSQL_ROOT_PASSWORD=root mysql

限制资源

1
docker run --memory="512m" --cpus="0.5" nginx

网络设置

1
docker run --network=my-network nginx

实用案例

运行MySQL容器

1
2
3
4
5
6
7
docker run -d \
--name mysql \
-p 3306:3306 \
-v mysql_data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-e MYSQL_DATABASE=myapp \
mysql:5.7

运行Nginx容器

1
2
3
4
5
6
docker run -d \
--name nginx \
-p 80:80 \
-v $(pwd)/html:/usr/share/nginx/html \
-v $(pwd)/nginx.conf:/etc/nginx/nginx.conf \
nginx

运行Redis容器

1
2
3
4
5
6
docker run -d \
--name redis \
-p 6379:6379 \
-v redis_data:/data \
redis \
redis-server --appendonly yes

Docker镜像构建与发布

构建镜像

1
docker build -t myapp:1.0 .

标记镜像

1
docker tag myapp:1.0 username/myapp:1.0

推送镜像到Docker Hub

1
docker push username/myapp:1.0

保存镜像到文件

1
docker save -o myapp.tar myapp:1.0

从文件加载镜像

1
docker load -i myapp.tar

常见问题与解决方案

容器无法启动

检查日志:

1
docker logs 容器名

容器内存占用过高

限制内存:

1
docker update --memory="512m" 容器名

容器网络连接问题

检查网络配置:

1
docker network inspect 网络名

数据卷权限问题

修改权限:

1
docker exec -it 容器名 chmod -R 777 /data

Docker安全最佳实践

  1. 使用官方镜像或可信镜像
  2. 定期更新基础镜像
  3. 使用非root用户运行容器
  4. 限制容器资源使用
  5. 使用只读文件系统
  6. 扫描镜像漏洞
  7. 使用安全网络配置

Docker多阶段构建

多阶段构建可以显著减小最终镜像的大小,特别适合编译型语言。

1
2
3
4
5
6
7
8
9
10
11
12
# 构建阶段
FROM golang:1.16 AS builder
WORKDIR /app
COPY . .
RUN go build -o main .

# 运行阶段
FROM alpine:3.14
WORKDIR /app
COPY --from=builder /app/main .
EXPOSE 8080
CMD ["./main"]

Docker健康检查

在Dockerfile中添加健康检查:

1
2
HEALTHCHECK --interval=30s --timeout=3s \
CMD curl -f http://localhost/ || exit 1

在Docker Compose中添加健康检查:

1
2
3
4
5
6
7
8
services:
web:
image: nginx
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost/"]
interval: 30s
timeout: 3s
retries: 3

Docker网络模式

Bridge模式(默认)

1
docker run --network=bridge nginx

Host模式(共享主机网络)

1
docker run --network=host nginx

None模式(无网络)

1
docker run --network=none nginx

Container模式(共享其他容器网络)

1
docker run --network=container:容器名 nginx

Docker Swarm集群

初始化Swarm

1
docker swarm init --advertise-addr <IP地址>

加入Swarm集群

1
docker swarm join --token <token> <IP地址:端口>

部署服务

1
docker service create --name web --replicas 3 -p 80:80 nginx

查看服务

1
docker service ls

扩展服务

1
docker service scale web=5

Docker与CI/CD集成

GitHub Actions示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
name: Docker CI/CD

on:
push:
branches: [ main ]

jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2

- name: Build and push Docker image
uses: docker/build-push-action@v2
with:
context: .
push: true
tags: username/app:latest

Jenkins Pipeline示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
pipeline {
agent any
stages {
stage('Build') {
steps {
sh 'docker build -t myapp:${BUILD_NUMBER} .'
}
}
stage('Deploy') {
steps {
sh 'docker stop myapp || true'
sh 'docker rm myapp || true'
sh 'docker run -d --name myapp -p 80:80 myapp:${BUILD_NUMBER}'
}
}
}
}

Docker监控工具

Prometheus + Grafana

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
version: '3'

services:
prometheus:
image: prom/prometheus
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
ports:
- "9090:9090"

grafana:
image: grafana/grafana
ports:
- "3000:3000"
depends_on:
- prometheus

cAdvisor

1
2
3
4
5
6
7
8
9
docker run \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:ro \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--publish=8080:8080 \
--detach=true \
--name=cadvisor \
google/cadvisor:latest

Docker备份与恢复

备份容器

1
docker commit 容器名 备份镜像名

备份数据卷

1
docker run --rm -v 数据卷名:/volume -v $(pwd):/backup alpine tar -czvf /backup/volume_backup.tar.gz /volume

恢复数据卷

1
docker run --rm -v 数据卷名:/volume -v $(pwd):/backup alpine sh -c "cd /volume && tar -xzvf /backup/volume_backup.tar.gz --strip 1"

Docker性能优化技巧

  1. 使用轻量级基础镜像(如Alpine)
  2. 合并RUN指令减少镜像层数
  3. 使用.dockerignore排除不必要文件
  4. 清理缓存和临时文件
  5. 合理设置资源限制
  6. 使用多阶段构建
  7. 优化Dockerfile指令顺序(频繁变动的放后面)