使用Docker Compose 编排微服务

使用Docker Compose 编排微服务

1、Docker Compose 简介

Compose是一个用于定义和运行多容器Docker 应用程序的工具,前身是Fig。它非常适合在开发、测试、构建CI工作流等场景。

Docker Compose的官方地址:https://docs.docker.com/compose/

Dcoekr Compose的github地址为: https://github.com/docker/compose

安装Docker Compser

安装Compose

1、通过以下命令 自动下载并安装适应系统版本的Compose:官方安装方式

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

此方式可能会失败,以下提供国内compose安装方式

curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

2、为安装脚本添加执行权限

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

3、测试安装

[root@localhost ~]# docker-compose version

docker-compose version 1.25.1, build a82fef07
docker-py version: 4.1.0
CPython version: 3.7.4
OpenSSL version: OpenSSL 1.1.0l  10 Sep 2019
## 如果有以上输出 说明Docker Compose安装成功

安装Compose命令补全工具

现在安装成功了Docker Compose 但是当我门使用Tab键的时候,Compose并没有补全命令。现需要安装命令补全工具

1、执行以下命令

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

这样,在重新登录后,输入docker-compose 命令后,按下TAB键盘,效果如下:

[root@localhost bash_completion.d]# docker-compose 
build    config   down     exec     images   logs     port     pull     restart  run      start    top      up       
bundle   create   events   help     kill     pause    ps       push     rm       scale    stop     unpause  version  

发现已经可以自动提示了。

Docker Compose 快速入门

基本步骤

使用Docker Compose大致有三个基本步骤:

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

入门示例

下面以部署eureka为例讲解Compose的基本步骤

eureka的项目我已经上传gitee https://gitee.com/cxsunfeng/LearnCloud 找到cloud-eureka-server7001

这是一系列Springcloud 组件搭建的项目

  1. 使用 mvn clean package 命令打包项目,获取jar包cloud-eureka-server7001-1.0-SNAPSHOT.jar

  2. 在cloud-eureka-server7001-1.0-SNAPSHOT.jar所在的路径创建Dockerfile,并编写如下内容

    FROM java:8
    
    #把当前项目下cloud-eureka-server7001-1.0-SNAPSHOT.jar改名为test.jar 添加到镜像中
    ADD *.jar /app.jar
    CMD ["--server.port=7001"]
    #指定端口,最好写与项目配置的端口
    EXPOSE 7001
    #在镜像中运行/test.jar包,这样在运行镜像的时候就已经启动好了test.jar
    ENTRYPOINT ["java","-Xms256m","-Xmx256m","-jar","/app.jar"]
    
    
  3. 在文件cloud-eureka-server7001-1.0-SNAPSHOT.jar 所在的路径创建docker-compose.ym,并编写如下内容

    version: '3.3' #表示该docker-compse.yml文件的版本
    services:
      eurekaapp: #指定服务的名称
        build: . #指定Dockerfile的路径  或作为一个对象,该对象具有 context 和指定的 dockerfile 文件以及 args 参数值
        ports:
          - "7001:7001" # 建立宿主机和容器之间的端口映射关系, ports 支持两种语法格式   下面会有详解
    
    
  4. 在docker-compose.yml所在的路径执行以下命令

    docker-compse up -d # -d 指的是后台运行
    

    Compose就会自动构建镜像并使用镜像启动容器。

  5. 访问http://宿主机IP:7001/, 即可访问到Eureka Server首页

注:由于我本机未按转发docker 我是将所有文件复制到虚拟机下执行的

[root@localhost eureka]# pwd
/home/eureka
[root@localhost eureka]# ll
总用量 51016
-rw-r--r--. 1 root root 52229733 4月  28 21:39 cloud-eureka-server7001-1.0-SNAPSHOT.jar
-rw-r--r--. 1 root root       90 4月  28 21:39 docker-compose.yml
-rw-r--r--. 1 root root      155 4月  28 21:40 Dockerfile

工程、服务、容器

Docker Compose 将所管理的容器分为三层,分别是工程(project)、服务(service)、容器(container)

Docker Compose 运行目录下的所有文件(docker-compose.yml)组成一个工程,一个工程包含多个服务,每个服务中定义了容器运行的镜像、参数、依赖,一个服务可包括多个容器实例

工程名称就是docker-compose.yml所在的目录名称,该工程包含了1个服务,服务名称为eurekaapp。执行docker-compose up 时,启动了eureka服务的一个容器实例。

docker-compse.yml常用命令

build

build                 # 指定包含构建上下文的路径, 或作为一个对象,该对象具有 context 和指定的 dockerfile 文件以及 args 参数值
        context               # context: 指定 Dockerfile 文件所在的路径
        dockerfile            # dockerfile: 指定 context 指定的目录下面的 Dockerfile 的名称(默认为 Dockerfile)
        args                  # args: Dockerfile 在 build 过程中需要的参数 (等同于 docker container build --build-arg 的作用)
        cache_from            # v3.2中新增的参数, 指定缓存的镜像列表 (等同于 docker container build --cache_from 的作用)
        labels                # v3.3中新增的参数, 设置镜像的元数据 (等同于 docker container build --labels 的作用)
        shm_size              # v3.5中新增的参数, 设置容器 /dev/shm 分区的大小 (等同于 docker container build --shm-size 的作用)

command               # 覆盖容器启动后默认执行的命令, 支持 shell 格式和 [] 格式
	# comman: bundle exec thin -p 3000
    # comman: [bundle,exec,thin,-p,3000]

dns                   # 设置 DNS 地址(等同于 docker run --dns 的作用)
	# dns:8.8.8.8
	# dns:
	#   -8.8.8.8
	#   -9.9.9.9
	
dns_search            # 设置 DNS 搜索域(等同于 docker run --dns-search 的作用)
	# dns_search: example.com
	# dns_search:
	#   -example1.com
	#   -example2.com
	
environment           # 设置环境变量, environment 的值可以覆盖 env_file 的值 (等同于 docker run --env 的作用)
	
env_file              # 从指定文件中读取变量设置为容器中的环境变量, 可以是单个值或者一个文件列表, 如果多个文件中的变量重名则后面的变量覆盖前面的变量, environment 的值覆盖 env_file 的值
 	
expose                # 暴露端口, 但是不能和宿主机建立映射关系, 类似于 Dockerfile 的 EXPOSE 指令
 	# expose:
 	#   - "3000"
 	#   - "8000"
 	
external_links        # 连接不在 docker-compose.yml 中定义的容器或者不在 compose 管理的容器(docker run 启动的容器, 在 v3 版本中使用 swarm 部署时将忽略该选项)
 	
image                 # 指定 docker 镜像, 可以是远程仓库镜像、本地镜像
 	# image:java
	
links                 # 链接到其它服务中的容器, 该选项是 docker 历史遗留的选项, 目前已被用户自定义网络名称空间取代, 最终有可能被废弃 (在使用 swarm 部署时将忽略该选项)
    #web:
    # links:
    #  -db
    #  -db:database
    #  -redis
networks              # 将容器加入指定网络 (等同于 docker network connect 的作用), networks 可以位于 compose 文件顶级键和 services 键的二级键
aliases               # 同一网络上的容器可以使用服务名称或别名连接到其中一个服务的容器
ipv4_address      # IP V4 格式
ipv6_address      # IP V6 格式

        示例:
            version: '3.7'
            services: 
                test: 
                    image: nginx:1.14-alpine
                    container_name: mynginx
                    command: ifconfig
                    networks: 
                        app_net:                                # 调用下面 networks 定义的 app_net 网络
                        ipv4_address: 172.16.238.10
            networks:
                app_net:
                    driver: bridge
                    ipam:
                        driver: default
                        config:
                            - subnet: 172.16.238.0/24
network_mode          # 指定网络模式 (等同于 docker run --net 的作用, 在使用 swarm 部署时将忽略该选项)       
    
ports                 # 建立宿主机和容器之间的端口映射关系, ports 支持两种语法格式
        SHORT 语法格式示例:
            - "3000"                            # 暴露容器的 3000 端口, 宿主机的端口由 docker 随机映射一个没有被占用的端口
            - "3000-3005"                       # 暴露容器的 3000 到 3005 端口, 宿主机的端口由 docker 随机映射没有被占用的端口
            - "8000:8000"                       # 容器的 8000 端口和宿主机的 8000 端口建立映射关系
            - "9090-9091:8080-8081"
            - "127.0.0.1:8001:8001"             # 指定映射宿主机的指定地址的
            - "127.0.0.1:5000-5010:5000-5010"   
            - "6060:6060/udp"                   # 指定协议

        LONG 语法格式示例:(v3.2 新增的语法格式)
            ports:
                - target: 80                    # 容器端口
                  published: 8080               # 宿主机端口
                  protocol: tcp                 # 协议类型
                  mode: host                    # host 在每个节点上发布主机端口,  ingress 对于群模式端口进行负载均衡
    
volumes               # 定义容器和宿主机的卷映射关系, 其和 networks 一样可以位于 services 键的二级键和 compose 顶级键, 如果需要跨服务间使用则在顶级键定义, 在 services 中引用
        SHORT 语法格式示例:
            volumes:
                - /var/lib/mysql                # 映射容器内的 /var/lib/mysql 到宿主机的一个随机目录中
                - /opt/data:/var/lib/mysql      # 映射容器内的 /var/lib/mysql 到宿主机的 /opt/data
                - ./cache:/tmp/cache            # 映射容器内的 /var/lib/mysql 到宿主机 compose 文件所在的位置
                - ~/configs:/etc/configs/:ro    # 映射容器宿主机的目录到容器中去, 权限只读
                - datavolume:/var/lib/mysql     # datavolume 为 volumes 顶级键定义的目录, 在此处直接调用

        LONG 语法格式示例:(v3.2 新增的语法格式)
            version: "3.2"
            services:
                web:
                    image: nginx:alpine
                    ports:
                        - "80:80"
                    volumes:
                        - type: volume                  # mount 的类型, 必须是 bind、volume 或 tmpfs
                            source: mydata              # 宿主机目录
                            target: /data               # 容器目录
                            volume:                     # 配置额外的选项, 其 key 必须和 type 的值相同
                                nocopy: true                # volume 额外的选项, 在创建卷时禁用从容器复制数据
                        - type: bind                    # volume 模式只指定容器路径即可, 宿主机路径随机生成; bind 需要指定容器和数据机的映射路径
                            source: ./static
                            target: /opt/app/static
                            read_only: true             # 设置文件系统为只读文件系统
            volumes:
                mydata:                                 # 定义在 volume, 可在所有服务中调用 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值