「Docker」Net-SNMPとApache HTTP ServerをインストールしたDockerイメージを作成してみる
今回は Dockerfile を使って Net-SNMP と Apache 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-SNMP、Apache をインストールするので centos:centos7 を指定してます。
RUN はイメージ作成の際に実行したいコマンドを定義できます。今回は Net-SNMP (ついでにユーティリティも) と Apache を yum install するコマンドを実行しています。
COPY はイメージの所定のディレクトリにコピーする際に使用できます。今回は start.sh を /root 配下にコピーしています。
なお、start.sh の内容は以下の通り、Net-SNMP と Apache を起動するものです。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。
[環境情報]
CentOS 7
Docker version 1.13.2