5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

UbuntuにDockerをインストールし、tlsを使ったリモート接続の設定を行う

Posted at

UbuntuにDockerをインストールし、tlsを使ったリモート接続の設定を行う

こちらでも同じ記事を書いています

1.Dockerのインストール

UbuntuにDockerをインストールするためには以下のコマンドを実行します
面倒がないようにコピペ一発で全て行うようにしてあります

sudo apt -y install apt-transport-https ca-certificates software-properties-common && \
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - && \
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" && \
sudo apt install -y docker-ce

2.Dockerの起動設定

OS起動時に自動起動させ、その場でも起動させます

sudo systemctl enable docker
sudo systemctl start docker

3.動作確認

デフォルトではDockerへの接続にroot権限が必要です

sudo docker ps

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

以下のコマンド実行後、ログインし直すと使えるようになります

sudo echo usermod -aG docker `logname`

確認

docker ps

5.tlsによる接続

ここからが面倒な部分になります
オレオレ証明書を作成しサーバとクライアントに配る必要があるのですが、これをやるのに一手間二手間かかります
余りに面倒なので、コマンド一発で終わるように、途中の入力を全てスキップするスクリプトを作成しました

5.1 証明書の作成

コマンドの説明はこちらを確認してください
https://github.com/SoraKumo001/docker-tls

リモートからで接続するための証明書を作成します

curl -s https://raw.githubusercontent.com/SoraKumo001/docker-tls/master/docker-tls.sh | \
sudo bash

接続の際にホスト名を正確に設定したい場合は以下のようにドメイン名やIPを指定します

curl -s https://raw.githubusercontent.com/SoraKumo001/docker-tls/master/docker-tls.sh | \
sudo bash -s DNS:host.example.com,IP:10.1.1.1

 5.1.1 生成されるファイル

  • プライベートキー
    /etc/docker/certs/private-key.pem

  • Dockerデーモン用ファイル
    /etc/docker/certs/ca.pem
    /etc/docker/certs/server-key.pem
    /etc/docker/certs/server-cert.pem

  • クライアント用ファイル
    ~/.docker/ca.pem
    ~/.docker/cert.pem
    ~/.docker/key.pem

 WindowsやMacの各環境でリモート接続する場合は、クライアント用ファイルをユーザディレクトリの.dockerフォルダにコピーします

 5.1.2 プライベートキーに関して

 証明書の自動生成スクリプトはプライベートキーを使い回すように作ってあります
 そのため証明書を再発行しても、クライアントの証明書は配り直す必要がありません
 また、既存のプライベートキーを他のサーバの同じ位置にコピーした状態で証明書を作成すると、同じクライアント用ファイルで複数のサーバに接続可能になります

 完全な作り直しが必要な場合は、プライベートキーを手動で消してください

5.2 サービスの設定変更

  • ファイルの書き換え
    /lib/systemd/system/docker.serviceExecStartを以下のように書き換えます
    この設定によって、tlsによるTCP接続を受け入れるようになります
    ちなみに外部公開サーバをtlsを使わずにTCP接続を受け入れる設定になっていると、いつの間にかビットコインの製造工場と化す可能性があるので気をつけてください
ExecStart=/usr/bin/dockerd --tlsverify --tlscacert=/etc/docker/certs/ca.pem --tlscert=/etc/docker/certs/server-cert.pem --tlskey=/etc/docker/certs/server-key.pem -H tcp://0.0.0.0 -H fd:// --containerd=/run/containerd/containerd.sock
  • 手動で編集するのが面倒な場合
    以下のコマンドを貼り付ければ書き換えが完了します
sudo sed -i "s/^ExecStart=.*/ExecStart=\/usr\/bin\/dockerd \
--tlsverify --tlscacert=\/etc\/docker\/certs\/ca.pem \
--tlscert=\/etc\/docker\/certs\/server-cert.pem \
--tlskey=\/etc\/docker\/certs\/server-key.pem \
-H tcp:\/\/0.0.0.0 -H fd:\/\/ \
--containerd=\/run\/containerd\/containerd.sock/" \
/lib/systemd/system/docker.service

5.3 サービスの更新

sudo systemctl daemon-reload && sudo systemctl restart docker

5.4 tlsによる接続確認

ここまでのサービス設定で-Hを使ってアドレス指定で接続する場合はtls接続が必須になっています
そのため--tlsを指定しないと接続できません
--tlsverifyにした場合は、接続時にドメイン名を検証するようになります

docker --tls -H localhost ps
docker --tlsverify -H localhost ps

5.5 リモートでのDockerイメージの転送

Dockerのコマンドには、Dockerイメージをパイプで受け渡す機能があるので、以下のようにするとDockerHubを経由しなくてもリモートでイメージを転送できます

docker save イメージ名(複数指定可能) | docker --tls -H サーバ名 load

ローカルで作成したイメージやCI/CDでビルドしたものを転送する場合に便利です
小規模なものならこれで簡単にデプロイが可能です

5.6 docker-composeから接続する場合

証明書作成時に指定したホスト名と一致しないと接続できないので注意してください

docker-compose --tlsverify -H ホスト名:2375 以下通常コマンド

6.まとめ

 証明書の発行させしてしまえば、リモートで簡単にDockerを操作することが出来るようになります
 あとはコンテナを送りつけて動かせば大体何でも出来るようになります
 ただし、パプリックなリポジトリに証明書を入れて公開するようなミスには気をつけてください
 公開は後悔を生みます

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?