Docker实践

IP

最初始碰着的就是ip难题,作者在run的时候做了端口映射,但是表面使用MySQL客户端死活连接不上,而那几个只在小编mac上面出现,linux上面正常,后来察觉是boot2docker的题材,我们需要利用boot2docker ip归来的ip来访问container,在小编的机械下边,那么些ip为192.168.59.103。

起因

Docker算是将来可怜火的一个体系,但作者对其从来不怎么头痛,终归没啥使用景况。只是如今,笔者须求在大团结的mac电脑上边安装项目的费用环境,发现要求设置MySQL,LedisDB,xcodis,Redis,Zookeeper等一堆东西,而相同的流程依旧要在Windows的机械上面再来两遍,陡然觉得必须得有一个更好的艺术来管理整个项目标成本条件了。自然,作者将眼光放到了Docker上面。

基于官方自身的牵线,Docker其实是一个为开支和运维人士提供构建,分发以及运行分布式应用的开源平台(野心真的不小,难怪CoreOS要新弄一个Rocket来跟他竞争的)。

Docker首要不外乎Docker Engine,一个轻量级的运作和包管理工具,Docker
Hub,一个用来共享和自动化工作流的云服务。实际在使用Docker的工程中,大家常常都是会在Docker
Hub上边找到一个base
image,编写Dockerfile,打造大家同心协力的image。所以广大时候,学习使用Docker,我们仅要求精晓Docker
Engine的事物就能够了。

至于怎么拔取Docker,原因仍然很显眼的,轻量简单,比较于采纳VM,Docker实在是太轻量了,作者在融洽的mac
air下面同时可以运作多个Docker
container进行开发工作,而这一个对VM来说是不敢想象的。

末尾,我将结合本身的阅历,来说说怎样创设一个MySQL
Docker,以及中等踩过的坑。

Volumn

仍然是boot2docker的问题,笔者在docker run的时候,使用-v来将表面的目录绑定到datadir那一个VOLUMN上边,这几个在linux上边是成功的,不过在mac上边,小编发现mysql_install_db持之以恒没有权力写入磁盘。后来才知晓,boot2docker只同意对友好VM下边的门径举办绑定。鉴于在mac下边仅仅是调节,数据不可以持久化保存,那个题材也懒得管了。反正只要不删除掉container,数据恐怕会在的。

后记

总的来说,Docker依然很不难上手的,只要大家耳熟能详了它的吩咐,Dockerfile的编辑以及相应的运行机制,就能很有利的用Docker来拓展集体的随处集成开发。而在生养环境中动用Docker,我还平昔不有关的经历,没准后续私有云会选择Docker举办配备。

此起彼伏,对于八个Container的互相,以及劳动意识,扩容等,作者也还须要卓越钻研,CoreOS没准是一个方向,恐怕研商下rocket
🙂

MySQL Docker

小编平昔致力MySQL相关工作的费用,对于MySQL的依赖性很深,但老是安装MySQL其实是让我分外高烧的一件工作,不一样平台安装格局不均等,加上一堆设置,很不难就把人搞晕了。所以自然,小编的Docker第一遍尝试就放置了MySQL上边。

对此mac用户,首先需求安装boot2docker这些工具才能运用Docker,那些工具是挺便宜的,但也有点坑,后续会表明。

作者后边说了,平日选用Docker的主意是在Hub上边找一个base
image,纵然Hub上边有好多MySQL的image,但小编因为开发go-mysql,必要在MySQL启动的时候传出特定的参数,所以决定活动编排Dockerfile来营造。

首先,作者使用的base image为ubuntu:14.04,Dockerfile文件很粗略,如下:

FROM ubuntu:14.04

# 安装MySQL 5.6,因为笔者需要使用GTID
RUN apt-get update \
    && apt-get install -y mysql-server-5.6

# 清空apt-get的cache以及MySQL datadir
RUN apt-get clean
RUN rm -rf /var/lib/apt/lists/* /var/lib/mysql

# 使用精简配置,主要是为了省内存,笔者机器至少要跑6个MySQL
ADD my.cnf /etc/mysql/my.cnf

# 这里主要是给mysql_install_db脚本使用
ADD my-default.cnf /usr/share/mysql/my-default.cnf

# 增加启动脚本
ADD start.sh /start.sh
RUN chmod +x /start.sh

# 将MySQL datadir设置成可外部挂载
VOLUME ["/var/lib/mysql"]

# 导出3306端口
EXPOSE 3306

# 启动执行start.sh脚本
CMD ["/start.sh"]

我们需要留意,对于MySQL那种需求仓储数据的服务来说,一定必要给datadir设置VOLUMN,那样您才能积存数据。作者当年就忘记设置VOLUMN,结果启动6个MySQL
Docker container之后,突然意识这多少个MySQL使用的是同样份数据。

设若有VOLUMN,
大家可以在docker run的时候指定相应的外表挂载点,借使没有点名,Docker会在投机的vm目录上边生成一个唯一的挂载点,我们得以经过docker inspect一声令下详细询问种种container的动静。

对于start.sh,相比较不难:

  • 看清MySQL
    datadir上边有没有数量,倘若没有,调用mysql_install_db初始化。
  • 同意任意ip都能利用root账号访问,mysql -uroot -e "GRANT ALL ON *.* TO 'root'@'%' IDENTIFIED BY '' WITH GRANT OPTION;",否则大家在外部不可以连接MySQL。
  • 启动mysql

构建:

docker build -t siddontang/mysql .

构建好了MySQL Docker image,大家就能使用docker run来运转了:

docker run -d -p 3306:3306 --name=mysql siddontang/mysql:latest

此地,大家根据siddontang/mysql那些image创设了一个叫做mysql的container并运行,它会调用start.sh脚本来启动MySQL。

而作者辈因而docker stop mysql就可以告一段落mysql container了。

假使笔者须求周转七个MySQL,仅仅要求多新建多少个container并运行就足以了,当然得指定相应的端口。可以见到,那种形式充足的粗略,尽管选用mysqld_multi也能达成相同的法力,不过一旦本人须求新增一个MySQL实例,mysqld_mutli还须要去改变配置文件,以及在相应的MySQL里面安装允许mysqld_multi stop的权力,其实到头来相比较忙绿的。而这么些,在Docker里面,一个docker run就化解了。

总体的创设代码在此处,mysql-docker,你也能够pull我提交到Hub的image
siddontang/mysql来直接选拔docker pull siddontang/mysql:latest

Flatten Image

在应用Dockerfile打造协调的image的时候,对于Dockerfile里面的每一步,Docker都会变卦一个layer来对应,相当于每一步都以五回提交,到结尾你会发现,生成的image相当的庞大,而当您push那些image到Hub下面的时候,你的具备layer都会交到上去,加之我们国家的网速水平,会令人倾家荡产的。

从而大家必要不难生成的image大小,也等于flatten,这几个Docker官方还并未支持,但起码我们如故有办法的:

  • docker export and
    docker import,通过对一定container的export和import操作,我们可以生成一个无历史的新container,详见这里
  • docker-squash,很方便的一个工具,我就动用这些进行image的flatten处理。

Boot2Docker Pitfall

在此从前方可以见见,Docker的应用是尤其有利的,但笔者在利用的时候照旧碰到了好几坑,那里记录一下。

网站地图xml地图