さてRailsをMysqlでNginxでも動作するように環境構築をする方法ですが、Dockerを使用します。(Dockerはいいぞうお)VSCodeを使用して説明を行うので、インストールされていない方の閲覧はお勧めしません。なのでDocker、VSCodeをインストールされていない方はインストールを行うか、別のドキュメントをご覧ください。
Nginxは最新のものを利用しているのでもしかすると相性が悪くなって利用できない可能性もあります。その際はバージョンを指定していただくことをお勧めします。
そしてテンプレートを用意いたしましたので書き込むのが面倒な方はこちら
まず初めにディレクトリを紹介します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| .
├── docker
│ ├── app
│ │ ├── Dockerfile
│ │ └── entrypoint.sh
│ ├── docker-compose.yml
│ ├── mysql
│ │ ├── Dockerfile
│ │ └── tmp
│ │ └── db
│ │ ├──*
│ └── nginx
│ ├── Dockerfile
│ ├── log
│ │ ├── access.log
│ │ └── error.log
│ ├── nginx.conf
│ └── ssl
├── src
│ ├── Gemfile
│ ├── Gemfile.lock
|
*コマンド等により生成されるファイル等は省いています。
また、このようなディレクトリ構成(Docker用とRails用で分けている)にされない場合はあまり参考にならない可能性があるので別のドキュメント等を閲覧することをお勧めします。
まず、アプリを保存するディレクトリを作成してください。
そして移動してください。cd app-dir
この時点でGitを利用したい場合はgit init
を実行しておきましょう(後でよいとは思いますが、もし少し違うやり方をしたくなった際に戻れるので便利かとは思います)。移動した後はディレクトリを二つ作成します。Docker用とRailsのソースコード用になります。mkdir docker src
この辺は好みですが、こちらのほうがわかりやすくはなるのでこちらを採用しています。ディレクトリを作成後、code .
を実行し、VSCodeを起動しましょう。開いて一番上にあるタブ?欄に『ターミナル』とあると思います(場合によっては三本線か・・・マーク担っています)。それを押してターミナルを起動してください。起動した状態で次のコマンドを順に打っていって下さい。
1
2
3
| cd docker
mkdir app mysql nginx
touch docker-compose.yml app/Dockerfile mysql/Dockerfile nginx/Dockerfile
|
実行後は各ファイルに次のように打ち込んでいきましょう。
『app/Dockerfile』
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| FROM ruby:2.7
RUN apt-get update -qq && apt-get install -y nodejs postgresql-client
RUN mkdir /myapp
WORKDIR /myapp
COPY ./src/Gemfile /myapp/Gemfile
COPY ./src/Gemfile.lock /myapp/Gemfile.lock
COPY ./docker/app/entrypoint.sh /usr/bin/
RUN bundle install --path vendor/bundle
RUN chmod +x /usr/bin/entrypoint.sh
RUN apt install -y sudo
ARG USERNAME=user
ARG GROUPNAME=user
ARG UID=1000
ARG GID=1000
RUN groupadd -g $GID $GROUPNAME \
&& useradd -m -s /bin/bash -u $UID -g $GID $USERNAME
RUN chown -R 1000:1000 /myapp
|
『mysql/Dockerfile』
『nginx/Dockerfile』
『docker-compose.yml』
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
| version: '3'
services:
app:
build:
context: ..
dockerfile: ./docker/app/Dockerfile
tty: true
volumes:
- ../src:/myapp
depends_on:
- mysql
working_dir: /myapp
command: sh /usr/bin/entrypoint.sh
ports:
- "3000:3000"
user: user
mysql:
build:
context: ..
dockerfile: ./docker/mysql/Dockerfile
volumes:
- ./mysql/tmp/db:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: myapp_development
MYSQL_USER: myapp_user
MYSQL_PASSWORD: password
nginx:
container_name: nginx
build:
context: ..
dockerfile: ./docker/nginx/Dockerfile
environment:
TZ: Asia/Tokyo
ports:
- "80:80"
volumes:
- ../src:/var/www/myapp
- ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf
- ./nginx/log:/var/log/nginx
- ./nginx/ssl:/etc/nginx/conf.d/ssl
working_dir: /var/www
depends_on:
- app
tty: true
volumes:
dbdata:
myapp:
|
こちらでDockerに必要なファイルは書き終わりましたが、各アプリに必要なファイルがあるのでそちらも追加していきます。次のコマンドを打ってください。
1
| touch app/entrypoint.sh nginx/nginx.conf
|
作成した後、下記の情報を各ファイルに打ち込んでください。
『app/entrypoint.sh』
1
2
3
4
5
6
7
| bundle install --path vendor/bundle
bundle update
bundle exec rails db:create
bundle exec rails db:migrate
bundle exec rails db:seed
rm -f tmp/pids/server.pid
bundle exec rails s -p 3000 -b '0.0.0.0'
|
『nginx/nginx.conf』
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
| upstream puma {
server app:3000;
}
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name app.com;
root /myapp/public;
try_files $uri/index.html $uri @puma;
location @puma {
proxy_pass http://puma;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
error_page 500 502 503 504 /500.html;
client_max_body_size 4G;
keepalive_timeout 10;
}
|
お次はRailsに必要なGemfileを記述しましょう。srcディレクトリに移ってください。VSCodeなら新規ファイルで下記のファイルを作ってください。コマンドランで作成する場合はtouch ../src/Gemfile ../src/Gemfile.lock
を行ってください。ディレクトリには気を付けてください(ページ上のディレクトリ構成を見ていただけるとわかりやすいかと)。Gemefile.lockは何も書かなくてよいですが、Gemfileには下記のものを記述してください。
『src/Gemfile』
1
2
3
| source 'https://rubygems.org'
gem 'rails', '~> 5'
|
さあ、docker-compose up -d
してみましょう。あれ?localhost
にアクセスしても502 Bad Gatewayと出てしまいます。これはRailsが動作していない証ですね。試しにlocalhost:3000
にもアクセスしてみましょう。当然アクセスできません。docker ps
やDocker Desktopを利用してコンテナの状況を見ると、appコンテナが終了しています。これはsrcフォルダ内を見てもらってもわかるようにRailsのソースコードが生成されていません。なのでbundle exec rails new .
をしましょう。今回はDockerを利用しているので下記のコマンドを順次実行してみてください。
1
2
3
4
5
6
7
8
| docker-compose run app bash
bundle install
bundle update
bundle exec rails new .
bundle update
exit
docker-compose down
docker-compose up -d
|
さあどうでしょう!Yay!は出ましたか?
今回はちゃんとNginxの設定をしていないのでポート番号3000番をつけてもつけなくてもアクセスできています。また、どこかおかしな点がある場合は連絡を頂けると嬉しいです。
追記root権限でRailsを生成しているので編集ができない状態でした。修正したと思うので今後は大丈夫だと思います。