今回の概要
Dockerを初めて使って、バックエンドの環境を構築してみました。
最初は難しいと抵抗があったものの、作ってみると意外と楽しい。さらにローカル環境を汚さなくて良いという部分は、とても良かったです。
今回、ルートユーザーで作成しているので、何でもできてしまう危ういDocker環境となっていますが、あくまで個人利用を目的としています。
使用技術
詰まったポイント
基本的に、ネットで落ちている記事やDockerのドキュメントを呼んでいけば大丈夫でした。
M1macの部分は、platformを指定して上げる必要があるので、注意!!!
dockerの主なコマンド
実際に実行するためのコマンドをざっくり紹介します。
意外とコマンドってローカル環境で作る場合と異なります。基本的にdocker compose
をつけ忘れないで! docker-compose
の-
はversion3からつけなくても良くなったみたいです。
基本的にDBへの接続をすることは最初の頃は無いと思いますが、コマンドを載せておきます。ルートユーザーになっているので、複数人でつかう場合はルートユーザーで入れないようにしたほうが良いと思いました。なんでもできてしまうのでは?と思っています。(実際にやったことがないのでわかりませんが...)
# docker 起動(初回) $ docker compose build # 通常起動 $ docker compose up # バックグラウンド $ docker compose up -d # docker 停止 $ docker compose down # docker 再起動 gem追加などのとき $ docker compose restart # gemfile追加 $ docker compose exec web bundle install # 初回データ作成 $ docker compose exec web rails db:create RAILS_ENV=development # migrationファイル追加 $ docker compose exec web rails db:migrate RAILS_ENV=development # rails console使用時 $ docker compose exec web rails c # DBコンテナに入る $ docker-compose exec db bash # rootユーザになっている場合 $ mysql -u root -p
完成形
Dockerfile
FROM ruby:3.2.0 ENV LANG=ja_JP.UTF-8 ENV TZ=Asia/Tokyo RUN apt-get update -qq && apt-get install -y nodejs RUN mkdir /myapp WORKDIR /myapp COPY Gemfile /myapp/Gemfile COPY Gemfile.lock /myapp/Gemfile.lock RUN bundle install COPY . /myapp # Add a script to be executed every time the container starts. COPY entrypoint.sh /usr/bin/ RUN chmod +x /usr/bin/entrypoint.sh ENTRYPOINT ["entrypoint.sh"] EXPOSE 3010 # Start the main process. CMD ["rails", "server", "-b", "0.0.0.0"]
docker-compose.yml
version: '3' services: web: build: . command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3010 -b '0.0.0.0'" volumes: - .:/myapp ports: - "3010:3010" depends_on: - db-develop - db-test - redis # コンテナ起動を続けるため tty: true #標準出力とエラー出力を結びつける stdin_open: true db-develop: image: mysql # M1 CPUのためにplatform指定 platform: linux/amd64 # DBのレコードが日本語だと文字化けするので、utf8をセットする command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci volumes: - db-develop-volume:/var/lib/mysql # 環境変数 environment: MYSQL_ROOT_PASSWORD: password MYSQL_DATABASE: myapp_development TZ: "Asia/Tokyo" ports: - "3306:3306" db-test: image: mysql # M1 CPUのためにplatform指定 platform: linux/amd64 # DBのレコードが日本語だと文字化けするので、utf8をセットする command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci volumes: - db-test-volume:/var/lib/mysql # 環境変数 environment: MYSQL_ROOT_PASSWORD: password MYSQL_DATABASE: myapp_test TZ: "Asia/Tokyo" ports: - "3307:3307" redis: image: redis volumes: - redis-data:/data ports: - "6379:6379" volumes: db-develop-volume: db-test-volume: redis-data:
config/database.ymlもこちらに合わせて、設定してください。
注意点
駆け出しエンジニアです。日々の業務や学習から、気になったことをアウトプットしています。
まだ、理解できていない点も多く、間違えている点が多々あるかと思います。
その時は、ご指摘いただけると助かります。よろしくお願いします。