作为一个 freelancer,经常能够接到很多的开发工作,这些金主,有喜欢 PHP 的,有习惯撒手不管的;有偏好 sqlite 的,也有喜欢 PG 的,我甚至见过 mysql、PG 一起使用的项目;同一门语言下,使用的框架也不尽相同,有用 CI 的,也有用 Yaf 的。

在平时开发时,我有一台 10 年(或者是 11 年)的 thinkpad E50,在家里当作 linux 服务器,还有一个 rMBP 来做开发和展示用。对于一般的开发工作,他们两个的环境还是比较类似的,但是(权利的游戏里说的, “but”之前的,都是放 P),在一些特殊场景下,他们的差别还是让人很不爽 (比如 ubuntu 下装 yaf 和 OS X 下并不相同;在 coffee 查找路径也有细微区别,尤其是在 brew 跟着操作系统升级之后……)。这些差别虽然不大,但是在某个项目上,还是花费了我一些时间来搭建环境。

最近研究了一下 docker,然后发现 docker 可以很完美的解决在开发时由于宿主机差异造成的环境问题(线上环境我没试过,其实我也没线上环境), 下面我演示一下在 linux 宿主机上,从 0 开始搭建一个开发环境需要的 docker 镜像并到处的过程。

docker 安装

按照 https://docs.docker.com/ 的介绍安装即可。当然,如果你使用 ubuntu,那么执行下面的命令就好了:

sudo apt-get install docker.io

从网络上 Pull 一个 docker 镜像下来

忽略你从网上看到的各种教程吧,直接使用下面这个命令(如果你不是 root 用户,别忘记加 sudo)

docker pull ubuntu

经过或长或短的一段时间,你会从 docker 官方拉一个 ubuntu 的镜像到你磁盘上。你可以使用

docker images

看到它, 像这样:

启动下载的镜像,并进入运行该镜像的容器

使用 run 命令,启动对应的镜像

docker run -itd ubuntu

然后使用 ps 命令,找到刚才启动的容器 ID,在使用 attach 命令,进入该容器(注意截图中 attach 的参数,就是 ps 列出的容器的 ID)

安装开发环境需要的软件

这一步的具体操作,取决于你需要的开发环境都有哪些,我一般会安装 nginx、php5-fpm、mysql、mongodb、redis 和 python 的环境,使用 apt-get 安装(别忘了先  apt-get update) 即可。当然还会有一些其他操作,比如 nginx 的配置,这些和平时在 liunx 上安装服务是一样的。

等你安装完了环境,先不要着急 stop 掉对应容器。

保存更改的容器

上一步修改容器之后,如果直接关掉容器,这些改动不会在下次启动时保留,所以需要把它存储到本地另外一个镜像中。

方法很简单,同样需要 attach 那一步获取的 ID

docker commit 028ce7fa5596 ptj:dev

我把我本地的镜像,取名叫做 "ptj:dev", 这里名字你可以随便起。

现在你可以放心的停掉前面的容器了:

docker stop 028ce7fa5596

然后我们再使用 images 命令,看一下 docker 镜像:

ptj:dev 现在已经在我们磁盘上了。

增加启动服务、端口映射

现在“ptj:dev" 里面有了我们开发所需要的软件,但是并不能让 nginx、mysql 这些服务自动启动,下面需要把 ptj:dev 中的服务,随镜像一起启动。

具体步骤虽然繁琐,但是也不困难。

1. 新建一个目录,我们就叫它 ptj

mkdir ptj ; cd ptj

2. 在目录下,新建两个文件

touch Dockerfile start.sh

Dockerfile 告诉 docker 怎么制作一个镜像, start.sh 是我们自己的启动脚本

3. 将需要启动的 services 写入 start.sh,然后在最后加上"/bin/bash"

#!/bin/bash
service nginx start
service mysql start
service php5-fpm start
service mongodb start
service redis-server start
/bin/bash                   # 最后这行千万不要漏

4. 从 ptj:dev 复制镜像,并且将 start.sh 放入镜像内,自动启动

From ptj:dev
ADD start.sh /usr/local/start.sh
RUN chmod +x /usr/local/start.sh
EXPOSE 80 22 3306 6379 27017
CMD ["/usr/local/start.sh"]

From 那行,代表从哪个镜像复制

ADD 表示把文件放入镜像
RUN 需要把 start.sh 变为可执行

EXPOSE 是暴露 docker 内的端口给宿主机,将来可以通过 -P 让宿主机访问 docker 内的服务

CMD 则是指明了该镜像需要执行的程序

5. 制作新镜像

在我们前面的 ptj 目录下,执行一条指令即可:

docker build -t ptj .

启动新镜像,检查服务是否运行正常

再次祭出 images 命令:

可以发现 ptj 下面多了一个 latest, 这个就是我们刚才修改的镜像;

使用前面介绍的 run、 attach,看看我们服务运行的情况:

可以看到我们的服务已经全部随着镜像的启动运行起来了。

剩下的就是把 docker 导出成 tar 包,在不同机器之间拷贝、导入然后开发了。

使用 docker 搭建开发环境的更多相关文章

  1. Docker 搭建开发环境

    本文介绍如何将Docker集成到开发环境,自动构建应用,并使容器拥有独立的内网IP为开发人员提供服务. 术语解释 Docker镜像:一个不可修改的"模板",每个代码版本对应一个镜像 ...

  2. 利用Docker搭建开发环境

    一. 前言 随着平台的不断壮大,项目的研发对于开发人员而言,对于外部各类环境的依赖逐渐增加,特别是针对基础服务的依赖.这些现象导致开 发人员常常是为了简单从而直接使用公有的基础组件进行协同开发,在出现 ...

  3. Docker搭建开发环境(Nginx+MySQL+PHP)

    注意事项 1.像MySQL配置文件.Nginx配置文件.网站根目录这种比较经常操作的需要先使用 docker cp 将文件从容器里复制到主机目录,docker run的时候直接挂载目录就可以了 2.d ...

  4. [转]利用Docker构建开发环境

    利用Docker构建开发环境 Posted by  makewonder on 2014 年 4 月 2 日   最近接触PAAS相关的知识,在研发过程中开始使用Docker搭建了自己完整的开发环境, ...

  5. 利用Docker构建开发环境

    最近接触PAAS相关的知识,在研发过程中开始使用Docker搭建了自己完整的开发环境,感觉生活在PAAS时代的程序员真是幸福,本文会简要介绍下Docker是什么,如何利用Docker来搭建自己的开发环 ...

  6. 深入浅出Docker(五):基于Fig搭建开发环境

    概述 在搭建开发环境时,我们都希望搭建过程能够简单,并且一劳永逸,其他的同事可以复用已经搭建好的开发环境以节省开发时间.而在搭建开发环境时,我们经常会被复杂的配置以及重复的下载安装所困扰.在Docke ...

  7. Mac下docker搭建lnmp环境 + redis + elasticsearch

    之前在windows下一直使用vagrant做开发, 团队里面也是各种开发环境,几个人也没有统一环境,各种上线都是人肉,偶尔还会有因为开发.测试.生产环境由于软件版本或者配置不一致产生的问题, 今年准 ...

  8. Docker搭建disconf环境,三部曲之一:极速搭建disconf

    Docker下的disconf实战全文链接 <Docker搭建disconf环境,三部曲之一:极速搭建disconf>: <Docker搭建disconf环境,三部曲之二:本地快速构 ...

  9. Docker搭建disconf环境,三部曲之二:本地快速构建disconf镜像

    Docker下的disconf实战全文链接 <Docker搭建disconf环境,三部曲之一:极速搭建disconf>: <Docker搭建disconf环境,三部曲之二:本地快速构 ...

随机推荐

  1. sql语句的安全性考虑

    sql语句的应该考虑哪些安全性呢? 1.防止sql注入,对特殊字符进行转义(addslashes),或者使用已经编译好的sql语句进行变量的绑定: 2.当sql运行出现错误的时候,不要把数据库返回的错 ...

  2. d3.js 之关联数据:data操作符

    数据可视化 在可视化工作中,一个基本出发点是将不同的数值映射到不同的可视化 元素的属性上,使其表现出各自不同的视觉特征. 比如:以数组中的每一个值为直径分别创建一个圆,我们得到三个圆: 在d3中,可视 ...

  3. 向git服务器添加shh公钥

    步骤一,从客户端获得 SSH 公钥 为了使客户端可以向 Git 服务器提供 SSH 公钥,首先要确认客户端拥有公钥.SSH 的密钥存储在 ~/.ssh/ 目录下,下面我们查看一下这里面都有哪些文件: ...

  4. centos下apache安装

    ./configure --prefix=/usr/local/apache2 --enable-so --enable-proxy --enable-proxy-connect --enable-p ...

  5. Sql order by 和 group BY 如何共同运用?

    如果声明了 GROUP BY 子句,输出就分成匹配一个或多个数值的不同组里. 如果出现了 HAVING 子句,那么它消除那些不满足给出条件的组. 如果声明了 ORDER BY 子句,那么返回的行是按照 ...

  6. Spring第四弹—–Spring的三种实例化bean的方式

    1.使用类构造器实例化   1 <bean id=“orderService" class="cn.itcast.OrderServiceBean"/> 2. ...

  7. 我的第一次NGS分析操作

    部分参考自:生物信息学100个基础问题 —— 番外2: 用Anaconda快速搭建生物信息学分析平台 - 孟浩巍的文章 - 知乎 https://zhuanlan.zhihu.com/p/357114 ...

  8. 3.MySQL必知必会之检索数据-SELECT语句

    本章将介绍如何使用SELECT语句从表中检索一个或多个数据列. 1.SELECT语句 SQL语句是由简单的英语单词构成的.这些单词称为关键字,每个SQL语句都是由一个或多个关键字构成的.大概,最经常使 ...

  9. 阿里云搭建go开发环境

    开通了一个阿里云来玩,记录一下环境搭建的过程 运行环境 ECS Ubuntu 16.04 64位 过程 #切换到安装文件夹 cd /usr/local #下载go #由于墙的原因,直接下载官方的可能会 ...

  10. Windows下编译live555源码

    Windos下编译live555源码 环境 Win7 64位 + VS2012 步骤 1)源码下载并解压 在官网上下载最新live555源码,并对其进行解压. 2)VS下建立工程项目 新建Win32项 ...