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 time

import redis
from flask import Flask

app = 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,内容如下:

flask
redis

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

# syntax=docker/dockerfile:1
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
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: wordpress
volumes:
  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 --permanent
firewall-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节点上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值