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使用的三个步骤
- 编写Dockerfile定义各个微服务应用并构建出对应的镜像文件
- 使用 docker-compose.yml 定义一个完整业务单元,安排号整体应用中的各个容器服务。
- 最后执行 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/
共有 0 条评论