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 した状態でなければ削除できませんが、docker rm に -f (--force) オプションをつけることで、起動したままでも削除することができます。
# docker rm -f cont1
docker stop は SIGTERM+10秒待ちロジックでコンテナを極力安全に停止しますが、docker kill は SIGKILL でコンテナを一瞬で停止します。
# docker kill cont1
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
コンテナ側で環境変数LANGを設定します。
# cat >> ~/.bashrc <<EOF export LANG=en_US.UTF-8 EOF
一般ユーザでも Docker を使用できるようにするには、ユーザ(例: yamada)を docker グループに追加します。ただし、一般ユーザがコンテナ経由で root オーナーのファイルを作成できてしまうので、セキュリティ的には注意が必要です。
# usermod -aG docker yamada
コンテナ間で相手コンテナの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 のプロセスとして動作する場合に docker stop から送信される SIGTERM シグナルをうまく受け取ることができないそうです。docker run 時に --init を指定し、PID=1 のラッパープロセスの子プロセスとして Node.js を起動するのがおすすめだそうです。
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