Docker & Docker Compose
Docker & Docker Compose

Docker & Docker Compose

Tags
Computer Science
Web Dev
App Dev
Tech
Software Development
Published
April 30, 2024
Author
Junkai Ji

Docker

Docker 是一款轻量级的容器化平台,帮助开发者在任何环境下快速部署应用程序。它以容器的形式封装应用程序及其依赖环境,实现一致性、快速启动、资源隔离等优势。本篇文章将详细介绍 Docker 的基础指令及其工作原理,随后带你进入 Docker Compose 的进阶使用。

Docker 的核心原理

Docker 基于 镜像容器网络数据卷 构建。
  1. 镜像(Image):不可变的只读模板,包含应用及其运行环境。
  1. 容器(Container):镜像的运行实例,应用运行的隔离环境。
  1. 网络(Network):提供容器之间及外部的通信能力。
  1. 数据卷(Volume):用于持久化存储,避免容器删除时数据丢失。
Docker 通过 CgroupsNamespace 提供隔离和资源控制,同时依赖 UnionFS(联合文件系统) 实现镜像的层级存储。

Docker 基础指令

1. 镜像管理

1.1 获取镜像

从远程仓库(如 Docker Hub)拉取镜像:
docker pull <image>:<tag> # 示例 docker pull nginx:latest

1.2 列出本地镜像

查看已下载的镜像:
docker images

1.3 删除镜像

清理不再需要的镜像:
docker rmi <image>:<tag> # 强制删除 docker rmi -f <image>:<tag>

1.4 构建镜像

通过 Dockerfile 自定义构建镜像:
docker build -t <image>:<tag> <context> # 示例 docker build -t myapp:1.0 .

1.5 检查镜像层

查看镜像的分层信息:
docker history <image>:<tag>

2. 容器管理

2.1 启动容器

基于镜像运行容器:
docker run [OPTIONS] <image> # 示例 docker run -d -p 8080:80 --name web nginx
  • 常见选项:
    • d:后台运行容器。
    • p:端口映射,格式为 宿主机端口:容器端口
    • -name:为容器指定名称。
    • v:挂载数据卷。

2.2 查看容器

列出正在运行的容器:
docker ps
显示所有容器(包括停止的):
docker ps -a

2.3 停止与删除容器

停止容器:
docker stop <container>
删除容器:
docker rm <container>

2.4 进入容器

进入正在运行的容器交互模式:
docker exec -it <container> /bin/bash

2.5 查看容器日志

获取容器输出的日志:
docker logs <container> # 实时日志 docker logs -f <container>

2.6 检查容器资源

监控容器的 CPU、内存等使用情况:
docker stats

3. 网络管理

3.1 列出网络

查看所有网络:
docker network ls

3.2 创建网络

创建自定义网络:
docker network create <network-name>

3.3 启动容器连接网络

运行容器时指定网络:
docker run --network <network-name> <image>

3.4 查看容器网络

查看容器的网络配置:
docker inspect <container>

4. 数据卷管理

4.1 创建数据卷

定义持久化存储:
docker volume create <volume-name>

4.2 挂载数据卷

将数据卷挂载到容器:
docker run -v <volume-name>:<container-path> <image>

4.3 列出数据卷

查看现有的数据卷:
docker volume ls

4.4 删除数据卷

清理不再需要的数据卷:
docker volume rm <volume-name>

5. Dockerfile 指令

Dockerfile 是构建镜像的脚本,以下是常用指令:
# 基础镜像 FROM <base-image> # 设置维护者信息 MAINTAINER <name> # 拷贝文件到镜像 COPY <src> <dest> # 运行命令 RUN <command> # 容器启动命令 CMD ["executable", "param1", "param2"] # 暴露端口 EXPOSE <port> # 设置工作目录 WORKDIR <path>
示例:
FROM nginx:latest COPY index.html /usr/share/nginx/html EXPOSE 80
构建镜像:
docker build -t my-nginx:1.0 .

Docker Compose

Docker Compose 是用于定义和运行多容器应用的工具,基于 docker-compose.yml 文件简化管理。

1. 安装 Docker Compose

在大多数系统中,Docker Desktop 已内置 Docker Compose。检查版本:
docker-compose version

2. Docker Compose 文件格式

Compose 文件采用 YAML 格式,主要部分包括:
  • services:定义服务。
  • volumes:定义数据卷。
  • networks:定义网络。
示例:
version: "3.9" services: web: image: nginx ports: - "8080:80" volumes: - ./html:/usr/share/nginx/html app: build: context: ./app networks: - app-network volumes: app-data: networks: app-network:

3. 常用指令

3.1 启动服务

启动所有服务:
docker-compose up
后台运行:
docker-compose up -d

3.2 查看服务状态

列出当前运行的服务:
docker-compose ps

3.3 停止服务

停止并清理服务:
docker-compose down

3.4 构建服务

重新构建服务:
docker-compose build

3.5 调试日志

查看服务日志:
docker-compose logs
实时日志:
docker-compose logs -f

4. 高级功能

4.1 配置扩展

Compose 支持多环境文件:
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up

4.2 Scale

扩展服务实例数量:
docker-compose up --scale <service>=<count>

4.3 环境变量

.env 文件中定义变量:
APP_PORT=8080
在 Compose 文件中引用:
ports: - "${APP_PORT}:80"

5. 示例项目

完整示例:
version: "3.9" services: database: image: postgres:13 environment: POSTGRES_USER: admin POSTGRES_PASSWORD: password volumes: - db-data:/var/lib/postgresql/data backend: build: context: ./backend depends_on: - database ports: - "5000:5000" frontend: build: context: ./frontend ports: - "3000:3000" depends_on: - backend volumes: db-data:
运行服务:
docker-compose up -d