Dockerを使って環境構築してみよう!
dockerを学び始めて一週間思った事と魅力を書きたいと思います!!
まずはdockerとは?dockerとcomposeの違いは?について説明します。
Dockerとは何か?
Dockerは、ソフトウェアをパッケージ化し、そのパッケージ(これを「コンテナ」と呼びます)が
どの環境でも同じよう に動作するようにする技術です。
この技術を利用することで、開発者はアプリケーションを作成し途中で仲間が参加するとします、
仲間のPCに元の開発者のイメージをダウンロードしビルドしてコンテナを立ち上げます。
このコンテナには、アプリケーションが動作するために必要なライブラリや言語が
全てインストールされているので
ホストに必要なライブラリや言語がインストール
されていなくてもホスト環境に依存せずに簡単にアプリを共同開発できます!!!
素晴らしい!
docker-composeとdockerの違いは?
Docker Compose入門 サイトからお借りしました!
ざっくり言います!
docker runコマンドが長くなったりコンテナが複数あれば迷わずcomposeを使った方がいいです!!
以下違いを説明
docker
Dockerは一つのコンテナを管理するためのツールで、
イメージのビルド、コンテナの起動・停止・削除など、基本的な操作を行います。
docker-compose
docker-composeは複数のコンテナを一緒に管理するためのツールで、
docker-compose.ymlファイルに書かれた設定に基づいて、複数のコンテナを一度に操作します。
これにより、1コマンドで複数のコンテナが起動できたり止めたり削除したりすることが可能!
docker-composeはすべてのコンテナを同じネットワークに自動接続で設定してくれるので
コンテナ間の通信が簡単になります!素晴らしい!!!
docker-composeを使ってコマンドを短くしよう!
dockerfileのみ(rubyとポスグレ)でコマンドをうった場合
docker volume create db-data
docker network create my-network
docker run -d --name=web --network=my-network -p 3000:3000 -v $(pwd):/myapp my_rails_app
docker run -d --name=db --network=my-network -p 5432:5432 -v db-data:/var/lib/postgresql/data postgres:latest
この様にコマンドが長く4コマンドが必要ですが、docker-compose.ymlに一回書いてしまえば今後
開発再開する際にコンテナを起動する時に1コマンドで起動できます!
まずはdocker-compose.ymlを作成します。
version: '3.8'
volumes:
db-data
services:
web:
build: .
ports:
- "3000:3000"
volumes:
- .:/myapp
depends_on:
- db
db:
image: postgres:latest
volumes:
- db-data:/var/lib/postgresql/data
docker-compose up
たったこの1コマンドで2つのコンテナを起動できます!
docker-composeはただ単に1コマンドでできるだけがメリットではありません。
見えることにより他の人が見てこんなことやってるんだなと可視化もメリットの一つです!
既存のwebアプリをdocker化しよう
既存のアプリをdocker化してみました!!
まずは、アプリのディレクトリをカレントディレクトリにし必要なものを追加します。
touch Dockerfile
touch docker-compose.yml
いま開発している言語とバージョンに気をつけてDockerfileに記述します。
docker-compose.ymlにも必要なコードを書きます!
この部分が言語などがいろいろなため省略します。
docker-compose build
でビルドしdocker-compose up
でコンテナを起動します。
docker-compose up -d
でデタッチドモードでバックグラウンド起動できます。(ターミナルが占領されない)
docker compose exec web(サービス名) bash
でコンテナの中にbashで入れます。
-itの部分はdocker-compose.ymlで書いてあるとします。
ここからは、Railsの場合になります。
元々DBにはSQLiteを使っていたとします。
今後はポスグレを使うとします。
このままですと、nodatabase とエラーが出ます。
コンテナ内でrails db:create
で database を作ります。
rails db:migrate
アプリ内にある migrate ファイルのデータを DB に送ります。
次に webpacker エラーが出ます。
コンテナ内でインストールします。
bundle exec rails webpacker:install
してbundle exec rails webpacker:compile
webのポートは3000番とします!
最後に localhost:3000 と検索してアプリが表示されたら成功です!!!!!
最後に、dockerの素晴らしさ
Dockerを学んだり、既存のアプリケーションをDocker化したりする過程は、
初めての人にとっては少々難しく感じられるかもしれません、
自分はまだまだわからないことはいっぱいありますが最初に比べたら進歩はあります!!
個人的に思う最大の利点
開発環境の一貫性です!
"うまく動作していたのに、本番環境では動かない"という経験をしたことがあるなら、
Dockerはその問題を解決します。Dockerを使えば、開発者のローカルマシン上で動作するものは、
本番環境でも同じように動作します。素晴らしい!!!!
もし万が一PCが壊れてしまったら、、、1から環境構築をするのはとてもとてもとっても大変です。
ですがある程度dockerに慣れていたらdockerを使うのに
必要なアプリをダウンロードしてコード書いておしまいです。
(それか自分のGitHubにアクセスして今まで書いたDockerファイルとcompose.ymlコピペ)
OSによるエラーもありません。
DockerHubに自分の作成したイメージをpushしていたらpullすればおk!
これからの開発やちょっとした学習でもDockerを使っていきます!!