名前から解決できるIPアドレスを知る

表題の通り。shellスクリプトの中で、自身のIPアドレスを取得したい時がある。そんな時に使える方法。ただし”hostname“コマンドで得られるホスト名で解決できるIPアドレスに限る。

■ 環境

  • CentOS 6.6
  • AmazonLinux

■ hostname設定済みVM

Vagrantで起動しているCentOSで、Vagrantfile内でhostnameを設定していると下記のようになる。

$ hostname -i
127.0.0.1
$

これは、/etc/hostsファイルにて、Vagrantfileで設定したホスト名が”127.0.0.1“にて解決できるよう設定されている為である。しかし、一般的に取得したいIPアドレスとは異なると思われる。

■ DNSで名前解決できるホスト

これはイメージ通りのIPアドレスが取得できる。

$ hostname -i
XX.XX.X.XXX
$

■ 名前解決できないEC2

ちょっと設定を入れなければ、EC2でも名前解決ができなかった気がする。

$ hostname
ip-XX-XX-XX-XX
$
$ hostname -i
hostname: 不明なホストです
$

/etc/hostsファイル等に書けば良いのかもしれないが、期待通りの結果にはならないかもしれない。自身の場合は/etc/resolv.confを編集し、ip-XX-XX-XX-XXでも名前解決できるように変更してしまっている。

■ Dockerコンテナ

今回のこの”-i“オプションの存在を知ったのは、Dockerでコンテナに組み込むshellスクリプトの中であった。

[root@[CONTAINER_ID] /]# hostname
5976ffca2f94
[root@[CONTAINER_ID] /]#

Dockerコンテナ内では、コンテナIDがホスト名として設定されている。/etc/hostsファイルも下記のようになっている。

[root@[CONTAINER_ID] /]# cat /etc/hosts
172.17.0.4    5976ffca2f94
127.0.0.1     localhost

その為、下記のように取得できる。

[root@[CONTAINER_ID] /]# hostname -i
172.17.0.4
[root@[CONTAINER_ID]]# 

どんな環境においても使えるわけではないが、Dockerコンテナ内で利用するのには意外と便利である。

以上。

複数のDockerコンテナをリンク

表題の通り。Dockerではマイクロサービス化し、1コンテナで1サービスを稼動させるのが定石らしい。というのでコンテナを複数に分けたらお互いが接続できることが必要なので試す。

■ 環境

  • Mac OSX (10.9.5)
  • boot2docker
  • Docker 1.7.1

■ やりたいこと

MongoDBのServerを1台起動し、別クライアントから接続してみる。

■ MongoDBのコンテナ起動

下記のようにMongoDBのコンテナを起動する。

$ docker run -ti --rm mongodb -d

起動したものを確認する。

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS               NAMES
92c264d2de93        mongo:3.0.3         "/entrypoint.sh mong   5 minutes ago       Up 5 minutes        27017/tcp           berserk_brown
$

起動時に”–name“オプションで名前は指定していないので、自動で振られた”berserk_brown“という名前になっている。

■ CentOSのコンテナ起動

続いて、CentOS 6のコンテナを起動する。起動時に”–link“オプションでMongoDBの名前を指定する。指定の仕方は”–link [NAME]:[コンテナ内で使用できる名前]”である。

$ docker run -ti --rm --link berserk_brown:mongo centos:6

この場合では起動したCentOSのコンテナ内で”mongo“という名前でアクセスできるようになる。実際に見てみる。

■ 確認

CentOSのコンテナ内で確認してみる。

環境変数にいろいろと情報が入る。

[root@[CONTAINER_ID] /]# env | grep MONGO
MONGO_ENV_MONGO_MAJOR=3.0
MONGO_PORT=tcp://172.17.0.1:27017
MONGO_ENV_MONGO_VERSION=3.0.3
MONGO_PORT_27017_TCP=tcp://172.17.0.1:27017
MONGO_PORT_27017_TCP_PROTO=tcp
MONGO_PORT_27017_TCP_ADDR=172.17.0.1
MONGO_NAME=/determined_archimedes/mongo
MONGO_PORT_27017_TCP_PORT=27017
[root@[CONTAINER_ID] /]# 

またhostsファイルにも入るようだ。

[root@[CONTAINER_ID] /]# cat /etc/hosts
  :
172.17.0.1    mongo 92c264d2de93 berserk_brown
  :
[root@[CONTAINER_ID] /]#

MongoDBのクライアントを入れても試してみる。

[root@[CONTAINER_ID] /]# yum install epel-release
 :
[root@[CONTAINER_ID] /]# yum install mongodb
 :
[root@[CONTAINER_ID] /]# mongo --host mongo
MongoDB shell version: 2.4.14
connecting to: mongo:27017/test
Welcome to the MongoDB shell.
>

アクセスできた。

以上。

■ 関連

Docker Machineをインストール

表題の通り。先日はDockerComposeをインストールしたのだが、Machine/Compose/Swarmが一連のようらしいのでインストールしておく。

■ 環境

  • Mac OSX (10.9.5)
  • Docker Machine 0.3.1
  • Homebrew

■ 確認

まずは”docker“で検索。

$ brew update
$ brew search docker
boot2docker     docker          docker-compose   docker-machine   docker-swarm
$

詳細を確認してみる。

$ brew info docker-machine
Create Docker hosts locally and on cloud providers
https://docs.docker.com/machine
Not installed
From: https://github.com/Homebrew/homebrew/blob/master/Library/Formula/docker-machine.rb
==> Dependencies
Build: go ✘
$

■ インストール

いつも通りにインストール。

$ brew install docker-machine

■ 確認

何がインストールされているのか確認する。

$ brew list docker-machine
/usr/local/Cellar/docker-machine/0.3.1/bin/docker-machine
$

これだけのようである。

$ docker-machine -v
docker-machine version 0.3.1 (HEAD)
$

さて、今後はこれを使ってみる事にする。boot2dockerの代替となるわけではないようであるが、自身にはまだよく掴めていない。実際に使ってみながら、自身の場合にはどちらが使い勝手が良いのかを検証していこうと思う。

以上。

■ 関連

yumで過去versionをインストール

表題の通り。yumでインストール可能な最新versionではなく、ひとつ前のversionを入れたかったので調べてみた結果。

■ 環境

  • CentOS 6.6
  • AmazonLinux

■ –showduplicates

下記オプションを付ける事で、インストール可能なパッケージ名称と各version、そのパッケージがあるレポジトリを取得できる。

$ sudo yum list --showduplicates

対象のパッケージをgrepで絞れば、インストール可能なversionの一覧も取得できるだろう。

versionもわかれば下記のようにインストールできる。下記はzshで最新版ではないversionをインストールする場合である。

$ sudo yum list --showduplicates | grep zsh
python-twisted-core-zsh.x86_64       8.2.0-4.el6         base
zsh.x86_64                           4.3.10-7.el6        base
zsh.x86_64                           4.3.10-8.el6_5      updates
zsh.x86_64                           4.3.10-9.el6        updates
zsh-html.x86_64                      4.3.10-7.el6        base
zsh-html.x86_64                      4.3.10-8.el6_5      updates
zsh-html.x86_64                      4.3.10-9.el6        updates
$
$ sudo yum install zsh-4.3.10-7.el6

以上。

EPELレポジトリの有効化

表題の通り。既にどこかのエントリにも書いていたが、たまにど忘れして検索するので、検索に引っ掛かりやすいように切り出してエントリにしておく。

■ 環境

  • CentOS 6.4

■ EPELレポジトリの有効化

下記で有効にする。

$ sudo yum install epel-release

これで”update“を実行すると下記のようなエラーとなった。

$ sudo yum update
Loaded plugins: fastestmirror, security
Loading mirror speeds from cached hostfile
Error: Cannot retrieve metalink for repository: epel. Please verify its path and try again
$

インストールされたファイルを確認する。

$ sudo vi /etc/yum.repos.d/epel.repo

前述のエラーの内容が、metalink…とのことなので、下記のように編集した。

[epel]
name=Extra Packages for Enterprise Linux 6 - $basearch
baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch
# mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch
failovermethod=priority
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6

baseurl“をコメントインし、”mirrorlist“をコメントアウト。

これで前述の”update“も正常に稼動するようになった。

ちなみに常時EPELレポジトリを有効にしたくなければ、”enabled“の値を”0“にすれば良い。必要な時は–enablerepo=epelと付ければ使用可能だ。

以上。

■ 関連