社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  docker

Docker小白到实战之Docker Compose在手,一键足矣

dotNET跨平台 • 4 年前 • 617 次点击  

前言

Docker可以将应用程序及环境很方便的以容器的形式启动,但当应用程序依赖的服务比较多,或是遇到一个大系统拆分的服务很多时,如果还一个一个的根据镜像启动容器,那就有点累人了,到这有很多小伙伴会说:弄个脚本就搞定啦;要的就是这个思路,Docker提供了一个叫Docker Compose的工具,一键启动相关服务。

举个例:比如开发一个Web项目,需要有数据库、Redis、MongoDB、配置中心等等,如果将其进行容器化,可以有两种选择,第一种就是把所有的服务依赖和应用程序全部构建为一个镜像,然后以一个容器运行,即这个容器里面包含了Web应用程序、数据库、Redis、MongoDB、配置中心等;另一种方式就各自服务单独启动为一个容器服务,比较独立,一般可以一个一个的启动容器,然后通过网络连接起来就行;显然第二种方式是小伙伴们更多的选择,如果能配上一个批量操作那就完美了,而Docker Compose就是来干这个事的。

正文

1. 概述

Docker Compose 是一个用于定义和运行多个容器服务的 Docker 应用程序工具;搭配使用 YAML 文件来配置应用程序服务,然后运行Docker Compose命令,一键启动所有容器服务

2. 安装

Docker默认安装环境下是不包含Docker Compose工具的,需要单独安装。Docker Compose工具搭配Docker才有意义,所以安装Docker Compose之前需要安装Docker。以下演示平台为Linux,其他平台请参照文档:https://docs.docker.com/compose/install/

2.1 下载文件

其实Docker Compose是一个可执行文件,直接下载对应文件即可,执行如下命令:

# 下载Docker Compose文件, 这个地址下载比较慢
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 这个地址快点
sudo curl -L "https://get.daocloud.io/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

如下图:

2.2 授予执行权限

下载下来的文件默认是没有执行权限的,后续需要执行,所以得授予执行权限,执行如下命令即可:

sudo chmod +x /usr/local/bin/docker-compose

看看权限结果分配如下:

这样docker-compose就安装完啦。

2.3 卸载

如果需要卸载,直接删除即可,执行如下命令即可:

sudo rm /usr/local/bin/docker-compose

3. 使用

Docker Compose需要搭配YAML文件使用,YAML 是一种人类友好的数据序列化语言,适用于所有编程语言,后缀名为.yml

所以在进行实操前,需要大概的了解一下YAML的语法,不要慌,语法和Json的思路很像,大概了解一下,后续用到查文档就行啦。

3.1 简单说说语法

YAML文件内容是通过空格的缩进来代表层次,常用的数据类型有如下:

  • 对象:键值对集合;

    # yaml 对象语法
    testKey:testValue
    # Json 语法
    {"testKey":"testValue"}
    # yaml 嵌套对象
    testKey:{testKey1:testValue1,testKey2:testValue2}
    # Json 语法
    {"testKey":{"testKey1":"testValue1","testKey2":"testValue2"}}
  • 数组:一组按次序排列的数据;用-前缀表示。

    # yaml 数组语法
    -value1
    -value2
    -value3
    # Json 数组语法
    ["value1","value2","value3"]
    # yaml 数组行内语法
    testKey:[value1,value2]
    # Json 语法
    {"testKey":['value1','value2']}
  • 纯量:不可再分的值,包括字符串、整数、浮点数、日期、布尔值等。

    yaml
    testKey:666
    Json
    {testKey:666}
    yaml
    isbool:true
    Json
    {isbool:true}

常规的基本语法格式约定如下:

  • 大小写敏感

  • 使用空格缩进表示层级关系

  • 缩进不允许使用tab,只允许空格

  • 缩进的空格数不重要,只要相同层级的元素左对齐即可

  • '#'表示注释

大概了解上面这些,关于日常Docker Compose用到的文件基本上够用了,如果有需要进阶的,可以去查查对应的语法。传送门:

https://yaml.org/spec/1.2.2/

https://www.runoob.com/w3cnote/yaml-intro.html

关于YAML文件内容中配置的命令和Dockerfile的命令差不多是一一对应的,稍后会简单说说。

3.2 实操撸文件

这里还是以一个WebApi为例,例中需要依赖Redis服务。

  • 创建项目,编写例子

    这里只是引入了一个Redis的缓存包,通过构造函数注入之后就可以直接用啦;编写了一个API接口TestCache。

    这里还需要在Startup文件中注入相关服务,并指定Redis的连接地址,如下:

    运行起来测试一下效果,如下:

    Redis中也有值了,这里需要注意:存入Redis中的类型是Hash。

  • 编写Dockerfile文件

    在项目根目录创建一个Dockerfile文件,内容如下:

    关于Dockerfile中的内容这里就不细说了,之前有一篇文章专门分享的(点这里)。这里的Dockerfile目的就是将我们的WebApi项目构建为镜像,和Redis没有关系,不过这里不是通过执行命令构建,而是通过Compose文件一起构建。

    注:这里记得将Dockerfile文件通过右键->属性->设置为始终复制,保证编译后的文件有最新文件

  • 编写Compose文件

    在项目根目录下创建docker-compose.yml文件,内容如下:

    有了这个项目就可以一键启动了,这里需要稍微改一下我们原来的代码,如下:

    注:这里记得将docker-compose.yml文件通过右键->属性->设置为始终复制,保证编译后的文件有最新文件。

3.3 体验一键启动
  • 将项目先发布,并拷贝到对应的服务器上,如下:

    这里用的是我的阿里云服务器,拷贝文件如下:

  • 一键启动

    在docker-compose.yml所在的目录下执行如下命令:

    docker-compose up

    下面是执行docker-compose up内部执行的步骤:

    先是构建我们的程序,然后拉取依赖的Redis服务,并启动,最后启动我们的程序。(执行顺序和依赖有关系);启动之后就可以根据docker-compose.yml文件中映射的端口访问了,如下:

  • 看看启动的容器名

    image-20211007165313310

    通过docker ps -n 2 查看最近启动的容器,容器的名字规则是:目录名_Compose文件中定义的服务名_序号,那小伙伴肯定会好奇为什么程序能通过myredis名字连接到redis,可以通过docker inspect composetest_myredis_1查看容器详情:

    同样可以查看到API服务对应的容器也是用的composetest_default这个网络,这个网络是一个桥接模式,可以通过docker network ls看到,如下:

  • docker compose常用命令

    docker-compose build:构建或者重新构建服务

    docker-compose up:构建、启动容器,加上-d选项代表后台运行。

    docker-compose ps:列出所有通过Compose运行的容器

    docker-compose logs:打印相关日志信息

    docker-compose stop/start/restartd:可以指定服务停止、开始和重新启动

    docker-compose命令和docker的命令基本是一样的。

  • docker-compose.yml文件内容常用属性

    version:指定 docker-compose.yml 文件的版本,一般都是用version 3;

    services:定义多个容器集合,有多少写多少;

    build:构建镜像,和docker build一样功效;

    environment:配置环境变量,和Dockerfile中ENV 关键字功能一样;

    # 设置环境变量
    environment:
      RACK_ENV: development
      SHOW'true'

    expose:暴露端口,和Dockerfile中的EXPOSE 关键字功能一样;

    
    
    
        
    expose:
      - "80"
      - "9999"

    ports:配置端口映射,和docker run -p一样功效

    ports:
     - "8080:80"
     - "6379:6379"

    volumes:指定卷挂载路径,与Dockerifle中的VOLUME 关键字功能一样

    volumes:
      - /var/lib/mysql
      - /opt/data:/var/lib/mysql

    command:覆盖容器启动后默认执行的命令,和Dockerfile文件中的CMD命令一样;

    command: bundle exec thin -p 3000

    image:指定要用的镜像,构建的时候会拉取。

    # 指定要使用redis镜像
    image: redis

上面列出了一些比较常用的,具体的可以参考官网:https://docs.docker.com/compose/compose-file/compose-file-v3/

代码地址如下:https://gitee.com/CodeZoe/microservies-demo/tree/main/DockerComposeDemo

总结

上文只是演示了Docker Compose的使用,详细的Compose文件内容还需要在实际应用过程中根据实际需要查阅,后续在说集群的时候还会说到。

关注“Code综艺圈”,和我一起学习吧;


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/121032