Version 28 (modified by yuna, 9 years ago) (diff) |
---|
Docker
個人的なメモなので、Dockerを勉強したい場合、ここより他のサイトを見ることをお勧めします。
Ubuntuで最新のDockerを使う
ここみる http://www.ubuntuupdates.org/ppa/docker
最新版のDockerは、Dockerプロジェクトでパッケージを配布している。ここみるとよい http://blog.docker.com/2015/07/new-apt-and-yum-repos/ Key Serverにうまく接続できないときは、下記のようにubuntuのKey Serverを利用する。Ubuntu 14.04(trusty)の例だと下記のようになる。
# apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 58118E89F3A912897C070ADBF76221572C52609D # echo "deb https://apt.dockerproject.org/repo ubuntu-trusty main" >> /etc/apt/sources.list # apt-get update # apt-get install docker-engine
設定について
プロキシ
http_proxyやDNSの設定は、/etc/default/dockerでやる。http_proxyは設定しておかないとProxy環境ではdocker search/pullが使えない。 DNSをきちんと設定しておかないと、サーバプロセスが遅くなることがあるので注意
ストレージドライバ
Ubuntuでは、デフォルトのストレージドライバがaufs。overlayfsを試したい場合は、次のようにする。
/etc/default/docker DOCKER_OPTS="-s overlay"
設定後dockerデーモンを再起動。
# service docker restart
aufsで利用していたイメージ、コンテナは全て消えるので、注意が必要。イメージの移行は下記のようにする。
# docker ps CONTAINER ID IMAGE ... 1869db53a211 mariadb ... .. # docker commit 1869db53a211 export/server1 # docker save export/server1 > export_server1.tar.gz (ドライバ変更後) # docker load < export_server1.tar.gz
Dockerfile
Dockerイメージを作るファイル
- COPYは使わずADDを使う。ADDの方がURLを指定したり、アーカイブを自動解凍したり高機能。
- ENTRYPOINT/CMDは引数無しで実行したときのデフォルトの実行コマンド。CMDは上書き可能でENTRYPOINTは上書きできない。
- 汎用的なイメージを作りたい場合はCMD。アプリケーションコンテナとしてユーザに勝手な操作をさせないならENTRYPOINT
- ただしENTRYPOINTを利用した場合でも、ENTRYPOINTとして利用するファイルは変更可能
プロキシが必要な環境でイメージのビルドを行いたい場合、ENVコマンドを利用することにより、ビルド時の環境変数を設定することができます。
ENV http_proxy http://myproxy.server.com:8080 ENV https_proxy http://myproxy.server.com:8080
ネットワーク
DockerfileにEXPOSEを記述して、公開するポートを指定。もしくは、--expose <port>でポートを公開。
Dockerのホスト以外からアクセスする場合は、-p <ホストのポート>:<コンテナのポート>オプションでホストのポートを使って公開。例えば、SSHのポートをホストの2022番でアクセスできるようにするには、下記のようになる。
# docker run -it --name foo --expose 22 -p 2022:22 ubuntu /bin/bash
起動済みのDockerのポートの公開
Docker自身には機能はありません。ホスト上でiptablesを利用して直接設定してやります。例えば、上記のコンテナ上の22番をホスト上の2022番に公開するには、次のようにします。
まず、コンテナのIPアドレスを調べます。
# docker inspect コンテナ名 |grep IPAddress "IPAddress": "172.17.0.18",
上記で調べたコンテナに対して、直接iptableを設定します。
# iptables -t nat -A DOCKER ! -i docker0 -p tcp -m tcp --dport 2022 -j DNAT --to-destination 172.17.0.18:22 # iptables -t filter -A DOCKER -d 172.17.0.18/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 22 -j ACCEPT
イメージ初期化のChips
Tipsですね。ポテトチップスではありません。
- expect: コマンドラインでインタラクティブな設定を行う場合利用
- supervisord: Dockerではsystemdが使えないので、supervisordなどでデーモンを起動するとよい
Dockerでベンチマーク
MariaDBでDockerのベンチマークを取ってみる。
コンテナ取得、起動
# docker pull mariadb # docker run --name mariadb1 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=password -d mariadb
ベンチマークツールインストール
# apt-get install sysbench mariadb-client
ベンチマーク準備
# mysqladmin -h 192.168.1.5 -u root --password=password create sbtest # sysbench --test=oltp --oltp-table-size=200000 --max-time=300 --max-requests=0 --mysql-host=192.168.1.5 --mysql-port=3306 --mysql-table-engine=InnoDB --mysql-user=root --mysql-password=password --mysql-engine-trx=yes --num-threads=5 prepare
ベンチマークをやり直し場合、mysqladmin dropでsbtestを削除してからやり直す。
ベンチマーク実行
# sysbench --test=oltp --oltp-table-size=200000 --max-time=300 --max-requests=0 --mysql-host=192.168.1.5 --mysql-port=3306 --mysql-table-engine=InnoDB --mysql-user=root --mysql-password=password --mysql-engine-trx=yes --num-threads=5 run
コンテナの再開
docker startを利用すると既存のコンテナを再開することができます。コンテナ再開時の初期化処理は、docker runで指定した環境変数はそのままに、/entrypoint.shが実行されます。
Dockerのbashに接続
Dockerコンテナ内のbashに接続するには、docker attachを利用する。
Dockerでサービスを利用
systemdを利用
CentOS7のDockerイメージは、systemd-containerというパッケージがインストールされており、systemdを利用してコンテナ内のサービスを起動することができます。
CentOS7のsystemdのサービスを利用するには、下記のコマンドで/sbin/initを利用する。
# docker run --name mycon --privileged -it hoge /sbin/init
コンテナにbashで乗り込んでサービスを有効にする。
# docker exec -it mycon /bin/bash # service enable httpd # service mariadb # exit
コンテナを終了、コミットしイメージを作成
# docker stop mycon # docker commit mycon myserv
作成したイメージで、/sbin/initを起動するとサービスが起動する。CMDやENTRYPOINTを利用してもよい。
# docker run --privileged myserv /sbin/init
upstartを利用してサービスを起動
Ubuntuでupstartを利用してサービスを起動するサンプルを下記の場所にあります。
supervisordを利用してサービスを利用
上記のsystemdを利用する方法は、特権が必要となり、あまりセキュアではありません。また、CentOSはsystemd、Ubuntuはupstartとサービスの起動方法が違っては、 OS毎の設定が面倒です。supervisordを利用すると、特権を利用せず、また、統一的な方法でdocker内でサービスを管理することができます。
# apt-get install python-setuptools # easy_install supervisor # echo_supervisord_conf > /etc/supervisord.conf
上記supervisord.confにサービスの設定を記述
[supervisord] nodaemon=true [program:mariadb] command=/usr/bin/mysqld_safe autostart=true autorestart=true [program:httpd] command=/usr/local/bin/pidproxy /var/run/apache2/apache2.pid /bin/bash -c "source /etc/apache2/envvars && /usr/sbin/apache2 -DFOREGROUND" redirect_stderr=true
イメージをコミットして、supervisordをコンテナで起動すれば、mysqlとapacheが起動します。
# docker run image /usr/local/bin/supervisord
イメージ・コンテナファイルの場所を変更
Dockerはデフォルトでは、/var/lib/dockerにコンテナやイメージファイルを格納している。別のディレクトリに保存したい場合、/var/lib/dockerをシンボリックリンクにすることが考えらえるが、シンボリックリンクではうまく動作しない。bind mountを利用するか、/etc/default/dockerに-gオプションを追加して、dockerのディレクトリを指定する必要がある。
bind mountを利用する場合、/etc/fstabに次のように記述するとよい。
/mnt/disk2/docker /var/lib/docker none defaults,bind 0 0
コミットせずにコンテナ設定を変える
基本的にコンテナの設定を変えるためには、コンテナを一度コミットして、起動し直す必要があります。 コンテナのディスクサイズが大きくなると、コミットするのにも時間がかかります。
コンテナ設定ファイルのconfig.jsonを編集することで、コンテナの設定を変更することができます。 config.jsonファイルを編集する際の注意として、dockerサービスを停止しておく必要があります。 config.jsonの内容はdockerサービス内でキャッシュされているので、停止してから編集する必要があります。 また、サービスの停止に
# service docker stop
コンテナの設定ファイルは、/var/lib/docker/containers/コンテナID/config.jsonにあります。コンテナ実行時のコマンドを変更する場合は、下記のPathとArgsの値を変更します。
"Created":"2015-08-22T11:30:36.507268698Z","Path":"/bin/bash","Args":[],"Config":
修正後、dockerサービスを開始し、コンテナをstartすると変更したコマンドでコンテナが起動されます。
ネットワークの設定は、config.jsonとhostconfig.jsonに記載されています。例えば、コンテナの80をホストの18080に設定する例(docker run --expose 18080 -p 18080:80の例)
config.json
"ExposedPorts":{"18080/tcp":{},"80/tcp":{}},
hostconfig.json
"PortBindings":{"80/tcp":[{"HostIp":"","HostPort":"18080"}]}
コンテナのルートディレクトリの場所
コンテナのルートディレクトリの場所は、利用するストレージドライバ(利用するファイルシステムの実装)により異なる。
ストレージドライバ | 場所 |
overlay(overlay fs) | /var/lib/docker/overlay/[コンテナID]/merged |
aufs | /var/lib/docker/aufs/mnt/[コンテナID] |
devicemapperの場合は、/var/lib/docker/devicemapper/devicemapper/[コンテナID]にボリューム本体とメタデータがある。コンテナ実行中であれば、/var/mapper/docker-xxxx:x-xxxxxxxxxx-[コンテナID]を利用できる。