Docker 小技・ノウハウ集

トップ > Docker > 小技・ノウハウ集

目次

CentOSコンテナでsystemctlを使用する

CentOS コンテナで systemctl を使用しようとすると "Failed to get D-Bus connection: Operation not permitted" エラーが出ることがあります。これを回避するにはコンテナ起動時に --privileged オプションをつけ、かつ、/sbin/init を PID=1 のメインプロセスにします。

# docker run -d --privileged --name cont1 centos:7 /sbin/init
# docker exec -it cont1 /bin/bash
# yum install -y httpd
# systemctl start httpd

コンテナ削除時に事前にstopするのが面倒

通常、コンテナは stop した状態でなければ削除できませんが、docker rm に -f (--force) オプションをつけることで、起動したままでも削除することができます。

# docker rm -f cont1

コンテナを一瞬で停止したい

docker stop は SIGTERM+10秒待ちロジックでコンテナを極力安全に停止しますが、docker kill は SIGKILL でコンテナを一瞬で停止します。

# docker kill cont1

コンテナログイン時にCtrl-Pを二度押さないと効かないのを改善する

Ctrl-P は、コンテナからデタッチする際のキーとして割り当てられているため、ホストOS側でこれを変更します。

# mkdir ~/.docker
# vi ~/.docker/config.json

{
    "detachKeys": "ctrl-\\"
}

RHEL 8/CentOS 8 以降の Podmain では、docker exec の引数で指定します。

# docker exec -it --detach-keys ctrl-\\ containerName /bin/bash

コンテナにログインした際にvimで日本語が文字化けするのを改善する

コンテナ側で環境変数LANGを設定します。

# cat >> ~/.bashrc <<EOF
export LANG=en_US.UTF-8
EOF

一般ユーザでもDockerを使えるようにする

一般ユーザでも Docker を使用できるようにするには、ユーザ(例: yamada)を docker グループに追加します。ただし、一般ユーザがコンテナ経由で root オーナーのファイルを作成できてしまうので、セキュリティ的には注意が必要です。

# usermod -aG docker yamada

Dockerコンテナ間で名前解決する

コンテナ間で相手コンテナのIPアドレスを名前解決するには、① docker run --link オプションで設定する、② docker run --add-host オプションで設定する、③ ユーザ定義ネットワークの内部DNSサーバで解決するなどの方法があります。① の --link オプションは非推奨となっているのでおススメできません。② はIPアドレスを静的に管理する環境では有効です。③ はコンテナを docker network create で新規に作成されたネットワークに接続するだけで、相手コンテナ名を内部DNSサーバ(127.0.0.11)が名前解決してくれるものでおススメです。--net オプション無しの時にデフォルトで接続される bridge ネットワークでは、後方互換のため、デフォルトでは内部DNSサーバはサポートされません。

# docker network create --subnet 192.168.1.0/24 network1
# docker run -d -it --name host1 --net network1 centos:7
# docker run -d -it --name host2 --net network1 centos:7
# docker exec -it host2 /bin/bash
host2# ping host1
PING host1 (192.168.1.2) 56(84) bytes of data.
64 bytes from host1.network1 (192.168.1.2): icmp_seq=1 ttl=64 time=0.073 ms
64 bytes from host1.network1 (192.168.1.2): icmp_seq=2 ttl=64 time=0.061 ms
64 bytes from host1.network1 (192.168.1.2): icmp_seq=3 ttl=64 time=0.065 ms

コンテナから外部のネットワークに接続できない場合

コンテナから外部のネットワークに接続できないことがあります。詳細は調べきれていませんが、コンテナ作成時に host ネットワークに接続すると、アクセスできるようになることがあります。

# docker run -d -it --name host1 --net host centos:7

ループバックデバイスの警告を抑止する

コンテナ起動時に下記の警告が表示される場合は...

Usage of loopback devices is strongly discouraged for production use.
Either use `--storage-opt dm.thinpooldev` or use `--storage-opt dm.no_warn_on_loop_devices=true` to suppress this warning.

Dockerストレージの起動オプションに下記を加える

# vi /etc/sysconfig/docker-storage
DOCKER_STORAGE_OPTIONS="--storage-opt dm.no_warn_on_loop_devices=true"

# systemctl restart docker

Node.js は PID=1 のプロセスにしてはならない

Node.js は PID=1 のプロセスとして動作する場合に docker stop から送信される SIGTERM シグナルをうまく受け取ることができないそうです。docker run 時に --init を指定し、PID=1 のラッパープロセスの子プロセスとして Node.js を起動するのがおすすめだそうです。

SELinux対応

SELinux が有効なシステムでは、-v オプションでホストボリュームをコンテナにバインドしても、コンテナからボリュームにアクセスできないことがあります。詳細は SELinux を見ていただくとして、下記の様に対象ボリュームディレクトリに対して container_file_t タイプを割り当てることにより参照できるようになります。

# chcon -R -t container_file_t /var/mnt
# docker run -d -it --name centos7 -v /var/mnt:/var/mnt centos:7

Copyright (C) 2016-2022 杜甫々
初版:2016年6月4日 最終更新:2022年3月27日
http://www.tohoho-web.com/docker/howto.html