この記事はFreeBSD Advent Calendar 2016の23日目の記事として公開されました。

はじめに

数年前まで私は、FreeBSDだいすきおじさんでした。Jailで仮想環境をたくさん作ったり、flavourを作ったり、flavourを管理するツールを作ったり1、ワンライナーでインストールしたり2……など、充実したFreeBSDライフを楽しんでいました。 しかし、Dockerという非常に便利なツールが現れました。DockerはLinuxでしか動作しませんが、非常にパワフルで簡単で、そして何より実用的でした。私はFreeBSDというOSが大好きではありましたが、その便利さには抗えず、結果的にFreeBSDから離れることとなってしまいました。。。

しかし、そう。今ではFreeBSDでもDockerは動くらしいのです。 (Docker - FreeBSD Wiki)

その答えを求め我々は南米へ……は飛ばずに、検証してみようと思います。

環境のセットアップ

仮想環境でFreeBSDを起動

2015年6月時点ではFreeBSD 11-CURRENTが推奨されていたようですが、今では11.0-RELEASEがリリースされていますので、こちらで検証します。

最近は仮想環境にHyper-Vを使っているので、今回はHyper-v用のVHDファイルをダウンロードしてきてそのまま利用することにします。

1
2
3
$ curl -LO ftp://ftp2.jp.freebsd.org/pub/FreeBSD/releases/VM-IMAGES/11.0-RELEASE/amd64/Latest/FreeBSD-11.0-RELEASE-amd64.vhd.xz
$ 7z x FreeBSD-11.0-RELEASE-amd64.vhd.xz

VHDファイルが解凍できたので、適当にHyper-Vへインポートします。

SSHサーバの起動

とりあえずネットワークにはDHCPを使うようにして、sshdを起動します。 最近は直接/etc/rc.confを編集するのではなく、sysrcコマンドを使うものらしいです。

1
2
3
$ sysrc sshd_enable="YES"
$ sysrc ifconfig_hn0="DHCP"

あとは/etc/sshd/sshd_confなどを適当に設定してsshdを起動します。 sshでログインしましょう。

Dockerのインストール

公式サイトの内容(https://wiki.freebsd.org/Docker)に沿って進めます。

zfsの準備

1
2
3
4
5
6
7
8
9
$ kldload zfs
$ kldstat
$ dd if=/dev/zero of=/usr/local/dockerfs bs=1024K count=4000
$ zpool create -f zroot /usr/local/dockerfs
$ zpool list
$ zfs list
$ zfs create -o mountpoint=/usr/docker zroot/docker
$ zfs list

結果

※再マウントするときはzfs mount zroot/docker

Dockerをセットアップ

Dockerのインストール

1
2
$ pkg install docker-freebsd ca_root_nss

Bash利用のためにfdデバイスを作成

1
2
3
$ echo ' fdesc   /dev/fd         fdescfs         rw      0       0' >> /etc/fstab
$ mount -t fdescfs fdesc /dev/fd

Dockerをサービス登録&起動

1
2
$ sysrc docker_enable="YES"
$ service docker start

dockerのバージョン確認

1
2
$ docker version

Docker動かしてみる

Ubuntu

ひとまずUbuntuを。

1
2
$ docker search ubuntu

1
2
3
$ docker pull ubuntu
$ docker run ubuntu uname -a

いろいろ遊んでみます。

1
2
$ docker run -it ubuntu bash

1
2
$ apt update

apt updateがエラーになる……

CentOS

そして、公式にも書いてあるCentOSを。

1
2
$ docker search centos

1
2
3
$ docker pull centos:6
$ docker run centos uname -a

いろいろ遊んでみます。

1
2
$ docker run -it centos:6 bash

1
2
3
4
5
$ echo nameserver 8.8.8.8 >> /etc/resolv.conf
$ yum update
$ yum install -y bc
$ echo 9 + 7 | bc

FreeBSD

なぜかFreeBSDのコンテナもある

1
2
$ docker search freebsd

1
2
3
$ docker pull lexaguskov/freebsd
$ docker run lexaguskov/freebsd uname -a

いろいろ遊んでみます。

1
2
$ docker run -it lexaguskov/freebsd tcsh

1
2
3
4
5
$ echo nameserver 8.8.8.8 >> /etc/resolv.conf
$ pkg update
$ pkg install -y sl
$ sl

Jenkins

遊んでばかりでもアレなので、最後にJenkinsの公式イメージをホストしてみます。

1
2
$ docker search jenkins

1
2
3
$ docker pull jenkins:alpine
$ docker run -p 8080:8080 jenkins:alpine

ああああああああ………もうちょい勉強が必要ですね。。。

参考URL