Posted at

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の動きが悪いから/dev/shmののサイズを増やしたい。

けど、コンテナはいろいろ使っちゃっているから今のコンテナの状態は維持したい。


コンテナの情報を確認する

docker psでコンテナリストを表示・取得する | Unskilled?

$ 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

$ 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


コンテナをイメージを作成する

# 今あるイメージを確認しておく

$ 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


(任意)イメージをファイルにバックアップする

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

# イメージをバックアップファイルに出力する

$ 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


(任意)バックアップファイルからイメージを復元する

以前作ったバックアップファイルを使いたいときはイメージを復元します。

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


docker-compose.ymlを修正する

run — Docker-docs-ja 17.06.Beta ドキュメント

$ vi docker-compose.yml

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


build関連の設定を消し忘れるとエラーになります

初心者過ぎて書き方がよくわからずエラーになった・・・

# コンテナを作り直そうとしたら・・・エラー

$ 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の説明はこちら


コンテナを作り直す

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

$ 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