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自动化