今話題になっているDockerについて簡単に説明します。
Dockerは開発者とシステム担当者がアプリケーションの配信や動作をさせるためのオープンなプラットフォームです。簡単に説明すると、仮想化を行うソフトウェアです。VMware製品などの完全仮想化を行うハイパーバイザー型製品と比べて、ディスク使用量は少なく、インスタンス作成やインスタンス起動は速く、性能劣化がほとんどないという利点が大きな特長でクラウドサービスやビッグデータ基盤などを管理するためのIT基盤として注目されている技術です。(Wikipedia:Docker)
DockerソースコードはGitHubで公開されています。
Dockerのメリット
今までの仮想化で使われてきたソフトウェアと比べ、小さくて、速くて、扱いが容易、ポータビリティー(可搬性)が高く、運用にあたり専門的な知識が必要なく、レジストリサービスには公式コンテナが公開されていて、無料で提供され商用でも0円、とメリットが多くあります。
用途は主にコンテナと呼ばれる単位でのアプリケーション稼働に限定されますが、今までの仮想化環境でのデメリット(起動が重い、価格が高い、運用が難しいなど)がない、開発者とシステム担当者にとって手が届く理想的な仮想環境がDockerです。
Dockerを取り巻く動きとしてRedHat社やWindowsのマイクロソフト社など大手OSとの提携、サードパーティーによるサポートプログラムの提供、Docker社による商用プランの登場、ベンチャーキャピタルからの多額の資金調達などとても活発です。
今ではオープンソース界隈のGitHubのように、インフラ・プラットフォームの再構築においてDockerの検討は欠かせないものになりつつあります。
この記事では開発者向けに、DockerをUbuntu 14.04 LTSにインストールする手順を説明します。
Docker : https://www.docker.com/
Dockerをインストール(Ubuntu 14.04 LTS)
$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 14.04.2 LTS Release: 14.04 Codename: trusty
Docker公式のUbuntuへのインストール手順は以下URLをご確認下さい。
https://docs.docker.com/installation/ubuntulinux/
他プラットフォームへのインストールは以下URLから参照できます。
https://docs.docker.com/installation/
動作条件確認
カーネルのバージョンが3.10以上であることが動作条件にありますので、インストール環境でのカーネルのバージョンを確かめます。ここでは3.13なので問題ありませんでした。
$ uname -r 3.13.0-57-generic
Dockerのインストール
wgetを利用するためインストールします。既にインストールされていれば必要ありません。
$ which wget /usr/bin/wget
新しくインストールする場合はapt-getを利用してインストールします。
$ sudo apt-get update $ sudo apt-get install wget
wgetを利用してdockerをインストールします。
$ wget -qO- https://get.docker.com/ | sh
正常にインストールできた場合、コンソールの最後に以下のメッセージが表示されます。
If you would like to use Docker as a non-root user, you should now consider adding your user to the "docker" group with something like: sudo usermod -aG docker user Remember that you will have to log out and back in for this to take effect!
さあ次にDockerが本当に正しくインストールされていて、動作するのかを試します。
$ sudo docker run hello-world Unable to find image 'hello-world:latest' locally latest: Pulling from hello-world 535020c3e8ad: Pull complete af340544ed62: Already exists hello-world:latest: The image you are pulling has been verified. Important: image verification is a tech preview feature and should not be relied on to provide security. Digest: sha256:d5fbd996e6562438f7ea5389d7da867fe58e04d581810e230df4cc073271ea52 Status: Downloaded newer image for hello-world:latest Hello from Docker. This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker Hub account: https://hub.docker.com For more examples and ideas, visit: https://docs.docker.com/userguide/
動作していますね、インストールの問題はなさそうです。
UbuntuでDockerを使う設定
次にUbuntu上でDockerを使うにあたり、いくつか設定する項目があるのでそれらを行います。
”docker”グループの追加
“docker”グループを新しく作ってsudo権限をもっているユーザーに付与します。
これはdockerデーモンがUnixソケットにバインドする関係によるものです。Unixソケットのオーナーはデフォルトでrootユーザーのため、dockerの実行にはルート権限が必要です。そのためdockerデーモンは常にrootユーザーとして動きます。
そのため常にroot権限を必要します。このroot権限で動作させる事に懸念を持つ方は類似サービスのrkt(https://github.com/coreos/rkt)をご検討下さい。
$ sudo usermod -aG docker user
“docker”グループを付与した後にログアウト、ログインを行い入りなおします。次にログインし直した状態でsudoを付けずにdockerを動作させます。
$ docker run hello-world
正常に動作すると、前述での実行結果が再度表示されます。ログインし直さずに、sudoを付けないでdockerを実行すると以下のようなエラーが表示されます。dockerソケットにアクセスする権限がないと言われています。
$ docker run hello-world Post http:///var/run/docker.sock/v1.19/containers/create: dial unix /var/run/docker.sock: permission denied. Are you trying to connect to a TLS-enabled daemon without TLS?
メモリとスワップの調整
grubの設定を変更する必要があるので、grubに変更を加えるのはちょっと嫌だなあと思いつつも警告メッセージを回避するために設定したいと思います。
編集にroot権限が必要なファイルのためsudoして編集します。
$ sudo vi /etc/default/grub
GRUB_CMDLINE_LINUXの値を以下に変更するように説明されています。
GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"
この記事を作る中での環境では以下が設定されていたので、これに追記する形にします。
変更前:
GRUB_CMDLINE_LINUX="find_preseed=/preseed.cfg auto noprompt priority=critical locale=en_US"
変更後:
GRUB_CMDLINE_LINUX="find_preseed=/preseed.cfg auto noprompt priority=critical locale=en_US cgroup_enable=memory swapaccount=1"
編集を加えたらファイルを保存して閉じます。そしてgrubの設定反映を行います。/boot/grub/grub.cfgが更新されます。
$ sudo update-grub Generating grub configuration file ... Warning: Setting GRUB_TIMEOUT to a non-zero value when GRUB_HIDDEN_TIMEOUT is set is no longer supported. Found linux image: /boot/vmlinuz-3.13.0-57-generic Found initrd image: /boot/initrd.img-3.13.0-57-generic Found linux image: /boot/vmlinuz-3.13.0-24-generic Found initrd image: /boot/initrd.img-3.13.0-24-generic Found memtest86+ image: /boot/memtest86+.elf Found memtest86+ image: /boot/memtest86+.bin done
編集して反映後、再起動します。grubに変更加えて再起動したら上手く起動しないかも知れないという一抹の恐怖があります。
$ sudo reboot
再起動に成功したら完了です。
ファイヤーウォールを有効してdockerのポートを許可する
既存の環境に影響するかも知れませんし、UFW(https://help.ubuntu.com/community/UFW)も出来る限り設定を変更したくない方も居ると思います。この設定はご自身の環境に合わせて行ってください。
ufwが有効になっているとデフォルトの状態では全てのトラフィックを許可しません。そのためufwが有効になっている環境でdockerを動かすにはufwの転送ポリシーの変更とdockerのデフォルトポート番号2375を許可する必要があります。
ufwの状態を確認します。この記事を書いている環境ではinactive(動作していない)でした。
$ sudo ufw status Status: inactive
ufwの設定をエディタで編集を加えます。
$ sudo vi /etc/default/ufw
DEFAULT_FORWARD_POLICYの値を”ACCEPT”に変更、保存して閉じます。
DEFAULT_FORWARD_POLICY="ACCEPT"
ufwを再起動して新しい設定を有効にします。
$ sudo ufw reload
dockerのデフォルトのポート番号2375を許可するようにします。
$ sudo ufw allow 2375/tcp Rules updated Rules updated (v6)
DNSサーバーの設定
dockerコンテナではローカルのDNSサーバーを使うことができないため、dockerがローカルのDNSサーバーを参照しに行こうとして警告が表示される場合があります。Dockerのインストールマニュアルでは、この警告への対処方法が2通り説明されていますが、dockerに直接DNSを指定する方法が良さそうなのでこちらの方法を説明します。
dockerの設定ファイルを編集します。
$ sudo vi /etc/default/docker
DOCKER_OPTS=”–dns 8.8.8.8″と、ここではGoogleのDNSを指定しています。/etc/default/dockerの中で該当行がコメントアウトされていましたので、このコメントを消してDNSの指定を有効にしました。
変更前:
#DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"
変更後:
DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"
ファイルを編集、保存後にdockerの再起動を行うと反映されます。
$ sudo restart docker docker start/running, process 2946
まとめ、dockerのインストール手順を通して
docker自体のインストールはとても簡単です。利用者が多い事もあってOS・環境別のマニュアルが整備されています。若干複雑なのはroot権限に関係する設定と、ネットワークに関係するOS/プラットフォーム固有の設定です。
docker自体よりも、それを利用するための環境構築の方が慣れていない方には難しいでしょう。
アプリケーション開発者と、システム担当者にこれから求められるスキルの1つに、dockerのようなコンテナ型仮想化環境の取り扱いがあります。企業規模やサービス規模の大小を問わず各社で利用されており汎用性が高いスキルです。
仮想化というと難しそうという印象があるかも知れませんが、使ってみると意外と便利で簡単だと思います。ぜひ一度Dockerの導入をお試しください。
本ブログは、Git / Subversionのクラウド型ホスティングサービス「tracpath(トラックパス)」を提供している株式会社オープングルーヴが運営しています。
エンタープライズ向け Git / Subversion 導入や DevOps による開発の効率化を検討している法人様必見!
「tracpath(トラックパス)」は、企業内の情報システム部門や、ソフトウェア開発・アプリケーション開発チームに対して、開発の効率化を支援し、品質向上を実現します。
さらに、システム運用の効率化・自動化支援サービスも提供しています。
”つくる情熱を支えるサービス”を提供し、まるで専属のインフラエンジニアのように、あなたのチームを支えていきます。
No Comments