Version
ruby 2.5.7
rails 5.2.4
構成
RailsProject
├── mysql
│
├── nginx
│ ├── Dockerfile
│ ├── default.conf
│
├── rails
│ ├── Dockerfile
│ ├── Gemfile
│ ├── Gemfile.lock
│
├── static
│ ├── index.html
│
└── docker-compose.yml
STEP1_ブラウザからNGINXへアクセス
1.プロジェクトフォルダにnginxフォルダを作成し、Dockerfileを作成します
$mkdir nginx
$cd nginx
nginx$ touch Dockerfile
2.Dockerfileを確認
# (1)ベースイメージとして軽量のNginxイメージを使用
FROM nginx:alpine
# (2)ローカルのdefault.confファイルをNginxの設定ディレクトリにコピー
# COPY ./default.conf /etc/nginx/conf.d/default.conf
(1)軽量のNGINXをベースとして使います。
(2)default.confの説明は後述します。この工程ではNGINXにアクセスできることを
確認するためコメントアウト
3.DockerfileからイメージをビルドしNGINXコンテナを起動します
# ビルド
nginx$ docker build -t nginx .
# イメージ一覧を確認
nginx$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 93f9c72967db 6 weeks ago 47MB
# nginxコンテナを起動
nginx$ docker run -d -p 8888:80 nginx
4.ブラウザからNGINXにアクセスできるか確認します
ブラウザでhttp://localhost:8888/にアクセスします。
このように表示されれば接続は成功です。
STEP2_NGINXを介してRailsにアクセスします
1.default.confの設定
server {
listen 80; # ポート80で待ち受け
server_name localhost; # サーバー名の設定
location / {
proxy_pass http://web:3000; #railsに接続
proxy_set_header Host $host; # クライアントのホスト名を設定
proxy_set_header X-Real-IP $remote_addr; # クライアントのIPアドレスを設定
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # クライアントの元のIPアドレスを設定
proxy_set_header X-Forwarded-Proto $scheme; # プロトコル(httpまたはhttps)を設定
}
}
2.Dockerfile・docker-compose.ymlの作成
# ベースにするイメージを指定
FROM ruby:2.5.7
# RailsのインストールやMySQLへの接続に必要なパッケージをインストール
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs default-mysql-client vim
# rubygemsの更新
RUN gem update --system 3.2.3
# コンテナ内にappディレクトリを作成
RUN mkdir /app
# 作成したmyappディレクトリを作業用ディレクトリとして設定
WORKDIR /app
# ローカルの Gemfile と Gemfile.lock をコンテナ内のmyapp配下にコピー
COPY Gemfile /app/Gemfile
COPY Gemfile.lock /app/Gemfile.lock
# コンテナ内にコピーした Gemfile の bundle install
RUN bundle install
# ローカルのmyapp配下のファイルをコンテナ内のmyapp配下にコピー
COPY . /app
version: '3'
services:
nginx:
build:
context: ./nginx
ports:
- "80:80"
depends_on:
- web # Nginxがwebに依存して起動
volumes:
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf # Nginx設定ファイルの追加
web:
build:
context: ./rails
command: bash -c 'rm -f /app/tmp/pids/server.pid && rails server -b 0.0.0.0'
volumes:
- ./rails:/app
ports:
- "3000:3000"
3.rails newでプロジェクトファイルの生成
railsの雛形をつくりGemfileを更新します。
$ docker-compose run web rails new . --force --database=mysql --skip-bundle
4.ビルドを実行し更新されたGemをインストールします。
$ docker-compose build
5.コンテナを起動します。
$ docker-compose up -d
docker-compose psコマンドで起動中のコンテナを確認します。
$ docker-compose ps
Name Command State Ports
----------------------------------------------------------------------------------------------
rp-nginx-1 /docker-entrypoint.sh ngin ... Up 0.0.0.0:80->80/tcp,:::80->80/tcp
rp-web-1 bash -c rm -f /app/tmp/pid ... Up 0.0.0.0:3000->3000/tcp,:::3000->3000/tcp
6.ブラウザからrailsにアクセスします。
ブラウザでhttp://localhost:3000/にアクセスします。
Mysqlの設定をしてないので現時点ではこのように表示されれば接続は成功です。
docker-compose run web rails new . --force --no-deps --database=mysql
docker-compose run: Docker Composeで新しいコンテナを一時的に実行します。
web: 実行するサービスの名前(この場合はwebサービス)。
rails new: Railsのコマンドで、新しいRailsアプリケーションを作成します。
.: 現在のディレクトリに新しいRailsアプリケーションを作成します。
DockerファイルのWORKDIRで指定したパスがカレントディレクトリとなる
--force: 既存のファイルがあっても上書きします。
--no-deps: 依存サービスを起動せずに、このサービスだけを実行します。
--database=mysql: データベースとしてMySQLを使用するように設定します。
docker-compose build
ymlに記載されたサービス全てに対してビルドを行う
docker-compose up
コンテナ起動
docker-compose logs web
ログを確認
docker ps
dockerの起動状態を確認
■Dockerfile
RUN ビルド時に実行
CMD コンテナ起動時に実行
■yml
command コンテナ起動時に実行。DockerfileのCMDを上書きする
■ビルドコンテキスト
docker buildコマンドで指定したディレクトリ配下のファイル・ディレクトリが
dockerfileからのアクセス対象となる
/home/userでdocker build .とすると/home/user内のファイル・ディレクトリ
がビルドコンテキストとなる
dockercompose.ymlでビルドコンテキストを指定する場合は、ymlファイルからの相対パスで指定する
作業
database.yamlの変更
トラブルシューティング
- UnicornのPIDファイルの問題
原因: 既存のPIDファイルが残っていたため、Unicornが起動できなかった。
対策: Dockerfileに、古いPIDファイルを削除するコマンドを追加。
- データベースエラー ("Unknown database 'app_development'")
原因: 指定されたデータベースが存在しなかった。
対策: データベースを作成。
Dockerコマンド
dockerイメージのリストを表示する
docker image ls
コンテナのリストを表示する
docker container ls -a
未使用のイメージを一括削除
docker image prune
未使用のイメージを一括削除(tag付のイメージも含めて)
docker image prune -a
イメージを削除
docker image rm mysql:5.7
イメージをビルド
docker build [ -t {イメージ名} [ :{タグ名} ] ] {Dockerfileのあるディレクトリ}
稼働中のコンテナを表示
docker ps
コンテナの起動
docker start
コンテナの作成・起動
docker run
コンテナ内でコマンドを実行
docker-compose run web bash
停止コンテナを一括削除
docker container prune
メモ
unicornの設定はrails new の後
database.yml編集前に権限の変更
rails$ sudo chown -R $USER:$USER .