ツナワタリマイライフ

日常ネタから技術ネタ、音楽ネタまで何でも書きます。

Dockerのネットワークについて学ぶ

はじめに

昨日からdockerさわりはじめたよ!

take-she12.hatenablog.com

dockerがとてもはやくて便利ということはわかりました。今後自分が構築したサービス、システムをパッケージしてコンテナ化したい。そのために、コンテナの上に作ってWebサービスにどうやってネットワークを通じてアクセスするか知りたくなりましたので、簡単にhttpdを使って試してみましょう。

docker + httpd

というわけで慣れ親しんだhttpdをいれて80番portでアクセスすることを目指してみましょう。

centosのイメージをpullします。

[vagrant@docker ~]$ sudo docker pull centos:latest
Trying to pull repository docker.io/library/centos ... 
latest: Pulling from docker.io/library/centos
8d30e94188e7: Pull complete 
Digest: sha256:2ae0d2c881c7123870114fb9cc7afabd1e31f9888dac8286884f6cf59373ed9b
Status: Downloaded newer image for docker.io/centos:latest

そのイメージを使ってコンテナ起動します。

[vagrant@docker ~]$ sudo docker run --privileged -h httpd -d -p 80:80 --name httpd centos /sbin/init
34aa5674a684a0087adce40db9b9e238e0ad6fd214197d0d10d7f524bf819402

オプションについてまとめておきます。--helpを出してみましょう。

[vagrant@docker ~]$ docker run --help

Usage:  docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

Run a command in a new container
  • --privileged Give extended privileges to this container
  • -h, --hostname Container host name
  • -d, --detach Run container in background and print container ID
  • -p, --publish=[] Publish a container's port(s) to the host
  • --name Assign a name to the container

--privilegedはホストと同じレベルの権限を許可する、ぐらいの理解でしかないです。なかったらどれだけのことができないんだろう?今回重要なのは-pのポートマッピングですね。ホストとゲストの80番ポートをマップしています。

[vagrant@docker ~]$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                NAMES
34aa5674a684        centos              "/sbin/init"        52 seconds ago      Up 49 seconds       0.0.0.0:80->80/tcp   httpd

docker psでhttpdという名前のコンテナがでてきましたね。ところでコンテナを作ったあと/sbin/initをやる意味はなんだろう?

[vagrant@docker ~]$ sudo docker exec -it httpd /bin/bash
[root@httpd /]# yum -y install httpd
Loaded plugins: fastestmirror, ovl
base                                                                                                                               | 3.6 kB  00:00:00     
extras                                                                                                                             | 3.4 kB  00:00:00     
updates                                                                                                                            | 3.4 kB  00:00:00     
(1/4): extras/7/x86_64/primary_db                                                                                                  | 166 kB  00:00:00     
(2/4): base/7/x86_64/group_gz                                                                                                      | 155 kB  00:00:00     
(3/4): updates/7/x86_64/primary_db                                                                                                 | 8.4 MB  00:00:01     
(4/4): base/7/x86_64/primary_db                                                                                                    | 5.3 MB  00:00:01     
Determining fastest mirrors
 * base: ftp.tsukuba.wide.ad.jp
 * extras: ftp.tsukuba.wide.ad.jp
 * updates: ftp.iij.ad.jp
Resolving Dependencies
--> Running transaction check
---> Package httpd.x86_64 0:2.4.6-40.el7.centos.4 will be installed
--> Processing Dependency: httpd-tools = 2.4.6-40.el7.centos.4 for package: httpd-2.4.6-40.el7.centos.4.x86_64
--> Processing Dependency: system-logos >= 7.92.1-1 for package: httpd-2.4.6-40.el7.centos.4.x86_64
--> Processing Dependency: /etc/mime.types for package: httpd-2.4.6-40.el7.centos.4.x86_64
--> Processing Dependency: libaprutil-1.so.0()(64bit) for package: httpd-2.4.6-40.el7.centos.4.x86_64
--> Processing Dependency: libapr-1.so.0()(64bit) for package: httpd-2.4.6-40.el7.centos.4.x86_64
--> Running transaction check
---> Package apr.x86_64 0:1.4.8-3.el7 will be installed
---> Package apr-util.x86_64 0:1.5.2-6.el7 will be installed
---> Package centos-logos.noarch 0:70.0.6-3.el7.centos will be installed
---> Package httpd-tools.x86_64 0:2.4.6-40.el7.centos.4 will be installed
---> Package mailcap.noarch 0:2.1.41-2.el7 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

==========================================================================================================================================================
 Package                              Arch                           Version                                        Repository                       Size
==========================================================================================================================================================
Installing:
 httpd                                x86_64                         2.4.6-40.el7.centos.4                          updates                         2.7 M
Installing for dependencies:
 apr                                  x86_64                         1.4.8-3.el7                                    base                            103 k
 apr-util                             x86_64                         1.5.2-6.el7                                    base                             92 k
 centos-logos                         noarch                         70.0.6-3.el7.centos                            base                             21 M
 httpd-tools                          x86_64                         2.4.6-40.el7.centos.4                          updates                          83 k
 mailcap                              noarch                         2.1.41-2.el7                                   base                             31 k

Transaction Summary
==========================================================================================================================================================
Install  1 Package (+5 Dependent packages)

Total download size: 24 M
Installed size: 31 M
Downloading packages:
warning: /var/cache/yum/x86_64/7/base/packages/apr-1.4.8-3.el7.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEYs |    0 B  --:--:-- ETA 
Public key for apr-1.4.8-3.el7.x86_64.rpm is not installed
(1/6): apr-1.4.8-3.el7.x86_64.rpm                                                                                                  | 103 kB  00:00:00     
(2/6): apr-util-1.5.2-6.el7.x86_64.rpm                                                                                             |  92 kB  00:00:00     
Public key for httpd-tools-2.4.6-40.el7.centos.4.x86_64.rpm is not installed
(3/6): httpd-tools-2.4.6-40.el7.centos.4.x86_64.rpm                                                                                |  83 kB  00:00:00     
(4/6): mailcap-2.1.41-2.el7.noarch.rpm                                                                                             |  31 kB  00:00:00     
(5/6): httpd-2.4.6-40.el7.centos.4.x86_64.rpm                                                                                      | 2.7 MB  00:00:01     
(6/6): centos-logos-70.0.6-3.el7.centos.noarch.rpm                                                                                 |  21 MB  00:00:02     
----------------------------------------------------------------------------------------------------------------------------------------------------------
Total                                                                                                                     8.1 MB/s |  24 MB  00:00:02     
Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
Importing GPG key 0xF4A80EB5:
 Userid     : "CentOS-7 Key (CentOS 7 Official Signing Key) <security@centos.org>"
 Fingerprint: 6341 ab27 53d7 8a78 a7c2 7bb1 24c6 a8a7 f4a8 0eb5
 Package    : centos-release-7-2.1511.el7.centos.2.10.x86_64 (@CentOS)
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : apr-1.4.8-3.el7.x86_64                                                                                                                 1/6 
  Installing : apr-util-1.5.2-6.el7.x86_64                                                                                                            2/6 
  Installing : httpd-tools-2.4.6-40.el7.centos.4.x86_64                                                                                               3/6 
  Installing : centos-logos-70.0.6-3.el7.centos.noarch                                                                                                4/6 
  Installing : mailcap-2.1.41-2.el7.noarch                                                                                                            5/6 
  Installing : httpd-2.4.6-40.el7.centos.4.x86_64                                                                                                     6/6 
  Verifying  : apr-1.4.8-3.el7.x86_64                                                                                                                 1/6 
  Verifying  : httpd-tools-2.4.6-40.el7.centos.4.x86_64                                                                                               2/6 
  Verifying  : apr-util-1.5.2-6.el7.x86_64                                                                                                            3/6 
  Verifying  : httpd-2.4.6-40.el7.centos.4.x86_64                                                                                                     4/6 
  Verifying  : mailcap-2.1.41-2.el7.noarch                                                                                                            5/6 
  Verifying  : centos-logos-70.0.6-3.el7.centos.noarch                                                                                                6/6 

Installed:
  httpd.x86_64 0:2.4.6-40.el7.centos.4                                                                                                                    

Dependency Installed:
  apr.x86_64 0:1.4.8-3.el7        apr-util.x86_64 0:1.5.2-6.el7   centos-logos.noarch 0:70.0.6-3.el7.centos   httpd-tools.x86_64 0:2.4.6-40.el7.centos.4  
  mailcap.noarch 0:2.1.41-2.el7  

Complete!

コンテナにログインしてhttpdをインストールします。ホスト名もちゃんと設定されてますね。

ちなみにipコマンドとか使えなく、dockerコンテナはkernelコマンドしか使えないぐらい最低限しか入っていないそう。なるほどね。

[root@httpd /]# systemctl start httpd        
[root@httpd /]# systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
   Active: active (running) since Tue 2016-10-18 13:23:40 UTC; 4s ago
     Docs: man:httpd(8)
           man:apachectl(8)
 Main PID: 165 (httpd)
   Status: "Processing requests..."
   CGroup: /system.slice/docker-34aa5674a684a0087adce40db9b9e238e0ad6fd214197d0d10d7f524bf819402.scope/system.slice/httpd.service
           ├─165 /usr/sbin/httpd -DFOREGROUND
           ├─166 /usr/sbin/httpd -DFOREGROUND
           ├─167 /usr/sbin/httpd -DFOREGROUND
           ├─168 /usr/sbin/httpd -DFOREGROUND
           ├─169 /usr/sbin/httpd -DFOREGROUND
           └─170 /usr/sbin/httpd -DFOREGROUND

Oct 18 13:23:40 httpd systemd[1]: Starting The Apache HTTP Server...
Oct 18 13:23:40 httpd httpd[165]: AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set...s message
Oct 18 13:23:40 httpd systemd[1]: Started The Apache HTTP Server.
Hint: Some lines were ellipsized, use -l to show in full.
[root@httpd /]# systemctl enable httpd
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
[root@httpd /]# exit
exit
[vagrant@docker ~]

httpdを立ち上げます。

[root@httpd /]# vi /var/www/html/index.html

hello docker!

ドキュメントルートにindex.htmlを書いて

[vagrant@docker ~]$ curl localhost
hello docker!

ホストからcurするとちゃんと表示されましたね!

参考: Docker上のCentOS7にhttpdを最速で立てる方法 | TechBlog

コンテナを保存する

さてここまで作ったコンテナを保存してみましょう。

[vagrant@docker ~]$ sudo docker commit -a "take" httpd take/httpd:1.0
sha256:93fc9046f4e94336445ec678245b7fba3ec2a6f33d79da34002822f6047553b7

docker commitで保存します。

[vagrant@docker ~]$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
take/httpd          1.0                 93fc9046f4e9        4 minutes ago       349.7 MB
docker.io/mariadb   latest              63d91190a69e        3 days ago          389.8 MB
docker.io/ubuntu    latest              f753707788c5        4 days ago          127.1 MB
docker.io/centos    latest              980e0e4c79ec        5 weeks ago         196.7 MB
[vagrant@docker ~]$ sudo docker save -o httpd.tar take/httpd

docker imageに追加されました。さらにtarとして出力します。

[vagrant@docker ~]$ ls -lh
合計 342M
-rw-r--r-- 1 root root 342M 10月 18 14:38 httpd.tar

おわりに

今回、dockerコンテナ=プロセスに対してはホストとポートマッピングをして通信するということを学びました!次回はdockerfile を使ってプロビジョニングしたい!