Docker 基础使用

1. Docker 组件

Docker 主要由以下三个核心组件组成:

  • 镜像(Image):类似于软件的 蓝图,定义了容器运行所需的环境。
  • 容器(Container):基于镜像创建的 实例,可以运行应用。
  • 引擎(Engine):Docker 的 核心管理组件,负责容器的创建、运行、管理等。

2. 如何构建镜像(Blueprint)

  1. 编写 Dockerfile 定义镜像构建过程。
  2. 构建镜像
    1
    docker build -t my_image .
  3. 发布镜像
    • 登录 Docker Hub:
      1
      docker login
    • 推送镜像:
      1
      docker push my_image
  4. 使用镜像
    • 运行容器:
      1
      docker run -d --name my_container my_image

使用 Docker 执行 CI/CD

Docker 可与 JenkinsGitHub Actions 结合使用,实现 CI/CD:

  • Jenkins + Docker:用于企业级 CI/CD 自动化部署。
  • GitHub Actions(适用于个人小项目/免费方案)。

3. 查看容器日志

使用 docker logs 命令查看容器日志:

1
docker logs my_container

支持多种日志模式:

1
2
3
docker logs -f my_container  # 持续查看日志(实时刷新)
docker logs --tail 100 my_container # 查看最后100行日志
docker logs --since 10m my_container # 查看最近10分钟的日志

4. Docker 数据卷(Volume)

Docker 数据卷 主要用于持久化存储数据,容器销毁时数据不会丢失。

1. 创建数据卷

1
docker volume create my_data

2. 运行容器并挂载数据卷

1
docker run -d --name my_container -v my_data:/app/data nginx

3. 多个容器共享数据卷

1
2
docker run -d --name container1 -v my_data:/app/data nginx
docker run -d --name container2 -v my_data:/app/data alpine

4. 查看数据卷信息

1
docker volume inspect my_data

5. Docker 网络

Docker 提供多种 网络模式,用于管理容器间的通信:

1. Bridge(桥接模式)

  • 默认模式,适用于多个容器之间的通信。
  • 在相同桥接网络的容器可以通过容器名互相访问。
  • 创建桥接网络并将容器连接到该网络:
    1
    2
    3
    docker network create my_bridge
    docker run -d --name container1 --network my_bridge_network nginx
    docker run -d --name container2 --network my_bridge
  • 使用 Docker Compose 可以自动创建共享网络,提供基础的服务发现功能

2. Host(主机模式)

  • 容器直接使用 宿主机的网络,不做隔离,具有更高的网络性能。

3. None(无网络)

  • 容器没有任何网络连接,适用于需要完全隔离的环境。

4. Overlay 网络

  • 用于 Docker Swarm 集群,使多个主机上的容器可相互通信。

5. Macvlan 模式

  • 允许容器直接与宿主机的网络通信,适用于需要独立 IP 地址 的场景。

6. 如何优化 Docker 启动时间

  1. 使用较小的基础镜像(如 alpine 代替 ubuntu)。
  2. 利用构建缓存:避免每次 docker build 都从头开始构建。
  3. 减少容器层数:使用多阶段构建来减少镜像大小。
  4. 本地缓存镜像
    1
    docker pull my_image
  5. 优化应用启动方式:如 多阶段构建,减少不必要的运行时依赖。

6. 使用 docker-compose

docker-compose 允许用 YAML 配置文件 定义多个容器,并通过一个命令启动所有容器:

  1. 编写 docker-compose.yml 文件
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    version: '3'
    services:
    web:
    image: nginx
    ports:
    - "80:80"
    db:
    image: mysql
    environment:
    MYSQL_ROOT_PASSWORD: root
  2. 使用 docker-compose 启动容器
    1
    docker-compose up -d

6. 使用多阶段构建优化镜像体积

多阶段构建可减少最终镜像的大小:

1
2
3
4
5
6
7
8
9
10
11
# 第一阶段:构建应用
FROM golang:1.18 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp

# 第二阶段:创建更小的最终镜像
FROM alpine
WORKDIR /app
COPY --from=0 /app/mybinary .
CMD ["./mybinary"]
  • 第一阶段:使用完整的 Golang 环境构建二进制文件。
  • 第二阶段:使用 alpine 作为基础镜像,仅复制最终生成的二进制文件,减少体积。

6. Docker Swarm(集群)

Docker Swarm 是 Docker 官方提供的 轻量级容器编排工具

  • 允许将多个 Docker 主机集合成一个虚拟 Docker 主机。
  • 适用于 轻量级的集群管理,相比 Kubernetes 更加简单易用。

7. 总结

  • Docker 提供了镜像、容器、网络等组件,简化应用的打包、分发、部署
  • 通过 Dockerfile 构建自定义镜像,并使用 Docker Hub 分发。
  • 利用 Docker + CI/CD 工具(如 JenkinsGitHub Actions),可实现自动化部署。
  • 通过 Docker Compose 快速启动多容器应用,简化管理。
  • 使用 多阶段构建优化镜像体积,提高拉取与启动速度。
  • 优化启动时间 可以通过:
    • 选择较小的基础镜像。
    • 减少不必要的层数。
    • 使用本地缓存提高构建效率。