Docker

本文整理了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安全最佳实践

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

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性能优化技巧

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