Docker打造开发环境
背景
我一直想要打造这样一个干净且高效的开发环境:干净指与开发隔离,不污染物理机,我已经讨厌重装系统了;高效是指自动化,我需要每次都安装一对依赖,修改一些配置文件等等繁琐的操作,而且自动化过程要快。最开始自己用virtualbox新建虚拟机然后用其自带的克隆功能复制出来;后来用vagrant配合一些配置工具能达到不错的效果,一个文件即可生成开发环境,这应该是主流了,但是这种方式有个缺点就是太慢;现在我自己用docker+supervisor摸索了一个更快的方案。
组件 supervisor,管理所有进程 sshd,可以登陆到container里,修改代码调试代码 app,实际跑的项目具体运行流程如下:
docker -startup-> 运行supervisor ->管理(sshd,项目进程) -> dump出环境变量供远程ssh使用组件配置
supervisor
supervisor的配置关键就是要让其前台运行,具体配置如下:
[inet_http_server] port=0.0.0.0:9001 username=root password=thinkin [supervisord] logfile=/tmp/supervisord.log logfile_maxbytes=50MB logfile_backups=2 loglevel=info pidfile=/tmp/supervisord.pid nodaemon=true minfds=1024 minprocs=200 umask=022 [rpcinterface:supervisor] supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface [supervisorctl] serverurl=http://127.0.0.1:9001 username=root password=thinkin history_file=~/.sc_history [include] files = /etc/supervisor.d/*.conf
sshd
ssh不需要额外配置,主要是添加上远程登陆需要的公钥信息:
mv ssh /root/.ssh chmod 700 /root/.ssh && chmod 600 /root/.ssh/* chown -R root.root /root/.ssh
关于sshd有两点需要说明: 1. 启动container时要加上-t参数,不然无法远程登陆 2. 由于ssh无法获取远程的环境变量,这样docker依赖环境变量的link特性就无法使用,这样django的开发环境就没法在远程ssh后正常运行了。这里我的解决办法是在container启动的时候(封装启动脚本)dump一份当前的环境变量到文件,然后sshd登陆到机器上去时source该文件,这样ssh就拥有了和本地一样的环境变量了。
app
这部分工作主要是编写app对应的supervisor配置文件,然后将app交由supervisor管理
Docker配置Dockerfile
FROM ubuntu:china MAINTAINER xdays <easedays@gmail.com> ADD script /tmp/script RUN bash /tmp/script/setup.sh EXPOSE 80 EXPOSE 9001 CMD startup
初始化脚本setup.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
#!/bin/sh apt-get update apt-get install -y openssh-server python-pip wget libmysqlclient18 #安装一些包和依赖库 #sshd相关配置 mkdir /var/run/sshd cd /tmp/script mv ssh /root/.ssh chmod 700 /root/.ssh && chmod 600 /root/.ssh/* chown -R root.root /root/.ssh #supervisor相关配置 cd /tmp/script mv supervisord.conf /etc/supervisord.conf mv supervisor.d/ /etc/supervisor.d/ #封装下启动命令,脚本内容见下文 mv startup /usr/local/bin/ #下载项目依赖和项目代码 mkdir /web wget -SO - http://url/to/upops-deps.tgz | tar xz -C / wget -SO - http://url/to/upops-core.tgz | tar xz -C /web/
启动脚本
1 2 3 4
#!/bin/sh
/usr/bin/env > /root/.env
supervisord -c /etc/supervisord.conf
启动命令
目前docker还不能支持给虚拟机绑定公网地址,所以所有端口还需要通过docker的端口映射来实现:
docker run -t -d -p 80:80 -p 2022:22 --link mysql:db -v /web/:/web/ upops
文章来源:
Author:admin
link:http://xdays.me/docker打造开发环境.html
上一篇:虚拟机管理工具vagrant