赞
踩
Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。
通过之前的介绍,我们知道使用一个 Dockerfile 模板文件,可以让用户很方便的定义一个单独的应用容器。然而,在日常工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个 Web 项目,除了 Web 服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。
Compose 恰好满足了这样的需求。它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。
Compose 中有两个重要的概念:
Compose 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。
使用微服务架构的系统一般包含若干个微服务,每个微服务一般部署多个实例。如果每个服务都要手动启停,那么效率低,维护量大。
docker-compose.yml格式为:
- version: "3"
- services:
- webapp:
- image: examples/web
- ports:
- - "80:80"
- volumes:
- - "/data"
注意每个服务都必须通过 image 指令指定镜像或 build 指令(需要 Dockerfile)等来自动构建生成镜像。
version: '3'
services:
webapp:
build: ./dir
version: '3'
services:
webapp:
build:
context: ./dir
dockerfile: Dockerfile-alternate
command: echo "hello world"
dns: 8.8.8.8
dns:
- 8.8.8.8
- 114.114.114.114
dns_search: example.com
dns_search:
- domain1.example.com
- domain2.example.com
expose:
- "3000"
- "8000"
image: ubuntu
image: orchardup/postgresql
image: a4bc65fd
web:
links:
-db
-redis
ports:
- "3000"
- "8000:8000"
- "49100:22"
- "127.0.0.1:8001:8001"
volumes:
- /var/lib/mysql
- cache/:/tmp/cache
- ~/configs:/etc/configs/:ro
environment:
RACK_ENV: development
SESSION_SECRET:
environment:
- RACK_ENV=development
- SESSION_SECRET
version: "3"
services:
some-service:
networks:
- some-network
- other-network
version: '3'
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
container_name: docker-web-container
working_dir: /code
docker-compose 命令的基本的使用格式是
docker-compose [-f=<arg>...] [options] [COMMAND] [ARGS...]
命令选项:
- -f, --file FILE 指定使用的 Compose 模板文件,默认为 docker-compose.yml,可以多次指定。
-
- -p, --project-name NAME 指定项目名称,默认将使用所在目录名称作为项目名。
-
- --x-networking 使用 Docker 的可拔插网络后端特性
-
- --x-network-driver DRIVER 指定网络后端的驱动,默认为 bridge
-
- --verbose 输出更多调试信息。
-
- -v, --version 打印版本并退出。
--force-rm 删除构建过程中的临时容器。
--no-cache 构建镜像过程中不使用 cache(这将加长构建过程)。
--pull 始终尝试通过 pull 来获取更新版本的镜像。
$ docker-compose kill -s SIGINT
编排时用到的微服务项目:
- discovery :注册中心
-
- server:服务提供者
-
- client:服务消费者
-
- zuul:网关
1、由于Docker 默认的网络模式是bridge,各个容器的IP都不同。因此在Eureka Server配置一个主机名(discovery),让各个微服务使用主机名访问Eureka Server:
- eureka:
- instance:
- hostname: discovery
然后将如下配置
- eureka:
- client:
- serviceUrl:
- defaultZone: http://localhost:8761/eureka/
替换为:
- eureka:
- client:
- serviceUrl:
- defaultZone: http://discovery:8761/eureka/
2、编写构建镜像脚本
bash脚本的用途是分别执行几个module下的Dockerfile文件,分别打成镜像,不用一个个手工执行,文件如下:
buildDockerImage.sh:
- #!/usr/bin/env bash
- set -eo pipefail
- modules=( discovery server client zuul )
- for module in "${modules[@]}"; do
- docker build -t "microservice/${module}:latest" ${module}
- done
tree查看microservice文件夹下模块目录:
- $ tree
- .
- ├── buildDockerImage.sh
- ├── client
- │ ├── client-0.0.1-SNAPSHOT.jar
- │ └── Dockerfile
- ├── discovery
- │ ├── Dockerfile
- │ └── eureka-server-0.0.1-SNAPSHOT.jar
- ├── docker-compose.yml
- ├── server
- │ ├── Dockerfile
- │ └── server-0.0.1-SNAPSHOT.jar
- └── zuul
- ├── Dockerfile
- └── zuul-0.0.1-SNAPSHOT.jar
modules为各个模块目录,模块目录下存放该模块的jar包和Dockerfile文件。
执行sh buildDockerImage.sh命令,执行完,使用docker images 查看镜像。
- $ docker images
- REPOSITORY TAG IMAGE ID CREATED SIZE
- microservice/zuul latest d0fcb94e203e 30 seconds ago 204MB
- microservice/client latest a3ff8e192ee6 33 seconds ago 200MB
- microservice/server latest 8f04580f6063 35 seconds ago 200MB
- microservice/discovery latest d8b9347a8229 38 seconds ago 204MB
- frolvlad/alpine-oraclejdk8 slim 3ee5e1ce00fc 9 days ago 164MB
3、编写docker-compose-yml
- version: "3"
- services:
- discovery:
- image: microservice/discovery
- hostname: discovery
- ports:
- - "8761:8761"
- server:
- image: microservice/server
- ports:
- - "9000:9000"
- client:
- image: microservice/client
- ports:
- - "9001:9001"
- zuul:
- image: microservice/zuul
- ports:
- - "9002:9002"
执行以下命令启动项目。
- [root@node02 microservice]# docker-compose up -d
- Creating microservice_discovery_1 ...
- Creating microservice_discovery_1 ... done
- Creating microservice_client_1 ...
- Creating microservice_server_1 ...
- Creating microservice_client_1
- Creating microservice_client_1 ... done
- Creating microservice_zuul_1 ...
- Creating microservice_zuul_1 ... done
查看镜像:
- $ docker ps
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- ef16f3cccfdb microservice/zuul "java -Djava.securit…" 38 minutes ago Up 38 minutes 0.0.0.0:9002->9002/tcp microservice_zuul_1
- 657b28a5f17b microservice/server "java -Djava.securit…" 38 minutes ago Up 38 minutes 0.0.0.0:9000->9000/tcp microservice_server_1
- e048e4d69f49 microservice/client "java -Djava.securit…" 38 minutes ago Up 38 minutes 0.0.0.0:9001->9001/tcp microservice_client_1
- 66f9c53ec2b5 microservice/discovery "java -Djava.securit…" 38 minutes ago Up 38 minutes 0.0.0.0:8761->8761/tcp microservice_discovery_1
访问注册中心:
访问网关服务
zuul->client->server
- http://192.168.124.131:9002/api-a/getUser?name=gmg
-
- hi gmg,i am from
1、将所有的服务的注册中心改为
- eureka:
- client:
- serviceUrl:
- defaultZone : http://peer1:8761/eureka/,http://peer2:8762/eureka/
2、docker-compose-yml修改为
- version: "3"
- services:
- peer1:
- image: microservice/discovery
- ports:
- - "8761:8761"
- environment:
- - spring.profiles.active=peer1
- peer2:
- image: microservice/discovery
- hostname: peer2
- ports:
- - "8762:8762"
- environment:
- - spring.profiles.active=peer2
- server:
- image: microservice/server
- ports:
- - "9000:9000"
- client:
- image: microservice/client
- ports:
- - "9001:9001"
- zuul:
- image: microservice/zuul
- ports:
- - "9002:9002"
3、构建镜像
执行sh buildDockerImage.sh命令构建镜像。
4、创建容器
执行 docker-compose up -d
查看镜像:
- docker ps
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 8dfff5cf705f microservice/discovery "java -Djava.securit…" About a minute ago Up About a minute 0.0.0.0:8762->8762/tcp microserviceha_peer2_1
- a89594944490 microservice/client "java -Djava.securit…" About a minute ago Up About a minute 0.0.0.0:9001->9001/tcp microserviceha_client_1
- 29e941b18623 microservice/zuul "java -Djava.securit…" About a minute ago Up About a minute 0.0.0.0:9002->9002/tcp microserviceha_zuul_1
- 18580a21ab2f microservice/discovery "java -Djava.securit…" About a minute ago Up About a minute 0.0.0.0:8761->8761/tcp microserviceha_peer1_1
- 1bcaaadac4a4 microservice/server "java -Djava.securit…" About a minute ago Up About a minute 0.0.0.0:9000->9000/tcp microserviceha_server_1
5、查看注册中心:
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。