Dockerデーモンホストおよびcentos:6 DockerイメージとしてCentOS 7を使用しています。
非ループバックアドレスとして解決可能なホスト名を必要とするソフトウェアをインストールしたい。のような-hオプションでdockerイメージを実行する場合
docker run -i -t -h myhost centos:6 /bin/bash
次に、コンテナ内の/ etc/hostsが次のように自動的に構成されているため、ソフトウェアをインストールできます。
[root@myhost /]# cat /etc/hosts
172.17.0.7 myhost
127.0.0.1 localhost
[root@myhost /]# ping myhost
PING myhost (172.17.0.7) 56(84) bytes of data.
64 bytes from myhost (172.17.0.7): icmp_seq=1 ttl=64 time=0.033 ms
しかし、Dockerfileからイメージを作成する場合、同じ方法は使用できません。次のDockerfileを使用してイメージの作成をテストしました
FROM centos:6
ENV HOSTNAME myhost
RUN ping myhost
Dockerビルドプロセスでは、割り当てられたホスト名を次のような動的IPアドレスとして解決できません。
$ docker build -t testimage .
Sending build context to Docker daemon 2.048 kB
Sending build context to Docker daemon
Step 0 : FROM centos:6
---> a30bc9f3097e
Step 1 : ENV HOSTNAME myhost
---> Using cache
---> e73bf592389e
Step 2 : RUN ping myhost
---> Running in ca54c8eac073
ping: unknown Host myhost
INFO[0000] The command [/bin/sh -c ping myhost] returned a non-zero code: 2
動的コンテナIPアドレスとして解決された特定のホスト名を使用するにはどうすればよいですか?
これは一般的にDockerfileでは不可能です。
ソフトウェアによっては、何らかの回避策を実行できる場合があります。たとえば、次のようなものを試すことができます
RUN echo $(grep $(hostname) /etc/hosts | cut -f1) my.Host.name >> /etc/hosts && install-software
ソフトウェアをインストールするのと同じRUNコマンド内でホスト名を設定すると、コンテナーの同じレイヤー内でホスト名が設定されます。 Dockerは後でホスト名を上書きするため、実行時にホスト名を新たに設定する必要がありますが、ソフトウェアはそれで問題ない場合があります。
これを多く行う必要がある場合は、コンテナの構築に Packer を試してください。 Dockerコンテナーを構築できますが、複数のレイヤーは使用しません。これにより、再構築が遅くなり、ビルドされたイメージのダウンロードが速くなり、イメージをコンテナに凍結する前に複数の操作を行うのがより便利になります。
Dockerコンテナには通常「ホスト名」がインストールされていないため、次の方が良いと思います。したがって、headコマンドを使用します。
echo $(head -1 /etc/hosts | cut -f1) $Host_NAME >> /etc/hosts
/etc/hosts
は役に立ちません。hostname
バイナリを置き換えます。
RUN mv /usr/bin/hostname{,.bkp}; \
echo "echo myhost.local" > /usr/bin/hostname; \
chmod +x /usr/bin/hostname
...
RUN mv /usr/bin/hostname{.bkp,}
回避策として、 docker-compose
またはdocker stack
特定のhostname
でコンテナを構築します。
version: '3'
services:
all:
image: testimage
container_name: myname
hostname: myhost
build:
context: .
次に、次のように実行します:
docker-compose --build up
または Dockerスタック を使用:
docker stack deploy -c docker-compose.yml mystack