概述
openshift提供了3种方式构建镜像:Docker, S2I, Pipeline。
-
Docker方式是典型的一种方式。
-
S2I(source to image) 适用于java, golang等需要编译的应用,因为它提供依赖包保存的功能以保证后续的镜像构建可以复用第一次下载的依赖包,减少了构建镜像的时间。
-
Pipeline是采用jenkins的方式来构建镜像,jenkins插件丰富,功能全面。
kubernetes是没有构建镜像的功能的,也就是缺失了CI这一块的功能。
大部分情况下你其实只需要第一种方式即可。本文以第一种方式来说明。
应用说明
把应用迁移到openshift或kubernetes中主要需要两个东西,一个是Dockerfile,一个是模版。本文示例的应用是一个以ansible为基础开发的批量部署系统,以下简称AU。整个应用设计到的组件包含django, celery, mysql, nginx, uwsgi, supervisor,按照标准的做法应该把每个组件都单独放到一个容器中跑,但本文为了简化流程就把所有组件放到supervisor中托管,容器启动时只启动supervisor进程。
上传项目源代码AU到git仓库
git init
git add -A .
git commit -m "init"
git remote add origin git@gitlab.example.com:au
git push -u origin master
4.编写Dockerfile
编写Dockerfile有自己的规则,每一条命令就代表一层镜像,所以写Dockerfile的时候能合并到一个命令的尽量合并,以下是AU的Dockerfile
FROM ubuntu:14.04
MAINTAINER zhanghh
#define volume /var/log/AU and volume for mysql storage
#VOLUME ["/var/log/AU", "/var/lib/mysql"]
#copy source code to container
COPY . /data/app/AU/
#set source list
RUN \
##change owner and group for /var/lib/mysql
#chown -R mysql:mysql /var/lib/mysql
#chmod 700 /var/lib/mysql
#install basic packages
apt-get install -y \
openssh-client \
mysql-server \
libmysqlclient-dev \
python-dev \
libldap2-dev \
libsasl2-dev \
libssl-dev \
libffi-dev \
supervisor \
nginx \
libjpeg8-dev \
zlib1g-dev \
python-setuptools \
python-dev \
build-essential \
python-pip \
&& pip install --upgrade setuptools;\
\
#add user ansible
adduser --home /home/ansible --shell /bin/bash ansible;\
\
#install python libraries
pip install -r /data/app/AU/requirements.txt; \
\
###mysql setting ###
#modify /etc/mysql/my.cnf
sed -i 's/bind_address/# bind_address/g' /etc/mysql/my.cnf; \
\
#start mysql service
service mysql start && \
\
#set root password
#RUN mysqladmin -u root password xxxxxxx
#create user and