写点什么

【云原生 | 从零开始学 Docker】九丶完结篇 Docker Compose

作者:泡泡
  • 2022 年 9 月 18 日
    河北
  • 本文字数:3742 字

    阅读完需:约 12 分钟

【云原生 | 从零开始学Docker】九丶完结篇 Docker Compose

简介

之前在制作 dockerfile 的时候,流程是写完然后 build 然后 run,这还是单个的容器,比如公司有五十个微服务,难道要打包五十个 docker 吗,依赖关系啥的手动操作很麻烦!这个时候使用 dockercompose 高效的管理,可以定义运行多个容器!


定义,运行多个容器。 YAML file 配置文件,single command 命令有哪些。所有环境都可以使用 dockercompose,以及它的三个步骤:


1.定义应用的环境 dockerfile,保证项目在任何地方都可以运行


2.定义一个服务,把应用写在 dockercomposeyml 文件里。


3.启动跟停止项目

个人理解

compose 是 docker 官方的开源项目,需要安装!


dockerfile 让程序在任何地方运行。在一个 web 服务,链接 redis,mysql,nginx 等一个一个启动太麻烦了,compose 为此而生。


docker-compose 是 docker 官方提供的容器编排工具!


官方文档是这样的


version: "3.9"  # optional since v1.27.0services:  web:    build: .    ports:      - "8000:5000"    volumes:      #持久化挂载      - .:/code      - logvolume01:/var/log    links:      - redis  redis:      #redis和web写在了一起,links是连接在一起,先启动redis然后启动web,运行之后他们同时启动了,不用一个一个run了!哪怕有一百个服务,文件写不错就能上线。    image: redisvolumes:  logvolume01: {}
复制代码


compose 重要概念 1.服务 services,容器,应用(web,redis,mysql 都可以想成单独的服务),跑起来是一个完整的项目。2.可以把它想象成一个项目,project。也就是一组关联的容器!下载


curl -SL https://github.com/docker/compose/releases/download/v2.5.0/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
复制代码



有 compose 就完成了。


#然后是授权 其实这就是一个二进制文件
chmod +x /usr/local/bin/docker-compose
#然后可以执行了!
[root@VM-16-7-centos bin]# docker-compose versiondocker-compose version 1.25.5, build 8a1c60f6docker-py version: 4.1.0CPython version: 3.7.5OpenSSL version: OpenSSL 1.1.0l 10 Sep 2019
#看到version就算成功了
复制代码

原理

Compose 项目是由 Python 编写的,实际上就是调用了 Docker 服务提供的 API 来对容器进行管理,因此,只要所在的操作系统的平台支持 Docker API,就可以在其上利用 Compose 来进行编排管理。


compose 中常常提及的概念:


project


通过 docker compose 管理的一个项目被抽象称为一个 project,它是由一组关联的应用容器组成的一个完整的业务单元。简单点说就是一个 docker-compose.yml 文件定义一个 project。我们可以在执行 docker-compose 命令时通过 -p 选项指定 project 的名称,如果不指定,则默认是 docker-compose.yml 文件所在的目录名称。


service


运行一个应用的容器,实际上可以是一个或多个运行相同镜像的容器。可以通过 docker-compose up 命令的 --scale 选项指定某个 service 运行的容器个数,比如:


docker-compose up -d --scale redis=2
复制代码


compose 流程调用



重新启动 services


前面我们提到当前宿主机已经存在与该应用对应的容器,docker-compose 会进行判断并决定是否重新启动已有服务。


强制 recreate


Recreate 就是删除现有的容器并且重新创建新的容器,为 docker-compose up 命令指定 --force-recreate 选项可以强制 recreate 容器。


创建个别容器


如果应用中的个别 service 对应的容器被删除了,docker-compose up 命令会新建相关的容器。


启动个别容器


与上面类似,如果应用中的个别 service 对应的容器被停止(stop)了,docker-compose up 命令会重新启动相关的容器。

体验

跟着官方来搞一个玩玩


1.创建一个目录然后进入。


[root@VM-16-7-centos home]# mkdir composetest[root@VM-16-7-centos home]# cd composetest/[root@VM-16-7-centos composetest]# ls
复制代码


2.创建一个文件(app.py)在当前目录下!


import time    #时间
import redis #redisfrom flask import Flask #flask的框架 app = Flask(__name__) cache = redis.Redis(host='redis', port=6379) #redis缓存 调用redis
def get_hit_count(): retries = 5 while True: try: return cache.incr('hits') #每次调用都会自增 使用了redis的incr 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() #计数器+1 return 'Hello World! I have been seen {} times.\n'.format(count)
复制代码


然后写一个依赖包 requirements.txt


flaskredis
复制代码


这是未来 dockerfile 里要用的,单独没啥用写一个 dockerfile


vim Dockerfile
FROM python:3.7-alpineADD . /codeWORKDIR /code RUN pip install -r requirements.txt CMD ["python","app.py"]
复制代码


在 compose 里部署一个服务,以前是一个一个 run 服务,现在定义一个 docker-compose.yml


version: "3.9"        #版本services:          #服务  web:            #web服务    build: .        #web使用build让dockerfile生成镜像    ports:      - "8000:5000"  redis:          #redis服务    image: "redis:alpine"  #使用官方现成的镜像 也可以自己写!
复制代码


最后 buildandrun 一下就可以了docker-compose up


1.创建网络 2.启动 yaml3.启动服务



正常启动成功有两个服务



[root@VM-16-7-centos ~]# curl 172.18.0.2:5000Hello World! I have been seen 1 times.[root@VM-16-7-centos ~]# curl 172.18.0.2:5000Hello World! I have been seen 2 times.[root@VM-16-7-centos ~]# curl 172.18.0.2:5000Hello World! I have been seen 3 times.[root@VM-16-7-centos ~]# curl 172.18.0.2:5000Hello World! I have been seen 4 times.[root@VM-16-7-centos ~]# curl 172.18.0.2:5000Hello World! I have been seen 5 times.[root@VM-16-7-centos ~]# curl 172.18.0.2:5000Hello World! I have been seen 6 times.
#访问结果
复制代码


docker images 查看 docker compose 的东西全都自动下载了



网络规则只要通过 compose 启动就会生成自己的网络!


比如运行十个服务,要打包成一个项目,这个项目上了之后对内网络十分麻烦,compose 自动帮我们维护了这些(项目中内容都在同一个网络下面。域名访问)


我们现在就可以写 mysql:3306 来访问了!


可能有十个容器实例,都跑的 mysql,十个就是十个 ip 写死了肯定不行,这个时候我们把它们写成 mysql,访问就会通过 mysql 到后面这里。



用 docker network inspect 服务名来查看这个 发现没有问题



如果没有在一个网络下或者没有联通是 ping 不通的 官方这里把 host 改成 redis 了,可以直接通过 redis 访问!如果在同一个网络下就直接通过域名访问,如果服务挂了重新拉就行了,比如这里的 redis 是 03,可能重新拉是 04,重新拉之后连接还是没有问题,这就是好处。


可以通过编写 dockercompose yaml 文件一键启动所有服务!

yaml 规则

docker compose yaml 核心


# 只有3层 
version: #版本,是和docker对应的services: #服务 也是核心服务1: web #服务配置 images build network ...服务2: redis ...服务3: redis ...#其他配置 网路配置/卷挂载/全局规则volumes:netwokrs:configs:
#可以在官方网站的version右边查看yaml的编写信息
复制代码



然后很重要的这个:依赖,我们项目是有启动顺序的,比如 web 启动需要 redis,现在得保证先启动 redis,不然 web 启动会报错,这个时候需要使用 depends_on 保证关系,比如上面 web 依赖于 redis 和 postgres,web 下面要写 depends_on 这两个。



后面 dns,entrypoint,environment 环境都可以配置 比如 mysql 密码


实战 搭建博客

1.创建目录 my_wordpressr 然后进入

2.写 docker-compose.yml


version: "3.9"    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    image: wordpress:latest    volumes:      - wordpress_data:/var/www/html    ports:      - "8000:80"    restart: always    environment:      WORDPRESS_DB_HOST: db      WORDPRESS_DB_USER: wordpress      WORDPRESS_DB_PASSWORD: wordpress      WORDPRESS_DB_NAME: wordpressvolumes:  db_data: {}  wordpress_data: {}
复制代码


服务里第一个是 db 数据库 第二个是 wordpress,博客,博客下面有 dpon 先启动 db 然后 restart 是否重启 always 总是重启 environment 是键值对(默认规则) 下面的是 image 下载了镜像,然后暴露 8000 端口,然后 env 是怎么连接数据库 密码 名字 用户名等 然后是 volumes 数据卷。


然后可以直接访问 ip:8000 了!可以在后台看到日志信息


docker-compose -d也是后台启动

写在最后

Docker 篇终于完结了!如果我的文章帮助到你了,希望你可以给我个关注,点赞,收藏支持一下,这将是我更新的动力,感谢你们的支持!咱们 k8s 见!

发布于: 刚刚阅读数: 4
用户头像

泡泡

关注

做最好的知识分享 云计算/云原生 2022.08.25 加入

CSDN万粉博主

评论

发布
暂无评论
【云原生 | 从零开始学Docker】九丶完结篇 Docker Compose_容器_泡泡_InfoQ写作社区