既存のRailsプロジェクトをDocker化する

Docker

こんにちは。趣味グラマのNobuです。

Macを初期化したので、MySQL等を直接Macに入れたくない病になりました。
WordPressはDockerで簡単に動かせたので、Railsもいけるかなぁと思ったら、DBの文字コード等でハマったりもしましたが、思いのほか簡単にできたので備忘録として残しておきます。

ここで作成する3ファイルDockerfile、docker-compose.yml、my.cnfは全てRailsのルートディレクトリに配置しています。

Dockerfileを用意する

FROM ruby:2.5.1
RUN apt-get update && apt-get install -y nodejs --no-install-recommends && rm -rf /var/lib/apt/lists/*
RUN apt-get update && apt-get install -y mysql-client --no-install-recommends && rm -rf /var/lib/apt/lists/*
RUN apt-get update -qq && apt-get install -y build-essential nodejs
RUN mkdir /workdir
WORKDIR /workdir
ADD Gemfile /workdir/Gemfile
ADD Gemfile.lock /workdir/Gemfile.lock
RUN bundle install
ADD . /workdir

docker-compose.ymlを用意する

dbのenvironmentはプロジェクトの環境に合わせます。逆にdatabase.ymlの方をdocker-compose.ymlに合わせて修正するのも有りです。

version: '3'
services:
  db:
    image: mariadb:5.5
    environment:
      MYSQL_ROOT_PASSWORD: hogehoge 
      MYSQL_DATABASE: hoge_database
      MYSQL_USER: hoge_user
      MYSQL_PASSWORD: hoge_pass
    volumes:
      - db-data:/var/lib/mysql
      - ./my.cnf:/etc/my.cnf
  web:
    build:
      context: .
      dockerfile: Dockerfile
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    tty: true
    stdin_open: true
    depends_on:
      - db
    ports:
      - "3000:3000"
    volumes:
      - ".:/workdir" # Dockerfileで指定したディレクトリと名前を合わせる
      - "~/.ssh:/tmp/ssh_dir" # capistranoでリモートにデプロイするのにSSHの鍵が必要なのでこれを入れておく
volumes:
  db-data:

my.cnfを用意する

[mysqld]
character-set-server=utf8
skip-character-set-client-handshake
collation-server=utf8_general_ci

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

Dockerを立ち上げる

docker-compose up -d

これでpumaが起動して、localhost:3000でアクセス出来ればOKです。
もしアクセスできない場合は、「-d」を外して立ち上げると、ログがずらずら出るので、そこに原因が書かれている可能性大です。

Capistranoでデプロイする

このやり方が正しいか不明ですが、最近はRailsを殆どいじっていないので、たまにやるぐらいなら良いかと思った手抜きの方法かもしれません。

SSHの鍵をコピーする

docker-compose.ymlで/tmp/ssh_dirにホスト側のSSH一式をリンクしているので、それをrootユーザのところにコピーします。

$ docker ps CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS              PORTS                    NAMES 6683cd9e71ab        hoge_web   "bundle exec rails s…"   8 minutes ago       Up 8 minutes 0.0.0.0:3000->3000/tcp   hoge_web_1
0e43eedf0cd2        mariadb:5.5            "docker-entrypoint.s…"   8 minutes ago       Up 8 minutes        3306/tcp                 hoge_db_1
$
$ docker exec -it 66 bash
root@6683cd9e71ab:/workdir# cp -r /tmp/ssh_dir /root/.ssh

デプロイする

後はおもむろにデプロイするだけです

root@6683cd9e71ab:/workdir# bundle exec cap production deploy

まとめ

これでMac本体にMySQL入れたりとかせずRailsを使えるようになりました。
Docker最高。

コメント

タイトルとURLをコピーしました