【備忘録 #4】Dockerの基本

## ■概要
https://www.youtube.com/watch?v=lZD1MIHwMBY&t=2135s

上記動画を学習しました。


## ■Dockerコマンド
### image build
Dockerfileからイメージ作成。
タグ名を`sample/webrick/latest`にする。
現在のディレクトリのDockerfileを参照。
```shell
docker image build -t sample/webrick:latest .
```

### image ls
イメージの一覧が見れる。
```shell
docker image ls
```

### container run
「sample/webrick:latest」イメージからコンテナ作成。
コンテナの8000番ポートとローカルマシンの8000番ポートを関連付ける。
コンテナ名を「webrick」とする。
```shell
docker container run -p 8000:8000 --name webrick sample/webrick:latest
```

### container stop
起動中コンテナを停止する。
以下コマンドの場合、「webrick」コンテナを停止。
```shell
docker container stop webrick
```

### container start
停止中のコンテナを起動。
```shell
docker container start webrick
```

### container rm
「webrick」コンテナを削除。
```shell
docker container rm webrick
```

### container logs
「webrick」コンテナのログを見れる。
```shell
docker container logs webrick
```

### container exec
「webrick」コンテナで`ruby -v`を実行する。
対象コンテナに入らなくても実行できる。
```shell
docker container exec webrick ruby -v
```
起動中コンテナに移動し、シェル（bash）を起動。
```shell
docker container exec -it webrick /bin/bash 
```

### system prune
全てのイメージ、
停止中コンテナを削除。
```shell
docker system prune -a
```


## ■Docker起動
Cドライブ直下にディレクトリ「docker」を作成後
下記の2ファイルを作成しました。
```ruby:main.rb
require 'webrick'

server = WEBrick::HTTPServer.new(
  DocumentRoot: './',
  BindAddress: '0.0.0.0',
  Port: 8000
)

server.mount_proc('/') do |req, res|
  res.body = 'hello'
end

server.start
```
↑フレームワーク「webrick」を利用して、サーバーを起動する処理です。

```Dockerfile:Dockerfile
FROM ruby:2.7

RUN mkdir /var/www
COPY main.rb /var/www

CMD ["ruby", "/var/www/main.rb"]
```
1. DockerHubのrubyのver.2.7を元にします。
2. ディレクトリ作成後、main.rbをコピーします。
3. main.rb実行します。

## ■Dockerfileの書き方

```dockerfile
FROM ruby:2.7

WORKDIR /var/www

COPY ./src /var/www

RUN bundle config --local set path "vendor/bundle" \
    && bundle install

CMD ["bundle", "exec", "ruby", "app.rb"]
```
`FROM`元となるイメージ
`WORKDIR`作業ディレクトリの指定
`COPY`ディレクトリ、ファイルのコピー
`RUN`イメージをビルドする際に一度だけ実行されるコマンド
`CMD`コンテナが起動するたびに実行されるコマンド


## ■Docker Compose
以下のコードだと、
webとdbという2つのコンテナを定義しています。
```yml:docker-compose.yml
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: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - ./src:/app  
    ports:
      - "3000:3000"
    environment:
      RAILS_ENV: development
    depends_on:
      - db
```

### run
上記のdocker-compose.ymlファイルで定義したコンテナのうち、webコンテナを作成・起動させ、
起動後に`web rails new . --force --database=mysql`を実行する。
```shell
docker-compose run web rails new . --force --database=mysql
```

### build
`docker-compose.yml`ファイルで、
`build:`と指定がある場合、
指定されているパスにあるDockerfileからイメージを作成する。
```shell
docker-compose build
```

### up
全コンテナ起動。
```shell
docker-compose up
```
イメージのビルドも行う。
```shell
docker-compose up --build
```

### down
コンテナ停止&削除。
```shell
docker-compose down
```

コンテナ停止&削除&イメージ削除。
```shell
docker-compose down --rmi all
```



### rm
コンテナ削除。
```shell
docker compose rm
```

### ls
一覧が見れる。
```shell
docker compose ls
```

### stop
コンテナ停止。
```shell
docker compose stop
```

### start
コンテナ実行。
```shell
docker compose start
```

### ps
起動中のコンテナが見れる。
```shell
docker-compose ps
```

### logs
ログが見れる。
```shell
docker-compose logs
```

### cp
webコンテナの`/usr/local/apache2/htdocs/index.html`ファイルを
ローカルマシンのカレントディレクトリにコピーする。
```shell
docker compose cp web:/usr/local/apache2/htdocs/index.html .
```

ローカルの./index.htmlファイルを
webコンテナの`/usr/local/apache2/htdocs/index.html`としてコピーする。
```shell
docker compose cp index.html web:/usr/local/apache2/htdocs/index.html
```


### exec
コンテナ「web」で`/bin/bash`コマンド実行。
```shell
docker-compose exec web /bin/bash
```


## ■コンテナ内のデータの永続化
下記の2種類がある。

### ボリューム
`volumes`と記述することで実装可能。
直接変更することがないデータに向いている。

### バインドマウント
ホストOSのフォルダー、ファイルをマウントする仕組み。
変更の頻度が高いデータに向いている。