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/log
links:
- redis
redis:
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 time
import redis
from flask import Flask
app = Flask(__name__)
#redis,域名访问,同一个网络下,直接通过域名(服务名)访问
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)
#使用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 down
ctrl+c //直接关掉所有容器
小结:
Docker镜像,run->容器
dockerfile 构建镜像 (服务打包)
docker-compose 启动项目(编排,多个微服务/环境)
docker网络
yaml规则
3层
#与docker engine对应版本
第一层:版本层
version: ''
第二层:服务层
#服务:build,
services:
服务1:
#服务配置
image
build
network
...
服务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.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,在下载wp
- 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 后台启动
[root@ my_wordpress]# docker-compose up -d
Creating my_wordpress_db_1 ... done
Creating my_wordpress_wordpress_1 ... done