今後の開発はDockerと共に！Dockerの魅力について

# Dockerを使って環境構築してみよう！
dockerを学び始めて一週間思った事と魅力を書きたいと思います！！

まずはdockerとは？dockerとcomposeの違いは？について説明します。

## Dockerとは何か？

Dockerは、ソフトウェアをパッケージ化し、そのパッケージ（これを「コンテナ」と呼びます）が

**どの環境でも同じよう** に動作するようにする技術です。

この技術を利用することで、開発者はアプリケーションを作成し途中で仲間が参加するとします、

仲間のPCに元の開発者のイメージをダウンロードしビルドしてコンテナを立ち上げます。

このコンテナには、アプリケーションが動作するために必要なライブラリや言語が

全てインストールされているので

ホストに必要なライブラリや言語がインストール

されていなくてもホスト環境に依存せずに簡単にアプリを共同開発できます！！！

素晴らしい！

## docker-composeとdockerの違いは？

![docker_setumei.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124781/5032827e-4651-f5e8-24f6-20159d0241ec.png)
Docker Compose入門 サイトからお借りしました!

ざっくり言います！
docker runコマンドが長くなったりコンテナが複数あれば迷わずcomposeを使った方がいいです！！

### 以下違いを説明
### docker
Dockerは一つのコンテナを管理するためのツールで、

イメージのビルド、コンテナの起動・停止・削除など、基本的な操作を行います。

### docker-compose
docker-composeは複数のコンテナを一緒に管理するためのツールで、

docker-compose.ymlファイルに書かれた設定に基づいて、複数のコンテナを一度に操作します。

これにより、１コマンドで複数のコンテナが起動できたり止めたり削除したりすることが可能！

docker-composeはすべてのコンテナを同じネットワークに自動接続で設定してくれるので

コンテナ間の通信が簡単になります！素晴らしい！！！




## docker-composeを使ってコマンドを短くしよう！

dockerfileのみ(rubyとポスグレ)でコマンドをうった場合
```bash:ホストのターミナル
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を作成します。

```yml: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
```

```bash
docker-compose up
```

たったこの１コマンドで２つのコンテナを起動できます！

docker-composeはただ単に１コマンドでできるだけがメリットではありません。

見えることにより他の人が見てこんなことやってるんだなと可視化もメリットの一つです！

## 既存のwebアプリをdocker化しよう

既存のアプリをdocker化してみました！！

まずは、アプリのディレクトリをカレントディレクトリにし必要なものを追加します。

```zsh:ホストターミナル
touch Dockerfile
touch docker-compose.yml
```
:::note
いま開発している言語とバージョンに気をつけてDockerfileに記述します。

docker-compose.ymlにも必要なコードを書きます！

この部分が言語などがいろいろなため省略します。
:::

`docker-compose build`でビルドし`docker-compose up`でコンテナを起動します。

`docker-compose up -d`でデタッチドモードでバックグラウンド起動できます。(ターミナルが占領されない)

`docker compose exec web(サービス名) bash`でコンテナの中にbashで入れます。

-itの部分はdocker-compose.ymlで書いてあるとします。

:::note warn
ここからは、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を使っていきます！！