Dockerで使っているコンテナを作り直す方法

- 環境
    - Dockerホスト
        - CentOS Linux release 7.6.1810 (Core)
        - Docker version 18.09.6, build 481bc77156
        - docker-compose version 1.24.0, build 0aa59064
    - Dockerコンテナ : CentOS Linux release 7.6.1810 (Core)

# やりたいこと
[Dockerコンテナ上のChromeの動きが悪い](https://qiita.com/ponsuke0531/items/a96105a17a5c63612478)から/dev/shmののサイズを増やしたい。
けど、コンテナはいろいろ使っちゃっているから今のコンテナの状態は維持したい。

# コンテナの情報を確認する
[docker psでコンテナリストを表示・取得する | Unskilled?](https://unskilled.site/docker-ps%E3%81%A7%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%83%AA%E3%82%B9%E3%83%88%E3%82%92%E8%A1%A8%E7%A4%BA%E3%83%BB%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B/)

```bash
$ docker ps -a
CONTAINER ID        IMAGE                      COMMAND             CREATED             STATUS              PORTS                                             NAMES
{コンテナID}         {コンテナを作ったときのイメージ} "/usr/sbin/init"    4 weeks ago         Up 3 hours          0.0.0.0:8084->3389/tcp, 0.0.0.0:8085->8080/tcp    {コンテナ名}
de7908c6e739        host-project_saru          "/usr/sbin/init"    4 weeks ago         Up 3 hours          0.0.0.0:8080->3389/tcp, 0.0.0.0:28080->8080/tcp   project_saru
```

# コンテナを停止する
[Dockerコンテナの作成、起動〜停止まで - Qiita](https://qiita.com/kooohei/items/0e788a2ce8c30f9dba53)

```bash
$ docker stop {コンテナID}
{コンテナID}

# 停止したか確認する
$ docker ps -a
CONTAINER ID        IMAGE                       COMMAND             CREATED             STATUS                       PORTS                                             NAMES
{コンテナID} {コンテナを作ったときのイメージ}          "/usr/sbin/init"    4 weeks ago         Exited (137) 5 seconds ago                                                     {コンテナ名}
de7908c6e739        host-project_saru          "/usr/sbin/init"    4 weeks ago         Up 3 hours                   0.0.0.0:8080->3389/tcp, 0.0.0.0:28080->8080/tcp   project_saru
```

# コンテナをイメージを作成する
```bash
# 今あるイメージを確認しておく
$ docker images
REPOSITORY                      TAG                 IMAGE ID            CREATED             SIZE
{コンテナを作ったときのイメージ}      latest              11077df73f13        4 weeks ago         4.99GB
host-project_saru               latest              673ece8894c8        4 weeks ago         4.98GB
centos                          7.6.1810            f1cb7c7d58b7        4 months ago        202MB

# イメージを作成する・・・しばし時間がかかる
$ docker commit {コンテナ名} {イメージ名}:{タグ}
sha256:{イメージIDの長いやつ}

# コンテナを作ってから色々やっているので前のイメージよりサイズが大きくなった
$ docker images
REPOSITORY                      TAG                 IMAGE ID            CREATED             SIZE
{イメージ名}                      {タグ}              {イメージID}          47 seconds ago      7.71GB
{コンテナを作ったときのイメージ}      latest              11077df73f13        4 weeks ago         4.99GB
host-project_kuma               latest              9ad0feb2348d        4 weeks ago         4.98GB
host-project_saru               latest              673ece8894c8        4 weeks ago         4.98GB
centos                          7.6.1810            f1cb7c7d58b7        4 months ago        202MB
```

## (任意)イメージをファイルにバックアップする
コンテナを再作成するだけであれば必要はないのですが、他のホストなどで今後同じコンテナを作ったりまた作り直したりしたい場合はバックアップファイルを作っておきます。

```bash
# イメージをバックアップファイルに出力する
$ docker save -o {バックアップファイル名}.tar {コンテナ名}:{タグ}

# バックアップファイルが出力された
$ ls -l | grep {バックアップファイル名}
-rw-------. 1 dockeruser dockeruser 7826729472 Jul 23 12:35 {バックアップファイル名}.tar

# バックアップファイルに出力してもイメージは残っている
$ docker images
REPOSITORY                      TAG                 IMAGE ID            CREATED             SIZE
{イメージ名}                     {タグ}               {イメージID}          8 minutes ago       7.71GB
{コンテナを作ったときのイメージ}      latest              11077df73f13        4 weeks ago         4.99GB
host-project_saru               latest              673ece8894c8        4 weeks ago         4.98GB
centos                          7.6.1810            f1cb7c7d58b7        4 months ago        202MB
```


### (任意)バックアップファイルからイメージを復元する
以前作ったバックアップファイルを使いたいときはイメージを復元します。

```bash
$ docker load -i {バックアップファイル名}.tar
```

# docker-compose.ymlを修正する
[run &mdash; Docker-docs-ja 17.06.Beta ドキュメント](http://docs.docker.jp/engine/reference/commandline/run.html)

```bash
$ vi docker-compose.yml
version: "3.7"
services:
  {サービス名}:
    # ↓↓↓ここから↓↓↓
    build:
      context: ./dir
      dockerfile: {設定を書いたDockerfile}
      args:
        USER: {コンテナでのユーザ}
        PORT: {コンテナのポート}
    # ↑↑↑ここまで削除する↑↑↑
    # ↓↓↓イメージを指定する↓↓↓
    image: {イメージ名:タグ}
    # ↑↑↑イメージを指定する↑↑↑
    ...他の設定いろいろ...
    # ↓↓↓今回はChromeが使う領域を増やしたいので↓↓↓
    shm_size: 1gb
    # ↑↑↑/dev/shmのサイズを指定する↑↑↑
    ...他の設定いろいろ...
```

## build関連の設定を消し忘れるとエラーになります
初心者過ぎて書き方がよくわからずエラーになった・・・

```bash
# コンテナを作り直そうとしたら・・・エラー
$ docker-compose up -d {コンテナ名}
ERROR: yaml.scanner.ScannerError: mapping values are not allowed here
  in "./docker-compose.yml", line 5, column xx

# contextが残っていたのが原因(エラーに行番号が出力されている場合はcat -nで行番号を表示すると便利)
$ cat -n docker-compose.yml
1 version: "3.7"
2 services:
3   {サービス名}:
4     image: {イメージ名:タグ}
5       context: ./dir
    ...他の設定いろいろ...

# contextを削除
$ vi docker-compose.yml
version: "3.7"
services:
  {サービス名}:
    image: {イメージ名:タグ}
    ...他の設定いろいろ...
```

[contextの説明はこちら](http://docs.docker.jp/compose/compose-file.html#context)

# コンテナを作り直す
注意 : 対象のコンテナ名を指定し忘て、他のコンテナに影響しないように気をつける。

```bash
$ docker-compose up -d {コンテナ名}
Recreating {コンテナ名} ... done

$ docker ps
CONTAINER ID        IMAGE                 COMMAND             CREATED             STATUS              PORTS                                             NAMES
{新しいコンテナID}    {コンテナ名}:{タグ}      "/usr/sbin/init"    29 seconds ago      Up 28 seconds       0.0.0.0:8084->3389/tcp, 0.0.0.0:8085->8080/tcp    {コンテナ名}
de7908c6e739        host-project_saru     "/usr/sbin/init"    4 weeks ago         Up 4 hours          0.0.0.0:8080->3389/tcp, 0.0.0.0:28080->8080/tcp   project_saru
```