笔记来源于Bilibili狂神 :https://www.bilibili.com/video/BV1kv411q7Qc?p=7
我们之前操作Docker的过程是 :DockerFile build run 进行手动操作,单个容器,如果假设我们有100个微服务,并行微服务之间还存在依赖关系。这个时候,我们就可以使用Docker Compose来轻松高效的管理容器,定义运行多个容器。
定义、运行多个容器
YAMLfile配置环境
Compose是一个用于定义和运行多容器Docker应用程序的工具。使用Compose,您可以使用YAML文件来配置应用程序的服务。然后,使用一个命令,就可以从配置中创建并启动所有服务。要了解有关Compose的所有特性的更多信息,请参阅特性列表。
Compose可以在所有环境中工作:生产、阶段、开发、测试,以及CI工作流。您可以在常见用例中了解关于每个用例的更多信息
使用Compose基本上有三个步骤:
用 Dockerfile 定义你的应用程序的环境,这样它就可以在任何地方复制。
在 Docker-compose 中定义组成应用程序的服务。这样它们就可以在一个独立的环境中一起运行。
运行 docker-compose up 和 Compose 启动并运行整个应用程序。
批量容器编排
Compose是Docker官方的开源项目,需要安装!
Dockerfile 让程序在任何地方运行,web服务。Redis、MySQL、Nginx。。。多个容器
Compose的YAML文件如下所示
version: '2.0' services: web: build: . ports: - "5000:5000" volumes: - .:/code - logvolume01:/var/log links: - redis redis: image: redis volumes: logvolume01: {}
docker-compose up 100 个服务,也可以一键启动
Compose:重要的概念
服务service,容器,应用(web,redis,mysql)
项目project,就是一组关联的容器。
下面这个是小伙伴开源的一些Docker Compose脚本,我们如果需要部署某个应用的时候,可以通过下面脚本,非常方便的进行部署
https://gitee.com/zhengqingya/docker-compose
官方文档:https://docs.docker.com/compose/install/
运行此命令以下载 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
要安装不同版本的 Compose,请替换
1.29.2
为您要使用的 Compose 版本。
为二进制文件添加可执行权限
sudo chmod +x /usr/local/bin/docker-compose
注意:如果
docker-compose
安装后命令失败,请检查您的路径。您还可以/usr/bin
在路径中创建指向或任何其他目录的符号链接。
例如
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
测试安装
docker-compose --version
如果您从 Compose 1.2 或更早版本升级,请在升级 Compose 后移除或迁移现有容器。这是因为,从 1.3 版开始,Compose 使用 Docker 标签来跟踪容器,并且需要重新创建容器以添加标签。
如果 Compose 检测到创建时没有标签的容器,它会拒绝运行,这样您就不会得到两组。如果您想继续使用现有容器(例如,因为它们有您想要保留的数据卷),您可以使用 Compose 1.5.x 使用以下命令迁移它们:
docker-compose migrate-to-labels
或者,如果您不担心保留它们,则可以删除它们。Compose 只是创建新的。
$ docker container rm -f -v myapp_web_1 myapp_db_1 ...
如果您使用curl
以下方式安装,则卸载 Docker Compose :
sudo rm /usr/local/bin/docker-compose
如果您使用pip
以下方式安装,则卸载 Docker Compose :
$ pip uninstall docker-compose
在此页面上,您将构建一个在 Docker Compose 上运行的简单 Python Web 应用程序。该应用程序使用 Flask 框架并在 Redis 中维护一个命中计数器。虽然示例使用 Python,但即使您不熟悉此处演示的概念,也应该可以理解。
确保您已经安装了Docker Engine 和Docker Compose。您不需要安装 Python 或 Redis,因为两者都由 Docker 镜像提供。
定义应用程序依赖项。
$ mkdir composetest $ cd composetest
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)
在此示例中,redis
是应用程序网络上的 redis 容器的主机名。我们使用 Redis 的默认端口6379
。
3.requirements.txt
在您的项目目录中创建另一个文件并将其粘贴到:
flask redis
在此步骤中,您将编写一个用于构建 Docker 映像的 Dockerfile。该图像包含 Python 应用程序所需的所有依赖项,包括 Python 本身。
在您的项目目录中,创建一个名为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"]
这告诉 Docker:
/code
.flask
命令使用的环境变量。requirements.txt
并安装 Python 依赖项。.
项目中的当前目录复制到.
镜像中的workdir 。flask run
.docker-compose.yml
在您的项目目录中创建一个名为的文件并粘贴以下内容:
version: "3.9" services: web: build: . ports: - "5000:5000" redis: image: "redis:alpine"
这个 Compose 文件定义了两个服务:web
和redis
.
该web
服务使用从Dockerfile
当前目录中构建的映像。然后它将容器和主机绑定到暴露的端口5000
. 此示例服务使用 Flask Web 服务器的默认端口5000
.
该redis
服务使用 从 Docker Hub 注册表中提取的公共Redis映像。
从您的项目目录,通过运行启动您的应用程序docker-compose up
。
$ docker-compose up
Compose 会拉取一个 Redis 镜像,为您的代码构建一个镜像,并启动您定义的服务。在这种情况下,代码会在构建时静态复制到映像中。
在浏览器中输入 http://localhost:5000/ 以查看应用程序正在运行。
切换到另一个终端窗口,然后键入docker image ls
以列出本地镜像。
此时列出镜像应返回redis
和web
。
docker image ls
停止应用程序,方法是docker-compose down
在第二个终端的项目目录中运行,或者在启动应用程序的原始终端中按 CTRL+C。
使用下面的命令,就可以查看到docker中的网络
docker network ls
通过compose构建的服务,compose帮我们维护了,都会在一个网络下面,就可以通过域名访问
我们通过以下命令来进行查看,发现启动的两个服务,就是同处于同一个网络下的
docker network inspect composetest_default
我们可以对上述的操作,进行一下总结,就可以分为一下几个步骤
原来我们没有用到docker-compose的时候,都是需要使用docker run,一个个的运行我们的容器
通过docker-compose,我们编写yaml文件,可以通过docker-compose一键启动服务,或者停止。
docker-compose.yaml规则
# 三层 version: "3.8" # 定义版本 services: # 定义服务 服务1:web images build network ...... 服务2:redis ..... 服务3:nginx ..... # 其它配置 网络/卷、全局规则 volumes: networks: configs:
完整实例如下
version: "3.8" services: redis: image: redis:latest deploy: replicas: 1 configs: - my_config - my_other_config configs: my_config: file: ./my_config.txt my_other_config: external: true
如果我们的项目还有依赖关系,比如 web 依赖于redis,也就是说项目需要首先启动redis
version: "3.8" services: web: build: . depends_on: - db - redis redis: image: redis db: image: postgres
官网搭建文档:https://docs.docker.com/compose/wordpress/
首先创建项目的文件夹
# 创建文件夹 mkdir my_wordpress # 进入文件夹 cd my_wordpress/
然后创建一个 docker-compose.yml 文件
version: '3.3' # 定义版本 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,也就是需要db启动 - db image: wordpress:latest ports: - "8000:80" restart: always environment: WORDPRESS_DB_HOST: db:3306 WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: wordpress WORDPRESS_DB_NAME: wordpress volumes: db_data: {}
后台启动项目
docker-compose up -d
这
docker-compose up
在分离模式下运行,拉取所需的 Docker 镜像,并启动 wordpress 和数据库容器。
到此为止,项目已经成功搭建完毕
浏览器输入 http://IP:8000 即可访问。
正常的开源项目,可能还需要依赖 build后的jar包,所以我们还需要使用Dockerfile
当我们的文件准备齐全的时候,就可以一键启动项目
未来的趋势:linux、docker、k8s
掌握:docker基础、原理、网络、服务、集群、错误排查、日志。
我们可以使用下面命令 ,创建一个SpringBoot项目:https://start.spring.io/