Docker10: docker compose
docker compose
定义并运行多个容器
YAMLfile配置文件; 命令有哪些?;所有环境都可以使用Compose
原先:Dockerfile build run ,手动操作单个容器;微服务100个;
现在:DockerCompose来轻松高效地管理容器,定义运行多个容器。
三步骤:
- Dockerfile: 保证项目在任何地方可以运行
- docker-compose.yml 如何写;定义什么是服务
- docker compose up 启动项目(类似于docker run)
总结:批量容器编排
理解
Compose是docker官方开源项目,需要安装
Dockerfile 让程序在任何地方运行。web服务,redis,mysql,nginx…多个容器
compose
version: "3.8"
services:web:build: .ports:- "5000:5000"volumes:- .:/code- logvolume01:/var/loglinks:- redisredis:image: redis
volumes: #挂载 持久化的logvolume01: {}#--links标签,先启动redis,再启动web应用
就好像一个脚本
#文件没写错前提下,100个服务可以一键上线
重要概念:
- 服务service:容器,应用(web,redis,mysql)
- 项目project:一组关联的容器–>形成一个业务单元;一个商城有100个微服务,100个微服务跑起来就是一个项目
安装
#下载
sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
#权限
chmod +x /usr/local/bin/docker-compose[root@ bin]# docker-compose version
docker-compose version 1.27.4, build 40524192
docker-py version: 4.3.1
CPython version: 3.7.7
OpenSSL version: OpenSSL 1.1.0l 10 Sep 2019
测试
第一步:安装
定义应用依赖:
#创建文件夹
[root@ bin]# cd /home
[root@ home]# mkdir composetest
[root@ home]# cd composetest/
#创建py文件
[root@ composetest]# vim app.py
import timeimport redis
from flask import Flaskapp = Flask(__name__)
#redis,域名访问,同一个网络下,直接通过域名(服务名)访问
cache = redis.Redis(host='redis', port=6379)def get_hit_count():retries = 5while True:try:return cache.incr('hits')except redis.exceptions.ConnectionError as exc:if retries == 0:raise excretries -= 1time.sleep(0.5)@app.route('/')
def hello():count = get_hit_count()return 'Hello World! I have been seen {} times.\n'.format(count)
#使用6379端口作为redis(容器名)容器在应用所在网络的默认端口#依赖
[root@ composetest]# vim requirements.txt
flask
redis
第二步:创建dockerfile文件编写Compose文件
[root@ composetest]# vim Dockerfile
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"][root@ composetest]# vim docker-compose.yml
version: "3.8"
services:web:build: . #build把dockerfile变成镜像ports:- "5000:5000"volumes:- .:/code #挂载持久化 redis:image: "redis:alpine" #使用dockerhub官方#原先是docker run ...;docker run ...[root@ composetest]# ls
app.py docker-compose.yml Dockerfile requirements.txt
第三步:用Compose服务构建并允许app
#当前目录下 /home/dockercomposetest
docker-compose up#故障排查
ERROR: Service 'web' failed to build : The command '/bin/sh -c pip install -r requirements.txt' returned a non-zero code: 2#分析:故障卡在了执行dockerfile的第七步
#查看dockerfile第七步做了什么
[root@ home]# cat /home/composetest/Dockerfile |grep pip
RUN pip install -r requirements.txt
[root@ home]# cat /home/composetest/requirements.txt
flask
redis
#错误状态码2代表的意思:No such file or directory
#1.测试
free 内存正常
#2.执行报错命令
[root@ composetest]# /bin/sh -c pip install -r requirements.txt
install: pip: command not found
#3.安装pip
[root@ composetest]# yum install python-pip
#4.手动安装flask
[root@ composetest]# pip install flask
...
You are using pip version 8.1.2, however version 20.2.4 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
[root@ composetest]# pip install --upgrade pip
Successfully installed pip-20.2.4
[root@ composetest]# pip install redis#5.重新测试构建compose
[root@ composetest]# docker-compose up
...
web_1 | * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)#成功#6.开另一台终端测试
[root@ home]# curl http://0.0.0.0:5000/
Hello World! I have been seen 1 times.
[root@ home]# curl http://0.0.0.0:5000/
Hello World! I have been seen 2 times.
[root@ home]# curl http://0.0.0.0:5000/
Hello World! I have been seen 3 times.
[root@ home]# curl http://0.0.0.0:5000/
#查看服务状态,启动状态
[root@ composetest]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ef3c22478281 redis:alpine "docker-entrypoint.s…" 15 minutes ago Up 15 minutes 6379/tcp composetest_redis_1
848d684e81b5 composetest_web "flask run" 15 minutes ago Up 15 minutes 0.0.0.0:5000->5000/tcp composetest_web_1#查看镜像(自动安装镜像)
[root@ composetest]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
composetest_web latest 0499a4761d8b 19 minutes ago 195MB
redis alpine c1949ec48c51 21 hours ago 31.2MB
tomcat latest 625b734f984e 5 days ago 648MB
python 3.7-alpine 4d91c1ce4cc8 6 days ago 41.1MB#
[root@ composetest]# docker service ls
Error response from daemon: This node is not a swarm manager. Use "docker swarm init" or "docker swarm join" to connect this node to swarm and try again.#查看网络:compose自动生成了一个网络,项目中的内容都在同一个网络中
[root@ composetest]# docker network ls
NETWORK ID NAME DRIVER SCOPE
17eafe1c056a bridge bridge local
8f2db8d83cf3 composetest_default bridge local
2f902f83ffdf host host local
7e2d715f2494 mynet bridge local
318716c6177e none null local
8438acdc1088 redis bridge local[root@ composetest]# docker network inspect composetest_default
以前都是单个docker run启动一个容器,现在通过docker compose编写yaml配置文件,意见启动所有服务,停止!就三个步骤
Creating composetest_web_1 …done
Creating composetest_redis_1 …done
文件名composetest
自动的默认规则 ;默认服务名 文件名__服务名__num
多个服务器。集群都可能有同一个项目;A B 其中_num代表副本数量
集群(多个服务器)状态里,服务不可能只有一个redis运行实例。弹性,高可用高并发,因此多个副本就需要一个数字号来表示以便知道这个副本服务是来自那个服务器里
未来可以kuberctl service 负载均衡
MySQL有十个容器实例:mysql:3306 不用加ip;
如果在同一个网络,可以直接通过域名访问。保证了高可用
停止
要在yml文件目录下停止!!
docker-compose downctrl+c //直接关掉所有容器
小结:
Docker镜像,run->容器
dockerfile 构建镜像 (服务打包)
docker-compose 启动项目(编排,多个微服务/环境)
docker网络
yaml规则
3层
#与docker engine对应版本
第一层:版本层
version: ''第二层:服务层
#服务:build,
services:服务1:#服务配置imagebuildnetwork...服务2:redis...服务3:redis...第三层:其他配置
#其他配置 网络,卷,全局规则
volumes:
networks:
configs:
docker doc上service很全:
depend_on
build
deploy(replicas) 集群
entryoint
environment
expose
image
搭建wordpress
$ cd my_wordpress/$ vim docker-compose.yml
version: '3.3'services:db:image: mysql:5.7volumes:- db_data:/var/lib/mysqlrestart: alwaysenvironment:MYSQL_ROOT_PASSWORD: somewordpressMYSQL_DATABASE: wordpressMYSQL_USER: wordpressMYSQL_PASSWORD: wordpresswordpress:depends_on: #先下载db,在下载wp- dbimage: wordpress:latestports:- "8000:80"restart: alwaysenvironment:WORDPRESS_DB_HOST: db:3306WORDPRESS_DB_USER: wordpressWORDPRESS_DB_PASSWORD: wordpressWORDPRESS_DB_NAME: wordpress
volumes:db_data: {}$ docker-compose up -d 后台启动
[root@ my_wordpress]# docker-compose up -d
Creating my_wordpress_db_1 ... done
Creating my_wordpress_wordpress_1 ... done
Docker10: docker compose相关推荐
- Docker compose 容器编排
1. 概述 问题:如果要使用 Docker 运行 LNMP 架构,那么 Nginx.MySQL.PHP. Linux三个服务运行在一个容器里,还是运行在多个容器里呢? 答案是都可以. 你可以分别放在三 ...
- Docker核心技术之Docker Compose
一.Docker Compose 简介 Docker Compose是什么? Docker Compose是一个能一次性定义和管理多个Docker容器的工具. 详细地说: Compose中定义和启动的 ...
- Docker Compose 1.18.0 之服务编排详解
一个使用Docker容器的应用,通常由多个容器组成.使用Docker Compose,不再需要使用shell脚本来启动容器.在配置文件中,所有的容器通过services来定义,然后使用docker-c ...
- Centos7 Docker Compose部署mysql5.7
1 . 创建docker-compose.yml文件 version: '3' services:mysql:restart: alwaysimage: mysql:5.7.22container_n ...
- Docker Compose安装
一 . Docker Compose概述 Docker Compose是一个用于定义和运行多个容器Docker应用程序的工具.使用Compose,您可以使用YAML文件来配置应用程序的服务.然后 , ...
- Docker(八):Docker Compose
Docker Compose Compose 简介 Compose 是用于定义和运行多容器 Docker 应用程序的工具.通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务.然 ...
- Docker compose多容器管理
前言 Docker Compose 将所管理的容器分为三层,工程(project),服务(service)以及容器(contaienr). Docker Compose 运行的目录下的所有文件(doc ...
- Docker Compose—简化复杂容器应用的利器
Compose是用于定义和运行复杂Docker应用的工具.你可以在一个文件中定义一个多容器的应用,然后使用一条命令来启动你的应用,然后所有相关的操作都会被自动完成. 1. 安装Docker和Compo ...
- Spring Boot 2.0(五):Docker Compose + Spring Boot + Nginx + Mysql 实践
我知道大家这段时间看了我写关于 docker 相关的几篇文章,不疼不痒的,仍然没有感受 docker 的便利,是的,我也是这样认为的,I know your felling . 前期了解概念什么的确实 ...
最新文章
- 北大博士干了半年外卖骑手,写出 AI 伦理论文登上顶刊,“系统知道一切”
- 绘制ROC 曲线 计算 AUC PR曲线(精准率 召回率)示例
- M1芯片搞数据科学好使吗?5种基准测试给你答案
- Hrefer教程【超越官方】
- python爬虫工程师-Python爬虫工程师
- 月饼怎么吃才不胖,数据分析师教你选月饼
- 分布式系统理论基础 - 一致性、2PC和3PC
- C++调用Asprise OCR识别图片
- 计算机网络同步技术,计算机网络同步技术
- 华为USG6550 MIB CPU MEM
- 华为云数据库GaussDB(for Cassandra)揭秘第二期:内存异常增长的排查经历
- I/O----复制文本文件
- 【BZOJ2095】[Poi2010]Bridges 动态加边网络流
- 用Java编写考试报名系统_基于jsp的计算机考试报名系统-JavaEE实现计算机考试报名系统 - java项目源码...
- pdf转word转换器绿色版
- Spring Boot 2 基础篇学习笔记
- 【强化学习论文精读】Timeliness Guaranteed Traffic Flow Forecasting Based on Federated Online Learning
- 使用RecyclerView实现列表展开动画
- 计算机网络第七版3-2
- OpenCV4学习笔记(55)——基于KNN最近邻算法实现鼠标手写数字识别