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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 Tair(兼容Redis),内存型 2GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
简介: 之前在制作dockerfile的时候,流程是写完然后build然后run,这还是单个的容器,比如公司有五十个微服务,难道要打包五十个docker吗,依赖关系啥的手动操作很麻烦!这个时候使用dockercompose高效的管理,可以定义运行多个容器!

简介


之前在制作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.0
services:
  web:
    build: .
    ports:
      - "8000:5000"
    volumes:    #持久化挂载
      - .:/code
      - logvolume01:/var/log
    links:
      - redis
  redis:    #redis和web写在了一起,links是连接在一起,先启动redis然后启动web,运行之后他们同时启动了,不用一个一个run了!哪怕有一百个服务,文件写不错就能上线。
    image: redis
volumes:
  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


6.png


有compose就完成了。


#然后是授权 其实这就是一个二进制文件
chmod +x /usr/local/bin/docker-compose
#然后可以执行了!
[root@VM-16-7-centos bin]# docker-compose version
docker-compose version 1.25.5, build 8a1c60f6
docker-py version: 4.1.0
CPython version: 3.7.5
OpenSSL 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流程调用


60.png


重新启动 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  #redis
from 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


flask
redis


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


写一个dockerfile


vim Dockerfile
FROM python:3.7-alpine
ADD . /code
WORKDIR /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.启动yaml


3.启动服务


61.png


正常启动成功有两个服务


62.png


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


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


63.png


网络规则


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


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


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


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


64.png


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


65.png


如果没有在一个网络下或者没有联通是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的编写信息


66.png66.png

66.png


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


67.png


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


68.png


实战 搭建博客


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: wordpress
volumes:
  db_data: {}
  wordpress_data: {}


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


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


docker-compose -d也是后台启动


常用命令


命令

功能

docker-compose -h

查看帮助

docker-composeup

启动所有docker-compose服务

docker-composeup -d

启动所有docker-compose服务并后台运行

docker-composedown

停止并删除容器、网络、卷、镜像

docker-composeexec ${yml内服务的id} /bin/bash

进入容器实例内部

docker-composeps

展示当前docker-compose编排过的运行的所有容器

docker-composetop

展示当前docker-compose编排过的容器进程

docker-composelogs ${yml内服务的id}

查看容器输出日志

docker-composeconfig

检查配置

docker-composeconfig -q

检查配置,有问题才输出

docker-composerestart

重启服务

docker-composestart

启动服务

docker-composestop

停止服务


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
27天前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker和Kubernetes入门
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术成为企业提升敏捷性和效率的关键。本篇文章将引导读者了解如何利用Docker进行容器化打包及部署,以及Kubernetes集群管理的基础操作,帮助初学者快速入门云原生的世界。通过实际案例分析,我们将深入探讨这些技术在现代IT架构中的应用与影响。
86 2
|
24天前
|
运维 Cloud Native 虚拟化
一文吃透云原生 Docker 容器,建议收藏!
本文深入解析云原生Docker容器技术,涵盖容器与Docker的概念、优势、架构设计及应用场景等,建议收藏。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
一文吃透云原生 Docker 容器,建议收藏!
|
1月前
|
关系型数据库 MySQL API
|
3天前
|
监控 NoSQL 时序数据库
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
119 77
|
2天前
|
关系型数据库 MySQL Docker
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
53 6
|
20天前
|
运维 Cloud Native 云计算
云原生之旅:Docker容器化实战
本文将带你走进云原生的世界,深入理解Docker技术如何改变应用部署与运维。我们将通过实际案例,展示如何利用Docker简化开发流程,提升应用的可移植性和伸缩性。文章不仅介绍基础概念,还提供操作指南和最佳实践,帮助你快速上手Docker,开启云原生的第一步。
|
21天前
|
运维 Kubernetes Cloud Native
云原生技术入门:Kubernetes和Docker的协同工作
【10月更文挑战第43天】在云计算时代,云原生技术成为推动现代软件部署和运行的关键力量。本篇文章将带你了解云原生的基本概念,重点探讨Kubernetes和Docker如何协同工作以支持容器化应用的生命周期管理。通过实际代码示例,我们将展示如何在Kubernetes集群中部署和管理Docker容器,从而为初学者提供一条清晰的学习路径。
|
29天前
|
运维 开发者 Docker
Docker Compose:简化容器化应用的部署与管理
Docker Compose:简化容器化应用的部署与管理
|
29天前
|
Docker 微服务 容器
使用Docker Compose实现微服务架构的快速部署
使用Docker Compose实现微服务架构的快速部署
55 1
|
1月前
|
负载均衡 监控 开发者
深入浅出:掌握 Docker Compose 的高级用法
【10月更文挑战第22天】本文深入探讨了 Docker Compose 的高级用法,包括环境变量、服务扩展、网络配置和数据卷管理。通过实例详细介绍了如何利用这些功能提升开发效率和应用部署的灵活性。适合希望深入了解 Docker Compose 的开发者阅读。