Open nakatievent opened 3 years ago
Docker
とは
必要なアプリケーション
コマンド一覧
docker run hello-world
docker run
(クライアント)がデーモン(クライアントが実行したコマンドを受け取ってイメージやコンテナを操作するアプリケーション)にタスクを実行するように伝える。伝えたらHello-WorldというイメージをDockerレジストリが取得(イメージをオンライン上に保存するのがDockerレジストリ)。取得したイメージからコンテナを作成して起動させる。Dockerfile
→ イメージ、作成・起動 → コンテナDockerfile
はイメージのひな形。Dockerfile
の内容を元にDockerのイメージを作る。RUN
はコマンドの実行。docker image build -t sample/webrick:latest .
(docker
のイメージを作る。-t 〇〇
はタグの名前。.
は今いるディレクトリのdockerfile
を参照する)docker image ls
docker
のコマンド一覧を確認する→ docker --help
docker container run -p 8000:8000 --name webrick sample/webrick:latest
→(コンテナの作成と起動 -p
はポートの指定 --name
はイメージの名前)localhost:8000
でアクセスすると出る。コンテナのサイクルには、作成→起動→停止→削除 という一連の流れがあり、それを元に実行していく。
docker container ls
→コンテナの起動状態を確認するdocker container ls -a
→全部のコンテナを出すdocker container stop 〇〇
→〇〇というコンテナを停止させるdocker container rm 〇〇
→〇〇というコンテナを削除する*コントロール+Cで停止する
docker container logs 〇〇
→ログを確認するdocker container exec webrick ruby -v
→〇〇というコマンドを実行docker system prune -a
→使わないイメージやコンテナを一気に消すDockerfile
→イメージのひな型FROM ruby:2.7
→バージョンの指定WORKDIR /var/www
→作業するディレクトリの位置 どんな作業をするかを記載。COPY ./src /var/www
→ソースコードをコピーする(アプリケーションソースコードをDockerにコピーできる)RUN bundle config --local set path 'vendor/bundle' \ && bundle install
→Dockerファイルに反映させるCMD ["bundle", "exec", "ruby", "app.rb"]
→Dockerを実行するコマンド(サーバーが立ち上がる)docker container run -it -p 4567:4567 --name sinatra -v ${PWD}/src:/var/www sample/sinatra:latest
-it
→イントラクティブなプログラムを実行する(bashと接続する)-p
→ポート番号-v ${PWD}/src:/var/www
→ソースコードの共有(ローカルでコードを修正したらDocker側でも修正される。開発が楽になる)root@54674c555782:/var/www#
→bashが起動してcat gemfile
とかでコードを見れたりするbundle config --local set path ‘vendor/bundle’
→ライブラリーをインストールするディレクトリを指定するbundle install
→bundle exec ruby app.rb
→Gemfile
を使った処理を動かすdocker-compose.yml
→複数アプリケーション(複数コンテナを一括で管理)をまとめて操作する。
・イメージのビルド docker-compose build
・コンテナの作成と起動 docker-compose up -d
・コンテナを停止・削除 docker-compose down
・コンテナの一覧を表示 docker-compose ps
・ログを表示 docker-compose logs
・コンテナを作成してコマンド実行 docker-compose run <サービス> <コマンド>
・起動中のコンテナにコマンド実行 docker-compose exec <サービス> <コマンド>
Docker
関連のファイルを用意version: '3'
services:
db:
image: mysql:8.0
command: --default-authentication-plugin=mysql_native_password
volumes:
- ./src/db/mysql_data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: password
web:
build: .
↑今のディレクトリと同じディレクトリのrubyのDockerfileを使うという設定
command: bundle exec rails s -p 3000 -b '0.0.0.0'
↑rails serverを起動している
volumes:
- ./src:/app
src以下をDockerコンテナ内のappに共有する。ローカルのファイルを更新したら自動的にdockerに更新される
ports:
- "3000:3000"
environment:
RAILS_ENV: development
depends_on:
- db
docker-compose run web rails new . --force --database=mysql
→ウェブサービス(rails)に対して実行する。--force --database=mysql
はデータベースはmysqlを使用しますよという意味。docker-compose-build
→dockerfileやGemが更新されるともう一回イメージをビルドするdocker-compose up
→ビルドからの起動docker-compose run web rails db:create
→ウェブの方にデータベースの作成Docker
を使うと同じイメージからコンテナを起動させるだけなので、楽だし、差異が発生しない。heroku
はサーバーとかOS、ミドルウェアを自動で構築管理するサービス。インフラを簡単に構築して、本番環境にアプリケーションを公開するサービス。heroku
上にDocker
コンテナを後悔する。①事前準備[GitHub・Herokuの登録、Heroku Cliのインストール
]
git config --global merge.ff falsese
git config --global pull.rebase merges
git config --list
②herokuにログイン
heroku login
③herokuアプリを作成
heroku create rails-docker-haruki
→heroku
アプリの作成Docker
のイメージ置き場。heroku container:login
→イメージをコンテナレジストリにアップする。④DBを追加・設定
heroku addons:create cleardb:ignite -a rails-docker-haruki
→アドオンでデータベースの追加GitHub
にソースを渡すとデータベースに不正侵入されるので、アップしない。接続先を環境ごとに切り替えることができる。database.yml
の設定を変更する。→<%= ENV[‘APP_DATABASE’] %>、<%= ENV[‘APP_DATABASE_USERNAME’] %>、<%= ENV[‘APP_DATABASE_PASSWORD’] %>、<%= ENV[‘APP_DATABASE_HOST’] %>
heroku config:add APP_DATABASE_USERNAME=’b62bf1f80ee25a’ -a rails-docker-haruki
heroku config:add APP_DATABASE_PASSWORD=’184b8d73’ -a rails-docker-haruki
heroku config:add APP_DATABASE_HOST=’us-cdbr-east-03.cleardb.com’ -a rails-docker-haruki
heroku config:add APP_DATABASE=’heroku_8b739f60fccba26’ -a rails-docker-haruki
・heroku config -a rails-docker-haruki →環境変数の確認
⑤Dockerfileを本番環境用に修正
heroku config:add RAILS_SERVE_STATIC_FILES=’true’ -a rails-docker-haruki
→アセットプリコンファイルが本番で起動する
⑥Dockerイメージをビルド・リリース
heroku container:push web -a rails-docker-haruki
→ドッカーイメージをビルドしてコンテナレジストリーにビルドしたイメージをプッシュするheroku container:release web -a rails-docker-haruki
→dockerのコンテナをherokuにリリースしたheroku run bundle exec rake db:migrate RAILS_ENV=production -a rails-docker-haruki
→データベースのテーブルを変更する時に使う heroku run
→herokuに対してコマンドを実行する場合に使うdocker-compose up -d
→ローカルのコンテナで実行docker-compose exec web bundle exec rake db:migrate
→ローカルで実行heroku open
→herokuのアプリを開くheroku config:add RAILS_LOG_TO_STDOUT=’true -a rails-docker-haruki
→herokuのログを表示させるheroku logs -t -a rails-docker-haruki
→herokuのログを見る⑦機能追加
docker-compose up -d
→開発するようにサーバーを立ち上げるdocker-compose exec web bundle exec rails g controller users
→コントローラーを作るheroku container:push web -a rails-docker-haruki
heroku container:release web -a rails-docker-haruki
heroku container:push web -a rails-docker-haruki
コマンドを実行してDockerイメージをビルドしてコンテナレジストリにプッシュしようとしたら下記のようなエラーが出た。
Error: trust data missing for remote repository registry.heroku.com/rails-docker-haruki/web or remote repository not found: timestamp key trust data unavailable. Has a notary repository been initialized?
▸ Error: docker push exited with Error: 1
Dockerイメージをビルドしてないからエラーが出るのかと思いdocker-compose build
した後にコンテナの作成・起動をdocker-compose up -d
でやって再度heroku container:push web -a rails-docker-haruki
コマンドを実行したが変わらず上記のエラーメッセージが出る。。。
export DOCKER_CONTENT_TRUST_SERVER=https://notaryserver:4443
をターミナルに入力して上記コマンドを実行したところエラーメッセージが変わった。
Error: error contacting notary server: dial tcp: lookup notaryserver: no such host
▸ Error: docker push exited with Error: 1
翻訳すると
エラー:公証人サーバーへの接続エラー:ダイヤルtcp:ルックアップ公証人サーバー:そのようなホストはありません
▸エラー:docker pushがエラーで終了しました:1
もう訳わからん。。。
恐らく、Docker Content Trust(DCT)
が有効になっていて、イメージを利用する際(push時とか)に「発行者」と「イメージが改ざんされていないこと」を検証する機能が働いたと推測。
なので、解決策としてはopen /.zshrc
コマンドでファイルを開き、export DOCKER_CONTENT_TRUST=1
を消去すると無事heroku container:push web -a rails-docker-haruki
コマンドを実行することができた。
なぜこうなったかというと、過去にDockerの勉強をしようと下記の記事を進めた際にDCTを設定していたからである。 最強のLaravel開発環境をDockerを使って構築する
DCTを有効にしたい方にとっては「じゃあどのコマンドを実行すればエラー解決するの?」という話になりそうですが、今回はこれで進めていく。
Github
にソースコードを共有する。CI
=ビルド・テストを自動実行(バグが無いかなどコードの品質を一定に保つ・コードが変更されるたびに自動でテストを行う)CD
=自動デプロイ(継続的デリバリー)=変更を取り込んだら自動的にデプロイするCircleCI
=CI/CD構築サービス(ビルド・テスト・デプロイを自動的に行う)Git
コマンドは省略する。.gitignore
→バージョン管理する必要の無いファイルをバージョン管理下から外す(機密情報とかが書いてあるファイル)①テストコード記載
②CircleCIに登録 登録する際にGithubと連携させたいので「Githubで登録」を選択する。 プクロジェトの直下に.circleci/config.ymlを作り、config.yml上にCircle CIの設定を書くとCircle CIが動作する。
③プロジェクトを登録
④configを設定 APP_DATABASE_HOST: "127.0.0.1" →自分のコンピューターという意味
⑤環境変数を設定 master.keyの追加 heroku config:add RAILS_MASTER_KEY='f2f6e61f4fb485d1aba29bd18f34bfc0' -a rails-docker-haruki
⑥GitHubにプッシュ
git switch -c ci
git add .
git commit -m “CircleCIが動くようにconfigファイルを設定”
git push origin ci
⑦テストを修正
docker-compose exec web bundle exec rake test
git pull origin main
CircleCIめっちゃ便利やん!
「全体の流れ」
①configを修正
git checkout -b cd
git branch -d ci
②環境変数を設定
circle_ci
にログインし、projectからproject_settings→Environment Variableで環境変数を設定する
HEROKU_API_KEY
③Viewファイルを修正
docker-compose buildしてdocker-compose up -dしてlocalhost:3000
してもページに飛ばない場合はrm src/tmp/pids/server.pid
してみる。
④GitHubにプッシュ
⑤マージ、デプロイ
Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch
Docker
イメージとコンテナDockerfile
Docker Compose
echo $SHELL
で使っているシェルの種類が見れる
Docker image
はDocker
のコンテナを作る元となる物(コンテナはDocker image
から作られる)
Docker image
はDockerfile
から作られる
今回ポートフォリオを作成するにあたって
AWS、Docker、Laravel
を使用することになった。Laravel
に関してはRails
を使った経験があればすぐに慣れると想定しているが、他の2つについては正直全然知識がない状態である。そこで、色々と検索したりYoutube動画とかを見ていたところ
山浦清人さんのYoutube動画
が分かりやすそうだったのでこの動画を中心に勉強することにした。「習うより慣れろ」
この精神でやっていくしかない!