分散システムとポエム

Dockerを勉強してみた

前から気になっていたDockerをCentOS 7.xの環境でいじってみた。今月号(2017/2)のSoftwareDesignの特集にもなっていたのでやる気になって良かったかも。

1.Dockerのインストールと初期設定

yumでリポジトリから落とせるのでインストールは簡単。立ち上げて起動時にスタートするように設定した。

# yum install docker
# systemctl start docker
# systemctl enable docker

2.Dockerコマンドで操作

dockerのイメージ一覧

これが個人的には一番使う気がする。

# docker images

dockerリポジトリからイメージを落としてくる

末尾の:7をつけないとlatestで落としてくる。

# docker pull centos:7

dockerを起動してシェルに入る

オプション-pは[ホストマシンのポート]:[コンテナのポート]の形で指定するとポートマッピングすることができる。-iは標準入力の有効化(たとえアタッチしてなくても)。-tは擬似ターミナルを割り当てる。詳しいことはdocker run –helpで調べられる。

# docker run -i -t -p 8080:80 docker.io/centos /bin/bash

[エラーに遭遇]

調べてみると同様の症状が発生しているものの解決策がイマイチ見つからない。公式のGithubリポジトリでも議論されているものを見る限りメモリ不足に起因するバグのように思われる。

# docker run -i -t -p=8080:80 docker.io/centos /bin/bash
/usr/bin/docker-current: Error response from daemon: driver failed programming external connectivity on endpoint tiny_blackwell (d5c7b82b511b7aa6c0c0b2e350831c7f82a34d4ff173315fd94a1757fedaeb72): iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 8080 -j DNAT --to-destination 172.17.0.2:80 ! -i docker0: iptables: No chain/target/match by that name.
 (exit status 1).

[解決策]

freeコマンドでメモリをチェックしてみるが特に問題ない。仕方ないのでdockerプロセスをホストから再起動した。

# systemctl restart docker

無事にシェルに入れた。

net-toolsをインストールしてみる。(事前にインストール済みだった…)

コンテナを起動したままホストに戻る場合は[Ctrl] + P →[Ctrl] + Qの順で押下する。

起動中のコンテナ一覧を表示

最初に建てたコンテナが表示される。

# docker ps

ホストから起動中のコンテナに戻る

docker execでも戻れるので違いを調べてみるとdocker attachだとPID1に戻るらしい。

docker attach b46b79feb70f

[Ctrl] + P→[Ctrl] + Qでホストに戻る。

コンテナのコミット

個人的には、スナップショットを取るイメージがある。これが非常に便利な仕組みだと思う。間違えて環境を壊した時も大丈夫。

# docker commit -m "Installed net-tools" b46b79feb70f docker.io/centos

コンテナの履歴

# docker history docker.io/centos

コンテナの停止

停止後にdocker psで停止しているか確認。

docker stop b46b79feb70f

その他

dockerのポートマッピングの実態はiptablesのdnatを使った転送だったのが意外だった。docker0の配下にコンテナが配置されてそれぞれにIPが振られるのが実際に分かった。

ひとまず基本的な操作な一部は勉強できた。これからもうすこし勉強したい。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です