在云原生时代,Docker就像一艘轻量级的"应用集装箱船",让软件部署变得前所未有的高效!本文将带你从零开始掌握Docker的核心技术,从基础概念到生产实践,从单容器管理到多服务编排。无论你是开发还是运维,这些Docker技能都将大幅提升你的工作效率!准备好你的Linux主机,让我们一起扬帆起航,探索容器化的奥秘吧~
特性 | Docker容器 | 传统虚拟机 |
---|---|---|
虚拟化级别 | 操作系统级 | 硬件级 |
启动速度 | 秒级 | 分钟级 |
性能损耗 | 低(~1-5%) | 高(~15-20%) |
镜像大小 | MB级 | GB级 |
隔离性 | 进程级 | 完全隔离 |
# Ubuntu/Debian
sudo apt update
sudo apt install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) 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 > /dev/null
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io
# RHEL/CentOS
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install docker-ce docker-ce-cli containerd.io
sudo systemctl start docker
sudo systemctl enable docker
sudo groupadd docker
sudo usermod -aG docker $USER
newgrp docker # 刷新组权限
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
# 搜索镜像
docker search nginx
# 拉取镜像
docker pull nginx:1.21-alpine
# 列出镜像
docker images
# 删除镜像
docker rmi nginx:1.21-alpine
# 导出/导入镜像
docker save -o nginx.tar nginx:1.21-alpine
docker load -i nginx.tar
# 运行容器
docker run -d --name my_nginx -p 8080:80 nginx:1.21-alpine
# 列出容器
docker ps # 运行中的容器
docker ps -a # 所有容器
# 停止/启动容器
docker stop my_nginx
docker start my_nginx
# 进入容器
docker exec -it my_nginx /bin/sh
# 删除容器
docker rm my_nginx
# 查看日志
docker logs my_nginx
docker logs -f my_nginx # 实时日志
# 资源监控
docker stats
docker top my_nginx
# 检查容器详情
docker inspect my_nginx
# 使用官方轻量级Python镜像
FROM python:3.9-slim
# 设置工作目录
WORKDIR /app
# 复制依赖文件
COPY requirements.txt .
# 安装依赖
RUN pip install --no-cache-dir -r requirements.txt
# 复制应用代码
COPY . .
# 暴露端口
EXPOSE 8000
# 定义环境变量
ENV FLASK_APP=app.py
# 运行应用
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "app:app"]
# 构建阶段
FROM golang:1.16 AS builder
WORKDIR /src
COPY . .
RUN go build -o /app
# 运行阶段
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app /app
CMD ["/app"]
.dockerignore
文件减少构建上下文-alpine
)而非latest
# 创建管理卷
docker volume create my_volume
# 使用数据卷
docker run -d -v my_volume:/data --name vol_container nginx
# 查看卷信息
docker volume inspect my_volume
# 挂载主机目录
docker run -d -v /host/path:/container/path nginx
# 只读挂载
docker run -d -v /host/path:/container/path:ro nginx
# 备份卷数据
docker run --rm -v my_volume:/source -v $(pwd):/backup alpine \
tar cvf /backup/backup.tar /source
# 恢复数据到新卷
docker volume create new_volume
docker run --rm -v new_volume:/target -v $(pwd):/backup alpine \
tar xvf /backup/backup.tar -C /target
模式 | 描述 |
---|---|
bridge | 默认桥接网络(隔离) |
host | 共享主机网络栈 |
none | 无网络 |
overlay | 多主机容器网络(Swarm) |
# 创建网络
docker network create my_network
# 使用自定义网络
docker run -d --net=my_network --name container1 nginx
docker run -d --net=my_network --name container2 nginx
# 容器间通信
docker exec -it container1 ping container2
# 随机主机端口
docker run -d -p 80 nginx
# 指定主机端口
docker run -d -p 8080:80 nginx
# 查看端口映射
docker port my_nginx
version: '3.8'
services:
web:
image: nginx:1.21-alpine
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html
networks:
- mynet
db:
image: postgres:13
environment:
POSTGRES_PASSWORD: example
volumes:
- db_data:/var/lib/postgresql/data
networks:
- mynet
volumes:
db_data:
networks:
mynet:
# 启动服务
docker-compose up -d
# 查看服务状态
docker-compose ps
# 停止服务
docker-compose down
# 查看日志
docker-compose logs -f
# 重建服务
docker-compose up -d --build
# docker-compose.prod.yml
version: '3.8'
services:
web:
deploy:
replicas: 3
resources:
limits:
cpus: '0.5'
memory: 512M
restart_policy:
condition: on-failure
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 30s
timeout: 10s
retries: 3
RUN groupadd -r appuser && useradd -r -g appuser appuser
USER appuser
docker run -d --memory=512m --cpus=1.5 nginx
docker scan nginx:1.21-alpine
# 禁止特权模式
docker run --privileged=false ...
# 只读文件系统
docker run --read-only ...
# 限制内核能力
docker run --cap-drop=ALL --cap-add=NET_BIND_SERVICE nginx
name: Docker Build and Push
on:
push:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Login to Docker Hub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKER_HUB_USERNAME }}
password: ${{ secrets.DOCKER_HUB_TOKEN }}
- name: Build and push
uses: docker/build-push-action@v2
with:
context: .
push: true
tags: username/myapp:latest
# 使用不同compose文件
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d
# 环境变量配置
services:
db:
environment:
- POSTGRES_USER=${DB_USER}
- POSTGRES_PASSWORD=${DB_PASSWORD}
# cAdvisor
docker run -d \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:ro \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--publish=8080:8080 \
--name=cadvisor \
google/cadvisor:latest
# Prometheus + Grafana
docker-compose -f https://docs.docker.com/compose/monitoring.yml up -d
# ELK Stack集成
version: '3'
services:
web:
image: nginx
logging:
driver: "syslog"
options:
syslog-address: "tcp://logstash:5000"
tag: "nginx"
logstash:
image: docker.elastic.co/logstash/logstash:7.14.0
ports:
- "5000:5000"
volumes:
- ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf
通过本文的系统学习,我们已经掌握了Docker的核心技能:
容器化黄金法则:
记住:容器化不是终点,而是云原生的起点! 现在就去Dockerize你的应用吧!✨
PS:如果你在学习过程中遇到问题,别慌!欢迎在评论区留言,我会尽力帮你解决!