Docker 从入门到放弃:完整指南

#记录下docker中的常规命令,以及使用方式,方便以后使用和观看#

一、Docker 基础概念

什么是Docker?

Docker 是一个容器化平台,可以将应用程序及其依赖打包到轻量级、可移植的容器中,在任何环境中都能一致运行。

核心概念
概念 说明 类比
**镜像(Image)**​ 只读模板,包含运行应用所需的一切 类(Class)
**容器(Container)**​ 镜像的运行实例 对象(Object)
**仓库(Registry)**​ 存储和分发镜像的地方 应用商店
Dockerfile 构建镜像的脚本文件 构建说明书
Volume 数据卷,持久化数据存储 移动硬盘
Network 容器网络,容器间通信 虚拟局域网

二、Docker 安装与配置

1. 安装 Docker
bash 复制代码
# Ubuntu/Debian
sudo apt update
sudo apt install docker.io
sudo systemctl start docker
sudo systemctl enable docker

# CentOS/RHEL
sudo yum install docker
sudo systemctl start docker
sudo systemctl enable docker

# 一键安装脚本(Linux)
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

# Windows/Mac
# 下载 Docker Desktop 安装包
# https://www.docker.com/products/docker-desktop
2. 验证安装
bash 复制代码
# 检查版本
docker --version
docker-compose --version
docker info

# 运行测试容器
docker run hello-world
3. 配置 Docker(可选)
bash 复制代码
# 添加用户到docker组(避免每次用sudo)
sudo usermod -aG docker $USER
# 需要重新登录生效

# 配置镜像加速器(中国用户)
# 创建或修改 /etc/docker/daemon.json
{
  "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn",
    "https://hub-mirror.c.163.com"
  ]
}
sudo systemctl restart docker

三、Docker 基础命令

1. 镜像管理
bash 复制代码
# 搜索镜像
docker search nginx
docker search --filter stars=1000 nginx
docker search --filter is-official=true nginx

# 拉取镜像
docker pull nginx                    # 拉取最新版
docker pull nginx:1.21              # 拉取指定版本
docker pull alpine:latest           # 小体积Linux镜像
docker pull mysql:8.0
docker pull redis:alpine

# 列出镜像
docker images                        # 本地镜像列表
docker image ls                      # 同上
docker images -a                     # 包括中间层镜像
docker images --no-trunc             # 完整ID显示
docker images --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}"
docker images -q                     # 只显示镜像ID

# 镜像详细信息
docker image inspect nginx           # 查看镜像详细信息
docker image history nginx           # 查看镜像构建历史
docker image inspect nginx | grep -i size  # 查看镜像大小

# 删除镜像
docker rmi nginx                    # 删除镜像
docker rmi nginx:1.21               # 删除指定版本
docker rmi $(docker images -q)      # 删除所有镜像
docker image prune                  # 删除悬空镜像(无标签)
docker image prune -a               # 删除所有未使用的镜像
docker rmi -f nginx                 # 强制删除(即使有容器)

# 镜像标签
docker tag nginx mynginx:v1         # 给镜像打标签
docker tag nginx:latest myrepo/nginx:prod  # 推送到仓库前打标签

# 导出导入
docker save nginx > nginx.tar       # 导出镜像为tar文件
docker load < nginx.tar             # 从tar文件导入镜像
docker save -o nginx.tar nginx      # 另一种写法

# 保存为压缩包
docker save nginx:latest | gzip > nginx.tar.gz
2. 容器管理
bash 复制代码
# 运行容器
docker run nginx                     # 运行容器
docker run -d nginx                  # 后台运行
docker run -it nginx bash           # 交互式运行
docker run --name mynginx nginx     # 指定容器名称
docker run --rm nginx               # 退出后自动删除
docker run -p 8080:80 nginx         # 端口映射
docker run -v /data:/app nginx      # 挂载数据卷
docker run -e ENV=value nginx       # 设置环境变量

# 容器列表
docker ps                           # 运行中的容器
docker ps -a                        # 所有容器(包括已停止)
docker ps -l                        # 最近创建的容器
docker ps -n 5                      # 最近创建的5个容器
docker ps -q                        # 只显示容器ID
docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Status}}"
docker ps --filter status=running   # 过滤运行中的
docker ps --filter status=exited    # 过滤已停止的
docker ps --filter name=mynginx     # 按名称过滤
docker ps -f ancestor=nginx         # 使用nginx镜像的容器

# 启动/停止/重启容器
docker start mynginx                # 启动容器
docker stop mynginx                 # 停止容器
docker restart mynginx              # 重启容器
docker kill mynginx                 # 强制停止
docker pause mynginx                # 暂停容器
docker unpause mynginx              # 恢复容器
docker wait mynginx                 # 等待容器停止

# 进入容器
docker exec -it mynginx bash        # 进入运行中的容器
docker exec -it mynginx sh          # 如果bash不存在,用sh
docker exec -it mynginx /bin/bash   # 同上
docker exec -u root mynginx bash    # 以root用户进入
docker exec -e VAR=value mynginx bash  # 带环境变量进入
docker exec mynginx ls -la          # 在容器内执行命令

# 容器日志
docker logs mynginx                 # 查看容器日志
docker logs -f mynginx              # 实时查看日志
docker logs --tail 100 mynginx      # 查看最后100行
docker logs --since 10m mynginx     # 查看10分钟内的日志
docker logs -t mynginx              # 显示时间戳
docker logs --details mynginx       # 显示详细信息

# 容器操作
docker rename oldname newname       # 重命名容器
docker update --memory 512m mynginx # 更新容器配置
docker top mynginx                  # 查看容器内进程
docker stats mynginx                # 查看容器资源使用
docker stats                        # 查看所有容器资源使用
docker stats --no-stream           # 一次性显示资源使用

# 删除容器
docker rm mynginx                   # 删除已停止的容器
docker rm -f mynginx                # 强制删除(运行中的)
docker rm $(docker ps -aq)         # 删除所有停止的容器
docker container prune             # 删除所有停止的容器
docker rm -v mynginx               # 删除容器及相关卷
docker rm -f $(docker ps -aq)      # 强制删除所有容器

# 容器信息
docker inspect mynginx              # 查看容器详细信息
docker inspect --format='{{.NetworkSettings.IPAddress}}' mynginx  # 获取IP
docker inspect --format='{{.State.Status}}' mynginx  # 获取状态
docker diff mynginx                 # 查看容器文件变化
docker port mynginx                 # 查看端口映射
3. 容器生命周期管理
bash 复制代码
# 创建但不启动
docker create --name mynginx nginx
docker create -it --name myalpine alpine sh

# 运行容器(完整示例)
docker run -d \
  --name myweb \
  --hostname myweb \
  -p 80:80 \
  -p 443:443 \
  -v /data:/var/www/html \
  -e MYSQL_HOST=db \
  --memory="512m" \
  --cpus="0.5" \
  --restart=always \
  nginx:alpine

# 复制文件
docker cp file.txt mynginx:/app/file.txt    # 本地→容器
docker cp mynginx:/app/file.txt ./file.txt  # 容器→本地
docker cp mynginx:/app ./app-backup        # 复制整个目录

# 导出导入容器
docker export mynginx > nginx-container.tar
cat nginx-container.tar | docker import - mynginx:backup
docker import http://example.com/exampleimage.tgz

四、Dockerfile 详解

1. Dockerfile 指令
bash 复制代码
# 基础指令
FROM ubuntu:20.04                    # 基础镜像
MAINTAINER Your Name <email@example.com>  # 维护者
LABEL version="1.0" description="My App"  # 标签

# 构建指令
RUN apt update && apt install -y nginx  # 执行命令
RUN ["/bin/bash", "-c", "echo hello"]   # exec格式
WORKDIR /app                          # 工作目录
ADD ./app.tar.gz /app                 # 添加文件(自动解压)
COPY ./app /app                       # 复制文件
COPY --from=0 /app/build /app         # 多阶段构建复制

# 环境配置
ENV NODE_ENV production              # 环境变量
ENV APP_HOME=/app \
    USER=appuser
ARG BUILD_VERSION=1.0                # 构建参数
EXPOSE 80 443                        # 暴露端口
VOLUME ["/data"]                     # 数据卷

# 运行时指令
USER appuser                         # 运行用户
CMD ["nginx", "-g", "daemon off;"]  # 容器启动命令
ENTRYPOINT ["docker-entrypoint.sh"] # 入口点
HEALTHCHECK --interval=30s CMD curl -f http://localhost/ || exit 1

# ONBUILD
ONBUILD ADD . /app                   # 触发指令
2. Dockerfile 最佳实践示例
bash 复制代码
# 多阶段构建示例
# 第一阶段:构建阶段
FROM node:16 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build

# 第二阶段:运行阶段
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
3. 构建镜像
bash 复制代码
# 基本构建
docker build .                      # 使用当前目录Dockerfile
docker build -t myapp:1.0 .        # 指定标签
docker build -f Dockerfile.dev .   # 指定Dockerfile文件

# 构建参数
docker build --build-arg VERSION=1.0 .
docker build --no-cache .          # 不使用缓存
docker build --pull .              # 总是尝试拉取新基础镜像
docker build --progress=plain .    # 明文输出构建过程
docker build --target builder .    # 多阶段构建指定阶段

# 构建上下文优化
# .dockerignore 文件内容
.git
node_modules
*.log
Dockerfile
*.md

五、Docker Compose 详解

1. docker-compose.yml 结构
bash 复制代码
version: '3.8'  # 指定版本

services:  # 定义服务
  web:     # 服务名称
    image: nginx:alpine
    container_name: my-nginx
    build: .  # 从Dockerfile构建
    ports:
      - "80:80"
      - "443:443"
    environment:
      - NODE_ENV=production
      - DATABASE_URL=postgres://user:pass@db:5432/db
    env_file:
      - .env
    volumes:
      - ./html:/usr/share/nginx/html
      - nginx_data:/etc/nginx
    networks:
      - frontend
      - backend
    depends_on:
      - db
      - redis
    restart: always
    command: nginx -g "daemon off;"
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost"]
      interval: 30s
      timeout: 10s
      retries: 3
    
  db:
    image: postgres:13
    environment:
      POSTGRES_PASSWORD: secret
      POSTGRES_DB: mydb
    volumes:
      - postgres_data:/var/lib/postgresql/data
    networks:
      - backend
    
  redis:
    image: redis:alpine
    command: redis-server --appendonly yes
    volumes:
      - redis_data:/data
    networks:
      - backend

volumes:  # 数据卷定义
  nginx_data:
  postgres_data:
  redis_data:

networks:  # 网络定义
  frontend:
    driver: bridge
  backend:
    driver: bridge
2. Docker Compose 命令
bash 复制代码
# 启动服务
docker-compose up                    # 启动所有服务
docker-compose up -d                 # 后台启动
docker-compose up web               # 只启动web服务
docker-compose up --build           # 重新构建镜像
docker-compose up --force-recreate  # 强制重建容器
docker-compose up --scale web=3     # 扩展web服务到3个实例

# 停止服务
docker-compose down                 # 停止并删除容器
docker-compose down -v              # 停止并删除容器和卷
docker-compose stop                 # 停止服务
docker-compose pause                # 暂停服务
docker-compose unpause              # 恢复服务

# 管理服务
docker-compose ps                   # 查看服务状态
docker-compose logs                 # 查看所有服务日志
docker-compose logs -f web         # 实时查看web服务日志
docker-compose logs --tail=100     # 查看最后100行日志
docker-compose exec web bash       # 进入web服务容器
docker-compose exec db psql -U postgres  # 执行命令

# 构建和配置
docker-compose build               # 构建镜像
docker-compose build --no-cache    # 不使用缓存构建
docker-compose config              # 验证配置文件
docker-compose config --services   # 列出所有服务
docker-compose config --volumes    # 列出所有卷

# 其他命令
docker-compose restart             # 重启服务
docker-compose kill                # 强制停止
docker-compose rm                  # 删除已停止的容器
docker-compose pull                # 拉取镜像
docker-compose push                # 推送镜像
docker-compose images              # 列出使用的镜像
docker-compose top                 # 显示运行进程
docker-compose run web bash        # 运行一次性命令

六、Docker 数据管理

1. 数据卷(Volumes)
bash 复制代码
# 创建和管理卷
docker volume create myvolume       # 创建卷
docker volume ls                    # 列出所有卷
docker volume inspect myvolume     # 查看卷详细信息
docker volume rm myvolume          # 删除卷
docker volume prune                # 删除未使用的卷

# 使用卷
docker run -v myvolume:/app/data nginx      # 挂载卷
docker run --mount source=myvolume,target=/app/data nginx
docker run -v /host/path:/container/path nginx  # 绑定挂载

# 卷备份和恢复
# 备份
docker run --rm -v myvolume:/data -v $(pwd):/backup alpine \
  tar czf /backup/backup.tar.gz -C /data .

# 恢复
docker run --rm -v myvolume:/data -v $(pwd):/backup alpine \
  tar xzf /backup/backup.tar.gz -C /data
2. 数据持久化最佳实践
bash 复制代码
# docker-compose.yml 示例
version: '3.8'
services:
  db:
    image: mysql:8.0
    volumes:
      - mysql_data:/var/lib/mysql
      - ./conf.d:/etc/mysql/conf.d:ro
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql:ro
    environment:
      MYSQL_ROOT_PASSWORD: rootpass
      MYSQL_DATABASE: mydb

volumes:
  mysql_data:
    driver: local
    driver_opts:
      type: none
      device: /data/mysql
      o: bind

七、Docker 网络

1. 网络管理命令
bash 复制代码
# 网络列表
docker network ls                    # 列出网络
docker network inspect bridge        # 查看网络详情
docker network inspect --format='{{range .Containers}}{{.Name}} {{end}}' bridge

# 创建和管理网络
docker network create mynet         # 创建网络
docker network create --driver bridge mybridge
docker network create --subnet 172.20.0.0/16 --gateway 172.20.0.1 mynet
docker network create --internal my-internal-net  # 内部网络
docker network rm mynet             # 删除网络
docker network prune                # 删除未使用的网络
docker network connect mynet mycontainer  # 连接容器到网络
docker network disconnect mynet mycontainer  # 断开连接

# 容器网络配置
docker run --network=host nginx     # 使用主机网络
docker run --network=none nginx     # 不使用网络
docker run --network=bridge nginx   # 使用桥接网络(默认)
docker run --network=mynet nginx    # 使用自定义网络
docker run --dns 8.8.8.8 nginx      # 自定义DNS
docker run --add-host hostname:ip nginx  # 添加hosts记录
2. 网络模式对比
模式 说明 隔离性 性能
bridge 默认模式,容器有独立IP 中等
host 使用主机网络栈 最好
none 无网络 完全隔离 N/A
container 共享另一个容器的网络 最好
overlay Swarm集群网络 中等
macvlan MAC地址虚拟网络 最好

八、Docker 高级特性

1. 容器资源限制
bash 复制代码
# CPU限制
docker run --cpus=0.5 nginx        # 最多使用0.5个CPU核心
docker run --cpus=".5" nginx        # 同上
docker run --cpus=2 nginx          # 最多使用2个CPU核心
docker run --cpu-period=100000 --cpu-quota=50000 nginx  # 更细粒度控制

# 内存限制
docker run -m 512m nginx           # 内存限制为512MB
docker run --memory=1g nginx       # 内存限制为1GB
docker run --memory-reservation=256m nginx  # 内存软限制
docker run --memory-swap=1g nginx  # 内存+交换分区限制
docker run --oom-kill-disable nginx  # 禁用OOM Killer

# 其他限制
docker run --pids-limit 100 nginx  # 进程数限制
docker run --ulimit nofile=1024:1024 nginx  # 文件描述符限制
docker run --device-read-bps /dev/sda:1mb nginx  # 设备读取速度
docker run --device-write-iops /dev/sda:100 nginx  # 设备写入IOPS
2. 容器健康检查
bash 复制代码
# 运行带健康检查的容器
docker run \
  --name myapp \
  --health-cmd "curl -f http://localhost/ || exit 1" \
  --health-interval 30s \
  --health-timeout 10s \
  --health-retries 3 \
  --health-start-period 5s \
  nginx

# 查看健康状态
docker inspect --format='{{.State.Health.Status}}' myapp
docker inspect myapp | grep -A 10 "Health"
3. 多阶段构建实战
bash 复制代码
# 第一阶段:构建Go应用
FROM golang:1.19 AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o app .

# 第二阶段:运行应用
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /app/app .
EXPOSE 8080
CMD ["./app"]

# 第三阶段:测试(可选)
FROM alpine:latest AS tester
COPY --from=builder /app/app .
RUN ./app --version

九、Docker 集群与编排

1. Docker Swarm
bash 复制代码
# 初始化Swarm
docker swarm init                     # 初始化Swarm
docker swarm init --advertise-addr 192.168.1.100
docker swarm join-token manager       # 显示管理节点加入令牌
docker swarm join-token worker        # 显示工作节点加入令牌

# 节点管理
docker node ls                        # 查看节点列表
docker node promote <node-id>        # 升级为管理节点
docker node demote <node-id>         # 降级为工作节点
docker node update --availability drain <node-id>  # 排空节点
docker node ps <node-id>              # 查看节点上运行的任务
docker node inspect <node-id>         # 查看节点详情

# 服务管理
docker service create --name web --replicas 3 -p 80:80 nginx
docker service ls                     # 查看服务列表
docker service ps web                 # 查看服务任务
docker service scale web=5            # 扩展服务实例数
docker service update --image nginx:latest web
docker service update --force --update-parallelism 2 web
docker service logs web               # 查看服务日志
docker service rm web                 # 删除服务

# 网络
docker network create --driver overlay mynet
docker service create --network mynet --name myapp nginx

# 配置和密钥
echo "myconfig" | docker config create myconfig -
docker service create --config myconfig nginx
echo "secret" | docker secret create mysecret -
docker service create --secret mysecret nginx
2. 编排示例
bash 复制代码
# docker-stack.yml
version: '3.8'
services:
  web:
    image: nginx:alpine
    ports:
      - "80:80"
    deploy:
      replicas: 3
      update_config:
        parallelism: 2
        delay: 10s
      restart_policy:
        condition: on-failure
        delay: 5s
      resources:
        limits:
          cpus: '0.5'
          memory: 512M
    networks:
      - webnet

  visualizer:
    image: dockersamples/visualizer:stable
    ports:
      - "8080:8080"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    deploy:
      placement:
        constraints: [node.role == manager]
    networks:
      - webnet

networks:
  webnet:
    driver: overlay
3. 部署和管理
bash 复制代码
# 部署应用栈
docker stack deploy -c docker-stack.yml myapp
docker stack services myapp          # 查看服务
docker stack ps myapp                # 查看任务
docker stack rm myapp                # 删除应用栈
docker stack ls                      # 查看所有应用栈

# 滚动更新
docker service update \
  --image nginx:1.21 \
  --update-parallelism 2 \
  --update-delay 10s \
  web

十、Docker 安全最佳实践

1. 安全配置
bash 复制代码
# 以非root用户运行
docker run -u 1000:1000 nginx
# Dockerfile中
USER 1000

# 只读文件系统
docker run --read-only nginx
docker run --read-only --tmpfs /tmp nginx

# 安全选项
docker run --security-opt=no-new-privileges nginx
docker run --cap-drop=ALL --cap-add=NET_BIND_SERVICE nginx
docker run --security-opt="apparmor=docker-default" nginx
docker run --security-opt="seccomp=unconfined" nginx

# 资源限制
docker run --memory=256m --cpus=0.5 nginx
docker run --pids-limit 100 nginx
2. 镜像安全扫描
bash 复制代码
# 使用Trivy扫描镜像
trivy image nginx:latest
trivy image --severity HIGH,CRITICAL nginx:latest
trivy image --format json nginx:latest

# 使用Docker Bench Security
docker run -it --net host --pid host --userns host --cap-add audit_control \
  -e DOCKER_CONTENT_TRUST=1 \
  -v /var/lib:/var/lib \
  -v /var/run/docker.sock:/var/run/docker.sock \
  --label docker_bench_security \
  docker/docker-bench-security

# 内容信任
export DOCKER_CONTENT_TRUST=1
docker pull nginx:latest
docker push myrepo/myimage:latest

十一、Docker 实战项目

1. 单页应用部署
bash 复制代码
# docker-compose.yml
version: '3.8'
services:
  frontend:
    build: ./frontend
    ports:
      - "3000:80"
    environment:
      - NODE_ENV=production
    depends_on:
      - backend
    
  backend:
    build: ./backend
    ports:
      - "3001:3001"
    environment:
      - DB_HOST=db
      - REDIS_HOST=redis
    depends_on:
      - db
      - redis
    
  db:
    image: postgres:13
    environment:
      POSTGRES_PASSWORD: secret
      POSTGRES_DB: mydb
    volumes:
      - postgres_data:/var/lib/postgresql/data
    
  redis:
    image: redis:alpine
    command: redis-server --appendonly yes
    volumes:
      - redis_data:/data
    
  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
      - ./ssl:/etc/nginx/ssl
    depends_on:
      - frontend
      - backend

volumes:
  postgres_data:
  redis_data:
2. CI/CD 集成示例
bash 复制代码
# .gitlab-ci.yml
stages:
  - build
  - test
  - deploy

variables:
  DOCKER_DRIVER: overlay2
  DOCKER_TLS_CERTDIR: ""

build:
  stage: build
  script:
    - docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .
    - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA

test:
  stage: test
  script:
    - docker run $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA npm test

deploy:
  stage: deploy
  script:
    - docker stack deploy -c docker-compose.prod.yml myapp
  only:
    - master
3. 开发环境配置
bash 复制代码
# docker-compose.dev.yml
version: '3.8'
services:
  app:
    build:
      context: .
      dockerfile: Dockerfile.dev
    volumes:
      - .:/app
      - /app/node_modules
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=development
      - CHOKIDAR_USEPOLLING=true
    command: npm start
  
  db:
    image: postgres:13
    environment:
      POSTGRES_PASSWORD: postgres
      POSTGRES_DB: app_dev
    ports:
      - "5432:5432"
    volumes:
      - postgres_data:/var/lib/postgresql/data
  
  redis:
    image: redis:alpine
    ports:
      - "6379:6379"
  
  adminer:
    image: adminer
    ports:
      - "8080:8080"

volumes:
  postgres_data:

十二、Docker 故障排查

1. 调试技巧
bash 复制代码
# 查看容器日志
docker logs [容器]                    # 查看日志
docker logs -f [容器]                 # 实时日志
docker logs --since 10m [容器]        # 最近10分钟日志
docker logs --tail 100 [容器]         # 最后100行
docker logs --details [容器]          # 显示详细日志

# 检查容器状态
docker ps -a                          # 查看所有容器
docker inspect [容器]                 # 查看容器详细信息
docker stats [容器]                   # 查看资源使用
docker top [容器]                     # 查看容器内进程
docker events                         # 查看Docker事件

# 网络调试
docker exec [容器] ping google.com    # 测试网络连通性
docker exec [容器] nslookup google.com
docker network inspect [网络]         # 查看网络配置
iptables -t nat -L -n                # 查看NAT规则

# 文件系统检查
docker diff [容器]                    # 查看容器文件变化
docker cp [容器]:/path/to/file ./    # 从容器复制文件
docker export [容器] > container.tar  # 导出容器文件系统
2. 常用问题解决
bash 复制代码
# 1. 容器启动失败
docker logs [容器]                    # 查看启动日志
docker run -it --rm image sh         # 调试模式启动
docker inspect [容器] | grep -A 10 State

# 2. 端口被占用
netstat -tulpn | grep :80           # 查找占用80端口的进程
docker ps -a                         # 查看所有容器端口映射

# 3. 磁盘空间不足
docker system df                     # 查看磁盘使用
docker system prune                  # 清理未使用的资源
docker system prune -a               # 清理所有未使用的资源
docker volume prune                  # 清理未使用的卷
docker image prune                   # 清理未使用的镜像

# 4. 网络问题
docker network ls                    # 查看网络
docker network inspect bridge        # 查看网络详情
docker run --network=host nginx     # 测试使用主机网络
3. 监控和性能分析
bash 复制代码
# 资源监控
docker stats                         # 实时监控容器资源
docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"
docker stats --no-stream             # 一次性查看

# 系统信息
docker info                          # Docker系统信息
docker version                       # Docker版本信息
docker system df                     # 磁盘使用情况
docker system events                 # Docker事件流

# 性能分析
docker run -it --rm --pid=container:[容器] ubuntu top
docker run -it --rm --net=container:[容器] nicolaka/netshoot

十三、学习资源

1. 官方文档
2. 常用镜像
bash 复制代码
# 基础镜像
alpine:latest          # 轻量级Linux(5MB)
ubuntu:20.04           # Ubuntu
centos:8               # CentOS
debian:buster-slim     # Debian精简版

# 运行时
node:16-alpine         # Node.js
python:3.9-slim        # Python
openjdk:11-jre-slim    # Java
golang:1.19-alpine     # Go

# 数据库
mysql:8.0              # MySQL
postgres:13-alpine     # PostgreSQL
redis:alpine           # Redis
mongo:5.0              # MongoDB

# Web服务器
nginx:alpine           # Nginx
httpd:alpine           # Apache
traefik:v2.5           # Traefik代理

# 工具
busybox:latest         # 工具箱
nicolaka/netshoot      # 网络调试
portainer/portainer    # Docker管理界面
3. 学习路径
bash 复制代码
1. 基础阶段(1-2周)
   - Docker安装和配置
   - 镜像和容器基本操作
   - Dockerfile编写
   - 数据卷使用

2. 进阶阶段(2-3周)
   - Docker Compose
   - Docker网络
   - Docker Swarm
   - 多阶段构建

3. 生产阶段(持续)
   - 安全最佳实践
   - 性能优化
   - 监控和日志
   - CI/CD集成

十四、快速参考表

命令速查表
bash 复制代码
# 镜像
docker pull [镜像]           # 拉取镜像
docker build -t [标签] .    # 构建镜像
docker images              # 列出镜像
docker rmi [镜像]          # 删除镜像

# 容器
docker run [镜像]          # 运行容器
docker ps                  # 列出容器
docker exec -it [容器] sh  # 进入容器
docker logs [容器]         # 查看日志
docker stop [容器]         # 停止容器
docker rm [容器]           # 删除容器

# 网络
docker network ls          # 列出网络
docker network create [网络] # 创建网络
docker network inspect [网络] # 查看网络

# 数据卷
docker volume ls           # 列出卷
docker volume create [卷]  # 创建卷
docker volume rm [卷]      # 删除卷

# Compose
docker-compose up         # 启动
docker-compose down       # 停止
docker-compose ps         # 查看状态
docker-compose logs       # 查看日志

# Swarm
docker swarm init         # 初始化
docker service create     # 创建服务
docker service ls         # 列出服务
docker stack deploy       # 部署应用栈
常用参数速查
bash 复制代码
-d, --detach              # 后台运行
-i, --interactive         # 交互模式
-t, --tty                 # 分配伪终端
--name                    # 指定容器名
-p, --publish             # 端口映射
-v, --volume              # 数据卷挂载
-e, --env                 # 环境变量
--network                 # 指定网络
--restart                 # 重启策略
--memory                  # 内存限制
--cpus                    # CPU限制
--rm                      # 退出时删除

💡 使用技巧和最佳实践

日常使用技巧
1.使用别名 :在 ~/.bashrc中添加:
bash 复制代码
alias dps='docker ps'
alias dcu='docker-compose up'
alias dcd='docker-compose down'
alias dcl='docker-compose logs -f'
2.清理命令
bash 复制代码
# 清理所有未使用资源
docker system prune -a -f

# 清理特定资源
docker container prune
docker image prune
docker volume prune
docker network prune
3.快速进入容器
bash 复制代码
# 在 ~/.bashrc 中添加
dsh() { docker exec -it $1 sh; }
dbash() { docker exec -it $1 bash; }
4.查看容器IP
bash 复制代码
dip() { docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $1; }

生产环境建议

  1. 永远不要在生产中使用最新标签:使用特定版本标签

  2. 使用非root用户运行容器

  3. 设置资源限制:防止容器占用所有资源

  4. 启用日志轮转:避免日志占满磁盘

  5. 使用只读根文件系统:增加安全性

  6. 定期更新基础镜像:获取安全补丁

  7. 扫描镜像漏洞:使用Trivy等工具

  8. 使用私有仓库:控制镜像分发

相关推荐
AOwhisky2 小时前
虚拟化技术学习笔记
linux·运维·笔记·学习·虚拟化技术
咖啡里的茶i2 小时前
在Docker环境中安装Hadoop cluster 实验报告一
hadoop·docker·容器
汪汪大队u2 小时前
续:从 Docker Compose 到 Kubernetes(2)—— 服务优化与排错
网络·后端·物联网·struts·容器
rabbit_pro3 小时前
Docker compose部署Ollama使用模型
linux·运维·docker
ILL11IIL3 小时前
k8s的pod管理及优化
云原生·容器·kubernetes
咖啡里的茶i4 小时前
在Docker环境中安装Hadoop cluster 实验报告三
docker
笑洋仟4 小时前
docker的overlay2目录占用磁盘空间很大,清理办法
运维·docker·容器
木雷坞5 小时前
2026 年 5 月国内可用 Docker 镜像源列表与配置方法
运维·docker·容器
2301_780789665 小时前
“数字珍珠港”再现:西北能源基地DNS篡改事件深度复盘与防护升级
运维·服务器·网络·tcp/ip·网络安全·智能路由器·能源