十四、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:

 

posted @ 2020-12-25 17:04  yaowx  阅读(378)  评论(1编辑  收藏  举报