随着微服务架构的现代兴起,容器化技术已经成为应用开发的重要组成部分。Docker作为最流行的容器化平台之一,使得应用的部署和管理变得更加灵活。
我平时使用docker容器通常都是部署单个小的应用,所以使用docker的命令就可以满足启停、运维的需求。但是对于一个应用中多个容器这种情况来说,就需要一些工具来将这些容器组织起来。
k8s是我们听过最常用的容器管理工具,但是对于个人开发者来说,k8s有点过于重量级了,其中包含了许多复杂的组件,从学习和部署都是需要一定的时间和资源成本。所以简单好用的docker-compose就成了一个比较不错的选择。
docker-compose是一个工具,用于定义和运行多个 Docker 容器。用户通过一个名为docker-compose.yml的YAML文件,来配置应用的各个服务,包括服务的镜像、环境变量、端口映射、卷挂载等信息。使用docker-compose,开发人员可以一键启动整个应用的所有服务,减轻了手动管理每个容器的复杂性。
我之前在服务器上,基于docker搭建了一个HDP版本的Hadoop集群,一共5个节点,包含2个NameNode和3个DataNode。然后我就是用docker-compose将五个节点启动组织成一个大数据集群应用。在此应用中,DN要在NN前启动。
docker-compose使用yum即可安装,真正的难点是如何编写docker-compose的yaml配置文件,其实这个文件和Dockerfile大同小异,掌握了语法就能轻松的编写,不过要注意的是:yaml文件要按照配置层级进行缩进。
还是从docker-compose.yaml的一个样例,来演示如何编写配置:
version: '3' # 指定 Compose 文件的版本
services: # 定义服务
service_name: # 服务名称
image: image_name:tag # 使用的镜像
build: # 可选,构建服务所需的 Dockerfile 路径
context: ./path/to/dockerfile # 构建上下文
dockerfile: Dockerfile # Dockerfile 名称
ports: # 端口映射
- "host_port:container_port"
environment: # 环境变量
- VARIABLE_NAME=value
- ANOTHER_VARIABLE=value
volumes: # 卷挂载
- host_path:container_path # 共享文件夹
networks: # 连接的网络
- network_name
depends_on: # 服务依赖关系
- other_service_name
restart: always # 容器重启策略
配置参数解释如下:
上面就是纯纯理论知识,在这我就使用docker-compose来搭建一个1 Nginx + 2 Tomcat的容器应用。
首先创建一个项目目录,在目录下新建一个docker-compose.yaml文件,其中nginx使用80端口,tomcat使用8080端口。
version: '3'
services:
nginx:
build:
context: /root/app/dockerfile/nginx
dockerfile: Dockerfile
ports:
- "800:80"
depends_on:
- tomcat1
- tomcat2
restart: always
tomcat1:
build:
context: /root/app/dockerfile/tomcat
dockerfile: Dockerfile
ports:
- "8081:8080"
restart: always
tomcat2:
build:
context: /root/app/dockerfile/tomcat
dockerfile: Dockerfile
ports:
- "8081:8080"
restart: always
可以通过build指定Dockerfile自己构建镜像,nginx和tomcat使用的之前的Dockerfile,如下图:
也可以直接使用image参数指定之前构造的对象,当编写完yaml配置之后,我们就可以开始使用compose来操作yaml中定义的一组容器。
之前说了yaml文件有层级的规范要求,那么如何知道我们的yaml是否符合规范,我们可以执行配置的检查命令:
docker-compose config -q
执行之后提示配置文件有问题。
去配置文件查看ports的缩进有问题,修改之后再次执行,当没有任何输出时表示配置没问题。
然后就开始构建容器,这个原理也是使用yaml中指定的Dockerfile来完成的构建。
docker-compose build
构建过程如图:
构造过后,可以看到多了compose开头的image。
有了image,就可以基于镜像启动容器了。
docker-compose up -d
-d表示后台启动,可以通过docker ps看到启动的容器信息:
上面的命令只需要执行一遍,docker-compose就通过yaml文件与一组容器关联了起来。接下里就是通过compose对这组容器进行操作了。
我们最常用的就是对容器进行启停。
docker-compose restart
docker-compose start
docker-compose stop
如图,和我们使用docker启动单个命令一样,docker-compose通过yaml文件启动一组容器。
然后就是删除所有容器,不过删除之后只需要后台启动容器就好了,构造镜像的步骤就不需要了。
docker-compose down
最后就是一些其他的命令,可以对比docker的命令。
# 进入容器
docker-compose exec 容器id
# 查看运行的所有容器
docker-compose ps
# 查看容器进程
docker-compose top
# 查看容器输出日志
docker-compose logs 容器id
从上面不难看出,docker-compose对于容器的操作和docker大同小异,只不过一个操作一组容器的命令,一个是操作单个容器的命令,这样让熟悉docker的开发者能够很快的上手docker-compose。
同时,docker-compose更适合开发和测试小型项目,而K8s则是为生产环境设计的容器编排平台,适合大规模和复杂的应用场景。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。