Docker容器基础

最后更新: 2026-01-20 作者: Linux Team
页面目录
目录

Docker概述

什么是Docker?

Docker是一个开源的容器化平台,用于构建、部署和运行应用程序。

┌─────────────────────────────────────────────────────────────┐
│                    虚拟机 vs 容器                           │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   虚拟机:                                                   │
│   ┌────┐ ┌────┐ ┌────┐                                   │
│   │App │ │App │ │App │ ← 每个VM都有独立OS                  │
│   ├────┤ ├────┤ ├────┤                                   │
│   │ OS │ │ OS │ │ OS │                                   │
│   ├────┤ ├────┤ ├────┤                                   │
│   │ VM │ │ VM │ │ VM │                                   │
│   └────┘ └────┘ └────┘                                   │
│                                                             │
│   容器:                                                     │
│   ┌────┐ ┌────┐ ┌────┐                                   │
│   │App │ │App │ │App │ ← 共享宿主机OS                     │
│   ├────┤ ├────┤ ├────┤                                   │
│   │ C  │ │ C  │ │ C  │                                   │
│   └────┘ └────┘ └────┘                                   │
│   ┌─────────────────────────────┐                         │
│   │         Docker Engine        │                         │
│   ├─────────────────────────────┤                         │
│   │         Host OS              │                         │
│   └─────────────────────────────┘                         │
│                                                             │
└─────────────────────────────────────────────────────────────┘

Docker核心概念

镜像(Image)  ──→  容器(Container)  ──→  仓库(Registry)
模板,只读        运行实例              存储和分发镜像

安装Docker

# Ubuntu/Debian
sudo apt update
sudo apt install apt-transport-https ca-certificates curl gnupg lsb-release

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list

sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin

# 启动Docker
sudo systemctl start docker
sudo systemctl enable docker

# 添加用户到docker组
sudo usermod -aG docker $USER
newgrp docker

Docker基础命令

镜像管理

# 拉取镜像
docker pull ubuntu:22.04
docker pull nginx:latest
docker pull mysql:8.0

# 列出镜像
docker images
docker image ls
docker images -a

# 删除镜像
docker rmi ubuntu:22.04
docker rmi $(docker images -q)          # 删除所有

# 构建镜像
docker build -t myapp:1.0 .
docker build -t myapp:1.0 -f Dockerfile.prod .

# 镜像历史
docker history nginx:latest

容器管理

# 运行容器
docker run ubuntu:22.04
docker run -it ubuntu:22.04 /bin/bash    # 交互式
docker run -d nginx                        # 后台运行
docker run --name mynginx nginx           # 命名容器

# 列出容器
docker ps                                # 运行中的
docker ps -a                             # 所有容器
docker ps -l                              # 最近容器

# 容器操作
docker start nginx                       # 启动
docker stop nginx                        # 停止
docker restart nginx                     # 重启
docker pause nginx                       # 暂停
docker unpause nginx                     # 恢复
docker rm nginx                          # 删除
docker rm $(docker ps -aq)               # 删除所有容器

# 进入容器
docker exec -it nginx /bin/bash
docker exec -u root nginx bash

# 查看日志
docker logs nginx
docker logs -f nginx                     # 跟踪日志
docker logs --tail 100 nginx            # 最近100行

# 容器信息
docker inspect nginx
docker stats nginx                       # 资源使用
docker port nginx                        # 端口映射

网络管理

# 网络列表
docker network ls

# 创建网络
docker network create mynetwork

# 连接容器到网络
docker network connect mynetwork nginx

# 容器网络模式
docker run --network host nginx          # host模式
docker run --network none nginx         # none模式
docker run --network mynetwork nginx     # 自定义网络

Dockerfile

# 基础镜像
FROM ubuntu:22.04

# 维护者
MAINTAINER John Doe <john@example.com>

# 安装系统包
RUN apt-get update && apt-get install -y \
    nginx \
    curl \
    vim \
    && rm -rf /var/lib/apt/lists/*

# 设置环境变量
ENV APP_ENV=production
ENV PORT=8080

# 工作目录
WORKDIR /app

# 复制文件
COPY . /app/
COPY package*.json /app/

# 暴露端口
EXPOSE 8080

# 运行命令
CMD ["python", "app.py"]
# 或
ENTRYPOINT ["python", "app.py"]

多阶段构建

# 第一阶段:构建
FROM golang:1.20 AS builder
WORKDIR /build
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o app

# 第二阶段:运行
FROM alpine:3.18
COPY --from=builder /build/app /app/
WORKDIR /app
CMD ["./app"]

Docker Compose

# docker-compose.yml
version: '3.8'

services:
  web:
    build: .
    ports:
      - "8080:8080"
    environment:
      - DB_HOST=db
      - DB_PASSWORD=secret
    depends_on:
      - db
    networks:
      - frontend
      - backend

  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_DATABASE: myapp
    volumes:
      - db_data:/var/lib/mysql
    networks:
      - backend

  redis:
    image: redis:7-alpine
    networks:
      - backend

volumes:
  db_data:

networks:
  frontend:
  backend:
# 启动服务
docker-compose up
docker-compose up -d                 # 后台运行
docker-compose up --build             # 重新构建

# 管理服务
docker-compose ps
docker-compose logs -f web
docker-compose stop
docker-compose down
docker-compose down -v               # 删除卷

# 扩展服务
docker-compose up -d --scale web=3

课后练习

实践任务
  1. 安装Docker并验证
  2. 运行第一个容器
  3. 编写Dockerfile构建应用镜像
  4. 使用Docker Compose部署应用栈