docker-ceがUbuntu16.04.2 LTSに入らないとき

wget http://launchpadlibrarian.net/236916213/libltdl7_2.4.6-0.1_amd64.deb
sudo dpkg -i libltdl7_2.4.6-0.1_amd64.deb
sudo add-apt-repository ppa:ubuntu-sdk-team/ppa
sudo apt-get update
sudo apt-get install docker-ce

これでいいみたい。外部のdebパッケージ入れてるみたいなので取扱要注意。

参考とソース元:
ubuntu16.04 安装docker-ce,解决libltdl7版本过低的问题。 – 简书
docker-ce : Depends: libseccomp2 (>= 2.3.0) but 2.2.3-3ubuntu3 is to be installed

起動中のDockerコンテナ内にホストのDNSサーバーを登録する

基本的に異なるDockerコンテナ内でDNSサーバを使う場合は、こちらに書かれているように –link や –dns を使うとよいでしょう。

もしも、この–linkや–dnsを設定し忘れたりした場合に簡単にDNSサーバーを登録する方法をご紹介します。

docker ps -q | xargs -I{} docker exec -i {} sh -c 'echo "nameserver (ここにDNSサーバのIP)" >> /etc/resolv.conf'

はい、お疲れ様でした。
DNSサーバに関してはこちらがおすすめです。

dnsmasqで始めるプライベートDNSサーバ – GeekFactory

なんと! Dockerホストに入れさえすれば、ホストの /etc/hostsを見てくれるようになります。

Dockerをアップデートした

何をしたのか

docker-engine から docker-ce へのアップデートです。結構一気に上げました。

はじめに

sudo apt-get remove docker docker-engine docker.io

もう消してしまいます。スッカラカン。
でも永続化データは、 ちゃんとDockerコンテナも使わずにエイリアスでディレクトリ指定していました。なのでファイルが消えることはありませんでした!

残作業

apt-get update
apt-get install linux-image-extra-$(uname -r) linux-image-extra-virtual
apt-get update
apt-get install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
apt-key fingerprint 0EBFCD88
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) \ stable"
apt-get update
apt-get install docker-ce
apt-get install docker-ce=18.06.1~ce~3-0~ubuntu

あとはもうこれで動いているみたいです。
もちろん中のコンテナは空。docker-compose up -d し直します。

気をつけること

volumesでエイリアス指定してるからと安心しきってたら、実はコンテナ作り直してなくてずっとコンテナの中に永続化するはずのデータが閉じこもっているかもしれないので気をつける。

docker-compose up がすごかった

これは何の画面かというと docker-compose upを実行した後の画面です。

スクリーンショット 2016-01-22 1.18.40

青色と緑色のプレフィックスが付いてますね。これが、コンテナ名です。右が標準出力です。おそらく、標準エラー出力も出ると思います。
それぞれのコンテナのstdinとstdoutとstderrがそのまま流れていきます。すごく便利ですね。

実はこれ、docker exec -it xxxx /bin/bash で bashを起動した時に、 /proc/<num>/fd/0,1,2 にファイル記述子がありまして、
そのファイル記述子に echo "ssss" > /proc/1/fd/1 すると書き込めてしまいます。

0 と 1 と 2 があるけど、たぶん 0が stdin 1 が stdout 2 が stderr になっていると思います。(自信ないけど)

スクリーンショット 2016-01-22 1.27.24

実際にかきこめてますね。docker-compose up いいね!

肥大化しがちなdocker contextをコンパクトにするたったひとつの方法

たったひとつの方法みたいな見出しつけてみたかっただですが、本当にたったひとつの方法です。
これより楽な方法ないんじゃないかな?

.dockerignore

*
!/hoge/

何してるのかというと、一旦 * で全て除外させます。そのあとに、必要な物だけを!で例外にします。
Dockerfileをルートディレクトリに置いてたりする場合は、こうやった方が楽ですね。