Docker三剑客之Docker-compose

「伸手摘星,即使一无所获,亦不致满手污泥」

「请关注公众号:星河之码」

一、什么是Docker-compose

在实际的生产中,一般都是使用一个docker容器部署一个应用进程,这种情况下,当部署多个不同应用或者一个应用部署多个实例的时候,就要运行多个容器。多个容器协同工作需要一个管理者来管理他们,定义这些容器如何相互关联。compose 就是做这件事的。

compose、machine 和 swarm 是docker 原生提供的三大编排工具。简称docker三剑客。

官网地址:

https://docs.docker.com/compose/compose-file/

「Docker Compose 是用于定义和运行多容器 Docker 应用程序的工具,能够在 Docker 节点上,以单引擎模式(Single-Engine Mode)进行多容器应用的部署和管理」

  • 「compose 使用 YAML 文件来定义多容器之间的关系(配置应用程序需要的所有服务),然后通过docker-compose up 命令执行一个YAML文件,就可以从 YML 文件配置中创建并启动所有服务,把完整的应用跑起来」

  • 本质上, compose 把 YAML 文件解析成 docker 命令的参数,然后调用相应的 docker 命令行接口,基于 Docker 引擎 API 完成应用的部署,从而将应用以容器化的方式管理起来。

    compose 通过解析容器间的依赖关系顺序地启动容器。而容器间的依赖关系由 YAML 文件中的 links 标记指定

二、Docker-compose的安装与卸载

  • 「下载」

    • 可以从 Github 上下载它的二进制包来使用,最新发行的版本地址:

      https://github.com/docker/compose/releases
      Docker三剑客之Docker-compose

      下载之后上传到服务器,通过mv或者cp 命令移动到指定文件中

      mv /data/docker-compose-Linux-x86_64 /usr/local/bin/docker-compose
      #或者
      cp /data/docker-compose-Linux-x86_64 /usr/local/bin/docker-compose
    • 也可以通过命令以下载 Docker Compose 的指定版本

      sudo curl -L "https://github.com/docker/compose/releases/download/v2.8.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

      上述命令是在GitHub会比较慢,可以提前下载或者使用下面的命令,高速安装 Docker Compose。

      curl -L https://get.daocloud.io/docker/compose/releases/download/v2.8.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

      要安装其他版本的 Compose,替换 v2.8.0即可。 /usr/local/bin/docker-compose  是下载存放的目录

      值得注意的是「在官网中,已经发布了3个大版本,推荐使用2.x 和 3.x 版本,并且每个版本对应的Docker的版本在官网中也有指出,按照需要进行下载即可」

      Docker三剑客之Docker-compose
  • 「授权」

    上传之后需要对可执行权限应用于二进制文件

    sudo chmod +x /usr/local/bin/docker-compose
    #开发环境可以授予最高权限
    chmod 777 /usr/local/bin/docker-compose
  • 「创建软链」

    软链类似Windows中的快捷方式,这一步可以不执行

    sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
  • 「验证是否安装成功」

    通过以下命令之一查看docker-compose的版本即可

    docker-compose -v
    docker-compose --version
    docker-compose version
    Docker三剑客之Docker-compose
  • 「卸载docker-compose」

    docker-compose卸载只需要删除二进制文件就可以了。

    rm -rf /usr/local/bin/docker-compose
    # 卸载之后重启一下虚拟机
    reboot

三、yml配置文件

3.1 yml 文件组成简介

  • Docker Compose 使用 YAML 文件来定义多服务的应用。YAML 是 JSON 的一个子集,因此也可以使用JSON。

  • Docker Compose 默认使用文件名 docker-compose.yml。如果名字不是这个可以使用 -f 参数指定具体文件。

    docker-compose up -f xxxxx.yml
  • Docker Compose 的 YAML 文件包含 4 个一级 key:「version、services、networks、volumes」

    • 「version」

      「version定义了 Compose 文件格式(主要是API)的版本,必须指定,位于文件的第一行」

      「注意,version 并非定义 Docker Compose 或 Docker 引擎的版本号」

    • 「services」

      「用于定义不同的应用服务。Docker Compose 会将每个服务部署在各自的容器中」

      比如有两个服务:eurekah和mysql ,就会写在services节点下

    • 「networks」

      「用于指引 Docker 创建新的网络。默认情况下,Docker Compose 会创建 bridge 网络」

      bridge 网络一种单主机网络,只能够实现同一主机上容器的连接。也可以使用 driver 属性来指定不同的网络类型。

    • 「volumes」

      「用于指引 Docker 来创建新的数据卷卷」

3.2 idea安装docker插件

idea高版本中已经安装docker插件,如果是低版本的idea,可以去下载安装docker插件

#插件官网地址:
https://plugins.jetbrains.com/plugin/7724-docker/versions
Docker三剑客之Docker-compose

「idea安装docker插件后,可以提示补全Dockerfile、docker-compose.yml文件大部分内容信息」

四、docker-compose案例

此案例以Nginx 反向代理两个Tomcat为例,访问Nginx,以轮训的方式分别请求Tomcat1,Tomcat2。因此我们需要部署一个Nginx,两个Tomcat,最终通过docker-compose来启动这三个容器

  • 「基础镜像」

    docker pull nginx:1.19.3-alpine
    docker pull tomcat:9.0.20-jre8-alpine
    Docker三剑客之Docker-compose
  • 「试运行镜像」

    先检查以下是否镜像是否可以正常启动

    docker run -itd --name nginx -p 80:80 nginx:1.19.3-alpine
    docker run -itd --name tomcat -p 8080:8080 tomcat:9.0.20-jre8-alpine
    Docker三剑客之Docker-compose

    启动的时候如果报以上的警告,说明「IPv4转发已禁用。网络是行不通的」,虽然容器启动了,但是外网无法访问,只需要门开只需要开启就可以了。

    • 「开启转发配置」

      #编辑sysctl.conf
      vi /etc/sysctl.conf
      #配置转发
      net.ipv4.ip_forward=1
      #保存退出就可以了
      #重启服务,让配置生效
      systemctl restart network
      #查看是否成功,如果返回为“net.ipv4.ip_forward = 1”则表示成功
      sysctl net.ipv4.ip_forward
      #重启docker
      sudo systemctl start docker

      Docker三剑客之Docker-compose
  • 「在宿主机创建目录」

    mkdir -p /data/tomcat1 tomcat2
  • 「复制镜像文件」

    将两个运行的容器的目录复制到宿主机

    docker cp nginx:/etc/nginx /data/nginx
    docker cp tomcat:/usr/local/tomcat/webapps /data/tomcat1/webapps
    docker cp tomcat:/usr/local/tomcat/webapps /data/tomcat2/webapps

    这里复制镜像文件,只是为了后面做数据卷挂载用的,其实没有必要一定要cp,可以直接在上一步骤直接创建相应的nginx、webapps目录进行挂载就行,之所以这么做,是因为演示过程中实现对webapps下的index.jsp做一些修改,不然后面访问不好区分

  • 「进入容器/退出容器」

#进入容器/退出容器 docker exec -it tomcat sh #退出容器 exit


* **停止/删除容器**

上面运行成功,说明镜像可用,停止镜像的运行,一会通过docker-compose来启动

```bash
#停止容器
docker stop nginx tomcat
#删除容器
docker rm -f nginx tomcat

等会使用docker-compose.yml启动

  • 「修改Tomcat的启动页面」

    这样就知道Tomcat是访问的那个tomcat1

    echo "tomcat1" > /data/tomcat1/webapps/ROOT/index.jsp
    echo "tomcat2" > /data/tomcat2/webapps/ROOT/index.jsp
    Docker三剑客之Docker-compose
  • 「修改nginx.conf」

    vi /data/nginx/nginx.conf
    #在nginx.conf添加以下配置
    include vhost/*.conf;
    Docker三剑客之Docker-compose
  • 「nginx配置」

    # 当前目录创建一个vhost,用于存放Nginx 配置
    mkdir -p /data/nginx/vhost
    cd vhost
    #创建编辑edwin.conf
    vi edwin.conf
    #将以下配置编辑到edwin.conf
    upstream nginxedwinedu{
    server 192.168.242.128:8081;
    server 192.168.242.128:8082;
    }
    server{
    listen 80;
    server_name 192.168.242.128;
    autoindex on;
    index index.html index.htm index.jsp;
    location / {
    proxy_pass http://nginxedwinedu;
    add_header Access-Control-Allow-Origin *;
    }
    }
  • 「编辑docker-compose.yml」

    当我们安装了docker插件之后,在编写docker-compose.yml的时候是有补全的

    Docker三剑客之Docker-compose
    # 指定 compose 文件的版本
    version: '2'
    # 定义所有的 service 信息, services 下面的第一级别的 key 既是一个 service 的名称
    services:
    # 服务名称
    edwin-nginx:
    #开机自启
    restart: always
    #容器名称
    container_name: edwin-nginx
    # 挂载目录 宿主机数据卷路径:容器内路径
    volumes:
    - /data/nginx:/etc/nginx/
    # 指定 docker 镜像, 可以是远程仓库镜像、本地镜像
    image: nginx:1.19.3-alpine
    # 建立宿主机和容器之间的端口映射关系, ports 支持两种语法格式
    ports:
    - 80:80
    edwin-tomcat1:
    restart: always
    container_name: edwin-tomcat1
    volumes:
    - /data/tomcat1/webapps:/usr/local/tomcat/webapps
    image: tomcat:9.0.20-jre8-alpine
    ports:
    - 8081:8080
    # 依赖的服务,这里的意思是启动edwin-tomcat1依赖edwin-nginx
    depends_on:
    - edwin-nginx
    edwin-tomcat2:
    restart: always
    container_name: edwin-tomcat2
    volumes:
    - /data/tomcat2/webapps:/usr/local/tomcat/webapps
    image: tomcat:9.0.20-jre8-alpine
    ports:
    - 8082:8080
    depends_on:
    - edwin-nginx

    docker-compose.yml还有很多的节点,因为这里用不上,就没有一一写上去,完整的节点信息可以关注我的公众号【星河之码】,回复【Docker-compose】获取。

  • 「上传docker-compose.yml」

    编写完docker-compose.yml之后,将其上传到服务器中,然后就可以通过docker-compose.yml来启动Nginx和tomcat

    Docker三剑客之Docker-compose
  • 「启动服务」

    #前台启动
    docker-compose up
    #后台启动
    docker-compose up -d

    由于我们的yml文件名是默认的docker-compose.yml,所以直接在docker-compose.yml所在目录下执行以上命令即可,如果不是这个名字,则需要用-f来指定启动的文件名  docker-compose up -f aaaa.yml

  • 「查看服务日志

    docker-compose logs 容器名
    # 比如
    docker-compose logs edwin-nginx

    查看Nginx发现还真有一个报错

    Docker三剑客之Docker-compose

    这个是因为主机没有开启Ipv6,虽然不影响启动,但是如果想吧这个去掉也很简单,修改一下Nginx的配置就可以了

    # 编辑default.conf文件
    vi /data/nginx/conf.d/default.conf
    #注释掉Ipv6的监听就可以了
    Docker三剑客之Docker-compose
  • 「浏览器访问」

    #访问tomcat
    http://192.168.198.128:8081/
    http://192.168.198.128:8082/
    #访问nginx 会轮训的访问tomcat1 tomcat2
    http://192.168.198.128

    访问Nginx会以轮询的方式请求两个tomcat,如下

    Docker三剑客之Docker-compose

五、docker-compose常用命令汇总

  • 「启动服务」

    docker-compose up -d
  • 「停止服务」

    docker-compose down
  • 「列出所有运行容器」

    docker-compose ps
  • 「查看服务日志」

    docker-compose logs
  • 「构建或者重新构建服务」

    docker-compose build
  • 「启动服务」

    docker-compose start
  • 「重启服务」

    docker-compose restart
  • 「停止已运行的服务」

    docker-compose stop

这里都是直接用的已有镜像,「构建服务下面这几个命令是用于在用dockerfile镜像构建服务的时候用的」


Docker三剑客之Docker-compose



原文始发于微信公众号(星河之码):Docker三剑客之Docker-compose

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/60825.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!