Docker10: docker compose

在这里插入图片描述

docker compose

定义并运行多个容器
YAMLfile配置文件; 命令有哪些?;所有环境都可以使用Compose

原先:Dockerfile build run ,手动操作单个容器;微服务100个;
现在:DockerCompose来轻松高效地管理容器,定义运行多个容器。

三步骤:

  1. Dockerfile: 保证项目在任何地方可以运行
  2. docker-compose.yml 如何写;定义什么是服务
  3. 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
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值