dockerfile mysql例子_docker-compose 实用示例

简单来说, docker compose就是一键启动/关闭多个容器的工具, 它能够帮你解决容器之间依赖的问题, 哪个先启动, 依赖哪个容器等.

当开发的系统越来越复杂, 开发环境和部署都没那么简单的时候, 可以试试docker compose.

下面会把我实际经验中的一个例子简化出来,一步步教大家如何搭建docker compose,对踩过的坑进行总结,希望对docker能有更深的了解.

1. 搭建环境背景

以我目前在做的一个用python开发的web应用为例, 需要搭建一个依赖mysql, localstack, presto, celery, python flask等多项docker容器.

2. 配置文件

通过官网的介绍, 创建docker-compose.yml, 配置上面提到的几个services.version: '3'services:

mysql:

# mysql 镜像

image: registry.docker-cn.com/library/mysql:latest    environment:

# 初始化mysql环境变量

MYSQL_DATABASE: test      MYSQL_ROOT_PASSWORD: "123456"

# 暴露端口号

ports:

- "3306:3306"

localstack:

image: atlassianlabs/localstack:latest    environment:

# localstack主要是为了模拟aws s3, 方便单元测试

AWS_ACCESS_KEY_ID: unit-test-user      AWS_SECRET_ACCESS_KEY: unit-test-user      AWS_DEFAULT_REGION: cn-north-1

AWS_DEFAULT_OUTPUT: text      SERVICES: s3    ports:

- "4572:4572"

presto:

# presto在我的另外一篇文章中有写如何制作镜像 https://www.jianshu.com/p/bb5181008cd7

image: presto:v0.180

ports:

- "8888:8888"

web:

# 这个镜像可以根据代码中依赖的包进行build, 节省每次安装的时间

image: python-web-base:v0.1

command: bash /base/sbin/docker_compose_web_entrypoint.sh    # 暴露端口号, 成功启动之后可以通过 http://localhost:8081 进行访问

ports:

- "8081:8081"

# 环境变量的设置

environment:

S3_PORT: 4572

S3_HOST: localstack      AWS_ACCESS_KEY_ID: unit-test-user      AWS_SECRET_ACCESS_KEY: unit-test-user      AWS_DEFAULT_REGION: cn-north-1

AWS_DEFAULT_OUTPUT: text      # 在docker-compose中, 想要在web service中访问

# mysql, localstack or presto, 需要给一个hostname,

# hostname跟service name一致.

PRESTO_HOST: presto      MYSQL_HOST: mysql      MYSQL_DATABASE: test      MYSQL_ROOT_PASSWORD: "123456"

depends_on:

- mysql

- localstack

- presto    volumes:#   code base

- .:/base#   query result shared volume: /tmp/

- /tmp:/tmp

celery:

image: python-web-base:v0.1

command: bash /base/sbin/docker_compose_celery_entrypoint.sh    environment:

C_FORCE_ROOT: "true"

PRESTO_HOST: presto      MYSQL_HOST: mysql      MYSQL_DATABASE: test      MYSQL_ROOT_PASSWORD: "123456"

AWS_ACCESS_KEY_ID: unit-test-user      AWS_SECRET_ACCESS_KEY: unit-test-user      AWS_DEFAULT_REGION: cn-north-1

AWS_DEFAULT_OUTPUT: text    depends_on:

- mysql

- presto

- localstack    volumes:#   code base

- .:/base#   query result shared volume: /tmp/

- /tmp:/tmp

3. 遇到的坑

3.1 host name问题

配置mysql的时候由于不知道docker-compose中网络通信是怎么样的, 就用localhost:3306 或者127.0.0.1:3306去连mysql, 总是报错, 无法连接该mysql. 发现原来在docker-compose环境下, 不管是mysql还是其他servers如presto, 想要连接这些服务, 都要用这些服务的名字进行连接. 如下所示version: '3'services:

mysql:

...

presto:

...

localstack:

...

可以连接的服务的名称分别为mysql, presto 和localstack. 于是我在环境变量中export这些HOST name, 方便我在程序中去判断是否存在这些环境变量, 如果有的话就连接这个hostname.

3.2 服务启动的先后顺序

当mysql还没有成功启动, celery会一直报错, 并不断地重复连接mysql, 于是我想设置这些服务的启动先后顺序, 用了docker compose的 depens_on, 但是depens_on只是表达服务之间的依赖关系, 并不会按照次序来启动service.depends_on does not wait for db and redis to be “ready” before starting web - only until they have been started. If you need to wait for a service to be ready, see Controlling startup order for more on this problem and strategies for solving it.

看来如果想让web或者celery服务等mysql启动完毕后再启动, 需要一个wait-for-it脚本的帮忙. 这个人写的脚本还比较清晰简单的: https://github.com/yamyamyuo/wait-for-it

可以在command添加一个脚本, 脚本中使用wait-for-it去轮询依赖的services, 一旦services启动成功, web 和 celery就可以继续进行启动了.

3.3 暴露端口号

服务对外暴露的端口号不要忘记填写, 否则其他docker container无法找到该服务. 注意事项:

当通过HOST:CONTAINER 格式来映射端口号的时候, 低于60的端口号会有错误提示, 因为YAML解析格式例如 xx:yy的数字是基于base-60的. 因此强烈建议用双引号把 "HOST:CONTAINER" 括起来.

3.4 volumes

为了能够持久化和共享容器中的数据, Docker提出了volume的概念. Volume可以让容器中的联合文件系统, 以目录或文件的形式存于宿主机上.

我最初遇到的一个问题是celery service 通过异步的方式执行一些任务, 任务结束后会把结果写到本地文件, web service 查询的时候会到本地文件中查看是否有相关结果. 这个时候volume排上用场. 只要把容器内用到的文件地址映射到宿主机, 同时让web和celery service 都共享该volume即可.

以上就是本次docker compose遇到的一些问题, 如有问题可以留言~

作者:小熊说_BruinTalk

链接:https://www.jianshu.com/p/46db38b94200

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/334440.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QPW 操作日志表(tl_operate_log)

操作日志表 前端每次调后端服务时,会往这张表插入一条记录,作为接口调用日志,出现 bug 时可以查询这张表追溯问题。 CREATE TABLE tl_operate_log (operate_log_id bigint(20) NOT NULL AUTO_INCREMENT COMMENT 操作ID,user_id bigint(20) …

java 线程中创建线程_如何在Java 8中创建线程安全的ConcurrentHashSet?

java 线程中创建线程在JDK 8之前,还没有办法在Java中创建大型的线程安全的ConcurrentHashSet。 java.util.concurrent包甚至没有一个名为ConcurrentHashSet的类,但是从JDK 8开始,您可以使用新添加的keySet(默认值)和ne…

docker 删除所有镜像_关于 Docker 镜像的操作,看完这篇就够啦 !(下)| 文末福利...

紧接着上篇《关于 Docker 镜像的操作,看完这篇就够啦 !(上)》,奉上下篇 !!!镜像作为 Docker 三大核心概念中最重要的一个关键词,它有很多操作,是您想学习容器技术不得不掌握的。本文将带您一步一…

排序出错Java_使用picard排序去重出错

命令:java -jar/public/home/nieyg/biosoft/package/picard-tools-1.124/picard.jar SortSam \I/public/home/nieyg/atacseq/data/Rawdata/align/LDN-D2-1.raw.bam\OLDN-D2-1.sort.bam \SORT_ORDERcoordinate错误信息:Exception in thread "main&qu…

移动端设备标识码/设备唯一标识码/设备唯一性

文章目录名词释义Android 设备标识码iOS设备标识码总结名词释义 Device ID:设备ID。 IMEI:International Mobile Equipment Identity,国际移动设备身份码的缩写。是由15位数字组成的“电子串号”,它与每台手机一一对应&#xff0…

python与access选哪个_从Python连接到Access

I want to be connected to a database Boreas (Access) from Python. How to be connected from Python to Access database Northwind? 解决方案 Here are 2 ways, with COM dispatch and with odbc. You will need the pywin32 extensions and/or pyodbc to use these meth…

aws实例启动失败_AWS:启动安装了APOC的Neo4j实例

aws实例启动失败安装Neo4j之后,我要做的第一件事就是安装APOC库 ,但是我发现在AWS上旋转服务器时这是一个手动过程,所以我想简化一下。 已经有一个Neo4j AMI可以安装Neo4j 3.2.0 ,我的同事Michael指出,我们可以通过编…

设备唯一标识/设备码/设备标识码

文章目录一、MAC地址二、IMEI三、MEIDMEID 和 IMEI 用途的区别四、序列号(一)苹果手机序列号(二)华为手机序列号一、MAC地址 MAC地址(英语:Media Access Control Address),直译为媒…

QPW 点评表(tf_appraise)

点评表 CREATE TABLE tf_appraise (appraise_id bigint(20) NOT NULL AUTO_INCREMENT COMMENT 点评ID,company_id bigint(20) DEFAULT NULL COMMENT 企业ID,user_id bigint(20) DEFAULT NULL COMMENT 用户ID,avg_score decimal(4,2) DEFAULT 0.00 COMMENT 综合评分,contributi…

python多次输入数据_如何用python3输出重复的数据?

面对很多重复的数据,如果人工一个个处理起来会很麻烦,而且要浪费大量的时间和精力。之前就python处理数据是简单便捷的,有没有一种方法能把重复的数据输出出来,这样就一目了然了。相信有一些小伙伴也跟小编有同样的困扰&#xff0…

java magic number_避免JDBC查询中的CheckStyle magic number错误

我正在上课一个小组项目,我们正在尝试CheckStyle.我对Java非常满意,但从未触及到JDBC或在此之前完成任何数据库工作.我想知道如果有一个优雅的方式来避免在准备语句电话中出现错误的数字错误,请考虑:preparedStatement connect.prepareStatement("INSERT INTO…

java登录界面命令_Java命令行界面(第18部分):JCLAP

java登录界面命令Giles Winstanley的JCLAP ( Java命令行参数解析器 )是基于Java的命令行处理库的系列文章中介绍的第18个库。 这篇文章的示例基于JCLAP 1.4 ,它需要Java 8 。 JCLAP主页上指出:“ JCLAP帮助Java开发人员为其应用程…

MySQL命令之show用法详解

文章目录参考示例(一)查看表字段详情(二)显示某个表的创建语句(三)显示所有数据库的名称(四)查看已选数据库中的所有表(五)查看某个数据库的创建语句&#xf…

java关闭websocket_关闭代码1006关闭websocket的原因

关闭代码1006是一种特殊的代码,它表示浏览器实现异常(本地)关闭了连接。在websocket.onerror(evt)事件中查看详细信息。但是,Chrome很少会向JavaScript端报告任何接近代码1006的原因。这可能是由于WebSocket规范中的客户端安全规则所致,以防止…

python生成c语言代码_Python爬取C语言中文网教程生成PDF

[Python] 纯文本查看 复制代码import requests from lxml import etree import re import os import pdfkit def gethtml(url,encode): r requests.get(url) r.encoding encode return r.text def writehtml(path,str): f open(path,w,encodingutf-8) f.write(str) f.close …

java登录界面命令_Java命令行界面(第15部分):Jargo

java登录界面命令Jargo在其GitHub主页上定义为“一种减轻程序参数/选项处理的工具”。 当已经存在许多其他命令行处理库时,该页面为另一个命令行处理库提供了基本原理 ,该列表的顶部是“因为类型安全性,不变性和可读性很重要”。 Jargo的选项…

QPW 提现申请单表(暂时不做)(tf_cash_apply)

提现申请单表 这是用户提现申请单表,这是一种申请单据。 CREATE TABLE tf_cash_apply (cash_apply_id bigint(20) NOT NULL AUTO_INCREMENT COMMENT 申请单ID,cash_order_no bigint(20) NOT NULL UNIQUE COMMENT 提现申请单编号, # 补cash_order varchar(100) NOT…

服务器一键建php网站,搭建服务器 - 我的lnmp一键安装报错 - php中文网博客

https://blog.csdn.net/weixin_34187862/article/details/87668648 链接/usr/local/nginx/conf/nginx.confuser www www;worker_processes auto;error_log /home/wwwlogs/nginx_error.log crit;pid /usr/local/nginx/logs/nginx.pid;#Specifies the value for maximum file …

python控制其它软件_从另一个脚本控制python脚本

我正在尝试学习如何编写一个脚本control.py,它在循环中运行另一个脚本test.py一定次数,在每次运行中,读取其输出并在打印某些预定义输出时暂停它(例如文本’现在停止’),并且循环继续其迭代(一旦test.py完成,无论是单独还是强制).所以有一些事情: for i in range(n)…

QPW 用户签署协议日志表(tf_user_agreement_log)

用户签署协议日志表 CREATE TABLE tf_user_agreement_log (log_id bigint(20) NOT NULL AUTO_INCREMENT COMMENT 日志ID,user_id bigint(20) DEFAULT NULL COMMENT 用户ID,agree_id int(11) DEFAULT NULL COMMENT 协议ID,agree_code varchar(32) DEFAULT NULL COMMENT 协议编号…