Docker容器基础

Docker概述

容器 vs 虚拟机

特性容器虚拟机
启动速度秒级分钟级
资源占用低(共享内核)高(独立系统)
隔离性进程级别系统级别
可移植性一般
性能损耗几乎无

Docker安装

# Ubuntu/Debian
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER
 
# CentOS/RHEL
yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install docker-ce docker-ce-cli containerd.io
 
# 启动Docker
systemctl start docker
systemctl enable docker
 
# 验证安装
docker --version
docker run hello-world

镜像管理

镜像操作

# 搜索镜像
docker search nginx
 
# 拉取镜像
docker pull nginx                    # 拉取最新版本
docker pull nginx:1.24               # 拉取指定版本
docker pull nginx:1.24-alpine        # 拉取alpine版本
 
# 查看本地镜像
docker images
docker image ls
 
# 删除镜像
docker rmi nginx:1.24
docker image prune                   # 清理悬空镜像
 
# 查看镜像详情
docker inspect nginx:latest
 
# 导出/导入镜像
docker save -o nginx.tar nginx:latest
docker load -i nginx.tar
 
# 构建镜像
docker build -t myapp:v1 .

Dockerfile编写

# 基础镜像
FROM ubuntu:22.04
 
# 维护者信息
LABEL maintainer="admin@example.com"
 
# 设置环境变量
ENV APP_HOME=/app \
    DEBIAN_FRONTEND=noninteractive
 
# 设置工作目录
WORKDIR $APP_HOME
 
# 安装依赖
RUN apt-get update && apt-get install -y \
    python3 \
    python3-pip \
    && rm -rf /var/lib/apt/lists/*
 
# 复制文件
COPY requirements.txt .
COPY src/ ./src/
 
# 安装Python依赖
RUN pip3 install --no-cache-dir -r requirements.txt
 
# 暴露端口
EXPOSE 8000
 
# 健康检查
HEALTHCHECK --interval=30s --timeout=3s \
    CMD curl -f http://localhost:8000/health || exit 1
 
# 启动命令
CMD ["python3", "src/main.py"]

容器管理

容器生命周期

# 创建并启动容器
docker run -d --name nginx nginx:latest
docker run -d -p 80:80 --name web nginx:latest
docker run -d -p 80:80 -v /data/html:/usr/share/nginx/html --name web nginx
 
# 常用参数
-d          # 后台运行
-p          # 端口映射 host:container
-P          # 随机端口映射
-v          # 挂载卷
-e          # 环境变量
--name      # 容器名称
--restart   # 重启策略
--network   # 网络模式
 
# 启动/停止/重启
docker start nginx
docker stop nginx
docker restart nginx
 
# 杀死容器
docker kill nginx
 
# 删除容器
docker rm nginx                       # 删除已停止容器
docker rm -f nginx                    # 强制删除运行中容器
docker container prune                # 清理所有停止的容器

容器操作

# 查看容器
docker ps                             # 查看运行中的容器
docker ps -a                          # 查看所有容器
docker ps -q                          # 只显示容器ID
 
# 查看容器详情
docker inspect nginx
 
# 查看容器日志
docker logs nginx
docker logs -f nginx                  # 实时跟踪日志
docker logs --tail 100 nginx          # 显示最后100行
 
# 进入容器
docker exec -it nginx bash
docker exec -it nginx sh              # alpine镜像
 
# 在容器中执行命令
docker exec nginx ls /etc
 
# 查看容器资源使用
docker stats nginx
docker top nginx                      # 查看容器进程
 
# 复制文件
docker cp file.txt nginx:/tmp/        # 复制文件到容器
docker cp nginx:/etc/nginx/nginx.conf ./  # 从容器复制文件

数据管理

数据卷

# 创建数据卷
docker volume create mydata
 
# 查看数据卷
docker volume ls
docker volume inspect mydata
 
# 使用数据卷
docker run -d -v mydata:/app/data nginx
 
# 删除数据卷
docker volume rm mydata
docker volume prune                   # 清理未使用的数据卷

挂载主机目录

# 挂载主机目录
docker run -d -v /host/path:/container/path nginx
 
# 只读挂载
docker run -d -v /host/path:/container/path:ro nginx
 
# 挂载单个文件
docker run -d -v /host/file.conf:/etc/nginx/nginx.conf:ro nginx

网络管理

网络模式

# 查看网络
docker network ls
 
# 创建网络
docker network create mynet
docker network create --driver bridge --subnet 172.20.0.0/16 mynet
 
# 连接容器到网络
docker network connect mynet nginx
docker run -d --network mynet nginx
 
# 断开网络连接
docker network disconnect mynet nginx
 
# 删除网络
docker network rm mynet

网络类型

模式说明
bridge默认模式,容器通过NAT访问外网
host容器使用主机网络,无隔离
none无网络
overlay跨主机网络(Swarm)

Docker Compose

docker-compose.yml示例

version: '3.8'
 
services:
  web:
    image: nginx:latest
    container_name: web
    ports:
      - "80:80"
    volumes:
      - ./html:/usr/share/nginx/html
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
    networks:
      - frontend
    depends_on:
      - app
    restart: always
 
  app:
    build: ./app
    container_name: app
    ports:
      - "8000:8000"
    environment:
      - DEBUG=False
      - DATABASE_URL=postgresql://db:5432/mydb
    volumes:
      - app-data:/app/data
    networks:
      - frontend
      - backend
    depends_on:
      - db
    restart: always
 
  db:
    image: postgres:15
    container_name: db
    environment:
      - POSTGRES_USER=admin
      - POSTGRES_PASSWORD=secret
      - POSTGRES_DB=mydb
    volumes:
      - db-data:/var/lib/postgresql/data
    networks:
      - backend
    restart: always
 
networks:
  frontend:
  backend:
 
volumes:
  app-data:
  db-data:

Compose命令

# 启动服务
docker-compose up -d
 
# 停止服务
docker-compose down
 
# 查看服务状态
docker-compose ps
 
# 查看日志
docker-compose logs
docker-compose logs -f web
 
# 重启服务
docker-compose restart
 
# 进入容器
docker-compose exec web bash
 
# 构建镜像
docker-compose build
 
# 拉取镜像
docker-compose pull

私有镜像仓库

搭建私有仓库

# 启动Registry容器
docker run -d -p 5000:5000 --name registry \
    -v /data/registry:/var/lib/registry \
    registry:2
 
# 推送镜像到私有仓库
docker tag myapp:v1 localhost:5000/myapp:v1
docker push localhost:5000/myapp:v1
 
# 从私有仓库拉取
docker pull localhost:5000/myapp:v1

配置HTTPS仓库

# 创建证书目录
mkdir -p /etc/docker/certs.d/registry.example.com
 
# 复制证书
cp ca.crt /etc/docker/certs.d/registry.example.com/
 
# 配置Docker守护进程 /etc/docker/daemon.json
{
    "insecure-registries": ["registry.example.com:5000"]
}
 
# 重启Docker
systemctl restart docker

容器资源限制

# CPU限制
docker run -d --cpus=1.5 nginx       # 限制使用1.5个CPU
docker run -d --cpuset-cpus=0,1 nginx # 使用CPU 0和1
 
# 内存限制
docker run -d -m 512m nginx          # 限制内存512MB
docker run -d -m 1g --memory-swap=2g nginx  # 内存1G,swap 2G
 
# 综合限制
docker run -d \
    --name nginx \
    --cpus=1 \
    -m 512m \
    --memory-swap 1g \
    --pids-limit 100 \
    nginx:latest

💡 Docker最佳实践:

  • 使用特定版本的镜像,避免使用latest
  • 最小化镜像大小,使用alpine版本
  • 不要在容器中运行多个进程
  • 使用数据卷持久化数据
  • 合理设置资源限制

🔗 相关笔记: 08.01_Web服务部署 09.02_Kubernetes基础 10.02_Ansible自动化