【云原生与DevOps】01-Docker从入门到实践:镜像、容器、网络三位一体
·
专栏: 云原生 & DevOps
难度: 入门
标签: Docker 容器 镜像 Docker网络 云原生
前言
容器化已经是现代运维的基础技能。本文系统梳理Docker的三大核心——镜像、容器、网络,让你建立完整的知识框架。
一、Docker 核心概念
镜像(Image) → 容器(Container)
| |
只读层叠加 运行时实例
(Dockerfile构建) (可读写层)
- 镜像:一个只读的模板,包含运行应用所需的所有内容
- 容器:镜像的运行实例,有自己的进程、网络和文件系统
- Registry:镜像仓库(Docker Hub、Harbor、阿里云ACR)
二、镜像操作
# 拉取镜像
docker pull nginx:1.24-alpine
# 查看本地镜像
docker images
# 构建镜像
docker build -t myapp:1.0 .
# 给镜像打标签
docker tag myapp:1.0 registry.example.com/myapp:1.0
# 推送镜像
docker push registry.example.com/myapp:1.0
# 查看镜像层信息
docker history nginx:1.24-alpine
# 删除镜像
docker rmi nginx:1.24-alpine
# 清理所有未使用的镜像
docker image prune -a
三、Dockerfile 最佳实践
# 使用精简基础镜像
FROM python:3.11-slim
# 合并RUN指令减少层数
RUN apt-get update && apt-get install -y \
curl \
&& rm -rf /var/lib/apt/lists/*
# 先复制依赖文件,充分利用构建缓存
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# 再复制源码(改代码不用重装依赖)
COPY . .
# 用非root用户运行
RUN useradd -m appuser
USER appuser
# 暴露端口
EXPOSE 8000
# 使用exec格式(可接收信号)
CMD ["python", "-m", "uvicorn", "main:app", "--host", "0.0.0.0"]
四、容器操作
# 运行容器
docker run -d \
--name myapp \
-p 8080:8000 \
-v /data/app:/app/data \
--memory=512m \
--cpus=1 \
--restart unless-stopped \
myapp:1.0
# 查看运行中的容器
docker ps
docker ps -a # 包含已停止的
# 进入容器
docker exec -it myapp bash
# 查看日志
docker logs -f --tail=100 myapp
# 查看容器资源使用
docker stats myapp
# 复制文件
docker cp myapp:/app/config.yaml ./config.yaml
# 停止/删除
docker stop myapp && docker rm myapp
五、Docker 网络
# 查看网络
docker network ls
# 创建自定义网络(推荐,容器间可用名称通信)
docker network create --driver bridge mynet
# 将容器加入网络
docker run -d --name db --network mynet postgres:15
docker run -d --name app --network mynet myapp:1.0
# app容器内可以直接用 db 作为主机名访问数据库
# psql -h db -U postgres
# 查看网络详情
docker network inspect mynet
网络类型对比:
| 类型 | 用途 |
|---|---|
| bridge | 默认,单机容器互通 |
| host | 共享宿主机网络栈,性能最好但隔离性差 |
| none | 无网络,最高安全隔离 |
| overlay | 跨主机通信(Swarm/K8s使用) |
六、Docker Compose(多容器应用)
# docker-compose.yml
version: '3.8'
services:
app:
build: .
ports:
- "8080:8000"
environment:
- DB_HOST=db
- REDIS_HOST=redis
depends_on:
db:
condition: service_healthy
restart: unless-stopped
db:
image: postgres:15-alpine
volumes:
- postgres_data:/var/lib/postgresql/data
environment:
POSTGRES_PASSWORD: secret
healthcheck:
test: ["CMD", "pg_isready", "-U", "postgres"]
interval: 10s
retries: 5
redis:
image: redis:7-alpine
command: redis-server --appendonly yes
volumes:
- redis_data:/data
volumes:
postgres_data:
redis_data:
# 启动所有服务
docker compose up -d
# 查看服务状态
docker compose ps
# 查看日志
docker compose logs -f app
# 停止并删除
docker compose down -v
结语: Docker的三位一体——镜像负责打包,容器负责运行,网络负责通信。掌握这三点,容器化应用的日常运维没有任何问题。
更多推荐
所有评论(0)