在一个例如web应用中,除了应用本身之外,其还关联用到数据库等……,如果都采用docker化的话,那么就需要启动所有相关的docker容器。那么,有没有可能,按照某种顺序,对所有相关联的docker容器进行编排,然后按照一定的先后顺序依次启动。是的,Docker Compose就是这么一个工具,容器编排工具。定义和运行多个容器的应用。

Compose中有两个重要的概念:

  • 服务(Service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
  • 项目(project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml文件中定义。

Compose 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。

安装Docker Compose

  • 确保已经安装了docker引擎,docker compose依赖docker引擎。
  • docker compose不要在root账户权限下运行。(为啥?在root运行下会有什么问题吗,是否也可以?)

Docker Compose安装:https://docs.docker.com/compose/install/

CentOs7下安装

注意: For alpine, the following dependency packages are needed: py-pip, python-dev, libffi-dev, openssl-dev, gcc, libc-dev, and make.

1.执行下面命令获取合适版本:

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

安装不同版本,只需要更改1.24.1

2.给二进制可执行文件赋权:

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

这样,Docker Compose就安装完成了。

3.测试是否安装成功:

[root@izwz9guplfsq8ltfk0wnjiz ~]# docker-compose --version
docker-compose version 1.24.1, build 4667896b

看上面输出信息可知已经安装成功了。

安装Docker Compose命令补全工具

我们已经安装了Compose,但是在命令窗口输入docker-compose后,按下Tab键,没有显示其所有具有的命令。因此,我们需要安装命令补全工具。

命令补全工具安装:https://docs.docker.com/compose/completion/

安装命令补全工具只需要执行下面命令:

curl -L https://raw.githubusercontent.com/docker/compose/$(docker-compose version --short)/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose

这样,在重新登录后,输入docker-compose 并按下Tab键,Compose就可自动补全命令了。

_注:_网址raw.githubusercontent.com可能需要翻墙才能访问。或者配置hosts,添加内容:199.232.28.133 raw.githubusercontent.com,亲测有效。

测试安装是否成功:

script
1
2
[root@xr-server-dev bash-completion]# docker-compose -version
docker-compose version 1.26.0, build d4451659

自动补齐需要依赖工具bash-complete,如果没有,则需要手动安装,命令如下:

script
1
yum install -y bash-completion

安装成功后,得到文件为 /usr/share/bash-completion/bash_completion,如果没有这个文件,则说明系统上没有安装这个工具。

使其生效:

script
1
2
3
source /usr/share/bash-completion/bash_completion

source /usr/share/bash-completion/completions/docker

快速入门

这里展示一个简单的示例,简单了解docker compose使用步骤。

基本步骤:

1.使用Dockerfile(或其他方式)定义应用程序环境,以便在任何地方重现该环境。
2.在docker-compose.yml文件中定义组成应用程序的服务,以便各个服务在一个隔离的环境中一起运行。
3.运行docker-compose up命令,启动并运行整个应用程序。

入门示例

  • 新建文件夹docker-compose-demo,进入该目录,拷贝文件eureka-server.jar进来。

  • 新建文件Dockerfile,添加内容:

FROM java:8
VOLUME /tmp
ADD eureka-server.jar app.jar
RUN bash -c 'touch /app.jar'
EXPOSE 9000
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
  • 再新建文件docker-compose.yml,添加内容:
version: '2'            # 表示该docker-compose.yml文件使用的是Version 2 file format
services:
  eureka:                # 指定服务名称
    build: .            # 指定Dockerfile所在路径
    ports:
      - "8761:8761"        # 指定端口映射,类似docker run的-p选项,注意使用字符串形式           
  • 在docker-compose.yml 所在路径执行以下命令。
docker-compose up

Compose就会自动构建镜像并使用镜像启动容器。我们也可使用docker-compose up -d 后台启动并运行这些容器。

  • 访问:http://宿主机IP:8761/ ,即可访问Eureka Server首页

工程、服务、容器

Docker Compose将所管理的容器分为三层,分别是工程(project),服务(service)以及容器(container)。Docker Compose运行目录下的所有文件(docker-compose.yml, extends文件或环境变量文件等)组成一个工程(默认为docker-compose.yml所在目录的目录名称)。一个工程可包含多个服务;每个服务中定义了容器运行的镜像、参数和依赖,一个服务可包括多个容器实例。

对应《入门示例》一节,工程名称是docker-compose.yml所在的目录名。该工程包含了1个服务,服务名称是eureka;执行docker-compose up时,启动了eureka服务的1个容器实例。