12、docker compose

Docker Compose 是Docker官方编排(Orchestration)项目之一,负责快速在集群中部署分布式应用。Compose定位是“defining and running complex applications with Docker”,前身是 Fig,兼容 Fig 的模板文件。

1、docker-compose简介

  学了前面的章节内容,我们知道dockerfile可以让用户管理一个单独的应用容器,而今天即将学习的compose则是允许用户在一个模板(YAML格式)中定义一组相关联的应用容器(被称为一个project,即项目),例如:一台web服务容器关联后端的数据库服务容器等。

  docker-compose将所管理的容器分为三层,分别是工程(project),服务(service)以及容器(container)。docker-compose运行目录下的所有文件(docker-compose.yml,extends文件或环境变量文件等)组成一个工程,若无特殊指定工程名即为当前目录名。一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像、参数、依赖。

  一个服务当中可包括多个容器实例,docker-compose并没有解决负载均衡的问题,因此需要借助其它工具实现服务发现及负载均衡。

  docker-compose的配置文件默认为docker-compose.yml,可通过环境变量COMPOSE_FILE或-f参数自定义配置文件,其定义了多个有依赖关系的服务及每个服务运行的容器

  使用dockerfile模板文件,可以让用户很方便的定义一个单独的应用容器。在工作中,经常会碰到需要多个容器相互配合来完成某项目任务的情况。例如要实现一个web项目,除了web服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。

  docker-compose允许用户通过单独的docker-compose.yml模板文件(YAML格式)来定义一组相关联的应用容器为一个项目(project)。

  docker-compose项目有Python编写,调用docker服务提供的API来对容器进行管理。因此,只要所操作的平台支持docker API ,就可以在其上利用compose来进行编排管理。

2、docker-compose部署安装

1、使用pip安装

安装compose之前,需要先安装docker引擎服务,此处使用PIP安装compose项目,要求系统必须提前安装pip工具,然后执行如下命令:

pip install --upgrade pip
pip install -U docker-compose

2、直接下载安装

gitlab https://github.com/docker/compose/releases 上查询适合自己的版本

 

我这里下载的是1.23.2 版本

 

安装成功后,可以查看 docker-compose 命令的用法,执行如下指令:
docker-compose -h

curl -L https://github.com/docker/compose/releases/download/1.23.2/docker-compose-Linux-x86_64 -o /usr/local/bin/docker-compose

添加执行权限

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

安装完成查看版本

docker-compose --version
docker-compose version 1.23.2, build 1110ad01

安装完成之后,可以添加 bash 补全命令。
curl -L https://raw.githubusercontent.com/docker/compose/1.2.0/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose

 3、 Docker-Compose常见概念

服务(service):一个应用容器,实际上可以运行多个相同镜像的实例。
项目(project):由一组关联的应用容器组成的一个完整业务单元。
一个项目可以由多个服务(容器)关联而成,Compose是 面向项目进行管理。

4、Docker-Compose实战案例一

基于docker-compose构建Nginx容器,并且实现发布目录映射,通过浏览器实现访问,操作步骤如下:

Docker pull nginx

Docker run -itd -v /data/webapps/www:/usr/share/nginx/html -p 80:80 nginx

1)编写docker-compose.yml文件,内容如下:

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

2)创建发布目录:/data/webapps/www/,并且在发布目录新建index.html页面,命令如下:

mkdir -p /data/webapps/www/
echo "<h1>Nginx Test pages.</h1>" >>/data/webapps/www/index.html

3)启动和运行docker-compose,启动Nginx容器,命令如下:

[root@hackerlin src]# docker-compose up -d
Creating www-nginx ... done

4)通过浏览器访问宿主机80端口,即可访问Nginx容器,如图所示:

 

5)docker-compose.yml内容剖析:

version:版本号,通常写2和3版本;

serviceDocker容器服务名称;

container_name:容器的名称

restart:设置为always,容器在停止的情况下总是重启;

imagedocker官方镜像上找到最新版的镜像。

ports:容器自己运行的端口号和需要暴露的端口号

volumes:数据卷。表示数据、配置文件等存放的位置。(- . 这个表示docker-compose.yml当前目录)

 5、Docker-Compose实战案例二

基于docker-compose构建Nginx容器和Tomcat容器,并且实现Nginx和Tomcat发布目录映射,同时实现nginx均衡tomcat服务,通过浏览器访问Nginx 80端口即访问Tomcat的8080端口,操作步骤如下:
1)编写docker-compose.yml文件,内容如下:

version: "3"
services: tomcat01: container_name: tomcat01 image: tomcat:latest restart: always ports: - 8080 tomcat02: container_name: tomcat02 image: tomcat:latest restart: always ports: - 8080 nginx: container_name: www-nginx image: nginx:latest restart: always ports: - 80:80 volumes: - /data/webapps/www/:/usr/share/nginx/html/ - ./default.conf:/etc/nginx/conf.d/default.conf links: - tomcat01 - tomcat02

2)创建发布目录:/data/webapps/www/,并且在发布目录新建index.html页面,命令如下:

mkdir -p /data/webapps/www/
echo "<h1>www.jfedu.net Nginx Test pages.</h1>" >>/data/webapps/www/index.html

3)创建nginx默认配置文件:default.conf,内容如下:

upstream tomcat_web {
        server tomcat01:8080 max_fails=2 fail_timeout=15;
        server tomcat02:8080 max_fails=2 fail_timeout=15;
}
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;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

4)启动Docker-compose,命令&如图所示:
docker-compose up -d

[root@hackerlin src]# docker-compose up -d
Pulling tomcat01 (tomcat:latest)...
Trying to pull repository docker.io/library/tomcat ... 
latest: Pulling from docker.io/library/tomcat
f15005b0235f: Downloading
f15005b0235f: Pull complete
41ebfd3d2fd0: Pull complete
b998346ba308: Pull complete
f01ec562c947: Pull complete
74c11ae3efe8: Pull complete
3a7e595a3ef5: Pull complete
8c8a4c437687: Pull complete
866db09728a7: Pull complete
e72e289c6e49: Pull complete
05db22411525: Pull complete
Creating tomcat02 ... done
Creating tomcat01 ... done
Recreating www-nginx ... done

5)通过浏览器直接访问Nginx容器,默认访问宿主机的80端口即可,如图所示:

 

6)查看运行的dockerS容器引用的状态和进程信息,命令如下:

[root@hackerlin src]# docker-compose ps
  Name            Command          State            Ports         
------------------------------------------------------------------
tomcat01    catalina.sh run        Up      0.0.0.0:32769->8080/tcp
tomcat02    catalina.sh run        Up      0.0.0.0:32768->8080/tcp
www-nginx   nginx -g daemon off;   Up      0.0.0.0:80->80/tcp     
[root@hackerlin src]# docker-compose top
tomcat01
UID     PID    PPID    C   STIME   TTY     TIME                                                  CMD                                             
-------------------------------------------------------------------------------------------------------------------------------------------------
root   20793   20754   2   02:20   ?     00:00:03   /usr/local/openjdk-8/bin/java                                                                
                                                    -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties                    
                                                    -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager                            
                                                    -Djdk.tls.ephemeralDHKeySize=2048                                                            
                                                    -Djava.protocol.handler.pkgs=org.apache.catalina.webresources                                
                                                    -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath
                                                    /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar                    
                                                    -Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat                          
                                                    -Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrap start          

tomcat02
UID     PID    PPID    C   STIME   TTY     TIME                                                  CMD                                             
-------------------------------------------------------------------------------------------------------------------------------------------------
root   20786   20755   3   02:20   ?     00:00:03   /usr/local/openjdk-8/bin/java                                                                
                                                    -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties                    
                                                    -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager                            
                                                    -Djdk.tls.ephemeralDHKeySize=2048                                                            
                                                    -Djava.protocol.handler.pkgs=org.apache.catalina.webresources                                
                                                    -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath
                                                    /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar                    
                                                    -Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat                          
                                                    -Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrap start          

www-nginx
UID     PID    PPID    C   STIME   TTY     TIME                        CMD                    
----------------------------------------------------------------------------------------------
root   20928   20911   0   02:20   ?     00:00:00   nginx: master process nginx -g daemon off;
101    20971   20928   0   02:20   ?     00:00:00   nginx: worker process                     
原文地址:https://www.cnblogs.com/hackerlin/p/12718302.html