本文整理了Docker的常用命令、参数和使用场景,方便快速查阅和使用。
Docker常用命令
镜像命令
列出所有镜像
docker images
搜索镜像
docker search 镜像名
拉取镜像
docker pull 镜像名
容器命令
列出所有容器
docker ps -a
运行容器
docker run -d --name 容器名 镜像名
启动容器
docker start 容器名
停止容器
docker stop 容器名
删除容器
docker rm 容器名
网络命令
列出所有网络
docker network ls
创建网络
docker network create 网络名
删除网络
docker network rm 网络名
数据卷命令
列出所有数据卷
docker volume ls
创建数据卷
docker volume create 数据卷名
删除数据卷
docker volume rm 数据卷名
其他命令
查看容器日志
docker logs 容器名
进入容器
docker exec -it 容器名 bash
查看容器端口映射
docker port 容器名
查看容器资源占用情况
docker stats 容器名
系统命令
查看Docker版本
docker version
查看Docker信息
docker info
清理未使用的资源
docker system prune
Dockerfile指令
FROM
指定基础镜像
FROM ubuntu:20.04
WORKDIR
设置工作目录
WORKDIR /app
COPY
复制文件到容器
COPY . /app
ADD
复制文件到容器(支持URL和自动解压)
ADD https://example.com/file.tar.gz /app/
RUN
执行命令
RUN apt-get update && apt-get install -y nodejs
ENV
设置环境变量
ENV NODE_ENV=production
EXPOSE
声明容器监听的端口
EXPOSE 8080
CMD
容器启动时执行的命令
CMD ["node", "app.js"]
ENTRYPOINT
容器启动时执行的命令(不可被覆盖)
ENTRYPOINT ["node", "app.js"]
VOLUME
声明数据卷
VOLUME ["/data"]
Docker Compose命令
启动服务
docker-compose up -d
停止服务
docker-compose down
查看服务状态
docker-compose ps
查看服务日志
docker-compose logs -f
重新构建服务
docker-compose build
Docker Compose配置示例
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:
常用运行参数
端口映射
docker run -p 8080:80 nginx
挂载数据卷
docker run -v /host/path:/container/path nginx
设置环境变量
docker run -e MYSQL_ROOT_PASSWORD=root mysql
限制资源
docker run --memory="512m" --cpus="0.5" nginx
网络设置
docker run --network=my-network nginx
实用案例
运行MySQL容器
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容器
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容器
docker run -d \
--name redis \
-p 6379:6379 \
-v redis_data:/data \
redis \
redis-server --appendonly yes
Docker镜像构建与发布
构建镜像
docker build -t myapp:1.0 .
标记镜像
docker tag myapp:1.0 username/myapp:1.0
推送镜像到Docker Hub
docker push username/myapp:1.0
保存镜像到文件
docker save -o myapp.tar myapp:1.0
从文件加载镜像
docker load -i myapp.tar
常见问题与解决方案
容器无法启动
检查日志:
docker logs 容器名
容器内存占用过高
限制内存:
docker update --memory="512m" 容器名
容器网络连接问题
检查网络配置:
docker network inspect 网络名
数据卷权限问题
修改权限:
docker exec -it 容器名 chmod -R 777 /data
Docker安全最佳实践
- 使用官方镜像或可信镜像
- 定期更新基础镜像
- 使用非root用户运行容器
- 限制容器资源使用
- 使用只读文件系统
- 扫描镜像漏洞
- 使用安全网络配置
Docker多阶段构建
多阶段构建可以显著减小最终镜像的大小,特别适合编译型语言。
# 构建阶段
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中添加健康检查:
HEALTHCHECK --interval=30s --timeout=3s \
CMD curl -f http://localhost/ || exit 1
在Docker Compose中添加健康检查:
services:
web:
image: nginx
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost/"]
interval: 30s
timeout: 3s
retries: 3
Docker网络模式
Bridge模式(默认)
docker run --network=bridge nginx
Host模式(共享主机网络)
docker run --network=host nginx
None模式(无网络)
docker run --network=none nginx
Container模式(共享其他容器网络)
docker run --network=container:容器名 nginx
Docker Swarm集群
初始化Swarm
docker swarm init --advertise-addr <IP地址>
加入Swarm集群
docker swarm join --token <token> <IP地址:端口>
部署服务
docker service create --name web --replicas 3 -p 80:80 nginx
查看服务
docker service ls
扩展服务
docker service scale web=5
Docker与CI/CD集成
GitHub Actions示例
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示例
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
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
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备份与恢复
备份容器
docker commit 容器名 备份镜像名
备份数据卷
docker run --rm -v 数据卷名:/volume -v $(pwd):/backup alpine tar -czvf /backup/volume_backup.tar.gz /volume
恢复数据卷
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指令顺序(频繁变动的放后面)