• 十四、docker-compose


    一、docker-compose的简介

    Docker Compose是 docker 提供的一个命令行工具,用来定义和运行由多个容器组成的应用。使用 compose,我们可以通过 YAML 文件声明式的定义应用程序的各个服务,并由单个命令完成应用的创建和启动。

    使用compose,可以使用yaml文件配置应用程序的服务。然后,通过一个命令,可以从配置中创建和启动所有服务。

    官网:https://docs.docker.com/compose/overview/

    官方文档:https://docs.docker.com/compose/

    compose适用于所有环境:生产,开发,测试以及CI工作流程。

    使用compose基本上是一个三步过程:

    1. 用dockerfile,或者镜像定义应用程序的环境,以便在任何地方复制。

    2. 在docker-compose.yml中定义组成应用程序的服务,以便它们可以在单独的环境中一起运行。

    3. 运行docker compose up启动并运行整个应用程序。

    二、docekr-compose的安装

    安装方式一:

    [root@docker ~]# yum -y install libcurl libcurl-devel
    [root@docker ~]# curl -L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-'uname -s'-'uname -m' -o /usr/local/bin/docker-compose
    [root@docker ~]# ls
    anaconda-ks.cfg         docker-compose 
    [root@docker ~]# mv docker-compose /usr/local/bin/
    [root@docker ~]# chmod +x /usr/local/bin/docker-compose
    [root@docker ~]# docker-compose --version
    docker-compose version 1.21.1, build 5a3f1a3

    安装方式二:

    通过pip -v检查pip 是否安装及版本
    yum -y install epel-release 安装pip基础
    yum install python-pip 安装pip的python 支持
    pip install --upgrade pip 完成pip的安装
    pip install docker-compose 来安装docker-compose

    安装方式三:

    yum install -y docker-compose

    三、docker-compose的常用选项和命令

    常用选项:
    --verbose:输出更多的调试信息
    --version:查看compose的版本
    -f --file FILE:使用特定的compose模板文件,默认为docker-compose.yml。
    -p --project-name NAME 指定项目名称,默认使用目录名称。
    常用命令:
    build:构建或重建服务
    ps:查看已经启动的服务状态   
    kill:停止某个服务、杀掉容器   
    logs:可以查看某个服务的log、显示容器的输出内容   
    port:打印绑定的public port(开放端口)
    pull:拉取服务镜像  
    up:启动yml定义的所有服务 
    stop:停止yml中定义的所有服务   
    start:启动被停止的yml中的所有服务
    kill:强行停止yml中定义的所有服务
    rm:删除yml中定义的所有服务  
    restart:重启yml中定义的所有服务
    scale:设置服务的容器数目
    run:运行一个一次性命令

    四、YAML简介

    Yaml简介.YAML是一种标记语言,可读性很强。类似于XML数据描述语言,语法比XML简单的多。YAML数据结构通过缩进来表示,连续的项目通过减号来表示,键值对用冒号分割,数组用括号括起来, hash用花括号括起来。
    YAML文件格式注意事项:
    在缩排中空白字符的数目并不是非常重要,只要相同阶层的元素左侧对齐就可以了(不过不能使用TAB字符);
    通常开头缩进2个空格;字符的后面缩进1个空格,比如冒号、逗号、横杆;
    支持#注释;
    允许在文件中加入选择性的空行,以增加可读性;
    docker-compose中YAML常用的字段:
    
    字段
    
    描述
    build
      dockerfile  指定dockerfile文件名
      context  构建镜像上下文路径
    image    指定镜像
    command    执行命令,覆盖默认命令
    container_name    指定容器名称,由于容器名称是唯一的,如果指定自定义名称,则无法scale
    deploy     指定部署和运行服务相关配置,只能在Swarm模式使用
    environment    添加环境变量
    networks    加入网络,引用顶级networks下条目
    ports    暴漏端口,与-p相同,但端口不能低于60
    volumes    挂载宿主机路径或命名卷在顶级volumes定义卷名称
    restart    重启策略,默认no,always|on-failurel|unless-stopped
    hostname    容器主机名

    docker-compose.yml 编排

    五、docker-compose案例

    案例1、docker-compose构建nginx容器

    第一步:编写docker-compose.yml文件

    version:"3" 
    services:
      nginx:
        container_name: www-nginx
        image: nginx:latest
        restart: always
        ports:
         - 80:80
        volumes:
         - /web:/usr/share/nginx/html

    第二步:创建发布目录,并在发布目录中新创建index.html页面

     
    mkdir -p /web
    cd /web
    echo 'first docker-compose project' > index.html

    第三步:启动和运行docker-compose,启动nginx容器

     
    docker-compose up -d

    docker-compose.yml文件说明

    version:版本号,通常写2和3
    services: Docker容器服务的名称
    container_name:容器的名字
    restart: 设置为always,容器在停止或docker服务重启后,重启容器
    image: docker镜像,如果本地没有,在官方镜像上去找
    ports: 容器自己运行的端口号和需要暴露的端口号
    volumes:数据卷,表示数据、配置文件等存放的位置。(- .表示docker-compose.yml当前目录)
    [root@inode3 docker]# docker-compose config
    services:
      nginx:
      container_name: www-nginx
      image: nginx:latest
      ports:
        - 80:80/tcp
      restart: always
      volumes:
        - /web:/usr/share/nginx/html:rw
      version: '3.0'
    
    [root@inode3 docker]# docker-compose up 
    Creating network "docker_default" with the default driver
    Creating www-nginx ... done
    Attaching to www-nginx
    www-nginx | 192.168.32.103 - - [09/Mar/2020:15:25:21 +0000] "GET / HTTP/1.1" 200 29 "-" "curl/7.29.0" "-"
    访问测试
    
    [root@inode3 ~]# curl 192.168.32.103
    first docker-compose project

    案例2、基于docker-compose构建nginx容器和tomcat容器,并且实现nginx和tomcat发布目录映射,同时实现nginx均衡tomcat服务,通过访问nginx的80端口及访问tomcat的8080端口

    tomcat页面的发布目录:/usr/local/tomcat/webapps/ROOT 挂载宿主机的/web/ROOT目录到/usr/local/tomcat/webapps下

    第一步:编写docekr-compose.yml文件

    version: '3'
    services:
        nginx:
          container_name: web_nginx
          images: nginx:latest
          restart: always
          ports:
            - 80:80
          volumes:
            - /web:/usr/share/nginx/html
            - /web/nginx.conf:/etc/nginx/nginx.conf
            - /web/default.conf:/etc/nginx/conf.d/default.conf
          links:
           - tomcat01
           - tomcat02
           - 
        tomcat01:
           container_name: tomcat01
           images: tomcat:latest
           restart: always
           volumes:
             - /web:/usr/local/tomcat/webapps
              
        tomcat02:
           container_name: tomcat02
           images: tomcat:latest
           restart: always
           volumes:
             - /web:/usr/local/tomcat/webapps

    第二步:创建发布目录

    mkdir -p /web
    echo 'nginx to tomcat' > index.html
    echo 'It is error' > 50x.html

    default.conf文件内容

    upstream tomcat_web {
         server tomcat01:8080 max_fails=2 fail_timeout=5;
         server tomcat02:8080 max_fails=2 fail_timeout=5;
    }
    
    server {
       listen 80;
       server_name localhost;
       location / {
            root /usr/share/nginx/html;
            index  index.html index.htm;
            proxy_pass http://tomcat_web;
            proxy_set_header host $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Real-IP $remote_addr;
       }   
       error_page   500 502 503 504 /50x.html;
       location = /50x.html {
            root /usr/share/nginx/html;
       }
    
    }

    nginx.conf文件内容

    worker_processes  1;
    events {
      worker_connections  1024;
    }
    http {
      include   mime.types;
      default_type  application/octet-stream;
      sendfile on;
      keepalive_timeout  65;
      include conf.d/*.conf;
    }

    第三步:docker-compose up -d

    [root@inode3 docker]# docker-compose config
    services:
    nginx:
      container_name: web_nginx
      image: nginx:latest
      links:
        - tomcat01
        - tomcat02
      ports:
        - 80:80/tcp
      restart: always
      volumes:
         - /web:/usr/share/nginx/html:rw
         - /web/nginx.conf:/etc/nginx/nginx.conf:rw
         - /web/default.conf:/etc/nginx/conf.d/default.conf:rw
    tomcat01:
       container_name: tomcat01
       image: tomcat:latest
       restart: always
    
    tomcat02
       container_name: tomcat02
       image: tomcat:latest
        restart: always
    version: '3.0'
    [root@inode3 docker]# docker-compose up -d
    Pulling tomcat01 (tomcat:latest)...
    latest: Pulling from library/tomcat
    50e431f79093: Pull complete
    dd8c6d374ea5: Pull complete
    c85513200d84: Pull complete
    55769680e827: Pull complete
    e27ce2095ec2: Pull complete
    5943eea6cb7c: Pull complete
    3ed8ceae72a6: Pull complete
    91d1e510d72b: Pull complete
    98ce65c663bc: Pull complete
    27d4ac9d012a: Pull complete
    Digest: sha256:2c90303e910d7d5323935b6dc4f8ba59cc1ec99cf1b71fd6ca5158835cffdc9c
    Status: Downloaded newer image for tomcat:latest
    Creating tomcat02 ... done
    Creating tomcat01 ... done
    Recreating www-nginx ... done
    [root@inode3 docker]# docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                          PORTS               NAMES
    3ba3f8a9a8d1        nginx:latest        "nginx -g 'daemon of…"   47 seconds ago      Restarting (1) 10 seconds ago                       web_nginx
    965e4e262cc5        tomcat:latest       "catalina.sh run"        49 seconds ago      Up 47 seconds                   8080/tcp            tomcat01
    73d90a4a2ad3        tomcat:latest       "catalina.sh run"        49 seconds ago      Up 47 seconds                   8080/tcp            tomcat02

    可以使用浏览器来经行访问

    案例3: docker-compose和dockerfile结合使用

    文件位置

    [root@inode4 docker]# tree /server/docker/
    /server/docker/
    ├── docker-compose.yml
    └── kod
      ├── dockerfile
      ├── init.sh
      └── kodexplorer4.40.zip

    docker-compose.yml与kod项目在同一个目录中

    docker-compose.yml

    version: '3'
    kod:    #指定服务名   
      build: ./kod  #指定dockerile路径
      ports:
         - "80:80"  #指定端口映射
      expose:
         - 80    #容器提供服务的i:端口

    dockerfile

    FROM   centos:7
    RUN    yum install -y httpd php php-cli php-gd php-mbstring unzip
    WORKDIR /var/www/html
    COPY kodexplorer4.40.zip .
    RUN    unzip kodexplorer4.40.zip
    RUN    chown -R apache.apache /var/www/html
    RUN    chmod 777 /var/www/html
    ADD    init.sh /init.sh
    EXPOSE  80
    ENTRYPOINT  ["/bin/bash","/init.sh"]

    init.sh

     
    #!/bin/bash
    /usr/sbin/httpd -k start
    tail -F /var/log/access_log

    案例4:一键部署 LNMP 网站平台

    version: '3'
    services:
      nginx:
        hostname: nginx
        build:
          context: ./nginx
          dockerfile: Dockerfile
        ports:
          - 80:80
        networks:
          - lnmp
        volumes:
          - ./nginx/php.conf:/usr/local/nginx/conf/vhost/php.conf
          - ./wwwroot:/usr/local/nginx/html
    
      php:
        hostname: php
        build:
          context: ./php
          dockerfile: Dockerfile
        networks:
          - lnmp
        volumes:
          - ./wwwroot:/usr/local/nginx/html
    
      mysql:
        hostname: mysql
        image: mysql:5.7
        ports:
          - 3306:3306
        networks:
          - lnmp
        volumes:
          - ./mysql/conf:/etc/mysql/conf.d
          - ./mysql/data:/var/lib/mysql
        command: --character-set-server=utf8
        environment:
          MYSQL_ROOT_PASSWORD: 123456
          MYSQL_DATABASE: test 
          MYSQL_USER: user
          MYSQL_PASSWORD: user123456 
    
    networks:
      lnmp: {} 

    案例5: 一键部署 LNMT网站平台

    version: '3'
    services:
      nginx:
        hostname: nginx
        build:
          context: ./nginx
          dockerfile: Dockerfile
        ports:
          - 80:80
        networks:
          - lnmt
        volumes:
          - ./nginx/tomcat.conf:/usr/local/nginx/conf/vhost/tomcat.conf
          - ./webapps:/usr/local/tomcat/webapps
    
      tomcat01:
        hostname: tomcat01
        build: ./tomcat
        networks:
          - lnmt
        volumes:
          - ./webapps:/usr/local/tomcat/webapps
    
      tomcat02:
        hostname: tomcat02
        build: ./tomcat
        networks:
          - lnmt
        volumes:
          - ./webapps:/usr/local/tomcat/webapps
    
      mysql:
        hostname: mysql
        image: mysql:5.7
        ports:
          - 3306:3306
        networks:
          - lnmt
        volumes:
          - ./mysql/conf:/etc/mysql/conf.d
          - ./mysql/data:/var/lib/mysql
        environment:
          MYSQL_ROOT_PASSWORD: 123456
          MYSQL_DATABASE: test
          MYSQL_USER: user
          MYSQL_PASSWORD: user123456
    
    networks:
      lnmt:
  • 相关阅读:
    sublime text在Linux下build出现'ascii' codec can't decode byte 0xe4 in position 0的解决办法
    sublime text的verilog插件——verilog automatic
    Ubuntu Lucid Installation Guide
    vim之perlsupport的小修改
    python笔记
    sublime text中ctags使用注意事项
    2021年终总结
    wp7学习站点
    WPF中调用Winform控件
    Xen Cloud Platform 系列:NFS 存储库(四)
  • 原文地址:https://www.cnblogs.com/yaokaka/p/14189831.html
Copyright © 2020-2023  润新知