「Docker」Net-SNMPとApache HTTP ServerをインストールしたDockerイメージを作成してみる

今回は Dockerfile を使って Net-SNMPApache HTTP Server をインストール、起動した状態のイメージを作成してみようと思います。

1. Dockerfile の作成

Docker のイメージは docker build で作成するようです。どのようなイメージにするかを Dockerfile というファイルに定義していきます。今回の Dockerfile の内容は以下の感じです。

# ベースとなるイメージを指定する
FROM centos:centos7

# net-snmp, net-snmp-utils, httpd をインストール
RUN yum -y install net-snmp net-snmp-utils httpd
RUN echo "install OK"

# start.sh をイメージ内の /root にコピーして実行権限を付与
COPY start.sh /root/start.sh
RUN chmod +x /root/start.sh

# コンテナで公開するポート番号の指定
EXPOSE 161/udp
EXPOSE 80/tcp

# 実行コマンドの指定
CMD /root/start.sh

FROM でベースとなるイメージを指定してます。今回は CentOS7 上に Net-SNMPApache をインストールするので centos:centos7 を指定してます。

RUN はイメージ作成の際に実行したいコマンドを定義できます。今回は Net-SNMP (ついでにユーティリティも) と Apacheyum install するコマンドを実行しています。

COPY はイメージの所定のディレクトリにコピーする際に使用できます。今回は start.sh を /root 配下にコピーしています。

なお、start.sh の内容は以下の通り、Net-SNMPApache を起動するものです。Dockerfile の CMD はコンテナ実行時 (docker run) に実行されるコマンドを定義できますが、一つのコマンドしか定義できません。「Net-SNMP を起動するコマンド」と「Apache を起動するコマンド」の両方を定義することができないので、一つのシェルスクリプトにまとめてあげます。

#!/bin/bash

/usr/sbin/snmpd -LS0-6d
/usr/sbin/httpd -DFOREGROUND


2. イメージをビルドする

Dockerfile が作成できたら docker build コマンドでイメージを作成します。

# docker build -t centos7:snmp_http .
Sending build context to Docker daemon 3.072 kB
Step 1/8 : FROM centos:centos7

 ...

Successfully built 9ecbe030ab35

centos7:snmp_httpd というイメージが作成されました。

# docker image ls
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
centos7                 snmp_http           9ecbe030ab35        4 hours ago         382 MB

※ Dockerfile を修正した場合、もう一度上記のコマンドを実行すれば修正した内容で上書いてくれるようです。なお、docker build はキャッシュを保持しているっぽく、前回と変更がない箇所はキャッシュ使ってくれるので初回より速いです。


3. ビルドしたイメージからコンテナを実行する

ビルドしたイメージからコンテナを実行します。 161 は 1610 で、80 は 8080 でフォーワードするので -p オプションを指定してます。なお、-p オプションはポート番号だけだと TCP になります。UDP の場合は <ポート番号>/udp とする必要があります。

# docker run -it -p 1610:161/udp -p 8080:80 -d centos7:snmp_http
# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS                                         NAMES
7cf9e0af76c0        centos7:snmp_http   "/bin/sh -c /root/..."   4 seconds ago       Up 3 seconds               0.0.0.0:8080->80/tcp, 0.0.0.0:1610->161/udp   eager_shaw

下記の通りに snmpwalk と curl に反応があれば成功です。

]# snmpwalk -v 2c -c public 127.0.0.1:1610 .1.3.6.1.2.1.1
SNMPv2-MIB::sysDescr.0 = STRING: Linux 7cf9e0af76c0 3.10.0-327.el7.x86_64 #1 SMP Thu Nov 19 22:10:57 UTC 2015 x86_64
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (34159) 0:05:41.59
SNMPv2-MIB::sysContact.0 = STRING: Root <root@localhost> (configure /etc/snmp/snmp.local.conf)
SNMPv2-MIB::sysName.0 = STRING: 7cf9e0af76c0
SNMPv2-MIB::sysLocation.0 = STRING: Unknown (edit /etc/snmp/snmpd.conf)
SNMPv2-MIB::sysORLastChange.0 = Timeticks: (9) 0:00:00.09
...
curl http://localhost:8080/
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"><html><head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
                <title>Apache HTTP Server Test Page powered by CentOS</title>
                <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

 ...

以上です。

Dockerfile に関するリファレンスは以下URL。

・Dockerfile reference

[環境情報]
CentOS 7
Docker version 1.13.2