【Docker 備忘録】image, containerに名前をつける/ホストのディレクトリをマウントする

## 概要

* Docker学習中
* Rails, Anaconda環境を構築したい
* やりたいこと
    * イメージとコンテナに名前をつけたい
    * ファイル管理はホスト側で行いたい

<br>

## 環境

* macOS Catalina 10.15.7
* Docker 19.03.13

### Dockerのバージョン確認

```:terminal
% docker --version
=> Docker version 19.03.13, ***
```

### Dockerコマンド/オプション確認

```:terminal
% docker --help
=>
Options:
  (略)
  -v, --version            Print version information and quit
```

<br>

## ディレクトリ構成

今回は、ホスト側の``host-directory``とコンテナ側の``container-directory``を紐付けます。

```:ホスト
~
|-- docker-test
    |-- Dockerfile  # これをビルドする
    |-- host-directory   # これをファイル管理用ディレクトリにする
```

```:コンテナ
/
|-- container-directory  # これとHostのhost-directoryを紐付ける
```

<br>

## build→run→ファイル操作までの流れ

### Dockerfile

ビルドすることで、「コンテナ」の設計図となる「イメージ」を作れるのが「Dockerfile」です。
これを書いていきます。

```dockerfile:Dockerfile
FROM ubuntu:latest
RUN apt-get update && \
    apt-get install -y vim && \
    mkdir /container-directory
```

少し解説すると、

* ``FROM ubuntu:latest`` : ubuntuのイメージをpull
* ``RUN``
    * ``apt-get update && apt-get install -y vim`` : vimをインストール
    * ``mkdir /container-directory`` : ルート直下にcontainer-directoryを作成

という内容が記載されています。

### docker-testという名前でビルド (imageを作成)

先ほど作成したDockerfileから``docker-test``という名前のイメージを作成します。

```:terminal
[~/docker-test] % docker build -t docker-test .
```

作成できたかは、``docker image ls``で確認できます。

```:terminal
% docker image ls
=>
REPOSITORY      TAG        IMAGE ID         CREATED             SIZE
docker-test     latest     2c980ecce523     39 seconds ago      167MB
```

<br>

### Docker imageからコンテナを作成

以下の条件でコンテナを作っていきます。

* ``docker-test-container``というコンテナ名
* ``Hostのhost-directory``と``containerのcontainer-directory``を紐付ける

コマンドは以下のとおりです。

```:terminal
# 以下のコマンドは、①スペース区切り、②一行、で入力して下さい
# 見やすいように改行で表現しています。

[~/docker-test] % docker run
　　　　　　　　　　　--name docker-test-container
　　　　　　　　　　　-v ~/docker-test/host-directory/:/container-directory
　　　　　　　　　　　-it docker-test bash
```

コマンドについてまとめます。

* ``run`` : イメージからコンテナを作成
* ``--name`` : コンテナ名を指定
* ``-v ホストのディレクトリパス:コンテナのディレクトリパス`` : ディレクトリの紐付け
* ``-it イメージ名 bash`` : (厳密には違うが)コンテナ内にとどまり、bashを起動する

現在、ubuntuOSのコンテナ内でbashが起動している状態です。
``ls``コマンドを入力すると、

```
root@167fe740d63e:/# ls
=>
bin  boot  container-directory  dev  etc  home  lib  lib32  lib64  libx32
media  mnt  opt  proc  root  run  sbin  srv  sys  test  tmp  usr  var
```

Dockerfileで記載した通り、``container-directory``が作成されているのが確認できました。

<br>

### ディレクトリでファイル操作し、マウントを確認

コンテナ内のcontainer-directoryでファイル操作をし、ホスト側のhost-directoryに反映されるか確認してみましょう。

```:terminal（コンテナ）
/# cd container-directory
/container-directory# touch test
/container-directory# ls
test
/container-directory# vim test
(vim で hello! を入力)
```

host側で``test``というファイルがあるか、そして``hello!``という内容か、確認しましょう。

```:terminal（ホスト）
[~/docker-test] % ls host-directory
test
[~/docker-test] % cat host-directory/test
hello!
```

確認できました！
ちなみに、ホスト側でファイルを作成/編集/削除等した場合も、コンテナ側に反映されます。

あくまで``同じディレクトリをどこから参照しているかの違いであり、見ている物自体は一緒``だということは覚えておきましょう！

<br>

### コンテナ、イメージの削除

コンテナからは``exit``コマンドで抜けられます。

```
root@167fe740d63e:/container-directory# exit
exit
[~/docker-test] %
```

コンテナ、イメージは次のコマンドで削除できます。

```
% docker rm docker-test-container  # コンテナの削除
% docker rmi docker-test           # イメージの削除
```

以上、Dockerの基本コマンドでした。

## 参考

* [Udemy | 米国AI開発者がゼロから教えるDocker講座](https://www.udemy.com/share/103aWtAEISeFhQQnUB/)