1小时入门Docker和Docker Compose

文章目录 「隐藏」
  1. 前言
  2. 第一部分:认识Docker(10分钟)
    1. 什么是Docker?
    2. 核心概念
    3. 与虚拟机的区别
  3. 第二部分:Docker安装与基础操作(20分钟)
    1. 安装Docker
      1. Windows系统
      2. Mac系统
      3. Linux系统(Ubuntu为例)# 更新软件包索引
    2. 基础操作命令
      1. 镜像操作# 拉取镜像(从Docker Hub下载)
      2. 容器操作# 运行容器
      3. 实战:运行一个Web应用# 拉取一个简单的Python Web应用镜像
  4. 第三部分:Docker Compose详解(25分钟)
    1. 什么是Docker Compose?
    2. 安装Docker Compose
    3. Docker Compose核心语法
      1. 完整示例与语法详解
    4. 关键语法说明
      1. services配置
      2. networks配置
      3. volumes配置
    5. Docker Compose命令
  5. docker-compose exec web /bin/bash
  6. 第四部分:实战练习(5分钟)
  7. 总结与进阶

1小时入门Docker和Docker Compose

前言

你是否曾因"在我电脑上能运行"的问题而困扰?Docker的出现彻底解决了环境一致性问题。本教程将用60分钟带你入门Docker容器技术,重点讲解Docker Compose的配置语法,让你读完就能部署多容器应用,再读一遍就能灵活配置复杂服务。


第一部分:认识Docker(10分钟)

什么是Docker?

Docker是一个开源的容器化平台,能让应用程序及其依赖环境被打包成标准化单元(容器),实现"一次构建,到处运行"。

核心优势: - 环境一致性:消除"在我这能运行"的问题 - 资源高效:比虚拟机更轻量,启动更快 - 隔离性:不同应用运行在独立容器中,互不干扰 - 可移植性:在开发机、测试环境、生产服务器间无缝迁移

核心概念

概念 解释 类比
镜像(Image) 包含应用程序及依赖的只读模板 类似操作系统ISO文件
容器(Container) 镜像的运行实例,可读写 类似运行中的虚拟机
仓库(Repository) 存储和分发镜像的地方 类似代码仓库(如GitHub)
Dockerfile 构建镜像的文本文件,包含一系列指令 类似自动化安装脚本
Docker Compose 用于定义和运行多容器Docker应用的工具 类似多服务启动脚本

与虚拟机的区别

Docker与虚拟机对比

  • 虚拟机:需要完整的操作系统,资源占用大,启动慢
  • Docker容器:共享宿主操作系统内核,只包含必要的应用和依赖,轻量高效

第二部分:Docker安装与基础操作(20分钟)

安装Docker

Windows系统

  1. 下载并安装Docker Desktop
  2. 启动Docker,等待状态栏显示"Docker Desktop running"

Mac系统

  1. 下载并安装Docker Desktop for Mac
  2. 从应用程序中启动Docker

Linux系统(Ubuntu为例)# 更新软件包索引

sudo apt-get update

安装必要的依赖

sudo apt-get install 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=(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

安装Docker引擎

sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io

验证安装

sudo docker run hello-world

基础操作命令

镜像操作# 拉取镜像(从Docker Hub下载)

docker pull [镜像名]:[标签]

示例:拉取最新版Nginx镜像

docker pull nginx:latest

查看本地镜像

docker images

删除镜像

docker rmi [镜像ID或镜像名]

容器操作# 运行容器

docker run [选项] 镜像名 [命令]

示例:运行Nginx容器,映射80端口,后台运行

docker run -d -p 80:80 --name mynginx nginx

选项说明:

-d: 后台运行容器

-p 主机端口:容器端口: 端口映射

--name: 给容器指定名称

查看运行中的容器

docker ps

查看所有容器(包括停止的)

docker ps -a

停止容器

docker stop [容器ID或容器名]

启动已停止的容器

docker start [容器ID或容器名]

进入容器内部

docker exec -it [容器ID或容器名] /bin/bash

删除容器

docker rm [容器ID或容器名]

实战:运行一个Web应用# 拉取一个简单的Python Web应用镜像

docker pull python:3.9-slim

创建一个简单的Python文件(本地)

echo 'from flask import Flask app = Flask(name) @app.route("/") def hello(): return "Hello from Docker!" if name "main": app.run(host="0.0.0.0", port=5000)' > app.py

运行容器,挂载本地文件到容器,映射端口

docker run -d -p 5000:5000 -v $(pwd):/app -w /app --name myapp python:3.9-slim sh -c "pip install flask && python app.py" 访问http://localhost:5000即可看到运行结果,修改本地app.py文件后刷新页面,内容会实时更新。


第三部分:Docker Compose详解(25分钟)

什么是Docker Compose?

Docker Compose是一个用于定义和运行多容器Docker应用程序的工具。通过一个YAML文件配置应用程序的所有服务,然后使用单个命令创建和启动所有服务。

适用场景: - 包含多个服务的应用(如Web应用+数据库+缓存) - 开发环境的快速搭建 - 自动化测试环境配置 - 简单的服务编排

安装Docker Compose

注意:Windows和Mac安装Docker Desktop时已包含Docker Compose,Linux需要单独安装

Linux系统安装Docker Compose

sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.3/docker-compose-(uname -s)-(uname -m)" -o /usr/local/bin/docker-compose

赋予执行权限

sudo chmod +x /usr/local/bin/docker-compose

验证安装

docker-compose --version

Docker Compose核心语法

Docker Compose使用YAML格式的配置文件(默认名为docker-compose.yml),主要包含以下顶级元素:

  1. version:指定Compose文件格式版本(推荐使用3.x
  2. services:定义各个服务(容器)的配置
  3. networks:定义网络配置
  4. volumes:定义数据卷配置
  5. configs:配置管理(用于Swarm模式)
  6. secrets:敏感信息管理

完整示例与语法详解

下面是一个包含Web应用、数据库和Redis缓存的完整示例,附带详细注释:

指定Compose文件格式版本,3.8是较新的稳定版本

version: '3.8'

定义所有服务(容器)

services: # 服务名称:web(可自定义) web: # 构建镜像的配置 build: context: ./app # Dockerfile所在目录 dockerfile: Dockerfile # Dockerfile文件名(默认就是Dockerfile,可省略) # 如果不构建,也可以直接使用现有镜像 # image: my-web-app:latest

# 容器名称(可选)
container_name: my_web_app

# 端口映射:主机端口:容器端口
ports:
  - "80:8000"  # 将主机80端口映射到容器的8000端口

# 环境变量配置
environment:
  - DEBUG=False          # 非敏感环境变量直接写
  - DB_HOST=db           # 可以引用其他服务名作为主机名
  - DB_PORT=5432
env_file:
  - ./.env               # 从文件加载环境变量(适合开发环境)

# 数据卷挂载:持久化数据或共享文件
volumes:
  - static_volume:/app/static  # 命名卷:卷名:容器内路径
  - ./app:/app                 # 绑定挂载:本地路径:容器内路径(适合开发)

# 依赖关系:先启动db和redis服务再启动web
depends_on:
  - db
  - redis

# 网络配置:指定服务加入的网络
networks:
  - app_network

# 健康检查:检测服务是否正常运行
healthcheck:
  test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
  interval: 30s    # 检查间隔
  timeout: 10s     # 超时时间
  retries: 3       # 重试次数
  start_period: 40s # 启动后等待时间

# 重启策略
restart: unless-stopped  # 除非手动停止,否则总是重启

数据库服务

db: image: postgres:13 # 使用官方PostgreSQL镜像 container_name: my_postgres volumes: - postgres_data:/var/lib/postgresql/data/ # 持久化数据库数据 environment: - POSTGRES_USER=appuser - POSTGRES_PASSWORD=secretpassword - POSTGRES_DB=myappdb networks: - app_network restart: unless-stopped # 暴露端口(仅在内部网络可见,不映射到主机) expose: - "5432"

Redis缓存服务

redis: image: redis:6-alpine # 使用轻量的Alpine版本 container_name: my_redis volumes: - redis_data:/data networks: - app_network restart: unless-stopped command: redis-server --appendonly yes # 启动命令,开启持久化

定义网络

networks: app_network: driver: bridge # 使用桥接网络(默认)

定义数据卷

volumes: postgres_data: # 数据库数据卷 redis_data: # Redis数据卷 static_volume: # 静态文件卷

关键语法说明

services配置

每个服务对应一个容器,主要配置项:

  • build:构建镜像的配置
    • context:构建上下文路径
    • dockerfile:指定Dockerfile
    • args:构建参数
  • image:使用的镜像名称,与build二选一

  • ports:端口映射,格式:
    • 主机端口:容器端口(如80:8080
    • 仅指定容器端口(随机映射主机端口,如8080
  • environment:环境变量,两种格式:
    • 数组形式:- KEY=VALUE
    • 字典形式:KEY: VALUE
  • volumes:数据卷挂载,格式:
    • 命名卷:卷名:容器路径[:选项]
    • 绑定挂载:本地路径:容器路径[:选项]
    • 临时卷:tmpfs:容器路径
  • depends_on:服务依赖关系,定义启动顺序

  • networks:服务加入的网络

  • command:覆盖容器启动命令

  • restart:重启策略,常用值:

    • no:默认,不重启
    • always:总是重启
    • on-failure:失败时重启
    • unless-stopped:除非手动停止,否则总是重启

networks配置

定义网络让服务之间通信,常用驱动: - bridge:默认,同一主机内的容器通信 - overlay:跨主机容器通信(Swarm模式) - host:使用主机网络 - none:禁用网络

volumes配置

定义命名卷,用于持久化数据,避免容器删除后数据丢失。

Docker Compose命令

构建并启动所有服务(后台运行)

docker-compose up -d

启动服务并查看日志(前台运行)

docker-compose up

构建镜像(即使镜像已存在也重新构建)

docker-compose build

查看服务状态

docker-compose ps

查看服务日志

docker-compose logs

查看特定服务日志并实时更新

docker-compose logs -f web

停止服务(不删除容器)

docker-compose stop

启动已停止的服务

docker-compose start

停止并删除容器、网络(数据卷和镜像保留)

docker-compose down

停止并删除所有(包括数据卷)

docker-compose down -v

进入服务容器

docker-compose exec web /bin/bash

第四部分:实战练习(5分钟)

现在动手实践一个简单的多服务应用:

  1. 创建项目目录并进入
    mkdir docker-demo && cd docker-demo
    
  2. 创建docker-compose.yml文件,内容如下:
    version: '3.8'
    
    services:
     # Web服务
     web:
       image: nginx:alpine
       ports:
         - "80:80"
       volumes:
         - ./html:/usr/share/nginx/html  # 挂载本地HTML文件
       depends_on:
         - api
       networks:
         - demo-network
    
     # API服务
     api:
       image: kennethreitz/httpbin  # 一个简单的HTTP测试服务
       expose:
         - "80"
       networks:
         - demo-network
    
    networks:
     demo-network:
    
  3. 创建HTML目录和文件
    mkdir html && echo '

    My Docker Demo

    API地址: http://localhost/api/get

    ' > html/index.html
  4. 启动服务
    docker-compose up -d
    
  5. 测试访问
    • 打开http://localhost查看Web页面
    • 打开http://localhost/api/get查看API响应
  6. 查看状态并停止服务
    docker-compose ps
    docker-compose down
    

通过这个练习,你可以理解如何用Docker Compose编排多个服务,并实现服务间的通信。


总结与进阶

通过这一小时的学习,你已经掌握了:

  • Docker的核心概念和基础操作
  • Docker Compose的配置语法和使用方法
  • 如何编排多容器应用

进阶学习方向:

  1. Dockerfile深入学习:掌握镜像构建的最佳实践
  2. 容器网络:理解不同网络模式的应用场景
  3. 数据管理:学习数据卷、绑定挂载的高级用法
  4. CI/CD集成:将Docker融入自动化部署流程
  5. 容器监控:学习如何监控容器运行状态
  6. Kubernetes:当应用规模扩大时,学习更强大的容器编排平台

实践建议:将你熟悉的项目Docker化,尝试用Docker Compose管理开发环境,逐步积累实战经验。Docker生态系统非常丰富,循序渐进地学习会让你更容易掌握。

《1小时入门Docker和Docker Compose》留言数:0

发表留言