Docker
Last updated
Last updated
sudo rpm -ivh
sudo sed -i.bak 's/enabled=0/enabled=1/' /etc/yum.repos.d/epel-testing.repo
sudo yum install docker-io
/etc/defaults/docker
sudo service docker restart
systemdにてdocker daemonにproxyを通す
を書いて
sudo systemctl daemon-reload
コンテナを起動し,それに接続したい場合は,docker start
してからdocker attach
する.
完全に一時的なコンテナを作りたい場合は,docker run -rm
で作成すれば停止(docker stop
)後にコンテナは破棄される.
ホストのディレクトリをコンテナ内にマウントしたい場合は,docker run -v $HOSTDIR:$DOCKERDIR IMAGE COMMAND
とする.
ONBUILDを使うと,次のビルドで実行するコマンドをイメージに仕込むことができるようになる. つまり,ベースイメージにONBUILDによるコマンドを仕込み,別のDockerfileでそのベースイメージを読み込みビルドした際に,そのコマンドを実行させるということが可能になる. 要するに, 親DockerfileのDockerfileコマンドを子Dockerfileのビルド時に実行させることができる機能.
cent65.sh
$ ./cent65.sh
作成したbase imageを登録するには以下のコマンドを実行します。
$ cat centos-6.5_64.tar.xz | sudo docker import - local/centos:6.5_64
試しに以下のようにechoコマンドを実行すると問題なく実行できました。
$ docker run local/centos:6.5 echo 'hello world'
32bitの場合
Dockerfileに以下を書く
ENTRYPOINT ["linux32"]
直接コマンドから実行する場合には
/usr/bin/linux32 /bin/bash
とする
32bitのイメージを使って別のイメージを作る場合、dockerfileの各RUNにlinux32を記述する必要がある。
febootstrapを使用しない方法
centos
ubuntu
febootstrapの代わりにsuperminを使うらしい
docker save -o
docker load -i
ls -1 | xargs -i sudo docker load -i {}
docker export
docker import
sudo docker run -d -p 22 xxx/xxx:xxx /usr/sbin/sshd -D
-v /var/docker/share:/workspace
ホスト:コンテナの順
をdocker run時に追記する
-w /share
をdocker run時に追記する
sudo docker build -t コンテナグループ/コンテナ名:バージョン Dockerfileのあるディレクトリのパス
sudo docker run -v /var/docker/share:/share -w /share -itd -p 22 bpos/l1dev:v0.01 /usr/sbin/sshd -D
ユーザー追加
useraddが使えないのでadduserを使う
RUN addgroup -g 1018 group-name && adduser -u 1016 -G group-name -D user-name&& echo "user-name ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers && echo 'password:password' | chpasswd
sudo apt-get install python-dev libffi-dev libssl-dev
sudo easy_install pip
sudo pip install -U docker-compose
docker-compose up -d
表示されるターミナルサイズが小さくなってしまう。ウィンドウリサイズで直るがリサイズがめんどくさいときに
docker exec -it -e COLUMNS=
tput cols-e LINES=
tput lines xxx /bin/bash`
docker v18.06では直ってるらしい
SELinuxが原因
-v host:guest:Z
で直る
ps aux | grep docker-proxy
sudo netstat -tulpen | grep docker
すると存在しないコンテナのdocker proxyがポートを抑えている
docker停止
sudo rm /var/lib/docker/network/files/local-kv.db
で直った
docker-composeにentrypointを設定
変数が展開されたりするのでテクニックが必要
exec -itで入って作業するときとかに
docker run -td xxx /bin/bash
docker exec -it yyy /bin/bash
docker-compose xxx-service /bin/bash
vim /path/to/config
docker-compose restart xxx-service
docker-compose logs xxx-service
一番はやいのは /.dockerenv
の有無を調べること LXCとかも対応したいなら /proc/1/cgroups
の中身を確認する
root以外のユーザで実行した場合
Cannot connect to the Docker daemon. Is the docker daemon running on this host?
とかが出る場合
ls -l /var/run/docker.sockで権限確認
sudo usermod -aG docker jenkins
等で権限追加
docker-compose rm -f
docker-compose pull
docker-compose up --build -d
@ sudo docker rmi $(docker images | awk '/^/ { print $3 }')@
step指定はできないみたいなのでv1.9以上は
docker build --build-arg commit=3e1670c59af1
とかでやる。
v1.9未満は
Dockerfileの指定の部分に
echo "restart" && command
と書いて、
ビルドし直す
とかやって強引に実行する
ホストの/procをマウントしているためホスト側でコアダンプする設定にする必要がある。
echo '/tmp/core.%e.%p.%t' > /proc/sys/kernel/core_pattern
mdesales@ubuntu ~ $ cat /etc/default/docker
DOCKER_OPTS="--dns 172.18.20.13 --dns 172.20.100.29 --dns 8.8.8.8"
sudo service docker restart
sudo docker build --build-arg http_proxy=http://ip:port
docker logs <id>
にて確認できる
ONBUILDという方法を取れば良い模様。
ベースとなるDockerイメージ(FROMで指定)と作成するDockerイメージ(docker build -tで指定)の両方に同じ名前を指定しています。
docker-http-proxy
if [ $# != 1 ]; then
echo "Usage: $0 DOCKER_IMAGE"
exit 1
fi
cat <<EOF | docker build ~~t $1 ~~
FROM $1
ONBUILD ENV http_proxy $http_proxy
ONBUILD ENV https_proxy $https_proxy
ONBUILD ENV no_proxy $no_proxy
EOF
$ docker-http-proxy fedora:21
Sending build context to Docker daemon 2.048 kB
Sending build context to Docker daemon
Step 0 : FROM fedora:21
---> 834629358fe2
---> Running in 7293472d9793
---> 35244c2f0c76
Removing intermediate container 7293472d9793
---> Running in 4a52cac11df4
---> 5190135a8d40
Removing intermediate container 4a52cac11df4
Step 3 : ONBUILD env no_proxy 127.0.0.1,localhost
---> Running in fedf6baa373a
---> eda7740be6ee
Removing intermediate container fedf6baa373a
Successfully built eda7740be6ee
これでプロキシ設定済みのfedora:21イメージが完成しました。
最初の例に挙げたDockerfileを再びビルドしてみます。
$ docker build -t httpd .
Sending build context to Docker daemon 2.048 kB
Sending build context to Docker daemon
Step 0 : FROM fedora:21
Executing 3 build triggers
---> Running in 1d862437b875
---> Running in 2483039ae324
Trigger 2, ENV no_proxy 127.0.0.1,localhost
Step 0 : ENV no_proxy 127.0.0.1,localhost
---> Running in 6cf89a748f98
---> c00437a577bd
Removing intermediate container 1d862437b875
Removing intermediate container 2483039ae324
Removing intermediate container 6cf89a748f98
Step 1 : RUN yum update -y && yum install -y httpd && yum clean all
---> Running in 3b5ba7989288
(中略)
Complete!
Cleaning repos: fedora updates
Cleaning up everything
---> 2c8f2b5806be
Removing intermediate container 3b5ba7989288
Successfully built 2c8f2b5806be
今度はONBUILDで埋め込んでおいたプロキシ設定が読み込まれ、正常にビルドが終了しました。
iptables -t nat -A DOCKER ! -i docker0 -p tcp -m tcp --dport 9292 -j DNAT --to-destination 172.17.0.49:80
iptables -A FORWARD -d 172.17.0.49/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 80 -j ACCEPT
確認は、
sudo iptables -t nat -L
プライベートレジストリを起動すればよい
docker run -d -p 5000:5000 --restart=always --name registry registry:2
何度がやればなぜか通る
docker run時に
-security-opt seccomp=unconfined
を追加すればよい
デタッチのショートカットと衝突しているため
~/.docker/config.json
正確にはdocker execのときに起動できなくなる模様。
これでできるようになる
docker exec -it my-container env TERM=xterm script -q -c "/bin/bash" /dev/nul
17.06バージョンからは上をやらなくてもできるようになる見込み
/etc/sysconfig/dockerに
INSECURE_REGISTRY='--insecure-registry ip:port'
を追加
dockerのsystemdに追加する
Pipeworkを使ってブリッジ接続するのが良い模様
ホスト側のcgroupsとの兼ね合いでゲスト・ホスト間の疎結合性が崩れるからインストールされていない。
パッケージコマンド管理による依存関係をだまくらかす意味でfakesystemdが入れられている。
強引に使いたい場合は以下を参照のこと。
docker run -e http_proxy=xxx:yyy
/etc/init.d/dockerに書き込むとなお良い
sudo vi /etc/sysconfig/docker
に以下を記述
no_proxy=no_proxy_ip:port
EXPOSEは書いただけで何か動作が変わるといったものではなく、他の機能から参照されて意味を持つ。
dockerに入門したてだとEXPOSEを指定しないとコンテナにネットワーク接続できないと勘違いしてしまったりするがそんなことはない。
EXPOSEしなくてもdocker run -pオプションでポートを外部公開できるし、dockerネットワークのIPを使ってコンテナ間もしくはホスト・コンテナ間で通信可能だ。
ENTRYPOINTはrun時の引数がENTRYPOINTの引数になる。CMDのときはrun時の引数がそのまま置き換わる。
要するにENTRYPOINTってのは絶対なわけだ。runする人が変えられない。Dockerfile作者が絶対に実行したいコマンドってこと。
CMDは、runする人しだいで置き換えられるもの。
export http_proxy=''
Environment="HTTP_PROXY=
"docker run": コンテナを作成する.
"docker stop": コンテナを停止する.
"docker start": コンテナを起動する.
"docker restart": コンテナを再起動する.
"docker attach": 起動中のコンテナに接続する.
"docker rm": コンテナを破棄する(コンテナを停止する必要がある)
"docker wait": コンテナが停止するまでブロックする.
"docker ps": 起動中のコンテナを表示する.
"docker inspect": コンテナの全情報を表示する(IPを含む).
"docker logs": コンテナのログを表示する.
"docker events": コンテナ内のイベントを表示する.
"docker port": コンテナのportを表示する.
"docker top": コンテナのプロセスを表示する.
Step 1 : ONBUILD env http_proxy
Step 2 : ONBUILD env https_proxy
Trigger 0, ENV http_proxy
Step 0 : ENV http_proxy
Trigger 1, ENV https_proxy
Step 0 : ENV https_proxy
http_proxy=
https_proxy=
HTTP_PROXY=
HTTPS_PROXY=