【Docker】Docker Compose的使用

我们知道使用一个Dockerfile模板文件,可以让用户很方便的定义⼀个单独的应用容器。然而,在日常工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。

例如要实现一个Web项目,除了Web服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等,我们只能一个一个写dockerfile文件,然后bulid构建和run,手动操作单个容器。

Docker Compose恰好满足了这样的需求。它允许⽤户通过⼀个单独的docker-compose.yml模板⽂件(YAML格式)来定义⼀组相关联的应⽤容器为⼀个项⽬(project)。

在这里插入图片描述

docker-compose基础概念

docker-compose项目是docker官方的开源项目,负责实现对docker容器集群的快速编排。

docker-compose将所管理的容器分为三层,分别是工程(project),服务(service)以及容器(containner)

  • docker-compose运行目录下的所有文件(docker-compose.yml文件、extends文件或环境变量等)组成一个工程,如无特殊指定,工程名即为当前目录名。
  • 一个工程当中,可以包含多个服务,每个服务中定义了容器运行的镜像、参数、依赖。
  • 一个服务中可以包括多个容器实例,docker-compose并没有解决负载均衡的问题。因此需要借助其他工具实现服务发现及负载均衡,比如nginx。

docker-compose的安装

Docker安装完成后,docker-compose也随之自动安装:

$ docker-compose --version
docker-compose version 1.25.0, build unknown

最新版本号可以在这里查询:https://github.com/docker/compose/releases

没有安装的可以使用下面的命令进行安装:

$ 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 chmod +x /usr/local/bin/docker-compose$ docker-compose --version
docker-compose version 1.29.2, build 5becea4c

熟悉python的朋友,可以使用pip去安装docker-Compose:

$ pip install docker-compose

docker-compose文件的语法结构

docker compose文件的语法说明 https://docs.docker.com/compose/compose-file/

version: "3.8" # 可选,docker compose语法的版本services: # 容器servicename: # 服务名字,这个名字也是内部 bridge网络可以使用的 DNS nameimage: # 镜像的名字command: # 可选,如果设置,则会覆盖默认镜像里的 CMD命令environment: # 可选,相当于 docker run里的 --envvolumes: # 可选,相当于docker run里的 -vnetworks: # 可选,相当于 docker run里的 --networkports: # 可选,相当于 docker run里的 -pservicename2:volumes: # 可选,相当于 docker volume createnetworks: # 可选,相当于 docker network create

程序准备

准备一个Python文件,名字为app.py内容如下:

from flask import Flask
from redis import Redis
import os
import socketapp = Flask(__name__)
redis = Redis(host=os.environ.get('REDIS_HOST', '127.0.0.1'), port=6379)@app.route('/')
def hello():redis.incr('hits')return f"Hello Container World! I have been seen {redis.get('hits').decode('utf-8')} times and my hostname is {socket.gethostname()}.\n"

准备Dockerfile

准备一个Dockerfile

FROM python:3.9.5-slimRUN pip install flask redis && \groupadd -r flask && useradd -r -g flask flask && \mkdir /src && \chown -R flask:flask /srcUSER flaskCOPY app.py /src/app.pyWORKDIR /srcENV FLASK_APP=app.py REDIS_HOST=redisEXPOSE 5000CMD ["flask", "run", "-h", "0.0.0.0"]

镜像准备

构建flask镜像,准备一个redis镜像。

$ docker image pull redis$ docker image build -t flask-demo .$ docker image ls
REPOSITORY   TAG          IMAGE ID       CREATED          SIZE
flask-demo   latest       e878470f65a4   13 minutes ago   128MB
redis        latest       7614ae9453d1   21 months ago    113MB
python       3.9.5-slim   c71955050276   2 years ago      115MB

创建一个docker bridge

$ docker network create -d bridge demo-network
adc45a365e7294f56b65464eb88a212624855b52dc568c9f70c4e39c31d43e4a$ docker network ls
NETWORK ID     NAME           DRIVER    SCOPE
28e45b9b8f4b   bridge         bridge    local
adc45a365e72   demo-network   bridge    local
29c08e905dab   host           host      local
d466db2f54a1   none           null      local

创建redis container

创建一个名为redis-server的container,连到demo-network上:

$ docker container run --rm -d --name redis-server --network demo-network redis
ff46dca96a56f8ce739732a87e2407fffcbc4a16651638aed15224ea9e355a6a$ docker container ls
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS      NAMES
ff46dca96a56   redis     "docker-entrypoint.s…"   24 seconds ago   Up 23 seconds   6379/tcp   redis-server

创建flask container

创建一个名为flask-demo的container,连到demo-network上:

$ docker container run --rm -d --network demo-network --name flask-demo --env REDIS_HOST=redis-server -p 5000:5000 flask-demo
a843952b19fc98f8dfd8a46eac18abb8885834a1f718de5ca265f09795db0f2a$ docker container ls
CONTAINER ID   IMAGE        COMMAND                  CREATED              STATUS          PORTS                                       NAMES
a843952b19fc   flask-demo   "flask run -h 0.0.0.0"   About a minute ago   Up 59 seconds   0.0.0.0:5000->5000/tcp, :::5000->5000/tcp   flask-demo
ff46dca96a56   redis        "docker-entrypoint.s…"   9 minutes ago        Up 9 minutes    6379/tcp                                    redis-server

访问http://127.0.0.1:5000应该能看到类似下面的内容,每访问一次,计数加1:

$ curl http://127.0.0.1:5000
Hello Container World! I have been seen 1 times and my hostname is a843952b19fc.

可以把上面的步骤合并到一起,成为一个部署脚本:

# prepare image
docker image pull redis
docker image build -t flask-demo .# create network
docker network create -d bridge demo-network# create container
docker container run -d --name redis-server --network demo-network redis
docker container run -d --network demo-network --name flask-demo --env REDIS_HOST=redis-server -p 5000:5000 flask-demo

改造为Docker Compose

以上面的Python Flask + Redis练习为例子,改造成一个docker-compose文件。

docker-compose.yml文件如下:

version: "3.8"services:flask-demo:image: flask-demo:latestenvironment:- REDIS_HOST=redis-servernetworks:- demo-networkports:- 8080:5000redis-server:image: redis:latestnetworks:- demo-networknetworks:demo-network:

docker-compose常用命令

运行这些命令需要结合docker-compose一起使用,且必须要在含有docker-compose.yml文件的目录中或者使用-f参数指定docker-compose.yml文件才可以使用,不然报错。

docker-compse up

docker-compse up创建和启动容器。

$ docker-compose up -d
Starting app_redis-server_1 ... done
Starting app_flask-demo_1   ... done

如果想要服务后台运行,需要带上-d参数。

docker-compose ps

docker-compose ps列出容器。

$ docker-compose psName                     Command               State                    Ports
------------------------------------------------------------------------------------------------------
app_flask-demo_1     flask run -h 0.0.0.0             Up      0.0.0.0:8080->5000/tcp,:::8080->5000/tcp
app_redis-server_1   docker-entrypoint.sh redis ...   Up      6379/tcp

down 删除容器、网络、数据卷和镜像
stop/start/restart 停止/启动/重启服务

docker-compose stop

docker-compose stop停止服务。

$ docker-compose stop
Stopping app_redis-server_1 ... done
Stopping app_flask-demo_1   ... done

docker-compose start

docker-compose start启动服务。

$ docker-compose start
Starting flask-demo   ... done
Starting redis-server ... done

docker-compsoe restart

docker-compose restart重启服务。

$ docker-compose restart
Restarting app_redis-server_1 ... done
Restarting app_flask-demo_1   ... done

docker-compse down

docker-compse down删除容器、网络、数据卷和镜像。

$ docker-compose down
Stopping app_redis-server_1 ... done
Stopping app_flask-demo_1   ... done
Removing app_redis-server_1 ... done
Removing app_flask-demo_1   ... done

docker-compse logs

docker-compse logs查看服务容器的输出。

$ docker-compose logs -f
Attaching to app_flask-demo_1, app_redis-server_1
flask-demo_1    |  * Serving Flask app 'app.py'
flask-demo_1    |  * Debug mode: off
flask-demo_1    | WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
flask-demo_1    |  * Running on all addresses (0.0.0.0)
flask-demo_1    |  * Running on http://127.0.0.1:5000
flask-demo_1    |  * Running on http://172.21.0.3:5000
flask-demo_1    | Press CTRL+C to quit
。。。 。。。

docker-compose top

docker-compose top显示正在运行的容器进程。

$ docker-compose top
app_flask-demo_1UID       PID    PPID    C   STIME   TTY     TIME                                CMD
-----------------------------------------------------------------------------------------------------------------
systemd+   11265   11244   2   16:31   ?     00:00:00   /usr/local/bin/python /usr/local/bin/flask run -h 0.0.0.0app_redis-server_1UID       PID    PPID    C   STIME   TTY     TIME             CMD
---------------------------------------------------------------------------
systemd+   11078   11059   0   16:30   ?     00:00:00   redis-server *:6379

docker-compose scale

docker-compose scale指定一个服务容器启动数量。

现在推荐使用docker-compose up -d --scale

$ docker-compose scale redis-server=2
WARNING: The scale command is deprecated. Use the up command with the --scale flag instead.
Starting app_redis-server_1 ... done
Creating app_redis-server_2 ... done$ docker-compose psName                     Command                State                      Ports
---------------------------------------------------------------------------------------------------------
app_flask-demo_1     flask run -h 0.0.0.0             Up         0.0.0.0:8080->5000/tcp,:::8080->5000/tcp
app_redis-server_1   docker-entrypoint.sh redis ...   Up         6379/tcp
app_redis-server_2   docker-entrypoint.sh redis ...   Up         6379/tcp$ docker-compose up -d --scale redis-server=1
app_flask-demo_1 is up-to-date
Stopping and removing app_redis-server_2 ... done
Starting app_redis-server_1              ... done

docker-compose exec

docker-compose exec在容器里面执行命令。

$ docker-compose exec --index=2 redis-server bash
root@7b36aecb80d1:/data#

docker-compse build

docker-compse build重新构建服务。

将上面的docker-compose.yml修改如下:

version: "3.3"services:flask-demo:build:context: .dockerfile: Dockerfileimage: flask-demo:latestenvironment:- REDIS_HOST=redis-servernetworks:- demo-networkports:- 8080:5000redis-server:image: redis:latestnetworks:- demo-networknetworks:demo-network:

主要是将flask-demo的镜像改为从Dockerfile构建而不是使用已有镜像。

$ docker-compose build
redis-server uses an image, skipping
Building flask-demo
Step 1/8 : FROM python:3.9.5-slim---> c71955050276
Step 2/8 : RUN pip install flask redis &&     groupadd -r flask && useradd -r -g flask flask &&     mkdir /src &&     chown -R flask:flask /src---> Using cache---> 41091d3d13c5

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/119057.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在Linux将Spring Boot项目的Jar包注册为开机自启动系统服务

有时候我们需要将Spring Boot打包出来jar文件当做系统服务注册到系统中,本文教你如何操作 目录结构 以下是目录结构,jar文件是从maven package打包出来的,config/application.yml是原先在项目的resources文件夹里,外置出来方便适…

什么是IO多路复用?Redis中对于IO多路复用的应用?

IO多路复用是一种高效的IO处理方式,它允许一个进程同时监控多个文件描述符(包括套接字、管道等),并在有数据可读或可写时进行相应的处理。这种机制可以大大提高系统的并发处理能力,减少资源的占用和浪费。 在Redis中&…

m1 安装 cocoapods

其实最终解决问题很简单,麻烦的是如果找到解决问题的答案。 网上的答案一大堆,但不一定适合你的电脑,就好像天下的女人到处有,但不一定都适合你,一定要亲自试验一下才知道结果。 前提条件: 命令行工具&am…

Leetcode 18 三数之和

//双指针&#xff0c;不过因为是三个数所以左侧是两个下标class Solution {public List<List<Integer>> threeSum(int[] nums) {int n nums.length;Arrays.sort(nums);List<List<Integer>> ans new ArrayList<List<Integer>>();for(int …

优思学院:六西格玛培训中的“绿带”和“黑带”

在当今竞争激烈的商业世界中&#xff0c;提高效率、减少浪费是每个组织都追求的目标。为了达到这一目标&#xff0c;六西格玛管理方法为组织提供了一个卓越的工具。在六西格玛培训中&#xff0c;我们经常会听到“绿带”和“黑带”这两个术语。那么&#xff0c;究竟什么是绿带和…

Unity之ShaderGraph如何实现旋涡效果

前言 今天我们来通过ShaderGraph来实现一个旋涡的效果 如下图所示: 主要节点 Distance:返回输入 A 和输入 B 的值之间的欧几里德距离。除了其他方面的用途,这对于计算空间中两点之间的距离很有用,通常用于计算有符号距离函数 (Signed Distance Function)。 Twirl:将…

[数据分析与可视化] 基于Python绘制简单动图

动画是一种高效的可视化工具&#xff0c;能够提升用户的吸引力和视觉体验&#xff0c;有助于以富有意义的方式呈现数据可视化。本文的主要介绍在Python中两种简单制作动图的方法。其中一种方法是使用matplotlib的Animations模块绘制动图&#xff0c;另一种方法是基于Pillow生成…

机器学习实验一:KNN算法,手写数字数据集(使用汉明距离)(2)

KNN-手写数字数据集&#xff1a; 使用sklearn中的KNN算法工具包&#xff08; KNeighborsClassifier)替换实现分类器的构建&#xff0c;注意使用的是汉明距离&#xff1b; 运行结果&#xff1a;&#xff08;大概要运行4分钟左右&#xff09; 代码&#xff1a; import pandas as…

进程 概念和理解 - Linux 是怎么做到 管理进程的?-fork 手动创建进程

前言 上一篇博客当中&#xff0c;对 冯诺依曼体系结构 和 操作系统 进行了简要概述&#xff0c;本篇博客将会从上一篇博客的基础之上进行展开&#xff0c;如果你有些不了解的话&#xff0c;建议先看上一篇博客再看本篇博客&#xff1a; 冯诺依曼体结构 - 为什么要有操作系统-…

golang 工程组件:grpc-gateway 环境安装+默认网关测试

grpc-gateway grpc-gateway 顾名思义是专门是grpc的网关。也是一个protobuf的编译器&#xff0c;是一个proto的插件。 grpc-gateway就是将http请求处理后转发到对应grpc服务上。很多浏览器&#xff0c;或者客户端开箱不支持grpc&#xff0c;只支持传统的restful API。 grpc网关…

广播和组播(多播)

广播 概述 广播&#xff08;broadcast&#xff09;是指封包在计算机网络中传输时&#xff0c;目的地址为网络中所有设备的一种传输方式。实际上&#xff0c;这里所说的“所有设备”也是限定在一个范围之中&#xff0c;称为“广播域”。并非所有的计算机网络都支持广播&#xf…

【2021集创赛】Arm杯三等奖:基于FPGA的人脸检测SoC设计

本作品参与极术社区组织的有奖征集|秀出你的集创赛作品风采,免费电子产品等你拿~活动。 团队介绍 参赛单位&#xff1a;合肥工业大学 队伍名称&#xff1a;芯创之家 指导老师&#xff1a;邓红辉、尹勇生 参赛杯赛&#xff1a;Arm杯 参赛人员&#xff1a;王亮 李嘉燊 金京 获奖情…

Prompt-Tuning源码分析

Prompt-Tuning源码分析 源码 我们这里的代码解析以huggingface peft源码为主 从模型类结构可以看到&#xff0c;Prompt Tuning 只在输入层加入 prompt virtual tokens&#xff0c;其他地方均没有变化&#xff0c;具体可查看 PromptEmbedding 的源码。 伪代码示例 soft_prom…

【STM32】RCC时钟模块(使用HAL库)

https://gitee.com/linhir-linhir/stm32-f103-c8/blob/master/STM32%E6%9C%80%E6%96%B0%E5%9B%BA%E4%BB%B6%E5%BA%93v3.5/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_rcc.h STM32最新固件库v3.5/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/system_stm32f10x.c…

完成比写得好更重要,先完成初稿再说

我发现自己有个毛病&#xff0c;总想着满意了才动手。于是&#xff0c;经常做到一半跑去看文献&#xff0c;然后陷入文献中觉得这个比自己好&#xff0c;那个比自己好。于是&#xff0c;暂时中断手边工作&#xff0c;最后进度被推迟&#xff0c;甚至啥也没做出来。 今晚再次听…

Centos使用tomcat部署jenkins

jenkins的最新版本已经不在支持jdk8&#xff0c;支持的jdk环境如下&#xff1a; 安装jdk环境 yum -y install java-11-openjdk.x86_64 java-11-openjdk-devel.x86_64安装tomcat tomcat官网 cd /optwget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.82/bin/apache-tomcat…

【项目管理】如何开展高质量的团队管理

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

0026Java程序设计-中学走读生信息管理系统设计与实现

文章目录 摘要**目录**系统设计开发环境 摘要 目前&#xff0c;中学走读生信息管理系统已经发展成为学校的学生走读管理工作中必不可少的一个组成部分&#xff0c;没有该系统&#xff0c;学生的日常工作就会变得繁琐、效率低下。在信息化的社会发展下&#xff0c;有必要建立一…

Spring和SpringMVC,SpringBoot区别的文章

Spring、SpringMVC和SpringBoot是Java开发中常用的三大框架&#xff0c;它们各有特点&#xff0c;适用于不同的开发场景。下面我们将从它们的基本概念、区别和适用场景等方面进行介绍。 Spring框架 Spring是一个轻量级的开源框架&#xff0c;它最初是为了解决企业应用开发的复…

【VPX610】 青翼科技基于6U VPX总线架构的高性能实时信号处理平台

板卡概述 VPX610是一款基于6U VPX架构的高性能实时信号处理平台&#xff0c;该平台采用2片TI的KeyStone系列多核DSP TMS320C6678作为主处理单元&#xff0c;采用1片Xilinx的Virtex-7系列FPGA XC7VX690T作为协处理单元&#xff0c;具有2个FMC子卡接口&#xff0c;各个处理节点之…