Docker 进阶
2026/1/15大约 3 分钟
Docker 进阶
Docker 网络
网络模式
┌─────────────────────────────────────────────────────────┐
│ Docker 网络模式 │
├─────────────┬───────────────────────────────────────────┤
│ bridge │ 默认模式,容器通过虚拟网桥通信 │
│ host │ 容器使用宿主机网络,无隔离 │
│ none │ 无网络,完全隔离 │
│ overlay │ 跨主机通信,用于 Swarm/K8s │
│ macvlan │ 容器拥有独立 MAC 地址 │
└─────────────┴───────────────────────────────────────────┘网络操作
# 创建网络
docker network create mynet
# 创建指定子网的网络
docker network create --subnet=172.20.0.0/16 mynet
# 查看网络
docker network ls
# 查看网络详情
docker network inspect mynet
# 容器加入网络
docker run -d --name app --network mynet nginx
# 连接已运行容器到网络
docker network connect mynet container_name
# 断开网络
docker network disconnect mynet container_name
# 删除网络
docker network rm mynet容器间通信
# 同一网络内,可通过容器名通信
docker network create app-net
docker run -d --name mysql --network app-net mysql:8
docker run -d --name app --network app-net myapp
# app 容器内可通过 mysql:3306 访问数据库Docker 存储
存储类型
┌─────────────────────────────────────────────────────────┐
│ Docker 存储类型 │
├─────────────┬───────────────────────────────────────────┤
│ volume │ Docker 管理的存储,推荐使用 │
│ bind │ 挂载宿主机目录 │
│ tmpfs │ 内存存储,容器停止后丢失 │
└─────────────┴───────────────────────────────────────────┘Volume 操作
# 创建 volume
docker volume create mydata
# 查看 volume
docker volume ls
# 查看 volume 详情
docker volume inspect mydata
# 使用 volume
docker run -d --name mysql \
-v mydata:/var/lib/mysql \
mysql:8
# 删除 volume
docker volume rm mydata
# 清理未使用的 volume
docker volume pruneBind Mount
# 挂载宿主机目录
docker run -d --name nginx \
-v /host/path:/container/path \
nginx
# 只读挂载
docker run -d --name nginx \
-v /host/path:/container/path:ro \
nginxDocker Compose
Docker Compose 用于定义和运行多容器应用。
docker-compose.yml
version: '3.8'
services:
# 应用服务
app:
build: .
ports:
- "8080:8080"
environment:
- SPRING_PROFILES_ACTIVE=prod
- DB_HOST=mysql
- REDIS_HOST=redis
depends_on:
- mysql
- redis
networks:
- app-net
restart: unless-stopped
# MySQL 服务
mysql:
image: mysql:8
environment:
MYSQL_ROOT_PASSWORD: root123
MYSQL_DATABASE: myapp
volumes:
- mysql-data:/var/lib/mysql
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
networks:
- app-net
restart: unless-stopped
# Redis 服务
redis:
image: redis:7-alpine
command: redis-server --appendonly yes
volumes:
- redis-data:/data
networks:
- app-net
restart: unless-stopped
# Nginx 反向代理
nginx:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
depends_on:
- app
networks:
- app-net
restart: unless-stopped
networks:
app-net:
driver: bridge
volumes:
mysql-data:
redis-data:Compose 命令
# 启动服务
docker-compose up -d
# 查看服务状态
docker-compose ps
# 查看日志
docker-compose logs -f app
# 停止服务
docker-compose stop
# 停止并删除
docker-compose down
# 删除并清理 volume
docker-compose down -v
# 重新构建
docker-compose build
# 扩容
docker-compose up -d --scale app=3环境变量
# docker-compose.yml
services:
app:
image: myapp
env_file:
- .env
environment:
- DB_HOST=${DB_HOST:-localhost}# .env 文件
DB_HOST=mysql
DB_PORT=3306
DB_USER=root
DB_PASSWORD=secret资源限制
# 限制 CPU 和内存
docker run -d \
--name app \
--cpus="1.5" \
--memory="512m" \
--memory-swap="1g" \
myapp
# docker-compose.yml
services:
app:
image: myapp
deploy:
resources:
limits:
cpus: '1.5'
memory: 512M
reservations:
cpus: '0.5'
memory: 256M日志管理
# 查看日志
docker logs container_name
# 实时查看
docker logs -f container_name
# 查看最后 100 行
docker logs --tail 100 container_name
# 配置日志驱动
docker run -d \
--log-driver json-file \
--log-opt max-size=10m \
--log-opt max-file=3 \
myapp健康检查
# Dockerfile
HEALTHCHECK --interval=30s --timeout=3s --retries=3 \
CMD curl -f http://localhost:8080/health || exit 1# docker-compose.yml
services:
app:
image: myapp
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
interval: 30s
timeout: 3s
retries: 3
start_period: 40s私有仓库
Harbor
# 登录私有仓库
docker login harbor.example.com
# 标记镜像
docker tag myapp:1.0 harbor.example.com/project/myapp:1.0
# 推送镜像
docker push harbor.example.com/project/myapp:1.0
# 拉取镜像
docker pull harbor.example.com/project/myapp:1.0安全最佳实践
# 1. 使用非 root 用户
FROM openjdk:11-jre-slim
RUN groupadd -r app && useradd -r -g app app
USER app
# 2. 最小化镜像
FROM alpine:3.18
# 或使用 distroless
FROM gcr.io/distroless/java11
# 3. 扫描镜像漏洞
# docker scan myapp:1.0
# 4. 使用只读文件系统
# docker run --read-only myapp
# 5. 限制权限
# docker run --cap-drop ALL --cap-add NET_BIND_SERVICE myapp