笔记来源于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脚本
下面这个是小伙伴开源的一些Docker Compose脚本,我们如果需要部署某个应用的时候,可以通过下面脚本,非常方便的进行部署
https://gitee.com/zhengqingya/docker-compose
安装Docker Compose
官方文档:https://docs.docker.com/compose/install/
下载
- 首先我们先安装一下Docker
运行此命令以下载 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 镜像提供。
1.设置
定义应用程序依赖项。
- 为项目创建一个目录:
$ 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
2.创建Dockerfile
在此步骤中,您将编写一个用于构建 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:
- 从 Python 3.7 映像开始构建映像。
- 将工作目录设置为
/code
. - 设置
flask
命令使用的环境变量。 - 安装 gcc 和其他依赖项
- 复制
requirements.txt
并安装 Python 依赖项。 - 将元数据添加到图像以描述容器正在侦听端口 5000
- 将
.
项目中的当前目录复制到.
镜像中的workdir 。 - 将容器的默认命令设置为
flask run
.
3.在 Compose 文件中定义服务
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服务
该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
总结
我们可以对上述的操作,进行一下总结,就可以分为一下几个步骤
- 应用 app.py
- Docker file 将应用程序打包成镜像
- Docker-compose yaml 文件(定义整个服务,需要的环境,web、redis)完整的上线服务
- 启动compose项目(docker-compose up)
- 流程
- 创建网络
- 执行Docker-compose yaml
- 启动服务
原来我们没有用到docker-compose的时候,都是需要使用docker run,一个个的运行我们的容器
通过docker-compose,我们编写yaml文件,可以通过docker-compose一键启动服务,或者停止。
yaml规则
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
快速搭建WordPress
官网搭建文档: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基础、原理、网络、服务、集群、错误排查、日志。
docker-compose搭建微服务
我们可以使用下面命令 ,创建一个SpringBoot项目:https://start.spring.io/
- 编写项目微服务
- dockerfile构建镜像
- 创建docker-compose来启动项目,进行服务编排
- 丢到服务器 docker-compose启动
- 如果出现了问题:使用docker-compose up --build(重新构建)
Docker小结
- Docker镜像 -> 通过 run命令启动镜像
- Dockerfile 构建镜像(服务打包)
- docker-compose 启动项目(编排、多个微服务/ 环境)
- Docker 网络
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类