読者です 読者をやめる 読者になる 読者になる

そんな今日この頃でして、、、

コード書いたり映画みたり。努力は苦手だから「楽しいこと」を探していきたい。

Dockerのプライベートリポジトリを立てる

またDockerまわりを色々いじる機会があったのでメモ。

ホスト一台だけで使うだけならともかく複数台ホストがある環境で運用しようという場合、 プライベートリポジトリを立ててそこから各ホストにイメージを配信したくなる。

幸いにしてプライベートリポジトリ自体がイメージとして配布されており、 鍵を用意して適切に設定することにより簡単にプライベートリポジトリを立てることができる。

docs.docker.com


SSL証明書を用意する

下記のコマンドと適当に設定項目を入力し、証明書や鍵ファイルを用意する。

$ openssl genrsa 2048 > server.key
$ openssl req -new -key server.key > server.csr
$ openssl x509 -days 3650 -req -signkey server.key < server.csr > server.crt

以上の手順でserver.keyserver.csrserver.crtという3つのファイルが生成できる。


リポジトリを証明書・鍵を指定して起動する

直にdockerコマンドで立ち上げるのも良いが、オプションが長くなるのでdocker-composeを用いる。

blue1st.hateblo.jp


下記のようなディレクトリを作成し、先ほど生成した証明書ファイルも収めるものとする。

.
├── certs
│   ├── server.crt
│   ├── server.csr
│   └── server.key
├── data
└── docker-compose.yml

証明書周りを収めたcertsディレクトリとイメージの保管場所となるdataディレクトリを作成しておいた。


また、docker-compose.ymlとして以下の記述をする。

registry:
  image: registry:2
  restart: always
  ports:
    - 5000:5000
  volumes:
    - $PWD/data:/var/lib/registry
    - $PWD/certs:/certs
    - /etc/localtime:/etc/localtime:ro
  environment:
    REGISTRY_HTTP_TLS_CERTIFICATE: /certs/server.crt
    REGISTRY_HTTP_TLS_KEY: /certs/server.key


あとはいつも通り$ docker-compose up -dで起動する。


クライアントとなる各ホストに証明書を配布する

実際にDockerのコンテナを立ち上げる各ホストにも、リポジトリに接続するために先ほど生成した証明書ファイルserver.crtを配置する必要がある。(もちろんリポジトリを起動してるホスト自身にも)

/etc/docker/certs.d/以下(certs.dディレクトリが無ければ作る)に[ホスト名]:[ポート番号]というディレクトリを作成し、 ca.crtというファイル名に変更して保存する。

仮にホスト名がhostだとして、/etc/docker/certs.d/host:5000/ca.crtといった感じ。


使ってみる

登録

例えばubuntuというイメージが既にあって、これをレジストリに登録するとする。

まずはtagコマンドで登録先を指定した形に直す。

$ docker tag ubuntu [HOST]:[PORT]/ubuntu


あとは普通にpushコマンドを叩くだけ。

$ docker push [HOST]:[PORT]/ubuntu

正しく動作していれば、dataディレクトリ以下にイメージが格納されていることが確認できる。

取得

ここまでくれば後は同じことで、各サーバでpullコマンドを叩けば良い。

$ docker pull [HOST]:[PORT]/ubuntu

鍵の配置に問題がなければ、これでイメージを持ってくることができる。


その他メモ

今回は管理サーバ的なとこにデータを保管するモデルを考えていたけど、 例えばバックエンドにS3何かを指定することもできる。

で、特定のホストにリポジトリを立てるのではなくてそれぞれのホストで共通のS3を指定したリポジトリを立てるみたいな運用ケースもあるみたいだ。


タイトル内容とは若干ズレるけどマルチホスト運用について。

別のホストのコンテナではなく、単純にローカルネットワーク上の他のサーバを参照するには、 コンテナ起動時に--add-hostオプションを指定(docker-composeならextra-hosts項を記述)すれば良いようだ。

ただこれも台数が多いと大変になってくるので、DNSを立ててそれを参照する方がスマートっぽい。

このへんはもう少し勉強してまとめる。

プログラマのためのDocker教科書 インフラの基礎知識&コードによる環境構築の自動化

プログラマのためのDocker教科書 インフラの基礎知識&コードによる環境構築の自動化