写在前面

我第一次知道docker这个东西还是在大学时期,那时候第一次接触到容器化虚拟化的东西应该时VMware虚拟机,后来又用到过Windows的WSL,这都是很棒的技术,虚拟化技术和容器技术并不是很新鲜的东西,例如容器技术的起源可以追溯到20世纪70年代的chroot jail技术。chroot jail技术能够将一个进程及其子进程隔离在特定的目录树中,从而实现进程的隔离。

所以说Docker 其实并不是一种新技术,而是一个新瓶装旧酒的工具。到现在我对Docker 的理解都还是比较模糊的,最近看到一些写的很棒的文章讲到了,docker compose这个东西,我之前在构建一些开源项目的环境时也用到了,于是打算系统的学习一下这个玩意,这篇文章用来记录一下这个过程😁。

什么是 docker-compose

Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。使用Compose,就可以使用 YAML 文件来配置应用程序的服务。然后,使用一个命令,就可以从您的配置中创建并启动所有服务。

也就是只需要简单的一句 docker-compose up 就可以启动项目中所依赖的相关服务,例如数据库、缓存、微服务等。

编写 compose 的配置文件

Compose 有两个重要的概念:

  • services,这是一个 map,里面的 key 是容器的名字,value 是容器的配置。(map 是一种抽象数据类型,用于存储键值对)

  • projects,由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。

可见,一个项目可以由多个服务 (容器) 关联而成,Compose 面向项目进行管理。

其实你可以把 Docker 的容器想的很简单,是一个普通操作系统的进程只不过有独立的网络,独立的文件系统,和自己单独的进程树。

所以在建设自己的微服务环境的时候,需要关注容器的网络是否是联通的,以及容器中的文件是否需要挂载到本地。

下面是几个简单的例子:

version: "3.9"

services:
  web:
    image: nginx:latest
    ports:
      - "80:80"

在此示例中,我们将创建一个名为 web 的服务。此服务将使用 nginx:latest 映像,并将其端口 80 映射到主机的端口 80。这意味着您将能够通过访问 http://localhost 访问 Web 应用程序。

version: "3.9"

services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
  app:
    image: my-app:latest
    depends_on:
      - web

在此示例中,我们将创建两个服务:web 和 app。web 服务将使用 nginx:latest 映像,app 服务将使用 my-app:latest 映像。app 服务依赖于 web 服务,这意味着 app 服务将在 web 服务启动后启动。

Docker Compose 网络隔离

version: "3.9"

services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    networks:
      - web_net

  app:
    image: my-app:latest
    networks:
      - app_net

  db:
    image: postgres:latest
    networks:
      - db_net

networks:
  web_net:
  app_net:
  db_net:

在这个例子中:

  • webappdb 服务分别定义了 web_netapp_netdb_net 网络。

  • networks 部分用于指定每个服务应加入的网络。

由于 web 服务只能访问 web_net 网络,因此它将无法直接访问 app 或 db 服务。同样,app 服务只能访问 app_net 网络,因此它将无法直接访问 db 服务。

为了使 app 服务能够访问 db 服务,我们需要使用服务发现机制,例如 DNS 或环境变量。这里就不做赘述,这只是一个简单的示例,用于演示如何在 Docker Compose 中实现网络隔离。实际情况可能更复杂,可能需要其他网络配置选项。

一个懒人