> 技术文档 > Docker compose与swarm

Docker compose与swarm


一、docker compose

Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。使用 Docker Compose 可以轻松、高效的管理容器。

Compose 使用的三个步骤:

1、使用 Dockerfile 定义应用程序的环境。

2、使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。

docker-compose.yml 的配置案例如下:

3、最后,执行 docker-compose up 命令来启动并运行整个应用程序。

Compose 允许用户通过一个单独的 docker-compose.yml 模板文件(YAML格式)来定义一组相关联的应用容器为一个项目(project)

两个重要的概念:

服务(service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。

项目(project):由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml文件中定义。

Compose 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。

1、安装docker compose

官方文档:Install | Docker Docs

1、下载docker compose

官方给的下载地址,下载较慢,有可能会失败。

sudo curl -L \"https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)\" -o /usr/local/bin/docker-compose

或者下载最新版本:

sudo curl -L \"https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)\" -o /usr/local/bin/docker-compose

推荐下载地址:(国内的daocloud.io镜像无法访问了)

sudo curl -L \"https://get.daocloud.io/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)\" -o /usr/local/bin/docker-compose 

2、授予可执行权限

chmod +x /usr/local/bin/docker-compose

3、查看版本,验证是否安装成功

docker-compose --version

2、简单使用docker compose

官方文档:Quickstart | Docker Docs

1、配置

1.1、为项目创建一个目录并进入到该目录下

mkdir composetest && cd composetest

1.2、创建app.py文件,内容如下

import timeimport redisfrom flask import Flaskapp = Flask(__name__)cache = redis.Redis(host=\'redis\', port=6379)def get_hit_count(): retries = 5 while True: try: return cache.incr(\'hits\') except redis.exceptions.ConnectionError as exc: if retries == 0: raise exc retries -= 1 time.sleep(0.5)@app.route(\'/\')def hello(): count = get_hit_count() return \'Hello World! I have been seen {} times.\\n\'.format(count)

In this example, redis is the hostname of the redis container on the application’s network. We use the default port for Redis, 6379.

1.3、创建requirements.txt,内容如下:

flaskredis

2、创建一个Dockerfile文件,内容如下

# syntax=docker/dockerfile:1FROM python:3.7-alpineWORKDIR /codeENV FLASK_APP=app.pyENV FLASK_RUN_HOST=0.0.0.0RUN apk add --no-cache gcc musl-dev linux-headersCOPY requirements.txt requirements.txtRUN pip install -r requirements.txtEXPOSE 5000COPY . .CMD [\"flask\", \"run\"]

This tells Docker to:

  • Build an image starting with the Python 3.7 image.
  • Set the working directory to /code.
  • Set environment variables used by the flask command.
  • Install gcc and other dependencies
  • Copy requirements.txt and install the Python dependencies.
  • Add metadata to the image to describe that the container is listening on port 5000
  • Copy the current directory . in the project to the workdir . in the image.
  • Set the default command for the container to flask run.

3、创建一个compose文件,定义services

创建一个docker-compose.yml文件,内容如下

version: \"3.9\"services: web: build: . ports: - \"8000:5000\" redis: image: \"redis:alpine\"

This Compose file defines two services: web and redis.

Web serviceThe web service uses an image that’s built from the Dockerfile in the current directory. It then binds the container and the host machine to the exposed port, 8000. This example service uses the default port for the Flask web server, 5000.

Redis serviceThe redis service uses a public Redis image pulled from the Docker Hub registry.

上述三步执行完之后得到的结果如下:

4、使用compose构建和运行项目应用

4.1、在项目目录下执行docker-compose up命令

docker-compose up

4.2、在浏览器上输入http://localhost:8000/

在宿主机的浏览器上输入http://localhost:8000/,或其他主机的浏览器上输入http://宿主机ip:8000查看应用运行结果。下图中的192.168.133.10是在windows电脑上安装的虚拟机的ip地址。

5、停止docker compose

在docker compose启动的窗口按Ctrl+C,或者新开一个窗口输入docker compose stop命令,或输入docker compose down命令。stop是停止服务,down是停止并删除容器。

docker-compose的其他命令:

可以查看docker compose的网络信息:

3、使用docker-compose.yml文件构建项目

官方文档:Legacy versions | Docker Docs

docker-compose.yml文件由三层构成:version、services和其他配置。

3.1、官方示例:搭建博客

参考官网:WordPress samples | Docker Docs

1、创建并进入工程目录

mkdir my_wordpress && cd my_wordpress/

2、创建docker-compose.yml文件,内容如下:

version: \"3.9\" services: db: image: mysql:5.7 volumes: - db_data:/var/lib/mysql restart: always environment: MYSQL_ROOT_PASSWORD: somewordpress MYSQL_DATABASE: wordpress MYSQL_USER: wordpress MYSQL_PASSWORD: wordpress wordpress: depends_on: - db image: wordpress:latest volumes: - wordpress_data:/var/www/html ports: - \"8000:80\" restart: always environment: WORDPRESS_DB_HOST: db WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: wordpress WORDPRESS_DB_NAME: wordpressvolumes: db_data: {} wordpress_data: {}

3、构建项目:docker-compose up,或docker-compose up -d 以后台模式运行

4、在浏览器上打开博客页面测试:http://localhost:8000

3.2、实战:编写微服务构建项目

1、在idea中创建一个springboot微服务

2、编写Dockerfile文件构建镜像

3、编写docker-compose.yml文件编排项目

4、将上述微服务打包和文件放到服务器上,使用docker-compose up命令启动

重新开一个窗口访问:curl localhost:8081/hello

二、docker swarm

官网地址:Swarm mode | Docker Docs

工作模式:管理节点(奇数个)和工作节点

1、搭建一个集群

准备工作:准备至少三台虚拟机且都能连网,每台虚拟机上都安装docker。

查看docker swarm的命令:

1、初始化集群,创建管理节点

docker swarm init --advertise-addr ip  # ip是当前节点ip,让其他节点能找到该节点

docker swarm init 命令是初始化集群,即创建集群,并让当前节点成为管理节点。

查看当前主机的ip地址:

docker swarm init --advertise-addr 192.168.133.10

docker swarm join 命令是加入一个节点。

docker swarm join-token worker  # 生成工作节点认证令牌

docker swarm join-token manager  # 生成管理节点认证令牌

通过这两个命令会生成另外两个命令,分别在不同的其他节点执行生成后的两个命令,会将其他节点当做工作节点和管理节点加入到集群中。

2、将工作节点加入到集群中

在192.168.133.11服务器上执行下面命令时报错了,如下图所示:

[root@node2 ~]# docker swarm join --token SWMTKN-1-088y0bhzlivy2evff8yuyxzizwtohxaaa3ktqv2kyqdb8u5wbe-6tqtx5easzsnstr9knl200hkg 192.168.133.10:2377

Error response from daemon: rpc error: code = Unavailable desc = connection error: desc = \"transport: Error while dialing dial tcp 192.168.133.10:2377: connect: no route to host\"

解决方法参考:使用docker swarm部署搭建容器集群 - 民工黑猫 - 博客园

firewall-cmd --zone=public --add-port=2377/tcp --permanentfirewall-cmd --reload

然后在192.168.133.11虚拟机上再次执行将工作节点加入到集群的命令,如下所示:

将192.168.133.12服务器也当做工作节点加入到集群中:

其他三个虚拟机用同样的方法修改主机名,并根据提示输入R使用Mobaxterm重新连接。

3、在管理节点上查看节点信息

在管理节点192.168.133.10上使用docker node ls命令查看节点信息:

4、在集群中加入另一个管理节点

先通过docker swarm join-token manager 命令生成管理节点认证令牌。

在192.168.133.13服务器上执行上面生成的将管理节点加入集群的认证令牌命令。

在管理节点192.168.133.10上再次使用docker node ls命令查看节点信息:

至此,双主双从docker集群搭建完毕。如果一个管理节点出现异常停止,则另一个管理节点也不能正常工作,因为存活的管理节点必须过半。如下图所示,将管理节点node10上的docker停掉,在另一个管理节点node13上查看节点信息,提示报错。

重启node10节点上的docker之后,发现node13节点变成了leader。

2、docker swarm其他命令

docker swarm leave    # 让节点离开集群

让node12节点再加入到集群中:

3、docker service

docker service create -p 本机端口:容器端口 --name 服务名称  镜像名称

动态扩缩容:

docker service update --replicas N 服务名称  

docker service scale 服务名称=N

其中N表示扩缩服务的个数。

由上面几幅图可知,将ny-nginx服务扩成3个之后,分别运行在node10、node11和node13节点上。