ふるてつのぶろぐ

福岡在住のエンジニアです。

写真提供:福岡市

今度は客先でコンテナ勉強会

今日すること

f:id:tetsufuru:20190806104529p:plain:w100
こんにちはふるてつです。

ただいま客先の勉強会にてDockerを勉強中で、まずは入門としてこちらのサイト「入門Docker」を勉強しております。
https://y-ohgi.com/introduction-docker/
今週は「コンポーネント」 メニューの中から「container」、「network」ページをもくもくとしました、では勉強した内容を書いていきます。

1. Container

f:id:tetsufuru:20190908143541p:plain:w500

言わずと知れたDocker Containerです。
Docker ImageがスナップショットだとするとDocker Containerはその「スナップショットから起動したプロセス」だとのこと。
意識する点はDocker Containerは1つのコマンドをフォアグラウンドで動かすように設計されていることだそうです。

1-1. ライフサイクル

f:id:tetsufuru:20190908145126p:plain

Docker Containerの状態は5つあるとのことです。

  1. Image
  2. RUNNING
  3. STOPPED
  4. PAUSED
  5. DELETED

4番目のPAUSEDはユーザーがコマンドを発行しないとならない模様なので、あまり覚える必要はないかもしれません。

2. Network

f:id:tetsufuru:20190908150106p:plain:w400

Dockerはネットワークの振る舞いを定義することが可能で、デフォルトでは2種類のNetwork Driver が存在するそうです。

  1. bridge
  2. host

ネットワークのところは少し難しそうですね。
昔、VirtualBoxの時にもブリッジとかホストとか出てきて困惑しましたけど、同じものですかねー、いやだなあ🤢
とりあえず1番目のbridgeというのだけを覚えようかとは思います。

2-1. ネットワークを試す

● デフォルトで存在するネットワークの確認

docker network lsコマンドでDockerが管理しているNetwork一覧を出力します。

docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
578fc5351093        bridge              bridge              local
4b353041c00c        host                host                local
f5018c1f7037        none                null                local

3件表示されました。bridgehost以外にnoneというのもあります。
これらはデフォルトで存在するものと思います。

次にホスト側のネットワークも確認します。
勉強しているサイトではip aコマンドですが、わたしはWindows環境なのでipconfig -allで確認します。
DockerNATというネットワークがありました、多分これですね。

Windows IP Configuration
~ 中略 ~
Ethernet adapter vEthernet (DockerNAT):

   Connection-specific DNS Suffix  . :
   Description . . . . . . . . . . . : Hyper-V Virtual Ethernet Adapter #2
   Physical Address. . . . . . . . . : xx-xx-xx-xx-xx-xx
   DHCP Enabled. . . . . . . . . . . : No
   Autoconfiguration Enabled . . . . : Yes
   IPv4 Address. . . . . . . . . . . : xx.xx.xx.xx
   Subnet Mask . . . . . . . . . . . : xxx.xxx.xxx.xxx
   Default Gateway . . . . . . . . . :
   DNS Servers . . . . . . . . . . . : fec0:0:0:ffff::1%1
                                       fec0:0:0:ffff::2%1
                                       fec0:0:0:ffff::3%1
   NetBIOS over Tcpip. . . . . . . . : Enabled

● 新しいネットワークの作成

次は新しいbridgeネットワークを作成してみます。
docker network create myappコマンドを実行します。

docker network create myapp
ffb3874673689da21d1e10002140f92d5f40c2b1fd1fe085821eb7429a9b44e5

networkに myapp が増えていることを確認します。
docker network lsコマンド

docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
578fc5351093        bridge              bridge              local
4b353041c00c        host                host                local
ffb387467368        myapp               bridge              local
f5018c1f7037        none                null                local

myappが増えました。
ホスト側のネットワークにも追加されたことを確認しようとしましたが、違いは見れませんでした。 LinuxWindows環境の違いだと思います。

● Networkへnginxを参加させる

通信を受けるためのサーバーとしてnginxを myapp ネットワークに構築します。

docker run --name nginx --network=myapp -d nginx

● AmazonLinux2を起動し、nginxコンテナへ接続する

bridgeネットワークの場合、同一ネットワークのコンテナにはコンテナ名で名前解決が可能だそうです。
nginxと疎通できるか myapp ネットワーク内にAmazonLinux2イメージでコンテナを起動し、 curl を実行してみます。
docker run --network=myapp -it amazonlinux:2 curl nginx:80

docker run --network=myapp -it amazonlinux:2 curl nginx:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

なるほど確かに疎通できました。

● 新しくネットワークを作成し、疎通できないことを確認する

では myapp2 というネットワークを作成し、nginx2 という命名nginxを起動します。

docker network create myapp2
docker run --name nginx2 --network=myapp2 -d nginx

myapp ネットワークに所属しているAmazonLinux2から curl を実行し、疎通できないことを確認します。

$ docker run --network=myapp -it amazonlinux:2 curl nginx2:80
curl: (6) Could not resolve host: nginx2

なるほどたしかに疎通できませんでした。

今日の感想


今回もあいかわらず「入門Docker」の内容をそのまままとめた内容になりました。
コンテナのページは少ししかなかったので、 主にネットワークについて勉強しましたが、bridgeを使用すれば大体がつながりそうですね。
今回勉強してネットワークはそれほど恐れることはないかもと思いました。

それではまた