2025/06/01 Updated by 
Docker Container として Ubuntu 24.04LTS を動かす (2)
新規ユーザを追加する + sshdを起動する
[Up]

このページ内での表記:
「ホストOSの対話環境」は背景色を黄色(lightyellow)で表す。
「Conainer 内の root 権限の対話環境」は背景色を水色(azure)であらわす。
「Conainer 内の一般ユーザ権限の対話環境」は背景色を赤色(#ffeeee)であらわす。
「他のPCの対話環境」は紫色(#eeeeff)で表す。
実験環境
- Docker 環境: Docker Engeine 28.1.1 build 4eba377
- ゲストOS : Ubuntu 24.04LTS
- Docker ホストのディレクトリを Container からマウントして、永続的なファイルシステムとして利用する。
方針
Container 内に新規ユーザを追加する
Container 内に追加する新規ユーザの情報は以下の通り。
グループ名 | guest |
グループID | 3000 |
ユーザ名 | guest |
ユーザID | 3000 |
Container 内で sshd サーバを起動する
Docker Host においてポートフォワーディングを行う。
ポート番号の対応は以下の通り。
Container を生成+起動する
- (ホストOSの対話環境で) Container を生成してシェル /bin/bash を起動する。
$
docker run --name ubuntu24c \
-p 10022:22 \
-v /home/docker/ubuntu24c:/mnt/hostos \
-i -t ubuntu:24.04 /bin/bash
# ← コンテナ内の対話環境 (root 権限の bash)
起動オプション
--name
コンテナ名: ubuntu24c
-p
host_port:guest_port : ホストの host_port 番ポートへのアクセスを、Container の guest_port 番ポートへとフォワーディングする。
-v
host_path:guest_path : ホスト内のディレクトリ host_path を、Container 内の guest_path にマウントする。
ホスト内パス | Container内パス |
/home/docker/ubuntu24c | /mnt/hostos |
-i
: 対話モード。標準入力 (stdin) を開いたままにする。ホストOSの入力がそのまま Container 内の対話環境 (bash) に送られる。
-t
: 疑似ターミナル (pseudo-tty) を割り当てる。
- Image 名: ubuntu:24.04
- 実行コマンド: /bin/bash
- (Container 内の root 権限の対話環境で) ユーザ名を表示する。
# whoami
root
- (Container 内の root 権限の対話環境で) カレント・ワーキング・ディレクトリを表示する。
# pwd
/
新しいグループを追加する
guest という名前のグループ を追加する。
- guest というグループがまだ存在しないことを確認する。
# grep guest /etc/group 
- 新しいグループ (グループ名: guest, グループID: 3000) を追加する。
# groupadd -g 3000 guest
- グループが作成されたことを確認する。
# grep guest /etc/group
guest:x:3000:
新しいユーザを追加する
- guest というユーザ名がまだ存在しないことを確認する。
# grep guest /etc/passwd 
- 新しいユーザ guest を追加する。
# useradd -m -u 3000 -g 3000 -s /bin/bash guest
- 新しいユーザが追加されたことを確認する。
# grep guest /etc/passwd
guest:x:3000:3000::/home/guest:/bin/bash
- [重要] 新規ユーザの初期パスワードを設定する。
# passwd guest
New password: ← 新しいパスワードを入力する(エコーバックされない)
Retype new password: ← もう一度新しいパスワードを入力する
passwd: password updated successfully
ユーザに管理者としてコマンドを実行できる権限を与える
- ユーザ (ここでは guest) を sudo グループに追加する。
# usermod -aG sudo guest
- ユーザが sudo グループに追加されたことを確認する。
# grep sudo /etc/group
sudo:x:27:ubuntu,guest
-
sudo
コマンドをインストールする。
# apt update
# apt install -y sudo
ネットワークコマンドをインストールする
- まず、aptのデータベースを更新する。
# apt update
- ifconfig, netstat, arp をインストールする
# apt install -y net-tools
- traceroute をインストールする
# apt install -y iputils-tracepath traceroute
- ping をインストールする
# apt install -y iputils-ping
- curl をインストールする
# apt install -y curl
- ip をインストールする
# apt install -y iproute2
netstat
コマンドを用いて、ルーティング情報を調べる。
→
container が接続しているネットワークは 172.17.0.0/16で、
デフォルトのルーティング先が 172.17.0.1 であることがわかる
$ netstat -nr
kernel ip routing table
destination gateway genmask flags mss window irtt iface
0.0.0.0 172.17.0.1 0.0.0.0 ug 0 0 0 eth0
172.17.0.0 0.0.0.0 255.255.0.0 u 0 0 0 eth0
ifconfig
でcontainer のipアドレスを調べる。
→ 172.17.0.2 であることがわかる。
$ ifconfig
eth0: flags=4163 mtu 1500
inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255
ether xx:xx:xx:xx:xx:xx txqueuelen 0 (ethernet)
rx packets 57700 bytes 10953734 (10.9 mb)
rx errors 0 dropped 0 overruns 0 frame 0
tx packets 56874 bytes 6131126 (6.1 mb)
tx errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73 mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10
loop txqueuelen 1000 (local loopback)
rx packets 0 bytes 0 (0.0 b)
rx errors 0 dropped 0 overruns 0 frame 0
tx packets 0 bytes 0 (0.0 b)
tx errors 0 dropped 0 overruns 0 carrier 0 collisions 0
Container に sshd をインストールする
- まず apt のデータベースを更新する。
$ apt update
- OpenSSH のパッケージをインストールする。インストール途中で Timezone を設定するための質問に2回答える必要がある。
$ apt install -y openssh-server
...
debconf: falling back to frontend: Teletype
Configuring tzdata
------------------
Please select the geographic area in which you live. Subsequent configuration questions will narrow this down by presenting a list of
cities, representing the time zones in which they are located.
1. Africa 3. Antarctica 5. Asia 7. Australia 9. Indian 11. Etc
2. America 4. Arctic 6. Atlantic 8. Europe 10. Pacific 12. Legacy
Geographic area: 5
Please select the city or region corresponding to your time zone.
1. Aden 12. Bangkok 23. Dili 34. Istanbul 45. Krasnoyarsk 56. Novosibirsk 67. Samarkand 78. Tokyo
2. Almaty 13. Barnaul 24. Dubai 35. Jakarta 46. Kuala_Lumpur 57. Omsk 68. Seoul 79. Tomsk
3. Amman 14. Beirut 25. Dushanbe 36. Jayapura 47. Kuching 58. Oral 69. Shanghai 80. Ulaanbaatar
4. Anadyr 15. Bishkek 26. Famagusta 37. Jerusalem 48. Kuwait 59. Phnom_Penh 70. Singapore 81. Urumqi
5. Aqtau 16. Brunei 27. Gaza 38. Kabul 49. Macau 60. Pontianak 71. Srednekolymsk 82. Ust-Nera
6. Aqtobe 17. Chita 28. Harbin 39. Kamchatka 50. Magadan 61. Pyongyang 72. Taipei 83. Vientiane
7. Ashgabat 18. Choibalsan 29. Hebron 40. Karachi 51. Makassar 62. Qatar 73. Tashkent 84. Vladivostok
8. Atyrau 19. Chongqing 30. Ho_Chi_Minh 41. Kashgar 52. Manila 63. Qostanay 74. Tbilisi 85. Yakutsk
9. Baghdad 20. Colombo 31. Hong_Kong 42. Kathmandu 53. Muscat 64. Qyzylorda 75. Tehran 86. Yangon
10. Bahrain 21. Damascus 32. Hovd 43. Khandyga 54. Nicosia 65. Riyadh 76. Tel_Aviv 87. Yekaterinburg
11. Baku 22. Dhaka 33. Irkutsk 44. Kolkata 55. Novokuznetsk 66. Sakhalin 77. Thimphu 88. Yerevan
Time zone: 78
Current default time zone: 'Asia/Tokyo'
Local time is now: Sun Jun 1 20:42:46 JST 2025.
Universal Time is now: Sun Jun 1 11:42:46 UTC 2025.
...
- ssh の設定ファイルを変更する。ここではパスワード認証を有効化している。
# sed -i 's/#PasswordAuthentication yes/PasswordAuthentication yes/' /etc/ssh/sshd_config
- ssh のログファイルを置くフォルダを生成する。
# mkdir -p /var/run/sshd
- 手動で sshd を起動する。
# service ssh start
* Starting OpenBSD Secure Shell server sshd [ OK ]
- (注意)
上記のようにして起動した sshd プロセスは container が停止したときに終了してしまう。
コンテナを再起動したときにはssh サーバを再起動する必要がある(root 権限で "service ssh start" )。
-
supervisord 経由で sshd を自動起動する Container の作り方は
https://nw.tsuda.ac.jp/lec/docker/custom_image_ubuntu24_sshd/
を参照すること。
本来の Ubuntu では、
systemctl を用いてシステムの再起動と同時に sshd サーバも起動するのが普通である。
しかし、Container 内では systemctl は使わずに、supervisord を用いることが多いようだ。
(自分へのメモ) 上記ページの supervisord の起動方法は、以下のように変更したほうがよい。
[entrypoint.sh] |
(変更前): /usr/bin/supervisord -c /etc/supervisor/conf.d/supervisord.conf &
(変更後): /usr/bin/supervisord -c /etc/supervisor/supervisord.conf &
理由: /etc/supervisor/supervisord.conf は /etc/supervisor/conf.d/*.conf をincludeするので。
|
ssh を用いてネットワーク経由で Container にアクセスする。
- Docker Host の対話環境から、localhost の 10022 番ポートに ssh アクセスする。
$
ssh -p 10022 guest@localhost
The authenticity of host '[localhost]:10022 ([127.0.0.1]:10022)' can't be established.
ED25519 key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
yes
Warning: Permanently added '[localhost]:10022' (ED25519) to the list of known hosts.
guest@localhost's password:
← パスワードを入力する。(エコーバックされない)Welcome to Ubuntu 24.04.2 LTS (GNU/Linux 6.11.0-26-generic x86_64)
...
To run a command as administrator (user "root"), use "sudo
".
See "man sudo_root" for details.
$ ← Container 内の guest 権限の対話環境が動く
- (Container 内の guest 権限の対話環境で) ユーザ名を調べる
$ whoami
guest
- (Container 内の guest 権限の対話環境で) 管理者権限でコマンドを実行する
$
sudo whoami
O[O[sudo] password for guest:
← guest のパスワードを入力する。(エコーバックされない)root ← root権限でコマンドが実行される
$
- ssh 経由でのアクセスを終了する。
$
exit
logout
Connection to localhost closed.
$ ← Docker Host の対話環境に戻る
-
(注意)
外部のマシンから ssh で Container にアクセスするには、Docker Host のファイアウォールで 10022 番ポートを開ける必要がある。
(Optional) Container を停止して消去する
- (ホストOSの対話環境で) 実行中の Container は "docker stop" コマンドで停止できる。
$ docker container stop ubuntu24c
ubuntu24c
- (ホストOSの対話環境で) 停止中の Container は "docker container rm" コマンドで消去できる。
$ docker container rm ubuntu24c
ubuntu24c
- (ホストOSの対話環境で) Container の一覧を表示することで、ubuntu24c が消去されたことを確認する。
$ docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES