はじめてのAWS EC2にDocker Registryコンテナを立てて保存先はS3にする ローカルからEC2のDocker-registryへpushできるようにする

AWS
Table of Contents

これからEC2を利用し、インスタンス1つでDockerコンテナをたくさん稼働してマイクロサービスをいろいろ作っていきたい。
サービスを開発していく環境でイメージをいろいろ管理していきたいので、Docker Hubの利用を検討したが、プライベートは有料なので自前でDocker Registryを作ることに。
Docker Registryはそこそこ容量がいるので、S3に保存することとする。

前提として

前回構築したSSL、リバースプロキシの環境も使っていきます。
https://blog.local-c.com/archives/1866

Docker Registryのイメージを取得する

$ docker pull registry:2.6.0

※ 最新バージョンはこちらで確認
https://github.com/docker/distribution/releases

Docker Registryのイメージを確認

$ docker images
REPOSITORY    TAG         IMAGE ID            CREATED             SIZE
registry      2.6.0       d1e32b95d8e8        2 weeks ago         33.17 MB

作業用ディレクトリを作成してdocker-compose.ymlを作成

$ mkdir /home/ec2-user/work
$ cd /home/ec2-user/work
$ vim docker-compose.yml

docker-compose.yml

docker-registry:
  image: registry:2.6.0
  container_name: docker-registry
  privileged: true
  ports:
    - 5000
  environment:
    VIRTUAL_HOST: registry.example.com
    LETSENCRYPT_HOST: registry.example.com
    LETSENCRYPT_EMAIL: example@gmail.com
    REGISTRY_STORAGE: s3
    REGISTRY_STORAGE_S3_ACCESSKEY: [S3フルアクセスのIAMユーザーのアクセスキー]
    REGISTRY_STORAGE_S3_SECRETKEY: [S3フルアクセスのIAMユーザーのシークレットキー]
    REGISTRY_STORAGE_S3_BUCKET: [バケット名]
    REGISTRY_STORAGE_S3_REGION: ap-northeast-1 ←東京リージョン
    REGISTRY_STORAGE_S3_ROOTDIRECTORY: /       ←バケットのディレクトを指定(ルートディレクトリ)
  restart: always

※事前にregistry.example.com のドメイン設定は、EC2のIPかドメインに設定しておくこと

Docker Registryのコンテナを起動する

$ docker-compose up -d

Docker Registryを使ってみる

今回、ローカルからリモートのレジストリへpushしてみる

イメージ名を変更するためタグを貼る

プライベートレジストリにpushするためにはイメージの名前を変える必要があります。

docker tag [イメージ名]:[tag] [レジストリのIP、URL]:[ポート]/[任意のリポジトリ名]/[イメージ名]:[tag]
docker tag centos:latest registry.example.com/registry-test/centos

※今回、jwilder/nginx-proxyのコンテナがEC2のフロントにあり、ポートは443なるため、ポートの指定はしない。

イメージを確認

$ docker images
REPOSITORY                                 TAG    IMAGE ID     CREATED      SIZE
registry.example.com/registry-test/centos  latest 67591570dd29 7 weeks ago  191.8 MB
centos                                     latest 67591570dd29 7 weeks ago  191.8 MB

イメージをプッシュする

docker push イメージ名
docker push registry.example.com/registry-test/centos
The push refers to a repository [registry.example.com/registry-test/centos]
3981cd79f308: Pushing [==================================================>] 122.1 MB/122.1 MB
34e7b85d83e4: Preparing
error parsing HTTP 413 response body: invalid character ・・・・・・・・・・・・・

HTTP 413 は、アップロードしようとしたデータサイズが大きいと怒られているのでnginxの上限値を上げたら解消される?あとで調査

S3に保存されているか確認する

バケット名の直下に「docker」ディレクトができいる。なんか保存されていそう。

/[バケット名]/docker/registry/v2/・・・

client_max_body_sizeの設定を追加

/etc/nginx/nginx.conf

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    server_names_hash_bucket_size 128;
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;

    client_max_body_size 1G; ←★1Gにしてみた

}
daemon off;

まだしてないこと

  • basic認証をnginxで設定すること