こんにちは。趣味グラマの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最高。
コメント