本文整理了Docker的常用命令、参数和使用场景,方便快速查阅和使用。
Docker常用命令
镜像命令
列出所有镜像
搜索镜像
拉取镜像
容器命令
列出所有容器
运行容器
1
| docker run -d --name 容器名 镜像名
|
启动容器
停止容器
删除容器
网络命令
列出所有网络
创建网络
1
| docker network create 网络名
|
删除网络
数据卷命令
列出所有数据卷
创建数据卷
1
| docker volume create 数据卷名
|
删除数据卷
其他命令
查看容器日志
进入容器
1
| docker exec -it 容器名 bash
|
查看容器端口映射
查看容器资源占用情况
系统命令
查看Docker版本
查看Docker信息
清理未使用的资源
Dockerfile指令
FROM
指定基础镜像
WORKDIR
设置工作目录
COPY
复制文件到容器
ADD
复制文件到容器(支持URL和自动解压)
1
| ADD https://example.com/file.tar.gz /app/
|
RUN
执行命令
1
| RUN apt-get update && apt-get install -y nodejs
|
ENV
设置环境变量
EXPOSE
声明容器监听的端口
CMD
容器启动时执行的命令
ENTRYPOINT
容器启动时执行的命令(不可被覆盖)
1
| ENTRYPOINT ["node", "app.js"]
|
VOLUME
声明数据卷
Docker Compose命令
启动服务
停止服务
查看服务状态
查看服务日志
重新构建服务
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 update --memory="512m" 容器名
|
容器网络连接问题
检查网络配置:
1
| docker network inspect 网络名
|
数据卷权限问题
修改权限:
1
| docker exec -it 容器名 chmod -R 777 /data
|
Docker安全最佳实践
- 使用官方镜像或可信镜像
- 定期更新基础镜像
- 使用非root用户运行容器
- 限制容器资源使用
- 使用只读文件系统
- 扫描镜像漏洞
- 使用安全网络配置
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 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 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性能优化技巧
- 使用轻量级基础镜像(如Alpine)
- 合并RUN指令减少镜像层数
- 使用.dockerignore排除不必要文件
- 清理缓存和临时文件
- 合理设置资源限制
- 使用多阶段构建
- 优化Dockerfile指令顺序(频繁变动的放后面)