AWSでprivate docker registryをコンテナで立てた際のハマったポイントをメモ。
ケース
・AWS EC2(Amazon Linux)上にコンテナで実現
・コンテナイメージはdocker registry 2.1
・ボリュームはS3に設定
・SSLはオレオレ証明書で対応
・外部インターネットとの接続は原則ない(クローズド環境)
ハマった点
① docker push/pullで以下のようなエラーとなる
x509: certificate signed by unknown authority
opensslでオレオレ証明書(crtファイル)を作成し、pull/pushするクライアント側に格納するが、/etc/docker/certs.d/配下に格納してしまうと、dockerがOSのroot証明書を参照しなくなり、S3など他のSSL接続ができなくなる。
今回のようにボリュームをS3に指定する場合は特に注意が必要。
crtファイルは[registryのドメイン名].crtとして、/etc/pki/ca-trust/source/anchors配下に格納する。
その後、設定を反映し、dockerを再起動する。
sudo update-ca-trust
sudo systemctl restart docker
※Cent6系の場合は
update-ca-trust enable
2.update-ca-trust extract
これでエラーは解決した。
② docker push/pullでio.timeoutとなる
SSLの設定が解決したところで、クライアントからpush/pullをすると、以下のようなエラーとなる。
tcp XX.XX.XX.XX:443: i/o timeout.
IPアドレスを逆引きしてみると、s3-ap-northeast-1.amazonaws.comと判明。
どうやらクライアントは、push/pushの際、docker registryサーバだけでなく、S3に直接イメージpull/pushのための接続を行っている模様。
つまり、docker registryでボリュームをS3に指定した場合、当然registryを立てたEC2から、ボリュームとして指定したS3バケットへのアクセス権(ポリシーやROLEなど)は必須だが、同時にクライアント側も対象S3バケットへアクセスできる必要がある。
オンプレミスとのハイブリッド環境など、クローズドな環境の場合は特に注意が必要。