2025/06/01 Updated by

Docker Container として Ubuntu 24.04LTS を動かす (2)

新規ユーザを追加する + sshdを起動する


[Up] Japanese English
このページ内での表記:
「ホストOSの対話環境」は背景色を黄色(lightyellow)で表す。
「Conainer 内の root 権限の対話環境」は背景色を水色(azure)であらわす。
「Conainer 内の一般ユーザ権限の対話環境」は背景色を赤色(#ffeeee)であらわす。
「他のPCの対話環境」は紫色(#eeeeff)で表す。

実験環境


方針

Container 内に新規ユーザを追加する

Container 内に追加する新規ユーザの情報は以下の通り。
グループ名guest
グループID3000
ユーザ名guest
ユーザID3000

Container 内で sshd サーバを起動する

Docker Host においてポートフォワーディングを行う。 ポート番号の対応は以下の通り。
HostContainer
1002222

Container を生成+起動する

  1. (ホストOSの対話環境で) Container を生成してシェル /bin/bash を起動する。
  2.   
    $ docker run --name ubuntu24c \ -p 10022:22 \ -v /home/docker/ubuntu24c:/mnt/hostos \ -i -t ubuntu:24.04 /bin/bash
    # ← コンテナ内の対話環境 (root 権限の bash)
    起動オプション
  3. (Container 内の root 権限の対話環境で) ユーザ名を表示する。
  4. # whoami  
    root
    
  5. (Container 内の root 権限の対話環境で) カレント・ワーキング・ディレクトリを表示する。
  6. # pwd  
    /
    

新しいグループを追加する

guest という名前のグループ を追加する。
  1. guest というグループがまだ存在しないことを確認する。
    # grep guest  /etc/group 
  2. 新しいグループ (グループ名: guest, グループID: 3000) を追加する。
  3. # groupadd -g 3000 guest
  4. グループが作成されたことを確認する。
  5. # grep guest /etc/group  
    guest:x:3000:
    

新しいユーザを追加する

  1. guest というユーザ名がまだ存在しないことを確認する。
  2. # grep guest /etc/passwd 
  3. 新しいユーザ guest を追加する。
  4. # useradd -m -u 3000 -g 3000 -s /bin/bash guest  
    
  5. 新しいユーザが追加されたことを確認する。
  6. # grep guest /etc/passwd   
    guest:x:3000:3000::/home/guest:/bin/bash
    
  7. [重要] 新規ユーザの初期パスワードを設定する。
  8. # passwd guest    
    New password:          ← 新しいパスワードを入力する(エコーバックされない)
    Retype new password:   ← もう一度新しいパスワードを入力する
    passwd: password updated successfully
    

ユーザに管理者としてコマンドを実行できる権限を与える

  1. ユーザ (ここでは guest) を sudo グループに追加する。
  2. # usermod -aG sudo guest   
    
  3. ユーザが sudo グループに追加されたことを確認する。
  4. # grep sudo /etc/group  
    sudo:x:27:ubuntu,guest
    
  5. sudo コマンドをインストールする。
    # apt update  
    # apt install -y sudo  
    

ネットワークコマンドをインストールする

  1. まず、aptのデータベースを更新する。
  2. # apt update
    
  3. ifconfig, netstat, arp をインストールする
  4. # apt install -y net-tools
    
  5. traceroute をインストールする
  6. # apt install -y iputils-tracepath traceroute
    
  7. ping をインストールする
  8. # apt install -y iputils-ping
    
  9. curl をインストールする
  10. # apt install -y curl
    
  11. ip をインストールする
  12. # apt install -y iproute2
    
  13. netstat コマンドを用いて、ルーティング情報を調べる。 → container が接続しているネットワークは 172.17.0.0/16で、 デフォルトのルーティング先が 172.17.0.1 であることがわかる
  14. $ 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
    
  15. ifconfig でcontainer のipアドレスを調べる。 → 172.17.0.2 であることがわかる。
  16. $ 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 をインストールする

  1. まず apt のデータベースを更新する。
  2. $ apt update  
    
  3. OpenSSH のパッケージをインストールする。インストール途中で Timezone を設定するための質問に2回答える必要がある。
  4. $ 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.
    ...
    
  5. ssh の設定ファイルを変更する。ここではパスワード認証を有効化している。
  6. # sed -i 's/#PasswordAuthentication yes/PasswordAuthentication yes/' /etc/ssh/sshd_config    
    
  7. ssh のログファイルを置くフォルダを生成する。
    # mkdir -p /var/run/sshd    
    
  8. 手動で sshd を起動する。
  9. # service ssh start   
     * Starting OpenBSD Secure Shell server sshd                                                                          [ OK ]
    
  10. (注意) 上記のようにして起動した sshd プロセスは container が停止したときに終了してしまう。 コンテナを再起動したときにはssh サーバを再起動する必要がある(root 権限で "service ssh start" )。
  11. supervisord 経由で sshd を自動起動する Container の作り方は https://nw.tsuda.ac.jp/lec/docker/custom_image_ubuntu24_sshd/ を参照すること。
  12. 本来の 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 にアクセスする。

  1. Docker Host の対話環境から、localhost の 10022 番ポートに ssh アクセスする。
  2. $ 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 権限の対話環境が動く
  3. (Container 内の guest 権限の対話環境で) ユーザ名を調べる
  4. $ whoami   
    guest
    
  5. (Container 内の guest 権限の対話環境で) 管理者権限でコマンドを実行する
  6. $ sudo whoami O[O[sudo] password for guest: guest のパスワードを入力する。(エコーバックされない)
    root ← root権限でコマンドが実行される
    $
  7. ssh 経由でのアクセスを終了する。
  8. $ exit logout Connection to localhost closed.
    $ ← Docker Host の対話環境に戻る
  9. (注意) 外部のマシンから ssh で Container にアクセスするには、Docker Host のファイアウォールで 10022 番ポートを開ける必要がある。

(Optional) Container を停止して消去する

  1. (ホストOSの対話環境で) 実行中の Container は "docker stop" コマンドで停止できる。
  2. $ docker container stop ubuntu24c  
    ubuntu24c
    
  3. (ホストOSの対話環境で) 停止中の Container は "docker container rm" コマンドで消去できる。
  4. $ docker container rm ubuntu24c   
    ubuntu24c
    
  5. (ホストOSの対話環境で) Container の一覧を表示することで、ubuntu24c が消去されたことを確認する。
  6. $ docker container ls -a    
    CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES