docker-compose容器编排

 

 简介

Docker-Compose是Docker官方的开源项目,负责实现对Docker容器集群的快速编排,可以管理多个 Docker 容器组成一个应用,你只需要定义一个 YAML 格式的配置文件 docker-compose.yml,写好多个容器之间的调用关系,然后只要一个命令,就能同时启动/关闭这些容器。

 

docker建议我们每一个容器中只运行一个服务,因为docker容器本身占用资源极少,所以最好是将每个服务单独的分隔开来。

但是这样我们又面临了一个问题,如果我需要同时部署好多个服务,难道要每个服务单独写Dockerfile然后在构建镜像、构建容器?这样累都累死了,所以docker官方给我们提供了docker-compose多服务部署的工具。

例如要实现一个Web微服务项目,除了Web服务容器本身,往往还需要再加上后端的数据库mysql服务容器,redis服务器,注册中心eureka,甚至还包括负载均衡容器等等。。。。。。

Compose允许用户通过一个单独的docker-compose.yml模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。可以很容易地用一个配置文件定义一个多容器的应用,然后使用一条指令安装这个应用的所有依赖,完成构建。

Docker-Compose 解决了容器与容器之间如何管理编排的问题。

 

docker-compose.yml 文件示例:

version: "3.9"  # optional since v1.27.0
services:
  web:
    build: .
    ports:
      - "8000:5000"
    volumes:
      - .:/code
      - logvolume01:/var/log
    links:
      - redis
  redis:
    image: redis
volumes:
  logvolume01: {}

 

安装docker-compose

官网:https://docs.docker.com/compose/

官方安装文档:https://docs.docker.com/compose/install/

安装步骤

1. 下载:

官方地址:

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

国内加速地址(官方是从github下载,如下下载失败,使用此地址):

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

 

2. 添加执行权限

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

3. 验证

[root@localhost ~]# docker-compose --version
docker-compose version 1.29.2, build 5becea4c

如果验证时命令找不到,请添加软链接:

sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

卸载步骤

直接删除即可

sudo rm /usr/local/bin/docker-compose

 

Compose核心概念

一文件,两要素。

一文件:指一个 docker-compose.yaml 文件。

两要素:

  • 服务(service):指一个个的应用容器实例,比如订单微服务、库存微服务、mysql容器、nginx容器或者redis容器。
  • 工程(project):指由一组关联的应用容器组成的一个完成业务单元,在 docker-compose.yml 文件中定义。

 

Compose使用的三个步骤

  1. 编写Dockerfile定义各个微服务应用并构建出对应的镜像文件
  2. 使用 docker-compose.yml 定义一个完整业务单元,安排号整体应用中的各个容器服务。
  3. 最后执行 docker-compose up命令来启动并运行整个应用程序,完成一键部署上线。

 

Compose常用命令

docker-compose -h                           # 查看帮助

docker-compose up                           # 启动所有docker-compose服务

docker-compose up -d                        # 启动所有docker-compose服务并后台运行

docker-compose down                         # 停止并删除容器、网络、卷、镜像。

docker-compose exec  yml里面的服务id          # 进入容器实例内部  docker-compose exec docker-compose.yml文件中写的服务id /bin/bash

docker-compose ps                            # 展示当前docker-compose编排过的运行的所有容器

docker-compose top                           # 展示当前docker-compose编排过的容器进程

 

docker-compose logs  yml里面的服务id           # 查看容器输出日志

docker-compose config                        # 检查配置

docker-compose config -q                     # 检查配置,有问题才有输出

docker-compose restart                       # 重启服务

docker-compose start                         # 启动服务

docker-compose stop                          # 停止服务

 

如何编写自己的docker-compose.yml文件

docker-compose.yml 中所涉及到的关键字以及语法很多,针对于Compose v3 可以查看官方的文档:https://docs.docker.com/compose/compose-file/compose-file-v3/   ,文档中有示例以及每一个的用法。

 

使用示例

本示例来自官方文档,将演示创建一个简单的Python应用并使用docker-compose运行起来。

1. 为此项目创建一个目录

mkdir composetest
cd composetest/

2. 在目录下创建一个 app.py 文件,文件内容如下:

这就是用flask创建了一个简单的web应用,用到了redis,当访问时就会增加一此访问数记录到redis中,并显示出来。

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)

注意:代码里可以看到 host='redis' ,这个redis是主机名/服务名,看过之前Docker网络的就可以明白,使用主机名/服务名可以防止IP改变带来的访问异常。

3. 创建一个 requirements.txt 文件,这是 app.py 所需要的依赖包,内容如下:

flask
redis

4. 创建 Dockerfile 文件,用于构建Docker镜像,内容如下:

# 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"]

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

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

该 docker-compose.yml 文件定义了两个服务:web 和 redis ,app.py代码里的host='redis' 就是这里的redis

web服务:用到了 build ,所以会自动查找 Dockerfile 文件,根据Dockerfile文件内容构建镜像,然后定义的端口映射,将宿主机的8000映射到容易内的5000端口。5000端口是Flask默认的端口。

redis服务:定义了直接使用 redis:alpine 镜像,将自动从镜像仓库拉取。

6. 构建并运行,在目录下直接运行 docker-compose up,则会自动开始构建镜像,然后启动web和redis服务容器。

后台运行执行 docker-compose up -d

docker-compose up

7. 访问 http://192.168.92.146:8000 即可看到如下:

刷新页面,次数会+1次。

8. 新开一个终端执行 docker images 即可看到生成的镜像:

[root@localhost ~]# docker images
REPOSITORY        TAG          IMAGE ID       CREATED          SIZE
composetest_web   latest       3f17b7109a4b   46 minutes ago   185MB
redis             alpine       3900abf41552   3 months ago     32.4MB
python            3.7-alpine   a1034fd13493   3 months ago     41.8MB

一个名叫 composetest_web ,命名规则为:目录名_服务名

一个名叫 redis ,直接从镜像仓库拉取的。

9. 停止应用直接 Ctrl+C ,如果后台运行的就执行 docker-compose down

 

10. 编辑 docker-compose.yml 文件,为 web 服务添加一个挂载卷。

version: "3.9"
services:
  web:
    build: .
    ports:
      - "8000:5000"
    volumes:
      - .:/code
    environment:
      FLASK_ENV: development
  redis:
    image: "redis:alpine"

volumes 表示将 当前目录 . 挂载到容器里的/code目录,相当于 -v .:/code

environment 中的 FLASK_ENV: development 表示告诉 flask run 以 development 模式运行。

 

11. 重新构建并运行

docker-compose up --build

 

12. 更新应用

修改 app.py 中的文字,如将 Hello World! 改为 Hello from Docker!   

然后刷新浏览器,既可看到在宿主机上的更改,容器内可即时生效。

13. 其他命令

# -d 后台启动
[root@localhost composetest]# docker-compose up -d
Starting composetest_web_1   ... done
Starting composetest_redis_1 ... done


# 查看运行中的容器
[root@localhost composetest]# docker-compose ps
       Name                      Command               State                    Ports                  
-------------------------------------------------------------------------------------------------------
composetest_redis_1   docker-entrypoint.sh redis ...   Up      6379/tcp                                
composetest_web_1     flask run                        Up      0.0.0.0:8000->5000/tcp,:::8000->5000/tcp


# 查看 web 容器所有的环境变量
[root@localhost composetest]# docker-compose run web env
Creating composetest_web_run ... done
PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=f95b1306d45c
TERM=xterm
FLASK_ENV=development
LANG=C.UTF-8
GPG_KEY=0D96DF4D4110E5C43FBFB17F2D347EA6AA65421D
PYTHON_VERSION=3.7.12
PYTHON_PIP_VERSION=21.2.4
PYTHON_SETUPTOOLS_VERSION=57.5.0
PYTHON_GET_PIP_URL=https://github.com/pypa/get-pip/raw/3cb8888cc2869620f57d5d2da64da38f516078c7/public/get-pip.py
PYTHON_GET_PIP_SHA256=c518250e91a70d7b20cceb15272209a4ded2a0c263ae5776f129e0d9b5674309
FLASK_APP=app.py
FLASK_RUN_HOST=0.0.0.0
HOME=/root

# 停止docker-compose中定义的服务
[root@localhost composetest]# docker-compose stop
Stopping composetest_web_1   ... done
Stopping composetest_redis_1 ... done


# 移除docker-compose中定义的服务、网络
[root@localhost composetest]# docker-compose down
Removing composetest_web_run_2f4111d7ca36 ... done
Removing composetest_web_1                ... done
Removing composetest_redis_1              ... done
Removing network composetest_default


# 移除docker-compose中定义的服务、网络 以及挂载卷
[root@localhost composetest]# docker-compose down --volumes
Removing network composetest_default
WARNING: Network composetest_default not found.

 

案例:搭建一个Wordpress网站

本案例来自官方: https://docs.docker.com/samples/wordpress/

将演示如何使用 docker-compose 快速搭建起一个 WordPress 站点。

 

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. 启动

[root@localhost my_wordpress]# docker-compose up -d    # 启动
Creating network "my_wordpress_default" with the default driver       # 创建 my_wordpress_default 网络
Creating volume "my_wordpress_db_data" with default driver            # 创建 my_wordpress_db_data 数据卷
Creating volume "my_wordpress_wordpress_data" with default driver     # 创建 my_wordpress_wordpress_data 数据卷
Pulling db (mysql:5.7)...       # 拉 mysql:5.7 镜像
5.7: Pulling from library/mysql
72a69066d2fe: Pull complete
93619dbc5b36: Pull complete
99da31dd6142: Pull complete
626033c43d70: Pull complete
37d5d7efb64e: Pull complete
ac563158d721: Pull complete
d2ba16033dad: Pull complete
0ceb82207cd7: Pull complete
37f2405cae96: Pull complete
e2482e017e53: Pull complete
70deed891d42: Pull complete
Digest: sha256:f2ad209efe9c67104167fc609cca6973c8422939491c9345270175a300419f94
Status: Downloaded newer image for mysql:5.7
Pulling wordpress (wordpress:latest)...    # 拉 wordpress:latest 镜像
latest: Pulling from library/wordpress
a2abf6c4d29d: Pull complete
c5608244554d: Pull complete
2d07066487a0: Pull complete
1b6dfaf1958c: Pull complete
32c5e6a60073: Pull complete
90cf855b27cc: Pull complete
8b0f1068c586: Pull complete
5355461305e8: Pull complete
ad1eec592342: Pull complete
e03fbc76cb78: Pull complete
1f5796e48b39: Pull complete
72fbe8e1d4e7: Pull complete
96edece66175: Pull complete
5f46f0743de2: Pull complete
c9f9671a5e1f: Pull complete
3f543dcd35b1: Pull complete
c88e21a0c2a0: Pull complete
964b4457a910: Pull complete
0d55fb9a64ef: Pull complete
fb009ff7c567: Pull complete
4f058a67a50d: Pull complete
Digest: sha256:fc33b796b04162a0db2e9ea9b4c361a07058b21597b1317ad9ab3ea4593de241
Status: Downloaded newer image for wordpress:latest
Creating my_wordpress_db_1 ... done
Creating my_wordpress_wordpress_1 ... done

4. 访问 http://192.168.92.146:8000/ 即可看到后台设置页面,选择 简体中文 继续

填入 站点标题、用户名、密码、电子邮箱,点击安装Wordpress

安装成功之后会得到提示,点击 登录 跳转到登录页面

输入你设置的用户名和密码,即可登录到后台

点击左上方的 查看站点 即可进入站点的前台页面

 

站点就搭建完成了。接下来就可以按照自己的想法给站点换个主题,添加些合适的插件就可以让网站跑起来了。

 

 

其他使用方式

其他更多的使用方式请查看官方文档:https://docs.docker.com/compose/

 

 

 

版权声明:
作者:admin
链接:https://www.chenxie.net/archives/2577.html
来源:蜀小陈
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>
文章目录
关闭
目 录