写在前面
我第一次知道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:
在这个例子中:
web
、app
和db
服务分别定义了web_net
、app_net
和db_net
网络。networks
部分用于指定每个服务应加入的网络。
由于 web 服务只能访问 web_net 网络,因此它将无法直接访问 app 或 db 服务。同样,app 服务只能访问 app_net 网络,因此它将无法直接访问 db 服务。
为了使 app 服务能够访问 db 服务,我们需要使用服务发现机制,例如 DNS 或环境变量。这里就不做赘述,这只是一个简单的示例,用于演示如何在 Docker Compose 中实现网络隔离。实际情况可能更复杂,可能需要其他网络配置选项。