Ubuntu Weekly Recipe

第459回 LXDを使ってDockerコンテナをマイグレーション

この記事を読むのに必要な時間:およそ 11 分

Docker用コンテナの作成

では実際にDockerを動かすためのLXDコンテナを作成し,起動しましょう。ちなみにDockerをLXD上で動かすためには,最低でもLXD 2.0とUbuntu版のカーネル4.4,Ubuntuリポジトリ上のDockerが必要です。Ubuntu 16.04 LTSならいずれも揃っています。

LXD上でDockerを動かすためにはコンテナ作成時に「defaultプロファイル」だけでなく「dockerプロファイル」を明示的に指定する必要があります。これにより,必要な権限がコンテナに設定され,コンテナの中でDockerが使えるようになります。

$ lxc init ubuntu:16.04 docker -p default -p docker
$ lxc start docker
$ lxc list
+--------+---------+---------------------+-----------------------------------------------+------------+-----------+
|  NAME  |  STATE  |        IPV4         |                     IPV6                      |    TYPE    | SNAPSHOTS |
+--------+---------+---------------------+-----------------------------------------------+------------+-----------+
| docker | RUNNING | 10.55.74.241 (eth0) | fdf5:4b0a:8212:503d:216:3eff:fe2e:c662 (eth0) | PERSISTENT | 0         |
+--------+---------+---------------------+-----------------------------------------------+------------+-----------+

コンテナが起動したら,必要に応じてパッケージのアップデートやロケールの設定,再起動などを行います。

$ lxc exec docker -- sed -i "s/archive.ubuntu.com/jp.archive.ubuntu.com/g" /etc/apt/sources.list
$ lxc exec docker apt update
$ lxc exec docker -- apt full-upgrade -y
$ lxc exec docker -- apt install -y language-pack-ja
$ lxc exec docker update-locale LANG=ja_JP.UTF-8
$ lxc exec docker timedatectl set-timezone Asia/Tokyo
$ lxc restart docker

上記のようにexecサブコマンドを使えば,コンテナの中にログインすることなくコマンドを実行可能です。ただ仮想環境として使う場合,毎回lxc execを打つのは面倒ですので,ログインできるようにしましょう。/bin/bashexecすることでもコンテナの中に移動できますが,SSHログインするという手もあります。Ubuntuコンテナであれば最初からSSHサーバーが起動していますので,あとは公開鍵をコンテナの中に移動するだけです。ちなみにUbuntuコンテナには「ubuntu」アカウントが最初から作られています。よってlxc file pushでホストのファイルをコンテナにコピーしてしまいましょう。

$ lxc file push ~/.ssh/id_rsa.pub docker/home/ubuntu/.ssh/authorized_keys
$ lxc exec docker chown ubuntu: /home/ubuntu/.ssh/authorized_keys

もしGitHubにすでに公開鍵を登録済みであれば,ssh-import-idを使ってGitHubからインストールする方法もあります。

$ lxc exec docker -- ssh-import-id -o /home/ubuntu/.ssh/authorized_keys gh:(GitHubのアカウント名)

さて次にDockerそのものをインストールしましょう。これについては第458回「Ubuntuのdocker.ioパッケージ」と手順は同じです。あえてホストからlxc execを実行すると,次のようになります。

$ lxc exec docker -- apt install -y docker.io
$ lxc exec docker getent group docker
docker:x:116:
$ lxc exec docker systemctl is-enabled docker
enabled

ちなみにここまでの手順をCloud Initに任せたい場合は,Cloud Initの設定ファイルを作成した上で,lxc initのあとlxc startの前に次のコマンドを実行してください。

$ lxc config set docker user.user-data - < cloud.cfg

さて実際にDockerが動作しているか試してみましょう。

$ lxc exec docker docker info
Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
Images: 0
Server Version: 1.12.3
Storage Driver: overlay
 Backing Filesystem: extfs
Logging Driver: json-file
(中略)

$ lxc exec docker docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
78445dd45222: Pull complete
(中略)

$ lxc exec docker docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              48b5124b2768        4 weeks ago         1.84 kB

簡単に動きましたね。このようにLXDを使えば,仮想マシンの代わりに軽量コンテナを使った仮想環境を用意した上で,Dockerのテスト環境を作ることができます。

Docker Composeによるマルチコンテナの管理

Docker Composeを使うと,複数のDockerコンテナをYAMLファイルで管理できます。ためしにWordPressコンテナとMySQLコンテナを導入するDocker Composeを使ってみましょう。

Docker ComposeはDocker本体とは別にインストールする必要があります。Ubuntuの公式リポジトリにもdocker-composeパッケージが存在しますが,こちらはバージョンが古い状態です。そこでDockerのサイトからバイナリをダウンロードしてインストールしましょう※4)⁠

※4
バイナリをダウンロードする以外にも,pipからインストールする方法や,Docker Composeコマンド自体をDockerコンテナで動かす方法も存在します。

今回はLXDコンテナの中でDockerを動かしているため,lxc execコマンド経由でコンテナの中にDocker Composeをインストールしています。ホストに直接インストールするなら,適宜コマンドを読み替えてください。

$ lxc exec docker -- curl -L "https://github.com/docker/compose/releases/download/1.11.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ lxc exec docker -- chmod +x /usr/local/bin/docker-compose
$ lxc exec docker -- docker-compose --version
docker-compose version 1.11.1, build 7c5d5e4

Docker Composeはdocker-compose.ymlファイルを作って,その中に個々のコンテナの設定を記述します。今回はDocker ComposeのドキュメントにあるWordPressの例をそのまま使いましょう。

version: '2'

services:
   db:
     image: mysql:5.7
     volumes:
       - db_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: wordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress

   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     ports:
       - "8000:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_PASSWORD: wordpress
volumes:
    db_data:

ホストで作ったdocker-compose.ymlをLXDコンテナの中にコピーします。LXDはlxd fileコマンドを使うことで,コンテナとホスト間のファイルのやり取りが行えます。なおDocker Compose用のプロジェクトディレクトリとしてwordpressディレクトリも作っています。

$ lxc exec docker -- sudo -u ubuntu mkdir /home/ubuntu/wordpress
$ lxc file push docker-compose.yml docker/home/ubuntu/wordpress/

最後にDocker Compose経由でWordPressコンテナとMySQLコンテナを起動しましょう。詳細は省きますが,プロジェクトディレクトリの中でdocker-compose upコマンドを実行するだけです。-dオプションをつけるとバックグラウンドで起動します。

$ lxc exec docker -- sh -c "cd /home/ubuntu/wordpress && docker-compose up -d"
Creating network "wordpress_default" with the default driver
Creating volume "wordpress_db_data" with default driver
Pulling db (mysql:5.7)...
5.7: Pulling from library/mysql
(中略)
Status: Downloaded newer image for wordpress:latest
Creating wordpress_db_1
Creating wordpress_wordpress_1

$ lxc exec docker -- sh -c "cd /home/ubuntu/wordpress && docker-compose ps"
        Name                       Command               State          Ports
-------------------------------------------------------------------------------------
wordpress_db_1          docker-entrypoint.sh mysqld      Up      3306/tcp
wordpress_wordpress_1   docker-entrypoint.sh apach ...   Up      0.0.0.0:8000->80/tcp

起動中のコンテナの状態はdocker-compose psで確認します。もちろんdocker psでもコンテナの状態は確認できます。さらにlxc listコマンドを使えばLXDコンテナの情報を取得できます。

$ lxc list docker -c 46
+--------------------------------+-----------------------------------------------+
|              IPV4              |                     IPV6                      |
+--------------------------------+-----------------------------------------------+
| 172.18.0.1 (br-3b0ff7fa92ef)   | fdf5:4b0a:8212:503d:216:3eff:fe2e:c662 (eth0) |
| 172.17.0.1 (docker0)           |                                               |
| 10.55.74.241 (eth0)            |                                               |
+--------------------------------+-----------------------------------------------+

eth0に割り当てられているアドレスにアクセスすれば,WordPressの初期設定ページが表示されることでしょう。上記の例であれば,次のようなアドレスになります。

  • http://10.55.74.241:8000/
  • http://[fdf5:4b0a:8212:503d:216:3eff:fe2e:c662]:8000/

著者プロフィール

柴田充也(しばたみつや)

Ubuntu Japanese Team Member株式会社 創夢所属。数年前にLaunchpad上でStellariumの翻訳をしたことがきっかけで,Ubuntuの翻訳にも関わるようになりました。

コメント

コメントの記入