プログラミングと旅と映画の日々

食品の営業からSEに転職した文系エンジニアです。 プログラミングと趣味の株に関してブログを書いていこうと思います。

【Docker】コンテナのリンクオプションとは【入門】

Dockerコンテナのリンクオプションとは

f:id:takanori5:20181028132956p:plain
こんにちは

本日はDockerのリンク機能についてみていきます。

リンクオプションの使い方

以下のコマンドで実行可能

docker run --link <コンテナ名orコンテナID> :<リンク先コンテナの別名>...

リンクオプションを付けた場合の動作

リンクオプションを付けてコンテナを起動した場合、

  • リンク先のコンテナにエイリアスで通信できるようになる(リンクしなくてもIPで通信は可能)
  • リンク先の環境変数や、リンク先コンテナのネットワークに対する環境変数が自動で追加される

実践

これから行うコンテナの構成図と概要

リバースプロキシコンテナとstatic siteコンテナの2つの構成を表す。
リバースプロキシコンテナからstatic siteコンテナにエイリアスでアクセスできるようにしていく

f:id:takanori5:20181110142101p:plain
*ちなみに、このようにブラウザからサーバの間にリバースプロキシを挟むことで
複数のウェブサーバーに負荷を分散させたり、身元を隠すことが可能です。

まず、nginxの設定ファイルを作成します

nginxのconfファイル作成
$ vim reverser_proxy.conf

$ cat reverser_proxy.conf
server {
 listern 8080;
 server_name localhost;

 location / {
  proxy_pass http://ss;
 }
}

この設定により、リバースプロキシコンテナの8080ポートにアクセスがきた場合に
ssというhostにリクエストを転送する動作となる

次にこの作成した設定ファイルをnginxの設定ファイルのディレクトリに配置して
新しいイメージを作成するDockerファイルを作成していきます!!

Dockerfileの作成
$ vim Dockerfile
$ cat Dockerfile
FROM nginx:latest
COPY /reverse_proxy.conf /etc/nginx/conf.d/reverse_proxy.conf
RUN apt-get update && apt-get install -y inetutuils-ping

COPY /reverse_proxy.conf /etc/nginx/conf.d/reverse_proxy.conf
で先ほど作成したconfをnginxの設定ファイルのディレクトリに配置
RUN apt-get update && apt-get install -y inetutuils-ping
その後pingで通信確認するのに必要なパッケージを取得しています。

ではDockerfileをビルドします。

imagebuild
$docker build -t reverse_proxy .
$ docker build -t reverse_proxy .
Sending build context to Docker daemon  3.072kB
Step 1/3 : FROM nginx:latest
 ---> dbfc48660aeb
Step 2/3 : COPY /reverse_proxy.conf /etc/nginx/conf.d/reverse_proxy.conf
 ---> Using cache
 ---> 4ba07543c8af
Step 3/3 : RUN apt-get update && apt-get install -y inetutils-ping
 ---> Running in 818d2f64318c
Ign:1 http://cdn-fastly.deb.debian.org/debian stretch InRelease
Get:2 http://security-cdn.debian.org/debian-security stretch/updates InRelease [94.3 kB]
Get:3 http://cdn-fastly.deb.debian.org/debian stretch-updates InRelease [91.0 kB]
Get:4 http://cdn-fastly.deb.debian.org/debian stretch Release [118 kB]
Get:5 http://cdn-fastly.deb.debian.org/debian stretch-updates/main amd64 Packages [5152 B]
Get:6 http://security-cdn.debian.org/debian-security stretch/updates/main amd64 Packages [454 kB]
Get:7 http://cdn-fastly.deb.debian.org/debian stretch Release.gpg [2434 B]
Get:8 http://cdn-fastly.deb.debian.org/debian stretch/main amd64 Packages [7099 kB]
Fetched 7864 kB in 17s (448 kB/s)
Reading package lists...
Reading package lists...
Building dependency tree...
Reading state information...
The following additional packages will be installed:
  netbase
The following NEW packages will be installed:
  inetutils-ping netbase
0 upgraded, 2 newly installed, 0 to remove and 1 not upgraded.
Need to get 242 kB of archives.
After this operation, 390 kB of additional disk space will be used.
Get:1 http://cdn-fastly.deb.debian.org/debian stretch/main amd64 netbase all 5.4 [19.1 kB]
Get:2 http://cdn-fastly.deb.debian.org/debian stretch/main amd64 inetutils-ping amd64 2:1.9.4-2+b1 [223 kB]
debconf: delaying package configuration, since apt-utils is not installed
Fetched 242 kB in 0s (249 kB/s)
Selecting previously unselected package netbase.
(Reading database ... 7027 files and directories currently installed.)
Preparing to unpack .../archives/netbase_5.4_all.deb ...
Unpacking netbase (5.4) ...
Selecting previously unselected package inetutils-ping.
Preparing to unpack .../inetutils-ping_2%3a1.9.4-2+b1_amd64.deb ...
Unpacking inetutils-ping (2:1.9.4-2+b1) ...
Setting up netbase (5.4) ...
Setting up inetutils-ping (2:1.9.4-2+b1) ...
Removing intermediate container 818d2f64318c
 ---> 6f5bab86233d
Successfully built 6f5bab86233d
Successfully tagged reverse_proxy:latest

build成功です!
docker imagesで念のため確認しておきます。
大丈夫そうですね!

$ docker images
REPOSITORY               TAG                   IMAGE ID            CREATED              SIZE
reverse_proxy            latest                6f5bab86233d        About a minute ago   127MB

続いてstatic siteコンテナを起動しておきます。

static siteコンテナの起動
$ docker run --name static-site -e AUTHOR="Takanori5" -d dockersamples/static-site
Unable to find image 'dockersamples/static-site:latest' locally
latest: Pulling from dockersamples/static-site
fdd5d7827f33: Pull complete
a3ed95caeb02: Pull complete
716f7a5f3082: Pull complete
7b10f03a0309: Pull complete
aff3ab7e9c39: Pull complete
Digest: sha256:daa686c61d7d239b7977e72157997489db49f316b9b9af3909d9f10fd28b2dec
Status: Downloaded newer image for dockersamples/static-site:latest
6be1be9837e6b1ff70952a4c1fca4035ec4aeae6279ff4b18d441950e9ba1355

*-eは引数の環境変数を設定するオプション
 このページではAUTHORという環境変数に名前を設定しておくとそれが静的ページに表示される仕組みとなっています。

次に、先ほど作成したリバースプロキシイメージから
コンテナを起動します

リバースプロキシイメージからコンテナを起動
$ docker run --name reverse_proxy  -p 8080:8080 --link static-site:ss -d reverse_proxy
226d3824bfdb0b5a02498e8354740c8b4542598ae3a7a339c5d60b2ae6902c39

このコンテナは8080番ポートを外部に公開し、
staticsiteコンテナにリンクして、エイリアスとしてssという名前を付けています。

起動中のプロセスを一度確認します。

$ docker ps
CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS              PORTS                            NAMES
4b70064342f6        reverse_proxy               "nginx -g 'daemon of…"   5 seconds ago       Up 4 seconds        80/tcp, 0.0.0.0:8080->8080/tcp   reverse-proxy
6be1be9837e6        dockersamples/static-site   "/bin/sh -c 'cd /usr…"   12 minutes ago      Up 11 minutes       80/tcp, 443/tcp                  static-site

2つのコンテナが起動できました。

コンテナの動作確認

では、2つのコンテナの動作確認をしていきます!!

まずはブラウザでローカルホストの8080にアクセスしてみます。
http://localhost:8080/
f:id:takanori5:20181110153119p:plain
このWebページはリバースプロキシを経由してstaticsiteコンテナにアクセスすることで取得しています。
では、リバースプロキシコンテナにシェル接続してリンクによる設定を確認してみます。

$ docker exec -it reverse-proxy /bin/bash
root@4b70064342f6:/#

まずは、どのようにしてstaticsiteやssというエイリアス名で通信先を特定できたのか確認します。
hostファイルを見ます。

root@4b70064342f6:/# cat /etc/hosts
127.0.0.1	localhost
::1	localhost ip6-localhost ip6-loopback
fe00::0	ip6-localnet
ff00::0	ip6-mcastprefix
ff02::1	ip6-allnodes
ff02::2	ip6-allrouters
172.17.0.4	ss 6be1be9837e6 static-site
172.17.0.5	4b70064342f6

172.17.0.4 ss 6be1be9837e6 static-site
ここで名前解決していますね。
これがリンク機能の一つです。
続いてenvコマンドで環境変数の設定を見ていきます。

/# env |grep SS_
SS_ENV_NGINX_VERSION=1.9.12-1~jessie
SS_PORT_443_TCP_ADDR=172.17.0.4
SS_PORT_80_TCP=tcp://172.17.0.4:80
SS_PORT_443_TCP=tcp://172.17.0.4:443
SS_ENV_AUTHOR=Takanori5
SS_PORT_80_TCP_PROTO=tcp
SS_PORT=tcp://172.17.0.4:80
SS_PORT_443_TCP_PORT=443
SS_PORT_80_TCP_ADDR=172.17.0.4
SS_NAME=/reverse-proxy/ss
SS_PORT_443_TCP_PROTO=tcp
SS_PORT_80_TCP_PORT=80

author変数に値が設定されていますね!
この環境変数はreverse-proxyコンテナに明示的に指定していませんが、
リンク先コンテナに指定しているものなので
リンク機能により自動で設定がされています!
便利ですね!!

これらがリンクの機能です!
コンテナ名の名前解決はリンクを使わなくても
Dockerのネットワークを作ることで実現できるので
ここで見たように環境変数を注入したい時だけ使うといいみたいです。

今回は以上です。