使用微服务架构的应用系统一般包含若干个微服务,每个微服务一般都会部署多个实例。如果每个微服务都要手动启停,那么效率之低,维护量之大可想而知

docker compose 是一个用于定义和运行多容器docker应用程序的工具

 

安装:

下在并安装适应系统版本的compose

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

 

为安装脚本添加执行权限

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

这样,compose就安装完成了

可使用一下命令测试安装结果

docker-compose --version

 

 

使用compose 大致有三个步骤

使用 dockerfile 定义应用程序环境,以便在任何地方重现该环境

在docker-compose.yml文件中定义组成应用程序的服务,以便各个服务在一个隔离的环境中一起运行

运行 docker-compose up 命令,启动并运行整个应用程序

 

 

docker compose 将所管理的容器分为三层,分别是工程(project),服务以及容器。docker compose运行目录下的所有文件(docker-compose.yml,extends文件或环境变量文件等)组成一个

工程(默认为docker-compose.yml所在目录的名称)。一个工程可包含多个服务,每个服务中定义了容器运行的镜像,参数和依赖,一个服务可包括多个容器实例

 

 

docker-compose.yml 常用命令

build

配置构建时的选项,compose会利用它自动构建镜像。build的值可以是一个路径。例如 build: ./dir

也可以是一个对象,用于指定dockerfile和参数,例如:

build:

  context: ./dir 

  dockerfile: Dockerfile-alternate 

  args:

    buildno: 1

context 为路径

dockerfile 为需要替换默认docker-compose的文件名

args 为构建(build)过程中的环境变量,用于替换dockerfile里定义的ARG参数,容器中不可用

例如

dockfile中

ARG buildno 

ARG password 

RUN echo "Build number: $buildno" 

RUN script-requiring-password.sh "$password"

docker-compose.yml

build:
  context: .
  args:
    - buildno=1
    - password=secret

 

 

command

覆盖容器启动后默认执行的命令

示例: command: bundle exec thin -p 3000

也可以是一个list,类似于dockerfile中的CMD指令 格式如下:

command:[bundle,exec,thin,-p,3000]

 

dns

配置dns 服务器. 可以是一个值, 也可以是一个列表. 示例:

dns: 8.8.8.8

dns:

- 8.8.8.8

- 9.9.9.9

 

 

dns_search

配置DNS的搜索域,可以是一个值,也可以是一个列表。示例:

dns_search:example.com

dns_search:

- dc1.example.com

- dc2.example.com

 

 

environment

环境变量设置,可使用数组或字典两种方式

environment:

RACK_ENV: development

SHOW: 'true'

environment:

- RACK_ENV=development

- SHOW=true

 

 

 

env_file

从文件中获取环境变量,可指定一个文件路径或路径列表。如果通过docker-compose -f FILE 指定了compose文件,那么env_file中的路径是compose文件所在目录的

相对路径。使用environment指定的环境变量会覆盖env_file指定的环境变量。

示例:

env_file: .env

env_file:

- ./common.env

- ./apps/web.env

- /opt/secrets.env

 

expose

expose 提供 container之间的端口访问,不会暴露给主机使用。同 docker run --expose

示例:

expose: - "3000" - "8000"

 

 

external_links

连接到docker-compose.yml外部的容器,甚至并非compose管理的容器,特别是提供共享或公共服务的容器。格式跟links类似

例如:

external_links:

- redis_1

- project_db_1:mysql

- project_db_1:postgresql

 

 

image

指定镜像名称或镜像ID,如果本地不存在该镜像,compose会尝试下载该镜像

示例:

image: java

 

 

links

连接到其他服务的容器。可以指定服务名称和服务别名(SERVICE:ALIAS),也可只指定服务名称,同docker run --link

示例:

web:

links:

- db

- db:database

- redis

 

 

ports

暴露端口信息,可使用HOST:CONTAINER的格式,也可只指定容器端口(此时宿主机将会随机选择端口),类似于docker run -p

需要注意的是,当使用HOST:CONTAINER格式映射端口时,容器端口小于60将会得到错误的接口,因为yaml会把xx:yy的数字解析为60进制。因此,建议使用字符串的形式。

例子:

ports:

- "3000"

- "3000-3005"

- "8000:8000"

- "9090-9091:8080-8081"

- "49100:22"

- "127.0.0.1:8001:8001"

 

 

volumes:

挂载数据卷。同docker run -v

volumes:
 - /var/lib/mysql
 - cache/:/tmp/cache
 - ~/configs:/etc/configs/:ro

 

volumes_from

从另一个服务或容器挂载卷。可指定只读(ro)或读写(rw),默认是读写(rw)。同docker run --volumes-from

例子

volumes_from:
 - service_name
 - service_name:ro
 - container:container_name
 - container:container_name:rw

 

container:container_name 格式仅支持 version2

 

 

depends_on

用于指定服务依赖,一般是mysql,redis等

指定了依赖,将会优先于服务创建并启动依赖

link2 也可以指定依赖

 

 

docker-compose命令常用选项

 

和docker命令一样,docker-compose命令也有很多选项

build

构建或重新构建服务。服务被构建后将会以project_service的形式标记,例如:compose-setest_db

 

help

查看指定命令的帮助文档

docker-compose help COMMAND

如 docker-compose help build

 

kill

通过发送SIGKILL信号停止指定服务的容器

例如:docker-compose kill eureka

 

logs

查看服务的日志输出

 

port

打印绑定的公共端口

例如 docker-compose port eureka 8761

这样就可输出eureka服务8761端口所绑定的公共端口

 

ps

列出所有容器。示例:

docker-compose ps

也可列出指定服务的容器,示例:

docker-compose ps eureka

 

pull

下载服务镜像

 

rm

删除指定服务的容器

如 docker-compose rm eureka

 

run

在一个服务上执行一个命令

docker-compose run web bash

这样即可启动一个web服务,同时执行bash命令

 

scale

设置指定服务运行容器的个数,以service=num 的形式指定

docker-compose scale user=3 movie=3

 

start

启动指定服务已存在的容器

docker-compose start eureka

 

stop

停止已运行的容器

docker-compose stop eureka

停止后,可使用docker-compose start再次启动这些容器

 

up

构建,创建,重新创建,启动,连接服务的相关容器。所有连接的服务都会启动,除非它们已经运行

docker-compose up 命令会聚合所有容器的输出,当命令退出时,所有容器都会停止。使用docker-compose up -d可在后台启动并运行所有容器

 

 

下面,编写一个简单的例子

项目地址 https://gitee.com/shenduedu/JXC.git

 

准备环境:

现在下载 mysql:5.5 镜像

新建一个目录

把 项目 pull 下来,然后用maven 打包,把tag 下的war包复制到 新建的目录下

然后 在该目录下编写dockerfile 文件

然后 使用 dockerfile 构建我的 JXC项目


FROM java:8
VOLUME /tmp
ADD JXC-0.0.1-SNAPSHOT.war /app.war
EXPOSE 80
ENTRYPOINT ["java","-jar","/app.war"]

编写完 dockerfile 执行 docker build -t jxc:0.0.2 .

 

 

然后 在该目录下 docker-compose.yml


version: '2'
services:
mysql:
image: docker.io/mysql:5.5
ports:
- "3306:3306"
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=db_jxc2
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
jxc:
image: jxc:0.0.2
links:
- mysql
ports:
- "8080:80"

然后执行 docker-compose up

 

 

 

注意: 要正常 运行

1 要把项目下的sql 脚本 导入,mysql 映射了3306端口,普通的 mysql 客户端可以连接,

 

 

鸣谢地址

http://www.cnblogs.com/52fhy/p/5991344.html

springcloud 与 docker 微服务实战一书

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐