Linux容器大师:Docker容器化应用部署指南

Linux容器大师:Docker容器化应用部署指南

引言

在云原生时代,Docker就像一艘轻量级的"应用集装箱船"🚢,让软件部署变得前所未有的高效!本文将带你从零开始掌握Docker的核心技术,从基础概念到生产实践,从单容器管理到多服务编排。无论你是开发还是运维,这些Docker技能都将大幅提升你的工作效率!准备好你的Linux主机,让我们一起扬帆起航,探索容器化的奥秘吧~ 🌊

一、Docker 基础概念

1.1 核心组件

Docker Engine:核心容器运行时Images:只读模板,包含应用和运行环境Containers:镜像的运行实例Dockerfile:构建镜像的指令文件Volumes:持久化数据存储Networks:容器网络通信

1.2 与传统虚拟化的区别

特性Docker容器传统虚拟机虚拟化级别操作系统级硬件级启动速度秒级分钟级性能损耗低(~1-5%)高(~15-20%)镜像大小MB级GB级隔离性进程级完全隔离

二、Docker 安装与配置

2.1 安装 Docker Engine

# 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

2.2 非root用户权限配置

sudo groupadd docker

sudo usermod -aG docker $USER

newgrp docker # 刷新组权限

2.3 配置镜像加速器(国内用户)

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 基础操作

3.1 镜像管理

# 搜索镜像

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

3.2 容器生命周期

# 运行容器

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

3.3 日志与监控

# 查看日志

docker logs my_nginx

docker logs -f my_nginx # 实时日志

# 资源监控

docker stats

docker top my_nginx

# 检查容器详情

docker inspect my_nginx

四、Dockerfile 最佳实践

4.1 基础 Dockerfile 示例

# 使用官方轻量级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"]

4.2 多阶段构建示例

# 构建阶段

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"]

4.3 构建优化技巧

使用 .dockerignore 文件减少构建上下文合理安排指令顺序,利用缓存层多阶段构建减小最终镜像大小使用特定标签(如-alpine)而非latest

五、数据管理与持久化

5.1 数据卷(Volumes)

# 创建管理卷

docker volume create my_volume

# 使用数据卷

docker run -d -v my_volume:/data --name vol_container nginx

# 查看卷信息

docker volume inspect my_volume

5.2 绑定挂载(Bind Mounts)

# 挂载主机目录

docker run -d -v /host/path:/container/path nginx

# 只读挂载

docker run -d -v /host/path:/container/path:ro nginx

5.3 数据备份与恢复

# 备份卷数据

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

六、网络配置

6.1 网络模式

模式描述bridge默认桥接网络(隔离)host共享主机网络栈none无网络overlay多主机容器网络(Swarm)6.2 自定义网络

# 创建网络

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

6.3 端口映射

# 随机主机端口

docker run -d -p 80 nginx

# 指定主机端口

docker run -d -p 8080:80 nginx

# 查看端口映射

docker port my_nginx

七、Docker Compose 编排

7.1 基本 compose 文件

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:

7.2 常用命令

# 启动服务

docker-compose up -d

# 查看服务状态

docker-compose ps

# 停止服务

docker-compose down

# 查看日志

docker-compose logs -f

# 重建服务

docker-compose up -d --build

7.3 生产环境配置

# 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

八、安全最佳实践

8.1 容器安全原则

使用非root用户运行容器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

8.2 安全配置

# 禁止特权模式

docker run --privileged=false ...

# 只读文件系统

docker run --read-only ...

# 限制内核能力

docker run --cap-drop=ALL --cap-add=NET_BIND_SERVICE nginx

九、CI/CD 集成

9.1 GitHub Actions 示例

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

9.2 多环境部署

# 使用不同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}

十、监控与日志管理

10.1 监控工具

# 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

10.2 集中式日志

# 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:如果你在学习过程中遇到问题,别慌!欢迎在评论区留言,我会尽力帮你解决!😄

相关推荐