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版本;
service:Docker容器服务名称;
container_name:容器的名称
restart:设置为always,容器在停止的情况下总是重启;
image:docker官方镜像上找到最新版的镜像。
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