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 service:The 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 service:The 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节点上。