📚 完整教程目录

前言:什么是Docker?

🤔 Docker的定义

Docker是一个容器化平台,允许你将应用及其依赖打包成一个独立的、可移植的单元,称为容器。

为什么需要Docker?

Docker vs 虚拟机

💡 重点:Docker是现代应用部署的标准方式。

安装Docker

安装步骤

# macOS brew install docker # Linux (Ubuntu) sudo apt-get update sudo apt-get install docker.io # Windows # 下载Docker Desktop: https://www.docker.com/products/docker-desktop # 验证安装 docker --version docker run hello-world

配置Docker

# 添加当前用户到docker组(避免使用sudo) sudo usermod -aG docker $USER # 配置镜像加速(中国用户) # 编辑 ~/.docker/daemon.json { "registry-mirrors": [ "https://registry.docker-cn.com", "https://mirror.aliyun.com" ] }

镜像管理

镜像操作

# 查看本地镜像 docker images # 搜索镜像 docker search ubuntu # 拉取镜像 docker pull ubuntu:20.04 # 删除镜像 docker rmi ubuntu:20.04 # 标记镜像 docker tag ubuntu:20.04 myubuntu:latest # 查看镜像详情 docker inspect ubuntu:20.04 # 查看镜像历史 docker history ubuntu:20.04

常用镜像

容器操作

基本操作

# 运行容器 docker run -d --name mycontainer ubuntu:20.04 # 查看运行中的容器 docker ps # 查看所有容器 docker ps -a # 启动容器 docker start mycontainer # 停止容器 docker stop mycontainer # 删除容器 docker rm mycontainer # 查看容器日志 docker logs mycontainer docker logs -f mycontainer # 实时日志 # 进入容器 docker exec -it mycontainer /bin/bash # 查看容器资源使用 docker stats mycontainer

高级选项

# 端口映射 docker run -p 8080:80 nginx # 环境变量 docker run -e NODE_ENV=production node:14 # 挂载卷 docker run -v /host/path:/container/path ubuntu # 资源限制 docker run -m 512m --cpus 1 ubuntu # 网络 docker run --network mynetwork ubuntu # 自动重启 docker run --restart always ubuntu

Dockerfile

Dockerfile基础

FROM node:14-alpine WORKDIR /app COPY package*.json ./ RUN npm install COPY . . EXPOSE 3000 ENV NODE_ENV=production CMD ["node", "app.js"]

常用指令

构建镜像

# 构建镜像 docker build -t myapp:1.0 . # 查看构建过程 docker build -t myapp:1.0 --progress=plain . # 使用BuildKit DOCKER_BUILDKIT=1 docker build -t myapp:1.0 .

最佳实践

# 使用轻量级基础镜像 FROM node:14-alpine # 分层构建,减少镜像大小 FROM node:14-alpine AS builder WORKDIR /app COPY . . RUN npm install && npm run build FROM node:14-alpine WORKDIR /app COPY --from=builder /app/dist ./dist COPY package*.json ./ RUN npm install --production CMD ["node", "dist/index.js"]

Docker Compose

Compose文件

version: '3.8' services: web: build: . ports: - "3000:3000" environment: - NODE_ENV=production - DATABASE_URL=postgres://db:5432/myapp depends_on: - db volumes: - ./src:/app/src db: image: postgres:13 environment: - POSTGRES_DB=myapp - POSTGRES_PASSWORD=password volumes: - postgres_data:/var/lib/postgresql/data ports: - "5432:5432" redis: image: redis:6-alpine ports: - "6379:6379" volumes: postgres_data:

Compose命令

# 启动服务 docker-compose up -d # 查看服务 docker-compose ps # 查看日志 docker-compose logs -f web # 停止服务 docker-compose stop # 删除服务 docker-compose down # 重启服务 docker-compose restart # 执行命令 docker-compose exec web npm test

网络和存储

网络管理

# 创建网络 docker network create mynetwork # 查看网络 docker network ls # 连接容器到网络 docker network connect mynetwork mycontainer # 断开连接 docker network disconnect mynetwork mycontainer # 查看网络详情 docker network inspect mynetwork # 删除网络 docker network rm mynetwork

存储管理

# 创建卷 docker volume create myvolume # 查看卷 docker volume ls # 查看卷详情 docker volume inspect myvolume # 删除卷 docker volume rm myvolume # 挂载卷 docker run -v myvolume:/data ubuntu # 绑定挂载 docker run -v /host/path:/container/path ubuntu

镜像仓库

Docker Hub

# 登录Docker Hub docker login # 标记镜像 docker tag myapp:1.0 username/myapp:1.0 # 推送镜像 docker push username/myapp:1.0 # 拉取镜像 docker pull username/myapp:1.0 # 登出 docker logout

私有仓库

# 运行私有仓库 docker run -d -p 5000:5000 --name registry registry:2 # 标记镜像 docker tag myapp:1.0 localhost:5000/myapp:1.0 # 推送到私有仓库 docker push localhost:5000/myapp:1.0 # 拉取 docker pull localhost:5000/myapp:1.0

最佳实践

镜像优化

安全最佳实践

# 不要以root用户运行 FROM ubuntu:20.04 RUN useradd -m appuser USER appuser # 扫描镜像漏洞 docker scan myapp:1.0 # 使用只读文件系统 docker run --read-only ubuntu # 限制资源 docker run -m 512m --cpus 1 ubuntu

日志管理

# 配置日志驱动 docker run --log-driver json-file --log-opt max-size=10m ubuntu # 查看日志 docker logs mycontainer # 使用外部日志系统 docker run --log-driver splunk ubuntu

实战项目:容器化Node.js应用

项目结构

myapp/ ├── Dockerfile ├── docker-compose.yml ├── .dockerignore ├── package.json ├── app.js └── src/ └── index.js

Dockerfile

FROM node:14-alpine WORKDIR /app COPY package*.json ./ RUN npm install --production COPY . . EXPOSE 3000 HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ CMD node healthcheck.js CMD ["node", "app.js"]

docker-compose.yml

version: '3.8' services: app: build: . ports: - "3000:3000" environment: - NODE_ENV=production - DATABASE_URL=postgres://db:5432/myapp depends_on: - db restart: always db: image: postgres:13-alpine environment: - POSTGRES_DB=myapp - POSTGRES_PASSWORD=password volumes: - db_data:/var/lib/postgresql/data restart: always volumes: db_data:

部署步骤

# 1. 构建镜像 docker build -t myapp:1.0 . # 2. 启动服务 docker-compose up -d # 3. 查看日志 docker-compose logs -f app # 4. 测试应用 curl http://localhost:3000 # 5. 推送镜像 docker tag myapp:1.0 username/myapp:1.0 docker push username/myapp:1.0
✨ 实战总结:

通过这个项目,你学会了如何将应用容器化并使用Compose进行编排。

🎉 Docker学习完成

现在你已经掌握了Docker容器化的核心知识。

✅ 你现在可以:

🚀 下一步学习

  1. 学习Kubernetes容器编排
  2. 学习CI/CD流程
  3. 学习容器监控和日志
  4. 学习容器安全
💡 建议:

Docker是现代应用部署的基础。掌握Docker,你就掌握了云原生应用开发的关键技能。