読者です 読者をやめる 読者になる 読者になる

俺、サービス売って家買うんだ

正直このペースで作ってればいつか2-3億で売れるのがポっと出来るんじゃないだろうか

Mac上にNginx、MySQL、Redis、Nodeが入ったDockerコンテナを準備してみる

infra Node.js Linux Docker
f:id:ie-kau:20161109192158p:plain

そろそろ触ってみないとという謎の焦燥感に急かされて触ってみた。
結論から言うと今のところVagrant + Virtualbox + Ansibleぐらいで事足りてる気がするけど、実運用になると変わってくるのかな。

目標

  • DockerにMySQL、Redis、Node、Nginxぐらい入れてみる

理解してなかったんだけど、コンテナ運用をする場合はMySQL用のコンテナ、Redis用のコンテナ、Web Application用のコンテナと分けて運用するのがコンテナの正しい使い方なのね。

用語

  • イメージ
    • ミドルウェアとか、アプリケーションが乗ってる雛形みたいなもの
  • コンテナ
    • イメージの実態

全てのイメージをみる

docker images

全てのコンテナをみる

# 起動中
docker ps

# 起動中 + 停止中
docker ps -a

参考

stackoverflow.com

手順

docker-toolboxをインストールする

brew cask install docker-toolbox

Docker Machineを使ってホストの作成

Docker MachineとはDockerのホストを簡単に作成、操作できるツール。 今回はVirtualboxをホストとしてDockerコンテナを動かします、Macの場合Mac OSを直接のホストとするとができずVirtualbox上にコンテナを立てないと行けないようです。VirtualboxにはOSが入ってないけど、どうなってるんだこれ??

docker-machine create --driver virtualbox default
eval "$(docker-machine env default)"

Dockerfileの作成

いろんなサイトのDockerfileを真似て見よう見まねで作ってみた。

FROM centos:centos6

RUN yum -y update
RUN yum -y install gcc git rsync tar openssl openssl-devel readline-devel  zlib-devel libffi-devel gdbm-devel tk tk-devel tcl tcl-devel patch gcc-c++ which sqlite-devel wget openssh-server file
RUN yum -y install tree wget

# MySQL
RUN yum -y install http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm
RUN yum -y install mysql mysql-devel mysql-server
RUN chkconfig mysqld on

# Edit mysql setting file
RUN echo "" >> /etc/my.cnf
RUN echo "[mysql]" >> /etc/my.cnf
RUN echo "default-character-set=utf8" >> /etc/my.cnf
RUN echo "" >> /etc/my.cnf
RUN echo "[client]" >> /etc/my.cnf
RUN echo "default-character-set=utf8" >> /etc/my.cnf

# nginx
RUN rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
RUN yum -y install nginx

# Silver Searcher
RUN yum -y install pcre-devel xz-devel automake
RUN cd /usr/local/src & \
    git clone https://github.com/ggreer/the_silver_searcher.git && \
    cd the_silver_searcher && \
    ./build.sh && \
    make install

# Redisのインストール
RUN wget http://download.redis.io/releases/redis-3.2.5.tar.gz && \
    tar xzf redis-3.2.5.tar.gz && \
    cd redis-3.2.5 && \
    make && \
    make install

# nvm, Nodeのインストール
ENV NVM_DIR /usr/local/nvm
ENV NODE_VERSION 5
RUN curl curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.32.1/install.sh | bash \
    && source $NVM_DIR/nvm.sh \
    && nvm install $NODE_VERSION \
    && nvm alias default $NODE_VERSION \
    && nvm use default

ENV NODE_PATH $NVM_DIR/v$NODE_VERSION/lib/node_modules
ENV PATH      $NVM_DIR/v$NODE_VERSION/bin:$PATH

ENV APP_HOME /app

RUN mkdir $APP_HOME
WORKDIR $APP_HOME

NG

RUNでcdしても次のRUNはcdしたディレクトリから始まらないので、&&でコマンドをつなぐかWORKDIRを適宜設定する必要がある。

RUN cd /usr/local/src 
RUN cd git clone https://github.com/ggreer/the_silver_searcher.git

イメージの作成

 docker build -t node/test .

起動

# 起動してコンテナ内に入る
docker run -it node/test

その他よく使うコマンド

# エラーが発生した場合途中までの作業がキャッシュされるので、完全に最初から作り直したい場合
 docker build --no-cache -t node/test .

# imageにタグを付ける
docker tag b297c95be09d node/test:latest

起こった問題

1. 何かしてたらDocker Daemonが死んでいた

原因は不明・・・・

$ docker images
Cannot connect to the Docker daemon. Is the docker daemon running on this host?

解決

ホストを起動して再度DockerのENV設定を行った。

docker-machine start
eval "$(docker-machine env default)"

2. 証明書がない

Dockerのホスト名を途中でdevからdefaultに変えた結果発生した。

Could not read CA certificate "/Users/[USER]/.docker/machine/machines/dev/ca.pem": open /Users/[USER]/.docker/machine/machines/dev/ca.pem: no such file or directory

解決

再度DockerのENV設定を行った。

eval "$(docker-machine env default)"

とりあえず

疎通まで行かずに終わった。 残りの課題は以下のとおりかな。

  • 手者のブラウザからNginxへ疎通させる
  • Nginxなどの管理ファイルをdocker内に入れる方法
  • MySQLサーバーのコンテナを分けてみる
  • WebサーバーとMySQLサーバーを疎通させる

参考書籍

プログラマのためのDocker教科書 インフラの基礎知識&コードによる環境構築の自動化

プログラマのためのDocker教科書 インフラの基礎知識&コードによる環境構築の自動化