再インストールしたUbuntuにDockerをインストールするまで

再インストールしたUbuntuにDockerをインストールするまで

はじめに

省電力 PC を開発機として使用していましたが、ある日突然 OS が立ち上がらなくなってしまい、結局 OS を再インストールしたので今後のために Docker を動作させるまでの設定をメモしておきます。

※バックアップは取るようにしようね…

OS のバージョン及びマシンスペックなど

OS バージョン

$ lsb_release -a
LSB Version:    core-11.1.0ubuntu2-noarch:security-11.1.0ubuntu2-noarch
Distributor ID: Ubuntu
Description:    Ubuntu 20.04.6 LTS
Release:        20.04
Codename:       focal

CPU

$ cat /proc/cpuinfo

processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 42
model name      : Intel(R) Core(TM) i3-2120T CPU @ 2.60GHz
stepping        : 7
microcode       : 0x2f
cpu MHz         : 1625.593
cache size      : 3072 KB
physical id     : 0
siblings        : 4
core id         : 0
cpu cores       : 2
apicid          : 0
initial apicid  : 0
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes

# 以下略

メモリー

$ free -h
              total        used        free      shared  buff/cache   available
Mem:          7.7Gi       596Mi       5.7Gi       6.0Mi       1.4Gi       6.8Gi
Swap:         2.0Gi          0B       2.0Gi

マザーボード

$ sudo dmidecode -t baseboard
# dmidecode 3.2
Getting SMBIOS data from sysfs.
SMBIOS 2.4 present.

Handle 0x0002, DMI type 2, 8 bytes
Base Board Information
        Manufacturer: Gigabyte Technology Co., Ltd.
        Product Name: H61M-USB3-B3-JP
        Version: x.x
        Serial Number:

固定 IP の設定(GUI)

有線 LAN の DHCP の設定を固定 IP に変更します。OS をインストールして SSH の設定するまではモニターを繋いでいたので、コマンドではなく画面から設定しました。

設定方法は以下の記事を参考にしました。

注意点としては IP を設定後、有線 LAN のトグルボタンの ON・OFF をしないと設定が反映されないことです。

SSH サーバの設定

openssh-serverをインストールして SSH 接続が出来るようにしていきます。

# 既存のパッケージをアップデート
$ sudo apt -y update
# openssh-server をインストール
$ sudo apt -y install openssh-server

インストール後は、/etc/ssh/sshd_configの設定を変更します。

$ sudo apt -y vim

$ sudo vim /etc/ssh/sshd_config

# 以下の内容を修正

Port 22 # 任意のポートに変更
PermitRootLogin no # rootユーザーでログインを禁止する
MaxAuthTries 3 # 一つのセッションで認証試行を最大3回までに制限する
PasswordAuthentication no # パスワードによるログインを無効にする
PermitEmptyPasswords no # 空のパスワードを持つユーザーがSSH接続出来ないようにする

# sshデーモンを再起動して設定を反映させる
$ sudo systemctl restart sshd
# ステータスの確認
$ sudo systemctl status sshd
#  Active: active (running) となっていることを確認

既存の秘密鍵から公開鍵を作成

残念なことに、公開鍵のバックアップを取っていませんでした…😢

鍵を再作成するのも手間なので、既存の秘密鍵から公開鍵を生成します。(秘密鍵はバックアップしていました。)

秘密鍵を持っている端末から USB やクラウドストレージを経由してサーバのデスクトップ画面など適当な場所へコピーします。

今回はdev-serverという名前の秘密鍵を使用していたものとします。

# ディレクトリがなければ作成する
$ mkdir ~/.ssh

$ mv [保存した秘密鍵のパス]/dev-server ~/.ssh

# アクセス権限を変更する
$ chmod 600 ~/.ssh/dev-server

# 秘密鍵から公開鍵を作成
$ ssh-keygen -y -f ~/.ssh/dev-server > ~/.ssh/dev-server.pub

# アクセス権限を変更する
$ chmod 600 ~/.ssh/dev-server.pub

# 公開鍵の名前を変更
$ mv ~/.ssh/dev-server.pub  ~/.ssh/authorized_keys

これでクライアント秘密鍵は変更することなく接続できます。

authorized_keys とは?

authorized_keysとは、サーバがクライアントを認証するために使用されます。

SSH 公開鍵認証をするためにクライアントは公開鍵と秘密鍵のペアを作成します。作成した公開鍵をサーバへ登録します。(鍵と言っても扱っている内容はデータになります)

このサーバへ登録した公開鍵を利用して、クライアントから送信されてきた秘密鍵の内容(電子署名)をサーバ側で検証します。

電子署名と言う単語が出てきましたが、クライアントはサーバへ SSH 接続する際に、端末内の秘密鍵を利用して電子署名を生成します。そして、サーバに登録されている公開鍵の内容で電子署名の内容が正しいと接続が許可される流れになります。

したがって、authorized_keysという名前に変更するのは、サーバがその公開鍵を認証に使用するためというわけです。なお、一つのauthorized_keysファイルには複数の公開鍵を追加できます。これにより、複数のクライアント(それぞれが異なる公開鍵/秘密鍵ペアを持つ)が同じユーザーアカウントに接続できるようになります。

その都度、公開鍵の内容を追記して登録します。

authorized_keysを使用する注意点としては、適切なアクセス権(パーミッション)が設定されている必要があります。適切なユーザーのみがこのファイルを読み書きできるようにすることです。一般的には、このファイルはユーザーのみが読み書きでき、その他のユーザー(グループまたはその他)はこのファイルを読むことができないようにすることが推奨されます。

そのため、chmod 600 ~/.ssh/dev-server.pubを実行してアクセス権を変更しておく必要があります。これは秘密鍵も同様です。

SSH 接続出来るか確認する

ここからクライアント側の操作になります。サーバへ SSH 接続できるか確認しましょう。

クライアント側で~/.ssh/configが作成されていなかった場合は以下の内容を記述します。

"~/.ssh/config"
Host dev-server
  HostName 192.168.xxx.xxx # サーバのIPアドレス
  User sampleUser # 接続するユーザー名
  Port xxxx # 任意のポート番号
  IdentityFile ~/.ssh/dev-server # SSH接続する際に使用する秘密鍵

このファイルを作成しておくことで、SSH 接続する際にssh -i 鍵のファイルパス sampleUser@192.168.xxx -p xxxなどと指定せずに以下のように簡単に接続することが出来ます。

ぜひ設定しておきますよう。何ならこのconfigファイルの内容もバックアップしておきましょう。

$ ssh dev-server

Docker プロジェクトを保存する HDD をマウントする

OS をインストールするストレージには SSD を使用しましたが、開発のソースコードなどは容量の多い HDD を使用していました。

再インストールした際にその設定も消し飛んでしまったので、メモとして記述します。

なお、今回は内部 HDD を指定してますが、同じような手順で USB 接続した外部 HDD もマウントすることが出来ます。

マウントポイントを作成する

開発環境なので分かりやすいようにユーザーのホームディラクトリ内にマウント用ディレクトリを作成します。

$ mkdir ~/docker_work

接続された HDD が認識されているか確認する

HDD が正しく認識されていれば以下のコマンドで HDD の情報が出力されます。

$ sudo fdisk -l

# 中略

ディスク /dev/sdb: 1.84 TiB, 2000398934016 バイト, 3907029168 セクタ
Disk model: WDC WD20EARX-00P
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 4096 バイト
I/O サイズ (最小 / 推奨): 4096 バイト / 4096 バイト

この/dev/sdbという文字列をコピーするなどして控えておきます。

HDD をマウントする

以下のコマンドを実行して HDD を作成したマウントポイントへマウントします。

$ sudo mount /dev/sdb /home/user01/docker_work/

# マウントされたか確認
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            3.9G     0  3.9G   0% /dev

# 中略

# ↓正しくマウントされていることを確認
/dev/sdb        1.8T  1.1G  1.7T   1% /home/user01/docker_work

# アクセスできるか確認
$ ls -la /home/user01/docker_work

正しくマウントできました。しかし、Linux において外部デバイスのマウントは一時的なもので、再起動やシャットダウンしてしますと次回起動時にマウントの設定は消えていまします。

そのため、外部 HDD を毎回自動的にマウントしたい場合は、その設定を/etc/fstabに登録しておく必要があります。

# 外部HDDのUUIDを確認する
$  lsblk -f
NAME   FSTYPE   LABEL UUID                                 FSAVAIL FSUSE% MOUNTPOINT

# 中略
sdb    ext4           2ad7d0e4-cab5-4206-98e4-50cee3e266ca    1.7T     0% /home/user01/docker_work

# 設定ファイルのバックアップを作成
$ sudo cp /etc/fstab /etc/fstab.bak

$ sudo vim /etc/fstab
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>


# 中略

# ファイルの末尾に以下を記述↓
# dockerプロジェクトが格納されたHDD
UUID=2ad7d0e4-cab5-4206-98e4-50cee3e266ca /home/user01/docker_work ext4 nofail 0 0

サーバを再起動して起動時に HDD がマウントされていることを確認してください。

マウントされていない場合は設定を見直してください。

Docker Engine のインストール

ここから Docker をインストールします。

以前、Ubuntu 上の Docker に SQL Server をインストールした記事の内容と同様です。

# パッケージリストの更新とインストール済のパッケージをアップグレード
sudo apt update && sudo apt upgrade -y

# 開発に必要なパッケージをインストール
sudo apt-get install -y \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release

sudo mkdir -p /etc/apt/keyrings
# GPG鍵を追加
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# 安定版のリポジトリを追加
echo \
 "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
 $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# aptのパッケージリストを更新
sudo apt-get update

# Docker Engine, containerd, Docker Compose をインストール
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

# Dockerのサービスを起動
sudo service docker start
* Starting Docker: docker   [ OK ]

# docker composeがインストールされているか確認
sudo docker compose version
Docker Compose version v2.15.1

# dockerグループが存在しているか確認
getent group docker

# ターミナルを実行中のユーザーをdockerグループに追加する
sudo usermod -aG docker $USER

# グループに追加されていることを確認
groups $USER

# 一度ログアウト
$ exit

# 接続
$ ssh dev-server

# sudo 無しで docker コマンドが実行できるか確認する
$ docker -v

Docker Engine が正しくインストールされていれば終了です。

参考記事