Scraping on Docker for Mac

作った環境まとめ(後ほど追記する可能性)
https://github.com/dich1/selenium_ruby

## 概要
Dockerでスクレイピングをselenium-rubyを使ってGUIで起動しつつ、ホストからも確認できる環境

## 初期設定

```
Homebrewを入れる
brew install socat
brew tap caskroom/cask
brew cask install xquartz
```

## 使い方
```
1. Docker for macを入れ、Dockerを起動する

2. ボリュームを作成する  
docker volume create --name=mysql-data

3. プロジェクトのルートに移動する

4. イメージを作成、コンテナを起動する  
docker-compose up -d

5.Mac側からのスクリプトGUI確認準備
別タブのターミナルを開いて下記を実行
open -a XQuartz
socat TCP-LISTEN:6000,reuseaddr,fork UNIX-CLIENT:\"$DISPLAY\"
XQuartzが開き、socatが起動中になっていることを確認

6. 動作確認  
docker-compose run --rm -e DISPLAY=MACのIP(ifconfigのinet 192.168.～):0 app ruby /selenium_ruby/app/tests.rb

7. XQuartzが立ち上がり画面から処理がみえる事の確認
```

## 構成

```
$ tree
.
└── selenium_ruby(プロジェクト名)
    ├── README.md (環境構築、実行方法を記載)
    ├── app(アプリケーションコンテナ)
    │   ├── Dockerfile(イメージ生成元ファイル)
    │   ├── Gemfile(アプリケーションコンテナ内で使うRubyモジュール)
    │   ├── google-chrome.repo(CentOSでchromeを使用するの必要なファイル)
    │   └── tests.rb(テスト用スクリプトが記載されているファイル)
    ├── docker-compose.yml(アプリケーションコンテナとデータベースコンテナを管理するファイル)
    ├── local-setup.sh(初回時使うコマンドまとめ)
    └── mysql(データベースコンテナ)
        ├── Dockerfile(イメージ生成元ファイル)
        └── my.cnf(データベース設定ファイル)
```

## アプリケーションコンテナDockerfileについて
主に下記の事をやっています。
- CentOSのイメージ取得
- rbenvに必要なモジュールのインストール、パス設定
- Rubyの設定
- Gemの設定
- プロジェクトをコンテナ内にマウント
- chromedriverに必要なモジュール取得
- firefoxdriver取得(なくても良い)
- コンテナを起動させ続ける

```Dockerfile:app/Dockerfile
FROM drecom/centos-base:latest

# rbenv
RUN git clone git://github.com/rbenv/rbenv.git /usr/local/rbenv \
  &&  git clone git://github.com/rbenv/ruby-build.git \
/usr/local/rbenv/plugins/ruby-build \
  &&  git clone git://github.com/jf/rbenv-gemset.git \
/usr/local/rbenv/plugins/rbenv-gemset \
  &&  /usr/local/rbenv/plugins/ruby-build/install.sh
ENV PATH="/usr/local/rbenv/bin:$PATH" \
    RBENV_ROOT="/usr/local/rbenv"

RUN echo 'export RBENV_ROOT=/usr/local/rbenv' >> /etc/profile.d/rbenv.sh \
  &&  echo 'export PATH=/usr/local/rbenv/bin:$PATH' >> /etc/profile.d/rbenv.sh \
  &&  echo 'eval "$(rbenv init -)"' >> /etc/profile.d/rbenv.sh

RUN echo 'export RBENV_ROOT=/usr/local/rbenv' >> /root/.bashrc \
  &&  echo 'export PATH=/usr/local/rbenv/bin:$PATH' >> /root/.bashrc \
  &&  echo 'eval "$(rbenv init -)"' >> /root/.bashrc

ENV CONFIGURE_OPTS="--disable-install-doc" \
    PATH="/usr/local/rbenv/bin:/usr/local/rbenv/shims:$PATH"

# ruby
RUN eval "$(rbenv init -)"; rbenv install 2.3.3 \
  &&  eval "$(rbenv init -)"; rbenv global 2.3.3 \
  &&  eval "$(rbenv init -)"; gem update --system \
  &&  eval "$(rbenv init -)"; gem install bundler --no-document --force

# project setting
RUN mkdir /selenium_ruby
WORKDIR /selenium_ruby
COPY . /selenium_ruby/app
WORKDIR /selenium_ruby/app
RUN bundle install
WORKDIR /

# chromedriver
ARG CHROME_DRIVER_VER=2.44
RUN yum install -y unzip
RUN curl -O https://chromedriver.storage.googleapis.com/${CHROME_DRIVER_VER}/chromedriver_linux64.zip
RUN unzip chromedriver_linux64.zip
RUN mv chromedriver /usr/local/bin/

# dependencies
RUN yum install -y libX11 \
                   GConf2 \
                   fontconfig

# chrome
COPY ./google-chrome.repo /etc/yum.repos.d/google-chrome.repo
RUN yum install -y google-chrome-stable \
                   libOSMesa
RUN yum install -y google-noto-cjk-fonts \
                   ipa-gothic-fonts

# xvfb
RUN yum install -y zlib-devel xorg-x11-server-Xvfb gtk+-devel gtk2-devel
RUN yum groupinstall -y base "Development Tools" --setopt=group_package_types=mandatory,default,optional

# firefox
ENV FF_LANG="ja" \
    FF_BASE_URL="https://archive.mozilla.org/pub" \
    FF_PLATFORM="linux-x86_64" \
    FF_INNER_PATH="firefox/releases"

ARG FF_VER="45.7.0esr"

ENV FF_COMP="firefox-${FF_VER}.tar.bz2"
ENV FF_URL="${FF_BASE_URL}/${FF_INNER_PATH}/${FF_VER}/${FF_PLATFORM}/${FF_LANG}/${FF_COMP}"
RUN cd /opt \
  && wget -nv "${FF_URL}" -O "firefox.tar.bz2" \
  && bzip2 -d "firefox.tar.bz2" \
  && tar xf "firefox.tar" \
  && rm "firefox.tar" \
  && ln -fs /opt/firefox/firefox /usr/bin/firefox \
  && chmod -R 777 /opt/firefox

CMD tail -f /dev/null

```

## データベースコンテナについて
主に以下のことをやっています。

- データベースのイメージ取得
- モジュールの最新化
- 設定ファイルをコンテナ内にマウント

```Dockerfile:mysql/Dockerfile
FROM mysql:5.6

RUN apt-get update
RUN apt-get install -y locales

ADD ./my.cnf /etc/mysql/conf.d/my.cnf

```

## mysql設定ファイル
```my.cnf
[mysqld]
character-set-server=utf8mb4

[mysql]
default-character-set=utf8mb4

[client]
default-character-set=utf8mb4
```

## docker-compose.ymlについて
主に以下のことをやっています。

- 2つのコンテナをまとめて管理(起動時の起点のファイル)

```yml:docker-compose.yml
version: '3'
services:
  db:
    build: ./mysql
    ports:
      - 3306:3306
    environment:
      MYSQL_ROOT_PASSWORD: root
      TZ: Asia/Tokyo
    volumes:
      - mysql-data:/var/lib/mysql
  app:
    build: ./app
    volumes:
      - .:/selenium_ruby
    links:
      - db
volumes:
  mysql-data:
    external: true

```