虽说kubernetes已经成为了容器编排的事实标准,但其强大的功能也伴随着复杂度和成本的提升。
在一些简易任务的应用场景中,Kubernetes显得有些笨重,即使是“玩具”性质的 minikube、kind,对电脑也有比较高的要求,会“吃”掉不少的计算资源,属于“大材小用”。
那到底有没有这样的工具,既像 Docker 一样轻巧易用,又像 Kubernetes 一样具备容器编排能力呢?
本文所用的docker-compose就刚好满足刚才的需求,是一个在单机环境里轻量级的容器编排工具,填补了 Docker 和 Kubernetes 之间的空白位置。
docker-compose是一种容器编排技术,也使用YAML,但它的基因与 Kubernetes 完全不同,走的是 Docker 的技术路线,所以在设计理念和使用方法上有差异就不足为怪了。
docker-compose 自身的定位是管理和运行多个 Docker 容器的工具,很显然,它没有 Kubernetes 那么“宏伟”的目标,只是用来方便用户使用 Docker 而已,所以学习难度比较低,上手容易,很多概念都是与 Docker 命令一一对应的。
docker-compose 的安装非常简单,它在 GitHub(https://github.com/docker/compose)上提供了多种形式的二进制可执行文件,支持 Windows、macOS、Linux 等操作系统,也支持 x86_64、arm64 等硬件架构,可以直接下载。
下面给出了Linux上安装的shell命令:
# intel x86_64
sudo curl -SL https://github.com/docker/compose/releases/download/v2.6.1/docker-compose-linux-x86_64 \
-o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
不过wsl是使用docker desktop for windows的docker engine,是直接就有docker-compose的。
安装完成之后,来看一下它的版本号,命令是 docker-compose version
,用法和 docker version
是一样的:
docker-compose version
安装好docker-compose之后,我们就可以通过编写YAML文件来管理容器了。
docker-compose 里管理容器的核心概念是“service”。虽然Kubernetes里也有Service,但却是完全不同的东西。docker-compose 里的“service”就是一个容器化的应用程序,通常是一个后台服务,用 YAML 定义这些容器的参数和相互之间的关系。对于service的YAML文件字段定义,可见docker官网的详细说明文档。
下面继续以搭建WordPress网站为例,来看看docker-compose是如何方便地部署。
本次案例的架构图和玩转docker实战(一):多个docker的网站搭建一样,如下图所示。
首先还是先定义数据库MariaDB,环境变量的写法与 Kubernetes 的 ConfigMap 有点类似,但使用的字段是 environment,直接定义,不用再“绕一下”:
services:
mariadb:
image: mariadb
container_name: mariadb
restart: always
environment:
MARIADB_DATABASE: db
MARIADB_USER: wp
MARIADB_PASSWORD: 123
MARIADB_ROOT_PASSWORD: 123
和之前的docker命令进行对比,可以看到environment中定义的变量,也就是命令中的–env,两者非常的类似
docker run -d --rm \
--env MARIADB_DATABASE=db \
--env MARIADB_USER=wp \
--env MARIADB_PASSWORD=123 \
--env MARIADB_ROOT_PASSWORD=123 \
mariadb
第二步是定义 WordPress 网站,它也使用 environment 来设置环境变量:
services:
...
wordpress:
image: wordpress
container_name: wordpress
restart: always
environment:
WORDPRESS_DB_HOST: mariadb #注意这里,数据库的网络标识
WORDPRESS_DB_USER: wp
WORDPRESS_DB_PASSWORD: 123
WORDPRESS_DB_NAME: db
depends_on:
- mariadb
不过,因为 docker-compose 会自动把 MariaDB 的名字用做网络标识,所以在连接数据库的时候(字段 WORDPRESS_DB_HOST
)就不需要手动指定 IP 地址了,直接用“service”的名字 mariadb 就行了。这是 docker-compose 比 Docker 命令要方便的一个地方,和 Kubernetes 的域名机制很像。
WordPress 定义里还有一个值得注意的是字段 depends_on
,它用来设置容器的依赖关系,指定容器启动的先后顺序,这在编排由多个容器组成的应用的时候是一个非常便利的特性。
第三步就是定义 Nginx 反向代理了,不过很可惜,docker-compose 里没有 ConfigMap、Secret 这样的概念,要加载配置还是必须用外部文件,无法集成进 YAML。
Nginx 的配置文件和玩转docker实战(一):多个docker的网站搭建里也差不多,同样的,在 proxy_pass 指令里不需要写 IP 地址了,直接用 WordPress 的名字就行:
server {
listen 80;
default_type text/html;
location / {
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_pass http://wordpress; #注意这里,网站的网络标识
}
}
然后我们就可以在 YAML 里定义 Nginx 了,加载配置文件用的是 volumes 字段,和 Kubernetes 一样,但里面的语法却又是 Docker 的形式:
services:
...
nginx:
image: nginx
container_name: nginx
hostname: nginx
restart: always
ports:
- 80:80
volumes:
- ./proxy.conf:/etc/nginx/conf.d/default.conf
depends_on:
- wordpress
到这里,三个“service”就都定义好了,所以目前wp-compose.yaml
文件的内容如下图所示:
然后用 docker-compose up -d
启动网站,记得还是要用 -f 参数指定 YAML 文件:
docker-compose -f wp-compose.yaml up -d
启动之后,用 docker-compose -f wp-compose.yaml ps
来查看状态:
当然,如果你想进一步验证这些容器的网络是否互通(通过网络标识),可以docker-compose exec
进入容器内部。
由于本文使用的Nginx镜像tag是alpine,里面有很多小工具,包括ping。如果直接安装默认的Nginx镜像,是没有ping的。
docker-compose -f wp-compose.yml exec -it nginx sh
从上图可以看到,分别 ping 了 mariadb 和 wordpress 这两个服务,网络都是通的,不过它的 IP 地址段用的是“172.22.0.0/16”,和 Docker 默认的“172.17.0.0/16”不一样。
这时候,我们就可以在主机浏览器地址栏输入http://127.0.0.1,访问到WordPress页面了。