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
课后练习
实践任务
- 安装Docker并验证
- 运行第一个容器
- 编写Dockerfile构建应用镜像
- 使用Docker Compose部署应用栈