ブラックボックス

プログラミングのノウハウやライフハックをどんどん投稿していきたい

Nov 11, 2017 - 4 minute read - ノウハウ

【Docker】AmazonLinuxイメージのyumを少しだけ早くするかもしれない方法

ちょっと環境が変わって、最近はDockerばかり触っています。
Dockerは1コンテナ1サービスってのが主流というか流れという話を聞きましたが、
本番環境ではDockerを使用しておらず、開発環境を構築する為のDockerなので、本番環境と同じような環境を作りたいのです。
で、本番環境もお客様の都合やら政治的なんちゃらの影響で1つのサーバにApacheとMySQLが混在するなんてこともあります。
そんな時に本番で使っているAmazonLinuxのイメージを元にDockerfileにApacheやらMySQLやらのyumを書きますが、
いかんせん構築までに時間がかかるんですよね。

前置きが長くなりましたが、多分少しだけAmazonLinuxのイメージでyumが早くなると思われる方法をメモとして残します。

事の発端としては、yumで100以上のパッケージをインストールした時にタイムアウトを起こしたときのメッセージでした。
スクリーンショットやらは残っていないのですが「us-west-1」だったかのリポジトリを参照してエラーと出ていました。
日本からus-west-1を見に行くのって距離あるし遅いんじゃ……?と思い、ちょっと実験。
実験用に用意したDockerfileはこんな感じです。

FROM amazonlinux:2016.09
MAINTAINER hoge

RUN echo 'ZONE="Asia/Tokyo"' > /etc/sysconfig/clock
RUN yum -y install ntp
RUN rm -f /etc/localtime
RUN ln -fs /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

RUN localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja
ENV LC_ALL ja_JP.UTF-8

RUN yum -y install gcc-c++ patch openssl-devel readline readline-devel libyaml-devel \
    zlib zlib-devel libffi-devel make bzip2 autoconf automake libtool bison iconv-devel \
    git vi ImageMagick-devel sqlite-devel gdbm-devel which file wget

実行

ひとまずこれで実行。
Docker Composeで環境を作っている最中の実験なので、Docker Composeで実行しています。
また、途中は長いので端折りました。

$ docker-compose build --no-cache test

Building test
Step 1/11 : FROM amazonlinux:2016.09
 ---> 1302c1eebf29
:
:

トランザクションの要約
================================================================================
インストール  20 パッケージ (+118 個の依存関係のパッケージ)
更新                        (   8 個の依存関係のパッケージ)

総ダウンロード容量: 147 M
Downloading packages:
--------------------------------------------------------------------------------
合計                                               1.1 MB/s | 147 MB  02:09

1.1MB/sでした。
これはus-west-1に繋いでいるはず。

Dockerfileの改善バージョンがこちら

FROM amazonlinux:2016.09
MAINTAINER hoge

RUN echo 'ZONE="Asia/Tokyo"' > /etc/sysconfig/clock

RUN echo "ap-northeast-1" > /etc/yum/vars/awsregion

RUN yum -y install ntp
RUN rm -f /etc/localtime
RUN ln -fs /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

RUN localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja
ENV LC_ALL ja_JP.UTF-8

RUN yum -y install gcc-c++ patch openssl-devel readline readline-devel libyaml-devel \
    zlib zlib-devel libffi-devel make bzip2 autoconf automake libtool bison iconv-devel \
    git vi ImageMagick-devel sqlite-devel gdbm-devel which file wget

変更点は6行目。
実行している国から近いリージョンをファイルに書き込むようにしてみました(ファイルについては後述)。

ということでこのDockerfileで再度実行。

$ docker-compose build --no-cache test

Building test
Step 1/12 : FROM amazonlinux:2016.09
 ---> 1302c1eebf29
:
:

トランザクションの要約
================================================================================
インストール  20 パッケージ (+118 個の依存関係のパッケージ)
更新                        (   8 個の依存関係のパッケージ)

総ダウンロード容量: 147 M
Downloading packages:
--------------------------------------------------------------------------------
合計                                               3.4 MB/s | 147 MB  00:43     

3.4MB/sとだいぶ速くなった。
回線の混み具合の影響もあるかなと思って何度かやりましたが、全て後者の方が速かったです。

考察

で、なんで速くなったのかなと思って見てみましたが、ミラーリストの取得先が影響しているのかなと考えています。
AmazonLinuxのイメージの中にあるリポジトリ設定を見てみると下記のようになっています。

/etc/yum.repos.d/amzn-main.repo

[amzn-main]
name=amzn-main-Base
mirrorlist=http://repo.$awsregion.$awsdomain/$releasever/main/mirror.list
:
:

$awsregion という変数は /etc/yum/vars/awsregion の値を取得しています。
何も変更していないと、ここには「default」が設定されています。
defaultの場合に取得されるリストは下記でした。

http://packages.us-west-1.amazonaws.com/2017.09/main/154a6dd467e2/$basearch
http://packages.us-west-2.amazonaws.com/2017.09/main/154a6dd467e2/$basearch
http://packages.eu-west-1.amazonaws.com/2017.09/main/154a6dd467e2/$basearch
http://packages.eu-central-1.amazonaws.com/2017.09/main/154a6dd467e2/$basearch
http://packages.ap-southeast-1.amazonaws.com/2017.09/main/154a6dd467e2/$basearch
http://packages.ap-northeast-1.amazonaws.com/2017.09/main/154a6dd467e2/$basearch
http://packages.ap-northeast-2.amazonaws.com/2017.09/main/154a6dd467e2/$basearch
http://packages.sa-east-1.amazonaws.com/2017.09/main/154a6dd467e2/$basearch
http://packages.ap-southeast-2.amazonaws.com/2017.09/main/154a6dd467e2/$basearch

us-west-1が一番上に設定されています。
で、ここに「northeast-1」を設定してやった時のリストはというと

http://packages.ap-northeast-1.amazonaws.com/2017.09/main/154a6dd467e2/$basearch
http://packages.ap-northeast-2.amazonaws.com/2017.09/main/154a6dd467e2/$basearch
http://packages.ap-southeast-1.amazonaws.com/2017.09/main/154a6dd467e2/$basearch
http://packages.us-west-1.amazonaws.com/2017.09/main/154a6dd467e2/$basearch
http://packages.us-west-2.amazonaws.com/2017.09/main/154a6dd467e2/$basearch
http://packages.us-east-1.amazonaws.com/2017.09/main/154a6dd467e2/$basearch
http://packages.eu-central-1.amazonaws.com/2017.09/main/154a6dd467e2/$basearch
http://packages.eu-west-1.amazonaws.com/2017.09/main/154a6dd467e2/$basearch
http://packages.sa-east-1.amazonaws.com/2017.09/main/154a6dd467e2/$basearch
http://packages.ap-southeast-2.amazonaws.com/2017.09/main/154a6dd467e2/$basearch

northeast-1が一番上となりました。
やはりコンテナを作る国とリージョンは合わせた方が良いということなのだろうか。

これで秘伝のDockerfileにまたスパイスが追加されることになりました。