返回教程列表
Docker容器化2025:现代云原生应用部署指南
掌握最新Docker功能、安全最佳实践和云原生部署技能
18 分钟阅读
MatrixTools
2024年8月4日
精选教程
预计学习时间
90 分钟
难度等级
🔴 高级挑战
学习技能
4 项技能
你将学到的技能:
容器化DevOps微服务部署自动化
学习进度跟踪0% 完成
已学习 0 分钟 / 预计 90 分钟
教程简介
从Docker基础概念到实际项目容器化部署,完整掌握现代应用交付方式
Docker容器化部署DevOps
📖
教程详细内容
深度解析每个关键概念,配合实际案例帮助理解
Docker容器化应用部署教程:从入门到实战
什么是Docker?
Docker是一个开源的应用容器引擎,基于Go语言开发,可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。
Docker的核心概念
容器(Container):
- 轻量级的、独立的、可执行的软件包
- 包含运行应用程序所需的一切:代码、运行时、系统工具、系统库和设置
- 与虚拟机相比,容器直接运行在宿主机的内核上,没有额外的虚拟化开销
镜像(Image):
- 容器的模板,包含了运行应用程序所需的所有文件和配置
- 镜像是只读的,容器是镜像的运行实例
- 可以基于现有镜像创建新的镜像
Dockerfile:
- 用于定义如何构建Docker镜像的文本文件
- 包含一系列指令,用于指定基础镜像、安装软件、复制文件等
Docker安装指南
Windows系统安装
系统要求:
- Windows 10 64位 专业版、企业版或教育版
- 启用Hyper-V功能
安装步骤:
# 下载Docker Desktop for Windows # 访问 https://www.docker.com/products/docker-desktop # 下载并运行安装程序 # 验证安装 docker --version docker-compose --version
Linux系统安装(以Ubuntu为例)
# 更新包索引
sudo apt-get update
# 安装依赖包
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release
# 添加Docker的官方GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 设置稳定版仓库
echo \
"deb [arch=amd64 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
# 安装Docker Engine
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
# 启动Docker服务
sudo systemctl start docker
sudo systemctl enable docker
# 验证安装
sudo docker run hello-world
macOS系统安装
# 下载Docker Desktop for Mac
# 访问 https://www.docker.com/products/docker-desktop
# 下载.dmg文件并安装
# 验证安装
docker --version
Docker基础命令详解
镜像相关命令
# 查看本地镜像
docker images
# 搜索镜像
docker search nginx
# 拉取镜像
docker pull nginx:latest
# 删除镜像
docker rmi nginx:latest
# 构建镜像
docker build -t myapp:v1.0 .
# 查看镜像历史
docker history nginx
# 镜像详细信息
docker inspect nginx
容器相关命令
# 运行容器
docker run -d --name mynginx -p 8080:80 nginx
# 查看运行中的容器
docker ps
# 查看所有容器(包括已停止的)
docker ps -a
# 停止容器
docker stop mynginx
# 启动容器
docker start mynginx
# 重启容器
docker restart mynginx
# 删除容器
docker rm mynginx
# 进入容器
docker exec -it mynginx /bin/bash
# 查看容器日志
docker logs mynginx
# 容器详细信息
docker inspect mynginx
Dockerfile编写指南
基础语法
# 指定基础镜像
FROM node:16-alpine
# 设置工作目录
WORKDIR /app
# 设置环境变量
ENV NODE_ENV=production
# 复制文件
COPY package*.json ./
# 执行命令
RUN npm install --only=production
# 复制应用代码
COPY . .
# 暴露端口
EXPOSE 3000
# 设置启动命令
CMD ["npm", "start"]
常用指令详解
FROM指令:
- 指定基础镜像,每个Dockerfile必须以FROM指令开始
FROM node:16-alpine
- 使用Node.js 16的Alpine版本
WORKDIR指令:
- 设置工作目录,后续的RUN、CMD、COPY等指令都会在这个目录下执行
WORKDIR /app
COPY和ADD指令:
- COPY:复制本地文件到镜像中
- ADD:除了复制功能外,还支持自动解压和远程文件下载
RUN指令:
- 在镜像构建过程中执行命令
RUN npm install
CMD和ENTRYPOINT指令:
- CMD:指定容器启动时的默认命令
- ENTRYPOINT:配置容器启动时的执行命令,不可被覆盖
实战项目:Node.js应用容器化
1. 准备Node.js应用
// app.js
const express = require('express');
const app = express();
const port = process.env.PORT || 3000;
app.get('/', (req, res) => {
res.json({
message: 'Hello Docker!',
timestamp: new Date().toISOString()
});
});
app.listen(port, () => {
console.log(`Server running on port ${port}`);
});
{
"name": "docker-node-app",
"version": "1.0.0",
"description": "Docker Node.js demo",
"main": "app.js",
"scripts": {
"start": "node app.js"
},
"dependencies": {
"express": "^4.18.0"
}
}
2. 编写Dockerfile
# 使用官方Node.js镜像作为基础镜像
FROM node:16-alpine
# 设置工作目录
WORKDIR /usr/src/app
# 复制package.json和package-lock.json
COPY package*.json ./
# 安装依赖
RUN npm ci --only=production
# 复制应用代码
COPY . .
# 创建非root用户
RUN addgroup -g 1001 -S nodejs
RUN adduser -S nodejs -u 1001
# 更改文件所有权
USER nodejs
# 暴露端口
EXPOSE 3000
# 健康检查
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD curl -f http://localhost:3000/ || exit 1
# 启动应用
CMD ["npm", "start"]
3. 构建和运行
# 构建镜像
docker build -t node-app:v1.0 .
# 运行容器
docker run -d \
--name my-node-app \
-p 3000:3000 \
--restart unless-stopped \
node-app:v1.0
# 测试应用
curl http://localhost:3000
Docker Compose多服务编排
什么是Docker Compose
Docker Compose是用于定义和运行多容器Docker应用程序的工具。通过Compose,你可以使用YAML文件来配置应用程序的服务,然后使用一个命令就可以创建并启动所有服务。
实战:Web应用 + 数据库
# docker-compose.yml
version: '3.8'
services:
# Web应用服务
web:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=production
- DB_HOST=db
- DB_PORT=5432
- DB_NAME=myapp
- DB_USER=postgres
- DB_PASSWORD=password123
depends_on:
- db
restart: unless-stopped
# PostgreSQL数据库服务
db:
image: postgres:13-alpine
environment:
- POSTGRES_DB=myapp
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=password123
volumes:
- postgres_data:/var/lib/postgresql/data
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
ports:
- "5432:5432"
restart: unless-stopped
# Redis缓存服务
redis:
image: redis:6-alpine
ports:
- "6379:6379"
restart: unless-stopped
volumes:
postgres_data:
Compose常用命令
# 启动所有服务
docker-compose up -d
# 查看服务状态
docker-compose ps
# 查看日志
docker-compose logs -f web
# 停止所有服务
docker-compose stop
# 删除所有容器和网络
docker-compose down
# 重新构建并启动
docker-compose up --build -d
# 扩展服务实例
docker-compose up --scale web=3 -d
生产环境部署最佳实践
1. 镜像优化
多阶段构建:
# 构建阶段
FROM node:16-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
# 生产阶段
FROM node:16-alpine AS production
WORKDIR /app
COPY --from=builder /app/node_modules ./node_modules
COPY . .
EXPOSE 3000
CMD ["npm", "start"]
2. 安全配置
非root用户运行:
# 创建应用用户
RUN addgroup -g 1001 -S nodejs
RUN adduser -S nodejs -u 1001
# 切换到非root用户
USER nodejs
扫描漏洞:
# 安装Docker安全扫描工具
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
-v $(pwd):/app clair-scanner \
--ip 127.0.0.1 node-app:v1.0
3. 监控和日志
健康检查:
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD curl -f http://localhost:3000/health || exit 1
日志配置:
docker run -d \
--name my-app \
--log-driver json-file \
--log-opt max-size=10m \
--log-opt max-file=3 \
node-app:v1.0
4. 容器编排(Kubernetes)
基础Deployment配置:
apiVersion: apps/v1
kind: Deployment
metadata:
name: node-app-deployment
spec:
replicas: 3
selector:
matchLabels:
app: node-app
template:
metadata:
labels:
app: node-app
spec:
containers:
- name: node-app
image: node-app:v1.0
ports:
- containerPort: 3000
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
常见问题解决
1. 容器启动失败
问题排查:
# 查看容器日志
docker logs container-name
# 进入容器调试
docker run -it --entrypoint /bin/sh image-name
# 检查容器状态
docker inspect container-name
2. 网络连接问题
# 查看容器网络
docker network ls
# 创建自定义网络
docker network create my-network
# 在指定网络中运行容器
docker run --network my-network nginx
3. 存储数据持久化
# 创建数据卷
docker volume create my-data
# 挂载数据卷
docker run -v my-data:/data nginx
# 绑定挂载本地目录
docker run -v /host/path:/container/path nginx
学习资源推荐
官方文档:
实践项目:
- 容器化现有的Web应用
- 搭建LNMP环境
- 部署微服务应用
- 使用CI/CD流水线自动化部署
进阶学习:
- Docker Swarm集群管理
- Kubernetes容器编排
- 服务网格(Service Mesh)
- 容器安全最佳实践
通过这个完整的Docker教程,你可以从零开始学习容器化技术,掌握现代应用部署的核心技能。记住,实践是最好的学习方法,多动手操作各种场景,你会更快掌握Docker的精髓。
💻
代码示例
实用代码片段和最佳实践,可直接复制使用
dockerfile
# Node.js生产就绪多阶段构建模板
FROM node:18-alpine AS base
WORKDIR /app
RUN addgroup -g 1001 -S nodejs && \
adduser -S nextjs -u 1001
# 依赖安装阶段
FROM base AS deps
COPY package*.json ./
RUN npm ci --only=production && npm cache clean --force
# 构建阶段
FROM base AS build
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# 生产运行时阶段
FROM base AS runtime
ENV NODE_ENV=production
COPY --from=deps --chown=nextjs:nodejs /app/node_modules ./node_modules
COPY --from=build --chown=nextjs:nodejs /app/dist ./dist
COPY --from=build --chown=nextjs:nodejs /app/package.json ./package.json
USER nextjs
EXPOSE 3000
# 健康检查
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD node healthcheck.js
CMD ["node", "dist/server.js"]
使用多阶段构建减少镜像大小60-80%,包含安全强化和健康检查。
📝 学习清单
0/8 完成学习进度0%
理解2025年容器化发展趋势和Docker最新特性
掌握Docker Build Cloud和性能优化
学习多阶段构建和安全强化技术
掌握现代Docker Compose最佳实践
实施容器安全和监控策略
集成CI/CD和多云部署
构建生产就绪的容器应用
掌握故障排除和性能调优
学习目标
- 容器化
- DevOps
- 微服务
- 部署自动化
📊 教程信息
预计学习时间⏱️ 90分钟
难度等级🔴 高级
技能点数🎯 4个技能