本文介绍docker-compose实践时的一些疑问与解决方案, 可能对新手略有帮助, 因此整理成文. 有不妥之处欢迎指摘!

Q1: docker-compose 如何安装?

A1: https://docs.docker.com/compose/install/#install-compose

Q2: 如何创建一个 mongodb docker-compose?

A2: 参照 https://gist.github.com/wesleybliss/29d4cce863f5964a3eb73c42501d99e4

version: "3"
services:
  mongo:
    build: mongo: 3.0
    volumes:
      - xtest-data:/data/db
    ports:
      - 27017:27017
    command: mongod --smallfiles --logpath=/dev/null # --quiet
volumes:
  xtest-data:
  • 由于使用了ports参数建立mongodb端口的映射, 因此可以在其他mongo客户端访问容器数据库, 等同于docker run 的 -p 参数;

  • 使用volumes挂载数据卷到容器, 等同于 docker run 的 -v 参数; 需要注意的是, 当指定volumes挂载关系后, 需要在docker-compose 文件services同级声明volumes(注意xtest-data后的":"冒号)

Q3: version: "3" 是什么?

A3: version指的是docker-compose的version, 详见https://docs.docker.com/compose/compose-file/#reference-and-guidelines

Q4: 如何在mongo数据库自动创建用户?

A4: 可以写一个初始化mongo的shell脚本, 并将该脚本写入mongo镜像中, 在初始化时执行该脚本.

具体操作:

  • 创建mongo目录, 并在该目录创建Dockerfile-mongo
FROM mongo:3.0
COPY init_mongo.sh init_mongo.sh
COPY mongodb.conf mongodb.conf
COPY mongo-fork.conf mongo-fork.conf
COPY start_mongo.sh start_mongo.sh
CMD ["./start_mongo.sh"]
EXPOSE 27017

其中几个文件分别为:

mongodb.conf: mongodb配置文件, 前台运行

mongo-fork.conf: mongodb配置文件, 后台运行

init_mongo.sh: 调用mongo-fork.conf, 后台启动mongod; 连接并创建mongodb用户

start_mongo.sh: 调用mongodb.conf, 前台启动mongod

  • 创建一个初始化mongodb的docker-compose.yml
version: "3"
services:
  mongo:
    build:
      context: mongo
      dockerfile: Dockerfile-mongo
    volumes:
      - xtest-data:/data/db
    command: ./init_mongo.sh
volumes:
  xtest-data:

build下, context表示路径, dockerfile表示Dockerfile文件名

  • 启动该docker-compose.yml即可调用容器内的初始化脚本, 完成创建用户.

Q5: 其他容器如何连接mongodb?

A5: 要考虑的几个问题: 一是host, 二是port;

由于port可以通过ports映射到宿主机, 所以port容易解决. 考虑到安全问题, 只将端口开放给同一个docker-compose的其他容器访问, 因此用 expose 参数开放 27017 端口;

参考https://docs.docker.com/compose/compose-file/#links,  其他容器使用links可以将mongo容器的ip记录到该容器中, 再通过连接 mongo:27017 可以访问数据库.

version: "3"
services:
  backend:
    build:
      context: backend
      dockerfile: Dockerfile-backend
    ports:
      - "8099:8099"
      - "8009:8009"
    links:
      - mongo
    depends_on:
      - mongo
  mongo:
    build:
      context: mongo
      dockerfile: Dockerfile-mongo
    volumes:
      - xtest-data:/data/db
    expose:
      - "27017"
    # uncommand to able host visit mongo
    #ports:
    # - "27017:27017"
    command: ./start_mongo.sh
volumes:
  xtest-data:

通过depends_on来标记依赖关系, 当mongo服务启动完成后, 才会启动backend服务;

由于后端代码只考虑到mongodb与后端服务部署在同一台宿主机情况下, mongo的host始终为127.0.0.1, 因此需要修改后端代码, 判断为容器时host=mongo, 不为容器时host=127.0.0.1.

Q6: 如何在Python代码中判断当前环境是否为容器?

A6: 一个简单的方法是为该容器添加一个环境变量, 在Python代码中判断有该变量时为容器, 没有时为普通环境.

在后端镜像的Dockerfile中添加:

ENV DOCKER 1

在Python代码中添加:

try:
    docker_flag = os.environ.get('DOCKER', "")
    if docker_flag == '1':
        mongo_host = 'mongo'
        print('Run in docker!')
    else:
        mongo_host = '127.0.0.1'
except:
    print("Unexpected error:", sys.exc_info()[0])
    raise

以上完成对mongo host的设置切换.

Q7: 如何分离前后端, 使得前端代码修改时无需将所有环境都重新构建?

A7: 单独创建一个前端镜像, 挂载一个前端数据卷到该容器中进行编译, 编译完成后, 在启动后端服务时直接挂载前端数据卷即可, 无需再启动该镜像. 即: 该前端镜像只是用于编译前端文件!

version: "3"
services:
  node:
    build:
      context: node
      dockerfile: Dockerfile-node
    volumes:
      - xtest-front:/www/xtest-web/dist
volumes:
  xtest-front:

下载源码与编译的过程在Dockerfile中, docker-compose的工作主要是挂载xtest-front数据卷到容器中, 使得编译后的前端文件能够持久化到该数据卷中用于与后端交互.

总结

以上是在将 x-utest 系统 Docker 化过程中的经验收获, 完整的项目在 https://github.com/x-utest/xtest-docker-compose , 欢迎学习, 也欢迎使用 x-utest 测试系统并提出意见与建议!

关于 x-utest

x-utest相关用法见: [免费 / 开源 / 好用] x-utest 测试开发平台

官方文档: http://xtest.readthedocs.io/zh/latest/

参考

[1] Compose file version 3 reference, https://docs.docker.com/compose/compose-file/

[2] Docker Compose 项目, https://yeasy.gitbooks.io/docker_practice/content/compose/

Docker 记一次 docker-compose 完整实践(转)的更多相关文章

  1. 记一次docker compose的低级错误

    记一次docker compose的低级错误 问题 ​ 今天在学习dockercompose的时候,启动docker compose up,结果却出现异常 Error response from da ...

  2. Docker学习笔记,从原理到实践

    什么是docker Docker是使用go语言基于LINUX内核的cgroup,namespace以及AUFS 类的 Union FS 等技术,对进程进行封装隔离的一种操作系统层面的虚拟化技术,由于隔 ...

  3. 云端基于Docker的微服务与持续交付实践

    云端基于Docker的微服务与持续交付实践笔记,是基于易立老师在阿里巴巴首届在线技术峰会上<云端基于Docker的微服务与持续交付实践>总结而出的. 本次主要讲了什么? Docker Sw ...

  4. [置顶] Docker学习总结(7)——云端基于Docker的微服务与持续交付实践

    本文根据[2016 全球运维大会•深圳站]现场演讲嘉宾分享内容整理而成 讲师简介 易立 毕业于北京大学,获得学士学位和硕士学位:目前负责阿里云容器技术相关的产品的研发工作. 加入阿里之前,曾在IBM中 ...

  5. Docker+Maven+Jenkins在Devops中完整应用

    过去与现在 很早之前,当我们需要一个部署环境的时候,我们可能指的是一台PowerEdge R710 2U服务器,走一系列冗长的申请流程,然后上架到机房.调试网络.安装系统.调试环境.最终部署应用,就这 ...

  6. 使用Docker快速部署ELK分析Nginx日志实践

    原文:使用Docker快速部署ELK分析Nginx日志实践 一.背景 笔者所在项目组的项目由多个子项目所组成,每一个子项目都存在一定的日志,有时候想排查一些问题,需要到各个地方去查看,极为不方便,此前 ...

  7. 7.云原生之Docker容器Dockerfile镜像构建浅析与实践

    转载自:https://www.bilibili.com/read/cv15220707/?from=readlist Dockerfile 镜像构建浅析与实践 描述:Dockerfile是一个文本格 ...

  8. 利用Docker搭建本地https环境的完整步骤

    利用Docker搭建本地https环境的完整步骤 这篇文章主要给大家介绍了关于如何利用Docker搭建本地https环境的完整步骤,文中通过示例代码将实现的步骤介绍的非常详细,对大家的学习或者工作具有 ...

  9. 使用Docker快速部署ELK分析Nginx日志实践(二)

    Kibana汉化使用中文界面实践 一.背景 笔者在上一篇文章使用Docker快速部署ELK分析Nginx日志实践当中有提到如何快速搭建ELK分析Nginx日志,但是这只是第一步,后面还有很多仪表盘需要 ...

  10. Docker 0x13: Docker 构建集群/服务/Compose/分布式服务栈

    目录 Docker 构建集群/服务/Compose/分布式服务栈 集群 初始化集群服务 安装docker-machine 管理节点和工作节点 docker集群构建完成 集群中部署应用 集群服务访问特性 ...

随机推荐

  1. (Linux基础学习)第六章:查询与修改系统的本地化(locale)与键盘布局的设置(locelectl)

    第1节:可查询与修改系统的本地化(locale)与键盘布局的设置[root@centos7 ~]# localectl System Locale: LANG=en_US.UTF-8 VC Keyma ...

  2. typescript 接口

    接口:用来建立某种代码约定,使得其他开发者在调用某个方法或创建新的类时必须遵循接口所定义的代码约定   在js里面没有接口这个概念,在ts里面通过两个关键字来支撑接口这个特性   interface ...

  3. Codeforces H. Maximal GCD(贪心)

    题目描述: H. Maximal GCD time limit per test 1 second memory limit per test 256 megabytes input standard ...

  4. 微信小程序~获取位置信息

    微信小程序提供的getlocation来获取用户的定位,能够得到用户的经纬度信息 (注:getloaction需要用户授权scope.userLocation)结合map组件能够得到用户的详细定位 & ...

  5. Windows 窗体的自适应分辨率、分屏显示、开机自启动

    前言 这里所说的针对Winform.WPF 都适用.开机自启动对于控制台的也可以. 还是从项目实践中得来的,在这里记录下来. 对于自适应.分屏显示,在以前感觉应该比较高大上的问题,会比较难.在经过这次 ...

  6. [Wc2011] Xor 和 [HNOI2011]XOR和路径

    Xor F.A.Qs Home Discuss ProblemSet Status Ranklist Contest 入门OJ ModifyUser  autoint Logout 捐赠本站 Prob ...

  7. 结构型模式(六) 享元模式(Flyweight)

    一.动机(Motivate) 在软件系统中,采用纯粹对象方案的问题在于大量细粒度的对象会很快充斥在系统中,从而带来很高的运行时代价--主要指内存需求方面的代价.如何在避免大量细粒度对象问题的同时,让外 ...

  8. linux autofs自动挂载

    autofs:自动挂载器 自动挂载器是一个监视目录的守护进程,并在目标子目录被引用时,自动执行预定义的NFS挂载 自动挂载器由autofs服务脚本管理 自动挂载器由auto.master配置文件进行配 ...

  9. Android平台5+ API提前生效,支持在plusready事件前调用

    ios上plus是一直存在的,不涉及等ready事件.但安卓上还是需要等plus ready.在安卓环境中,通常情况下需要html页面解析完成后才会让5+ API生效,安卓的执行的顺序为: 加载htm ...

  10. springboot 2.1.6发布

    最新消息: Spring Boot 2.1.6 昨天正式发布了,日常更新一些依赖和修复一些 BUG,没什么硬菜! 重点来了,Spring Boot 1.5 将于今年 8 月结束使命,请尽快迁移到 Sp ...