镀锡文件的背面 Dōngshí wénjiàn de bèimian
因为我是一个Docker初学者,所以我将自己制作的Dockerfile保存起来以供半年后的我使用。我将尽量使用原始的操作系统并尽可能地在Dockerfile中封闭地编写,而不依赖于外部文件。这是我的原则。
Dockerfile的一般注意事项
Dockerfile中的每一行都是独立的设置。
在使用Docker build构建镜像时,会逐行运行Dockerfile中的Shell命令来对Docker镜像进行操作。因此,无法在行与行之间传递当前目录或环境变量。您可以通过使用ENV指定环境变量,或者使用&&在一行中连接命令来解决此问题。
動かない例
#RUN git clone https://github.com/hoge/fuga.git
#RUN cd fuga
#RUN npm init
回避策
#RUN git clone https://github.com/hoge/fuga.git && cd fuga && npm init
关于CMD和ENTRYPOINT的路径
如果运行时 RUN、CMD或者ENTRYPOINT 不按预期工作,通常情况下是由于路径设置不正确(至少在我这里如此)。请在Dockerfile中的 WORKDIR 中设置(所期望的)当前目录。
Nodejs -> Node.js
从 GitHub 克隆基于 Node.js 的 Coffee 应用,并使用 PM2(Node.js 持久化工具)在 Dockerfile 中进行启动。
FROM ubuntu:14.04
RUN apt-get update
RUN apt-get install -y nodejs npm git git-core curl
RUN npm install -g coffee-script
RUN npm install -g pm2
RUN git clone https://github.com/xxx/yyyy.git && cd ./yyyy && npm install
RUN update-alternatives --install /usr/bin/node node /usr/bin/nodejs 10
WORKDIR /yyyy/
CMD pm2 start --no-daemon /yyyy/bin/www.coffee
#in the case you want to see the debug log
#CMD pm2 start /yyyy/bin/www.coffee && pm2 logs
EXPOSE 80
迷上了的地方
apt-get install nodejsでいれた場合、RUN update-alternatives しないとubuntu上ではnodeコマンドが動かない
WORKDIR を設定してあげないと、node appのpathが解決されずapp実行時にerrorで落ちる
RUNは1行毎にしかCurrent directoryが保持されないので、RUN git cloneの行は && で繋げて1行で記載する必要が有る
MongoDB (蒙哥数据库)
启动MongoDB,初始化数据库(创建集合,使用mongoimport导入数据库数据)。
FROM ubuntu:14.04
RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
RUN echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' > /etc/apt/sources.list.d/mongodb.list
RUN apt-get update
RUN apt-get install -y mongodb-org=2.6.5 curl
VOLUME ["/data/db"]
CMD ["mongod"]
# Expose ports. 27017 for normal db access, 28017 for http access
EXPOSE 27017
EXPOSE 28017
迷恋的要点 de
VOLUME [“/data/db”]してあげないと、mongodの起動が失敗する
Dockerfile上でmongoimportする処理も記述できないか試行錯誤してみたが、上手く行かず。
結局、以下の回避策をとりました。
host linux側に、mongodb-org-shellとmongodb-org-toolsをapt-get installでいれる
MongoのDockerを、docker run -p 27017:27017 -d xxxxxで立ち上げる
host linux上で、mongo importを実行する
mongoimport –host localhost:27017 –db test_db–collection test_collection –file test.json
host linux上で、mongo cliを操作する
#mongo localhost:27017
>use test_db
>db.test_collection.findOne()
Kibana4 + Elasticsearch + fluentd
Elasticsearch + fluentd 一体化 使用 Kibana4 的解决方案
设置Kibana4、Elasticsearch和fluentd的Dockerfile。
由于Kibana从版本4开始变成了基于Nodejs的应用程序,并且将监听端口5601,所以请注意。
另外,请单独准备td-agent.conf文件。
FROM ubuntu:14.04
RUN apt-get update -y
#Install Elasticsearch
ENV ELASTICSEARCH_VERSION elasticsearch-1.4.4
RUN apt-get install -y curl openjdk-7-jdk
RUN mkdir /opt/elasticsearch
RUN curl -sL "https://download.elasticsearch.org/elasticsearch/elasticsearch/${ELASTICSEARCH_VERSION}.tar.gz" | tar xz -C /opt/elasticsearch --strip=1
echo 'http.cors.enabled: true' >> /opt/elasticsearch/elasticsearch.yml
#Install Kibana4
ENV KIBANA_VERSION 4.0.0-linux-x64
ENV KIBANA_ES_URL http://localhost:9200
RUN apt-get install -y curl
RUN mkdir /opt/kibana
RUN curl -sL "https://download.elasticsearch.org/kibana/kibana/kibana-${KIBANA_VERSION}.tar.gz" | tar xz -C /opt/kibana --strip=1
RUN sed -i "s;^elasticsearch_url:.*;elasticsearch_url: ${KIBANA_ES_URL};" "/opt/kibana/config/kibana.yml"
RUN chmod -R 777 /opt/kibana
#Install Fluentd and plugins
RUN apt-get install -y libcurl4-openssl-dev git-core build-essential ruby-dev
RUN curl -L http://toolbelt.treasuredata.com/sh/install-ubuntu-trusty-td-agent2.sh | sh
RUN /opt/td-agent/embedded/bin/fluent-gem install fluent-plugin-elasticsearch fluent-plugin-map
RUN ulimit -n 65536
COPY td-agent.conf /etc/td-agent/td-agent.conf
#Install Supervisor and config
RUN apt-get install -y supervisor
RUN touch /etc/supervisord.conf
RUN echo '[supervisord]' >> /etc/supervisord.conf
RUN echo 'nodaemon=true' >> /etc/supervisord.conf
RUN echo '[program:elasticsearch]' >> /etc/supervisord.conf
RUN echo 'command=/opt/elasticsearch/bin/elasticsearch' >> /etc/supervisord.conf
RUN echo 'stdout_logfile=/dev/fd/1' >> /etc/supervisord.conf
RUN echo 'stdout_logfile_maxbytes=0' >> /etc/supervisord.conf
RUN echo '[program:td-agent]' >> /etc/supervisord.conf
RUN echo 'command=/usr/sbin/td-agent' >> /etc/supervisord.conf
RUN echo 'stdout_logfile=/dev/fd/1' >> /etc/supervisord.conf
RUN echo 'stdout_logfile_maxbytes=0' >> /etc/supervisord.conf
RUN echo '[program:kibana]' >> /etc/supervisord.conf
RUN echo 'command=/opt/kibana/bin/kibana' >> /etc/supervisord.conf
RUN echo 'stdout_logfile=/dev/fd/1' >> /etc/supervisord.conf
RUN echo 'stdout_logfile_maxbytes=0' >> /etc/supervisord.conf
# expose port for elasticsearch
# enble 9300 if you need cluster
EXPOSE 9200
# expose port for fluentd
# enable 24224 if you need to expose to host
# expose port for kibana4
EXPOSE 5601
CMD /usr/bin/supervisord -c /etc/supervisord.conf
迷上了的亮点
-
- kibana4は、Nodeやexpressなどを全てinstallerに抱えている状態なので、Nodeなどを別途installは必要無く、/kibana/bin/kibanaというshell scriptを実行するだけで良い
- Elasticsearch v1.4からCORSの設定を考慮する必要が有る。今回の場合Reverse proxyの後ろにKibana4, ESを配置するので、echo ‘http.cors.enabled: true’ >> /opt/elasticsearch/elasticsearch.ymlの記載を追加している
增长预测 + 流畅数据
设置Growthforecast和fluentd的Dockerfile。
FROM ubuntu:14.04
RUN apt-get update -y
#Install Growthforecast
RUN apt-get install -y curl perl
RUN apt-get -y build-dep rrdtool
RUN curl -L http://cpanmin.us | perl - --sudo App::cpanminus
RUN cpanm -n GrowthForecast
RUN mkdir /opt/growthforecast
#Install Fluentd and plugins
RUN apt-get install -y libcurl4-openssl-dev git-core build-essential ruby-dev
RUN curl -L http://toolbelt.treasuredata.com/sh/install-ubuntu-trusty-td-agent2.sh | sh
RUN /opt/td-agent/embedded/bin/fluent-gem install fluent-plugin-growthforecast fluent-plugin-dstat fluent-plugin-map --no-ri --no-rdoc -V
RUN ulimit -n 65536
COPY td-agent.conf /etc/td-agent/td-agent.conf
#Install Supervisor and config
RUN apt-get install -y supervisor
RUN touch /etc/supervisord.conf
RUN echo '[supervisord]' >> /etc/supervisord.conf
RUN echo 'nodaemon=true' >> /etc/supervisord.conf
RUN echo '[program:td-agent]' >> /etc/supervisord.conf
RUN echo 'command=/usr/sbin/td-agent' >> /etc/supervisord.conf
RUN echo 'stdout_logfile=/dev/fd/1' >> /etc/supervisord.conf
RUN echo 'stdout_logfile_maxbytes=0' >> /etc/supervisord.conf
RUN echo '[program:growthforecast]' >> /etc/supervisord.conf
RUN echo 'command=/usr/local/bin/growthforecast.pl --data-dir /opt/growthforecast --front-proxy=172.17.42.1' >> /etc/supervisord.conf
RUN echo 'stdout_logfile=/dev/fd/1' >> /etc/supervisord.conf
RUN echo 'stdout_logfile_maxbytes=0' >> /etc/supervisord.conf
# expose port for Growthforecast
EXPOSE 5125
CMD /usr/bin/supervisord -c /etc/supervisord.conf
迷上的点
-
- GrowthforecastはPerl上で動いて居るが、Perl知識0なので、余計なlibrary等が入って居ないか不明
-
- Growthforecast containerをnginxの後ろで動かす場合には、ここにあるtipsの対応が必要。
nginx側に設定が必要
growthforecast起動時に、nginxのIPを–front-proxyで渡す必要がある。172.17.42.1はContainerから見たHostのIP address。固定値で良いのか不安。
Containerを起動したら、curl -F number=10 http://localhost:5125/api/hoge/huga/valueを何回か実行して、Growthforecast上のUIに表示されるか確認すると良い。number=10の値は適宜変えて下さい。