sagantaf

なんでも自分の思ったこと、経験したことを書いて生きます。

Dockerコンテナに外部からアクセスするためにポートフォワード設定を追加する

コンテナを構築した後、アプリケーションを追加したりして、

「新たなポートを使って外部からコンテナにアクセスしたい!」 「でもコンテナを作り直したくない!」

となった時、コンテナを止めずにポートフォワード設定を追加する方法を記す。 また、誤って設定してしまった時の設定削除方法も下の方に記載した。

Dockerのポートフォワードの設定は、iptablesで実装されている。 そのため、今回のように稼働しているコンテナのポートを追加する時もiptablesの設定を編集するだけ。


1. まずはコンテナのIPアドレスを確認する

設定を追加したいコンテナ名をhogeとすると、

docker inspect --format '{{ .NetworkSettings.IPAddress }}' hoge

で確認できる。 普通は、 172.17.0.2 のようなIPアドレス帯になっている。


2. NAT設定

iptablesの設定として、NATとFilteringの二つの設定を追加する必要がある。

まずはNAT設定から。

コンテナが稼働しているホストマシンのポートを--dportで指定し、

コンテナのIPアドレスとポートを--to-destinationで指定する。(IPアドレスは上記1で確認したアドレスになる)

下記の例は、ホストマシンの8001番ポートにアクセスした時に、コンテナ172.17.0.2の8888ポートに接続されるようにしたい時のコマンド。8888はpython Jupyterのデフォルトポート。

sudo iptables -t nat -A DOCKER ! -i docker0 -p tcp -m tcp --dport 8001 -j DNAT --to-destination 172.17.0.2:8888

イメージ図:

f:id:sagantaf:20181118153602p:plain


3. Filtering設定

次はFilteringの設定。

コンテナのIPアドレスを-dで指定し、ホストマシンのポートを--dportで指定する。

sudo iptables -A DOCKER -d 172.17.0.2/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 8001 -j ACCEPT


4. 設定できたか確認

最後に想定通りに設定されたか確認する。

以下のコマンドでiptablesの現在の設定をファイルに保存できる。

sudo iptables-save > iptables.txt

保存したら、中身を表示して確認する。


5. 誤って設定した時の削除方法

NAT設定の削除方法
該当の設定行数を確認する

sudo iptables -t nat -L --line-numbers

行数を指定して削除する(X に行数を入れる)

sudo iptables -t nat -D DOCKER X


Filtering設定の削除方法
該当の設定行数を確認する

sudo iptables -L --line-numbers

行数を指定して削除する(X に行数を入れる)

sudo iptables -D DOCKER X


6. シェルスクリプトにして楽に設定できるようにした

1〜4の手順をシェル化!
引数で ホストマシンのポート、コンテナ名、コンテナのポート の順で指定するようになっている。

#!/bin/bash

if [ $# -ne 3 ]; then
  echo "引数は右記のように指定する:host port, container name, container port"
  exit 1
fi

host_port=$1
container=$2
container_port=$3

ip=`sudo docker inspect --format '{{ .NetworkSettings.IPAddress }}' ${container}`

if [ $? -gt 0 ]; then
  echo 'cannot get IP address of ${container}'
  exit 1
fi

echo 'IP Address is '${ip}
echo 'host port = '${host_port}', container port = '${container_port}
read -p 'ok? (yes/no): ' yn
case ${yn} in
  yes) ;;
  no) echo 'abort.' ; exit  ;;
  *) echo 'should yes or no' ; exit  ;;
esac

# NAT
sudo iptables -t nat -A DOCKER ! -i docker0 -p tcp -m tcp --dport ${host_port} -j DNAT --to-destination ${ip}:${container_port}

if [ $? -gt 0 ]; then
  echo 'NAT設定でエラー発生'
  exit 1
fi

# Filtering
sudo iptables -A DOCKER -d ${ip}/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport ${container_port} -j ACCEPT

if [ $? -gt 0 ]; then
  echo 'Filtering設定でエラー発生'
  exit 1
fi

# save
sudo iptables-save > iptables.txt
echo 'iptables.txtに現在のiptablesの設定を保存'

EOF

DockerのTips(O'REILLYのDockerを読んで)

 

O'REILLYのDockerを読んで役立ちそうに感じた部分に自分の考えをプラスしてメモ

 

第1章

・コンテナとVMの違い

OSをホストと共有しているかどうか。

VMはホストOSとゲストOSが別れているので、Windowsサーバ上でLinuxを動かすことができる。

コンテナは同じOSを使う、つまりカーネルを共有している。また、ライブラリも同じものを使うため、冗長なコピーを持つことがなく効率的。

 

・モノリシックなシステムと比べたマイクロサービスアーキテクチャのメリット・デメリット

モノリシックなシステムはスケールアップがしやすいが、マイクロサービスはスケールアウトがしやすい。つまりマイクロサービスはボトルネックな処理を見つけてそこだけを増強できる。

デメリットとしてはサービスが増えると複雑な構成になり、処理の流れを追いづらい。

(イベントドリブンであることもあいまって。ログもサービスごとに出力されるし。)

 

第2章

SELinuxとDocker

ホストにてSELinuxをenforcingモードで稼働させると、Dockerを動かす時にPermission Dinedが発生しやすくなる。

→permissiveモードに変えることで解消できる。これはエラーを強制するのではなく、ログとして記録するだけのモード。

DockerのエキスパートになったらSELinuxを有効化してセキュリティを高めるべき。

 

第3章

 

 

今後読みながらメモを残していく。。。

 

AstropyをLinux環境にインストールする方法

Astropy をインストールする方法を書いておく。

Anacondaを使っている場合はデフォルトでインストールされている。 以下のコマンドでバージョンを確認するだけで済む。

$ conda list |grep astropy
astropy                   3.0.2            py36h3010b51_1
pytest-astropy            0.3.0                    py36_0

astropyが表示されればOK。

pipを使ってインストールする

方法としては、単純にpipでastropyを指定してインストールするだけ。

$ pip install astropy --no-deps


すでにnumpyなどをインストールしていて、バージョンを変えたくない場合は、--no-depsのオプションを付けて、Astropyだけをインストールする。
ついでにNumpyもインストールしてしまいたい場合は、オプションをつけずに下記のようにインストールする。

$ pip install astropy 
Collecting astropy
  Downloading https://files.pythonhosted.org/packages/9a/dd/379071efa94c223c596594a429ab41b8e1bb7052e40c733842a9f28674c3/astropy-3.0.4-cp36-cp36m-manylinux1_x86_64.whl (6.0MB)
    100% |################################| 6.0MB 222kB/s
Collecting numpy>=1.10.0 (from astropy)
  Downloading https://files.pythonhosted.org/packages/22/02/bae88c4aaea4256d890adbf3f7cf33e59a443f9985cf91cd08a35656676a/numpy-1.15.2-cp36-cp36m-manylinux1_x86_64.whl (13.9MB)
    100% |################################| 13.9MB 117kB/s
Installing collected packages: numpy, astropy
Successfully installed astropy-3.0.4 numpy-1.15.2

numpyも一緒にインストールされていることが分かる。

またAstropyを動かすには以下のライブラリが必須になる。
・python3.5もしくは3.6
・numpy 1.10.0 以降
・pytest 3.1以降

先述の通り、numpyはastropyをインストールする時に合わせてインストールされるが、pytestはされないので、以下のコマンドでインストールする。

$ pip install pytest


他にもscipyとかmatplotlibなどに依存した機能もあるけど、必要になったときにインストールする。

Astropyがインストールされたかどうか確認する

ここで公式ページの通りに実施すると、以下のRuntimeErrorが発生する。

$ python3
Python 3.6.5 (default, Apr  1 2018, 05:46:30)
[GCC 7.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import astropy
>>> astropy.test()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/hoge/.local/lib/python3.6/site-packages/astropy/utils/decorators.py", line 827, in test
    func = make_function_with_signature(func, name=name, **wrapped_args)
  File "/home/hoge/.local/lib/python3.6/site-packages/astropy/tests/runner.py", line 260, in test
    return runner.run_tests(**kwargs)
  File "/home/hoge/.local/lib/python3.6/site-packages/astropy/tests/runner.py", line 601, in run_tests
    return super(TestRunner, self).run_tests(**kwargs)
  File "/home/hoge/.local/lib/python3.6/site-packages/astropy/tests/runner.py", line 202, in run_tests
    self._has_test_dependencies()  # pragma: no cover
  File "/home/hoge/.local/lib/python3.6/site-packages/astropy/tests/runner.py", line 182, in _has_test_dependencies
    raise RuntimeError(cls._missing_dependancy_error)
RuntimeError: Test dependencies are missing. You should install the 'pytest-astropy' package.


実はpytestじゃなくてastropy-pytestをインストールする必要があったということ。。。
そのため、一旦Ctrl+dでpythonを抜けて、pytest-astropyをインストールする。

pip3 install pytest-astropy


これでテストが実施できる。 再度テストコマンドを実行すると以下のように表示されるはず。(かなり時間がかかる場合がある)

$ python3
Python 3.6.5 (default, Apr  1 2018, 05:46:30)
[GCC 7.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import astropy as ap
>>> ap.test()
/usr/lib/python3.6/importlib/_bootstrap.py:219: ImportWarning: can't resolve package from __spec__ or __package__, falling back on __name__ and __path__
  return f(*args, **kwds)
========================================= test session starts =========================================
platform linux -- Python 3.6.5, pytest-3.8.1, py-1.6.0, pluggy-0.7.1

(中略)

=============== 10183 passed, 335 skipped, 66 xfailed, 5059 warnings in 446.75 seconds ================
0


test session starts
が表示されれば問題なくテストが開始されており、Astropyが使える状態になったということ。

参考ページ ・Astropy公式ページ https://astropy.readthedocs.io/en/stable/install.html

上記公式ページには、ソースからビルドする方法も書かれている。

GIt入門 いまさらだけど基本的なことをまとめてみた!

Gitとは

Gitとはファイルのバージョン管理システムのこと

バージョン管理とは、ファイルの過去の状態も保存しておき、どのように変更されてきたか管理することを表している。

普段、WindowsMacでエクセルファイルやテキストファイルを作って書いて保存して、を繰り返すと、同名ファイルは都度「上書き保存」されて、過去どんなことを書いて消してしまったのかが残らない。

一人だと過去の履歴が消えても、そんなに困ることは少ないが、 複数人でひとつのファイル(例えば経費管理のファイルや、Pythonのコードファイル)を編集するとなると、他の人が行った内容の変更に間違いがあったり、いまいちな点があったりして元に戻したい、となるときが結構ある。

そんな時に、過去の履歴があってすぐに戻せるとしたら、かなり助かるはず。

だからGitのようなバージョン管理システムが開発された。

基本用語

リポジトリ:過去のバージョンも履歴として残しておける、ファイルを保存するための貯蔵庫。個人リポジトリ(=ローカルリポジトリ)と、共有リポジトリ(=リモートリポジトリ)の2種類ある。

commit:個人リポジトリに変更を記録すること。要するにPC内にファイルを保存すること。

push:共有リポジトリに変更を記録すること。要するにインターネット上でチームなどと共有している場所にファイルを保存すること。

pull:共有リポジトリの情報を同期すること。要するにインターネット上の共有しているファイルの状態をPC内に持ってくること。

f:id:sagantaf:20180912231826p:plain


使い方

- インストール

GitはMacの場合、デフォルトでインストールされている。

$ git version
git version 2.16.1

Windowsの場合、自分でインストールする必要がある。



- 個人の情報を設定

GitHubでリモートリポジトリを使うために、gitを使い始める前にアカウントとメルアドを設定する必要がある。

$ git config --global user.name "自分のアカウント名"
$ git config --global user.email "登録したメールアドレス"



- PCに個人リポジトリ(=ローカルリポジトリ)を作成

git init コマンドで現在いる場所に隠しディレクトリ ".git" が作成される。

$ pwd
/Users/hoge/.git/
$ git init
Initialized empty Git repository in /Users/hoge/.git/
$ ls -a .git/
.     HEAD        description info        refs
..      config      hooks       objects

.gitディレクトリの中には様々なファイルやディレクトリが生成される。



- ローカルリポジトリにファイルをcommitする

自分のPCのファイルをローカルリポジトリに置く前にステージングエリアと呼ばれる場所に置く必要がある。ステージングエリアに置くことで、このファイルをGitで管理するよ!と宣言することになるイメージ。 その後、commitしてローカルリポジトリにファイルを置くことができる。

$ touch test.txt
$ echo "This is test." >> test.txt
$ git add test.txt
$ git commit

git commit をするとvimが開くので、一番上にコミットメッセージを追記して、保存すればOK。 (vimが開いたら、Escボタンで編集できるようになる。メッセージを追記したらもう一度Escを押して、:wqと押してEnterすることで保存できる)

f:id:sagantaf:20180913004354p:plain



- gitで管理したくないファイル(例えばパスワードファイル)の設定

gitignoreというファイルを作り、その中に管理したくなりファイル名を書いて置くことで、commitされなくなる。

VirtualBoxでWindows10にUbuntu16.04の仮想環境を構築する

 

Windows10のPCにUbuntu16.04の仮想環境を構築します。

VirtualBoxを利用します。

 

 

まずは以下のページからVirtualBoxをダウンロード

→「Windows host」をクリックするとダウンロードが始まる

Downloads – Oracle VM VirtualBox

 

 

以下のページからUbuntu16.04をダウンロード

Ubuntu 16.04.5 LTS (Xenial Xerus)

 

 

ダウンロードしたVirtualBoxを開き、インストール

→ひたすら「NEXT」や「YES」を押すだけ

 

 

インストール後、VirtualBoxを起動すると、以下の画面が最初に表示される

f:id:sagantaf:20180901135042p:plain

 仮想マシン(VM)を構築するために、まずは「新規」をクリック

 

 

f:id:sagantaf:20180901135323p:plain

名前を入力して次へ

 

 

f:id:sagantaf:20180901135416p:plain

メモリを好きなサイズに設定し、次へ

 

 

f:id:sagantaf:20180901135428p:plain

「仮想ハードディスクを作成する」を選択して、「作成」

 

 

f:id:sagantaf:20180901135510p:plain

VDIのまま次へ

 

f:id:sagantaf:20180901135528p:plain

可変サイズのまま次へ

 

f:id:sagantaf:20180901135537p:plain

好きな名前を入力し、ディスクサイズを設定し、「作成」

 

 

f:id:sagantaf:20180901135550p:plain

仮想環境が追加された

電源ONする前に、 「設定」を押して、ストレージ→コントローラー:IDEの「空」を選択する

 

 

f:id:sagantaf:20180901135712p:plain

ディスクの絵をクリックし、「仮想光学ディスクファイル」を選択

 

 

f:id:sagantaf:20180901135839p:plain

先ほど、ダウンロードしたUbuntuのiイメージファイルを選択して開く

 

 

f:id:sagantaf:20180901135930p:plain

OKを押す

 

 

f:id:sagantaf:20180901140145p:plain

これでダウンロードしたディスクから起動されるようになった

 

「起動」を押して、新しいウィンドウが開くことを確認

 

 

f:id:sagantaf:20180910224807p:plain

 

 日本語を選択しようとウィンドウを押すと、以下の画面が出る

f:id:sagantaf:20180910224844p:plain

 

「仮想環境にマウスとキーボードの制御が持っていかれるので、ローカル(Windows)に戻したいときは、Right Conrtolを押す必要がある」という警告文

「キャプチャー」をクリックして、「日本語」をキーボードの矢印キーを使って選択し、Enterを押す

 

 

f:id:sagantaf:20180910225156p:plain

Ubuntu Serverをインストール」でEnter

 

 

f:id:sagantaf:20180910225756p:plain

<はい>を選択 

 

 

f:id:sagantaf:20180910225820p:plain

「日本」のままEnter 

 

 

f:id:sagantaf:20180910225839p:plain

「Japanese」のままEnter 

 

 

f:id:sagantaf:20180910225902p:plain

「Japanese」のままEnter 

 

しばらくインストール処理が続く。。。

f:id:sagantaf:20180910225941p:plain

 

f:id:sagantaf:20180910230120p:plain

好きなホスト名を入力し、続ける

 

 

f:id:sagantaf:20180910230211p:plain

 好きなユーザの本名を入力し、続ける

 

 

f:id:sagantaf:20180910230239p:plain

好きなユーザ名を入力し、続ける

(このユーザ名が後ほどログインするときに入力するものになる)

 

 

f:id:sagantaf:20180910230321p:plain

f:id:sagantaf:20180910230338p:plain

パスワードを2回入力し、続ける 

 

 

f:id:sagantaf:20180910230449p:plain

短いパスワードの場合、上記のメッセージが出るが、気にしない人はそのまま進める

 

 

f:id:sagantaf:20180910230527p:plain

 暗号化してセキュリティを高めることができるが、気にしない人はそのまま進める

 

また、しばらく待つ。。。

 

f:id:sagantaf:20180910230752p:plain

 タイムゾーンが「Asia/Tokyo」になっていればそのまま<はい>を選択

なっていない場合は、<いいえ>を押して自分で設定する

 

 

f:id:sagantaf:20180910230914p:plain

「ガイド - ディスク全体を使い、LVMをセットアップする」でEnter 

 

 

f:id:sagantaf:20180910230939p:plain

 そのままEnter

 

 

f:id:sagantaf:20180910230955p:plain

 <はい>を選択

 

 

f:id:sagantaf:20180910231033p:plain

 好きな容量を記入して<続ける>

 

 

f:id:sagantaf:20180910231100p:plain

 「パーティ初認具の終了とディスクへの変更の書き込み」でEnter

 

 

f:id:sagantaf:20180910231132p:plain

  <はい>を選択

 

しばらく待つ。。。

f:id:sagantaf:20180910231153p:plain

 

f:id:sagantaf:20180910231323p:plain

プロキシが必要であれば入力して設定する

必要なければそのまま続ける 

 

またしばらく待つ。。。

f:id:sagantaf:20180910231349p:plain

 

意外と時間かかる、、、

 

 

 

f:id:sagantaf:20180910231658p:plain

 好きな項目を選んでEnter

 

 

f:id:sagantaf:20180910231748p:plain

 好きなソフトをスペースキーで選択してEnter

あとからでもインストールできるので、とりあえずそのままEnterでもOK

 

またしばらく待つ

 

f:id:sagantaf:20180910232038p:plain

<はい>を選択

 

 

f:id:sagantaf:20180910232123p:plain

ようやくインストール完了

ウィンドウが変わり、起動処理が始まる

 

 

しばらく待つとログイン画面になる

f:id:sagantaf:20180910232248p:plain

先ほど自分で設定したユーザ名とパスワードを入力してログインする。

 

あとは好きなように使っちゃってください。

 

 

 

 

 

 

昼飯後の眠気をどう解消するか? 原因と対処法をまとめてみた

 

昼飯を食べた後に、自分のデスクに戻ってしばらくすると、ほぼ必ず襲ってくる眠気。

眠すぎて、気付いたら首がひん曲がっていたこともある。。。

 

そこで色々調べ、考え、まとめてみた。

  

まず気になるのは、昼食後に眠くなるのはなぜか、その原因

①脳に血液が回らないから

眠くなる原因としてよく聞くのは、

食べ物を消化するために、内臓に血液が回り、脳に血液が回らなくなるから、

ということ。これは確かに納得出来る。

そして、消化に時間がかかると、ずっと眠いということになる。

 

では、消化に時間がかかるのはどんな時か。

 ・よく噛まずに食べる

 ・消化の悪いものを食べる

 ・水分の取りすぎで胃酸が薄まる

とかが思いつく。水分の取りすぎが良くないのは、何かの雑誌かテレビで言ってた気がする。

 

②血糖値が下がるから 

また、食後に血糖値が下がるから、眠くなる、というのもよく聞く。

なぜ食事で糖質を摂取してるのに、血糖値は下がるのか?

それは

「糖質を摂る(白米とか)と血糖値が上がる。すると体内でインシュリンと呼ばれる血糖値を下げる働きをするホルモンが分泌される。人間の眠気というものは、血糖値が下降したとき起こる傾向がある。」

ということらしい。(下記参照)

nemgym.com

 

つまり、糖質をとる→インシュリンが分泌される→血糖値が下降する→眠くなる、ということになる。

 

また、半概日性リズム(サーカセミディアン・リズム)という、12時間周期で眠気がやってくる生活リズムも昼間に眠くなる原因とひとつらしい。(下記参照)

allabout.co.jp

 

つまり、たとえ昼食を食べなくても、人間の生活リズムから午後の眠気はやってくる、ということになる。

 

ここで昼食後に眠くなる原因をまとめると、

  • 食べ物の消化により、脳に血液が回らなくなるから
  • 糖質を摂取することにより、インシュリンが分泌され、血糖値が下がるから
  • 人間の生活リズムが12時間周期だから

 

 

 

では、どう対策すれば良いか。

・野菜を先に食べて、血糖値の上昇を緩やかにする

・15~20分くらい仮眠する(それ以上長いと深い眠りに入り、起きにくくなるため)

・仮眠前にはカフェインを摂る(甘いコーヒーは糖質を摂ることになるのでNG)

・ストレッチをして血流を良くする、すこしの間電気イスをして足の血液を脳に送る

・午後に人と会話する仕事、もしくは期限がせまっている仕事をする

・昼食時および食後に水分を取りすぎない

 

などが考えられる。

 

人の性格や置かれている環境はそれぞれ違うので、色々試してみて自分に合うもの、効果があったものを取り入れていくのが良いと思う。

 

 

とりあえず野菜を食べる🥦

ストレッチをする

 

 

Dockerのコンテナ環境をきれいに消す


Dockerの検証したり、動作確認したりしていると、Dockerイメージや停止したDockerコンテナがどんどん蓄積されていって、目当てのイメージやコンテナを見つけにくくなる。

そのため、一度Dockerのコンテナ環境をクリーンアップする方法をまとめてみた。

クリーンアップするDockerの3つの状態

dockerの状態としては3種類ある。
1:Dockerイメージ
  →DockerHubから取得したり、自分のDockerfileをビルドして、ローカルに保存したイメージ
2:停止中のコンテナ
  →Dockerイメージから作成されたけど、起動していない状態のコンテナ
3:稼働中のコンテナ

これらを全て消す。


稼働中のコンテナは削除できないので、一度停止(stop)する必要がある。
 →3:稼働中のコンテナ があるとコンテナが消せない

コンテナが存在すると、そのコンテナで使っているイメージは削除できない制約がある。
 →2:停止中のコンテナ があるとイメージが消せない

つまり、Dockerの依存関係として 3 → 2 → 1 の順に対応する必要がある。



クリーンアップのためのコマンド

①稼働中のコンテナの停止

 $ docker stop $(docker ps -q)

  docker stop <コンテナのID> でコンテナを停止できる。
  docker ps でプロセスの状態を確認できる。

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
330ddbe7aee0        2b8caf31d8fe        "bash"              18 seconds ago      Up 17 seconds                           xenodochial_visvesvaraya


  -q はコンテナのIDだけを取得できる。

$ docker ps -q
330ddbe7aee0


 つまり、 docker ps -q で稼働中のコンテナのIDを取得し、それを docker stop に渡している。

$ docker stop $(docker ps -q)
330ddbe7aee0

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES 

 ↑稼働中のコンテナが無くなったことが分かる。



②停止中のコンテナの削除

 $ docker rm $(docker ps -aq)

  docker rm <コンテナID> ですべてのコンテナを削除できる。
  docker ps -a で停止中/稼働中関係なく全てのコンテナを表示する。

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                          PORTS               NAMES
330ddbe7aee0        2b8caf31d8fe        "bash"                   6 minutes ago       Exited (0) About a minute ago                       xenodochial_visvesvaraya
8aef7f9046fa        ubuntu-dev          "cc --version"           3 weeks ago         Exited (0) 3 weeks ago                              lucid_kowalevski
a542eca70416        ubuntu-dev          "ruby --version"         3 weeks ago         Exited (0) 3 weeks ago                              epic_brown
5225b7609af9        ubuntu-dev          "python --version"       3 weeks ago         Exited (0) 3 weeks ago                              relaxed_brahmagupta
c495fdee1b2b        ubuntu              "node --version"         4 weeks ago         Created                                             focused_aryabhata
0fd1dd889b0a        ubuntu-nodejs-1     "node --version"         4 weeks ago         Exited (0) 4 weeks ago                              practical_snyder
0f68c8d2e932        ubuntu              "/bin/bash"              4 weeks ago         Exited (0) 4 weeks ago                              heuristic_lichterman
c44cde856cf2        ubuntu              "cat /etc/lsb-release"   4 weeks ago         Exited (0) 4 weeks ago                              boring_rosalind


  -q はコンテナのIDだけを確認できる。

$ docker ps -aq
330ddbe7aee0
8aef7f9046fa
a542eca70416
5225b7609af9
c495fdee1b2b
0fd1dd889b0a
0f68c8d2e932
c44cde856cf2


 つまり、 docker ps -q で全コンテナのIDを取得し、それを docker rm に渡している。

$ docker rm $(docker ps -aq)
330ddbe7aee0
8aef7f9046fa
a542eca70416
5225b7609af9
c495fdee1b2b
0fd1dd889b0a
0f68c8d2e932
c44cde856cf2

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

↑コンテナがひとつも無くなったことが分かる。


③イメージの削除

 $ docker rmi $(docker images -q)

  docker rmi <イメージID> ですべてのイメージを削除できる。
  docker images でローカルに保存されている全てのイメージを表示する。

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu-dev          latest              2b8caf31d8fe        3 weeks ago         625MB
ubuntu-nodejs-1     latest              e581036c1087        4 weeks ago         218MB
ubuntu              latest              735f80812f90        6 weeks ago         83.5MB


  docker images -q でイメージIDだけを確認できる。

$ docker images -q
2b8caf31d8fe
e581036c1087
735f80812f90


  docker images -q で全イメージのIDを取得し、それを docker rmi に渡している。

$ docker rmi $(docker images -q)
Untagged: ubuntu-dev:latest
Deleted: sha256:2b8caf31d8feb3b34708dce7cca268bd60ac9bf877b4bddcba030f27e7a46197
Deleted: sha256:55a35c78d72783d5c6bf1c6fdf4b3918b95cd39938ac06e0f6b5775d9c4775bc
Deleted: sha256:1fc5e8bd33c7b0c5c46db006e7000f130dd9fa5a4fcbe855fe69a4364f746477
Deleted: sha256:5cca3817cd7bdb896379de90c22a76ac89604aaf492d98079f0d78186aec259f
Untagged: ubuntu-nodejs-1:latest
Deleted: sha256:e581036c10872e09c924a830b291fe3d720bb9613dc43b0803d9c6f2eaf2fd80
Deleted: sha256:ec4c6cb855528774f3da2edebc93e3d5a3bd66e392b6c34c549ea75bd701b93f
Untagged: ubuntu:latest
Untagged: ubuntu@sha256:3f119dc0737f57f704ebecac8a6d8477b0f6ca1ca0332c7ee1395ed2c6a82be7
Deleted: sha256:735f80812f90aca43213934fd321a75ef20b2e30948dbbdd2c240e8abaab8a28
Deleted: sha256:86267d11f0c14fca869691b9b32bdd610b6ab8d9033d59ee64bdcc2cf0219bce
Deleted: sha256:d9a8b3f912eee0b322b86fa0f6888558a468c384611c71178987b20e3a0ebafc
Deleted: sha256:4e627d1476f22151f05e5214147d6cc6e03ad79a082f01aca6560aa75c7ade3a
Deleted: sha256:757b76a12baba45fcbe76abbdd99723be9d94c12a2ad40354dc49ff5fbe1f5c1
Deleted: sha256:f49017d4d5ce9c0f544c82ed5cbc0672fbcb593be77f954891b22b4d0d4c0a84

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

↑イメージが一つも無くなっていることが分かる。



以上で、コンテナ環境をクリーンアップすることができた。



余談:依存関係によるエラーメッセージ例


稼働中のコンテナは削除できないので、一度停止(stop)する必要がある。
 →3:稼働中のコンテナ があるとコンテナが消せない


→稼働中のコンテナがある状態で、$ docker rm $(docker ps -aq) でコンテナを削除しようとすると、以下のエラーメッセージが出る。

Error response from daemon: You cannot remove a running container 330ddbe7aee0ce0dc2da9692bfd1c890227a52c01c73d3a8d4b4fccc17b2961b. Stop the container before attempting removal or force remove



コンテナが存在すると、そのコンテナで使っているイメージは削除できない制約がある。
 →2:停止中のコンテナ があるとイメージが消せない


→コンテナが存在している状態で、$ docker rmi $(dcoker images -q) でイメージを削除用とすると、以下のエラーメッセージが出る。

Error response from daemon: conflict: unable to delete 2b8caf31d8fe (cannot be forced) - image is being used by running container 330ddbe7aee0
Error response from daemon: conflict: unable to delete e581036c1087 (must be forced) - image is being used by stopped container 0fd1dd889b0a