- Image から Container を生成して起動する。ユーザ情報はデフォルト値 (guest) を利用する。
Container のファイルシステム内にホストOSのディレクトリをマウントする。
Container を起動するたびに、sshd サーバが起動される。
$ docker run --name ubuntu24-sshd --restart always \
-p 10022:22 \
-v /home/docker/sshd:/mnt/hostos \
-it ubuntu24_sshd
起動オプション
- --name: 生成する Container の名前は ubuntu24-sshd
- --restart always: docker が起動すると、このコンテナも自動起動する。
- -p: ホストOSのポート番号 10022 へのアクセスを、Container のポート番号 22 にフォワーディングする。
ポート番号 |
ホストOS | ゲストOS |
10022 | 22 |
- -v: ホストOSの /home/docker/sshd が Container の /mnt/hostos としてマウントされる。
マウントポイント |
ホストOS | ゲストOS |
/home/docker/ssh | /mnt/hostos |
- -it: 対話モード。ホストOSの端末をそのまま、Container 内の bash との対話環境として使う。
- 使用する Docker Image は ubuntu24-sshd
- Container を起動した対話環境が、そのまま Container 内で動作する bash との対話環境になる。root権限でloginした状態である。
First run. Setting up ... ← 生成された Container 内で entrypoint.sh が実行される
Creating group guest with GID=3000
Creating user guest with UID=3000, GID=3000
ownership of '/home/guest' retained as guest:guest
No command provided. Starting bash ...
root@af401d3cdf85:/# 2025-05-11 09:32:40,710 CRIT Supervisor is running as root. Privileges were not dropped because no user is specified in the config file. \
If you intend to run as root, you can set user=root in the config file to avoid this message.
2025-05-11 09:32:40,711 INFO supervisord started with pid 38
2025-05-11 09:32:41,715 INFO spawned: 'sshd' with pid 41
2025-05-11 09:32:42,717 INFO success: sshd entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
# ← Container 内の対話環境 (root権限の bash) が動く
- (Container 内で) ホストOSのマウントポイントを調べる。
# ls -ld /mnt/hostos
drwxr-xr-x 2 root root 4096 May 11 09:32 /mnt/hostos
- (Container 内で) 新規ユーザのホームディレクトリを調べる。
# ls -ld /home/guest
drwxr-x--- 2 guest guest 4096 May 11 09:32 /home/guest
# ls -la /home/guest
total 20
drwxr-x--- 2 guest guest 4096 May 11 09:32 .
drwxr-xr-x 1 root root 4096 May 11 09:32 ..
-rw-r--r-- 1 guest guest 220 Mar 31 2024 .bash_logout
-rw-r--r-- 1 guest guest 3771 Mar 31 2024 .bashrc
-rw-r--r-- 1 guest guest 807 Mar 31 2024 .profile
- (Container 内で) Control-P と Control-Q を順にタイプして、ホストOSの対話環境に戻る。
Container 内のシェルは動作したままとなる。
# ^p ^q ← Container の対話環境を抜ける
$ ← ホストOS 内の対話環境に戻る
- ホストOSにおいて、Container からマウントされているディレクトリを調べる。
$ ls -ld /home/docker/sshd
drwxr-xr-x 2 root root 4096 5月 11 18:32 /home/docker/sshd
- ホストOSから、Continer の guest ユーザのアカウントに ssh でアクセスする。
- localhost からのアクセスはファイアウォールの干渉を受けないので、
ファイアウォールが動作していてもアクセス可能である。
- Container 作成時の -p 10022:22 オプションの指定により、
ホストOSの 10022 番ポートへのアクセスは Container の 22 番ポートにポートフォワーディングされる。
- ssh アクセスで
$ ssh -p 10022 guest@localhost ← ホストOSの 10022 番ポートに sshアクセスする
...
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
...
guest@localhost's password: ← パスワードを入力する。エコーバックされない。
Welcome to Ubuntu 24.04.2 LTS (GNU/Linux 6.11.0-25-generic x86_64)
...
guest % ← Container 内の guest 権限の対話環境が開始する
- (Container 内の guest 権限で) ホームディレクトリを表示する。
$ pwd
/home/guest
- (Container 内の guest 権限で) ホームディレクトリにあるファイルの一覧を表示する。
$ ls -la
total 24
drwxr-x--- 3 guest guest 4096 May 11 09:35 .
drwxr-xr-x 1 root root 4096 May 11 09:32 ..
-rw-r--r-- 1 guest guest 220 Mar 31 2024 .bash_logout
-rw-r--r-- 1 guest guest 3771 Mar 31 2024 .bashrc
drwx------ 2 guest guest 4096 May 11 09:35 .cache
-rw-r--r-- 1 guest guest 807 Mar 31 2024 .profile
- (Container 内の guest 権限で) パスワードを変更する。
$ passwd
Changing password for guest.
Current password: ← パスワード を入力する。
New password: ← 新しいパスワード を入力する。
Retype new password: ← もう一度新しいパスワード を入力する。
passwd: password updated successfully
- (Container 内の guest 権限で) ssh 経由の対話環境を終了する。
guest@af401d3cdf85:~$ exit
logout
Connection to localhost closed.
$
- (ホストOS上) docker 上の実行中の container の状態を調べる
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
af401d3cdf85 ubuntu24_sshd "/entrypoint.sh" 4 minutes ago Up 4 minutes 0.0.0.0:10022->22/tcp, [::]:10022->22/tcp ubuntu24-sshd
- (ホストOS上) docker 上のすべての(停止中を含む) container の状態を調べる
$ docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
af401d3cdf85 ubuntu24_sshd "/entrypoint.sh" 4 minutes ago Up 4 minutes 0.0.0.0:10022->22/tcp, [::]:10022->22/tcp ubuntu24-sshd
- (ホストOS上) docker 上の Image の一覧を表示する。
-
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu24_sshd latest 23164575e4d2 About an hour ago 222MB
ubuntu24-user latest 7b64f0b8bea1 3 hours ago 81.4MB
- (ホストOS上) 外部のPCからネットワーク経由で Container にアクセスするためには、ホストOSの 10022 番ポートを開けておく必要がある。
Docker の公式文書では、「docker のポートフォワーディングは ufw のフィルタリングよりも前に行わるために、ufw の影響を受けない」
と記述されている (2025年春時点) が、これは現時点では間違いのようだ。
Containerに外部からアクセスするためには、ホストOSのポートを開けておく必要がある。
Ubuntu 24.04LTS の場合: ufw を用いる
- (ホストOS上) ファイアウォール ufw を有効化する。(既に有効化してあれば必要なし)
$ sudo apt update ← aptのデータベースを更新する
$ sudo apt install -y ufw ← ufw をインストールする。
$ sudo systemctl enable ufw ← ufw を有効化する
$ sudo systemctl restart ufw ← ufw を再起動する
- (ホストOS上) ホストOSの 10022 番ポートを開放する。
$ sudo ufw allow 10022 ← 10022 番ポートを開放する
ルールを追加しました
ルールを追加しました (v6)
- (ホストOS上) ファイアウォールの状態を確認する。
$ sudo ufw status 10022 ← 10022 番ポートを開放する
...
状態: アクティブ
To Action From
-- ------ ----
...
10022 ALLOW Anywhere
...
10022 (v6) ALLOW Anywhere (v6)
...
- (ネットワーク上の他のPC) 他のマシンから、ホストOS上の Container に ssh 接続する。
以下は、ホストOSの IPアドレスが 192.168.12.3 の場合の、ssh アクセスの様子である。
(他のPCから)
$
ssh -p 10022 guest@192.168.12.3
guest@192.168.12.3's password:
← パスワードを入力する。エコーバックされない。
Welcome to Ubuntu 24.04.2 LTS (GNU/Linux 6.11.0-25-generic x86_64)
...
guest $ whoami ← Container に guest 権限でアクセスできる
guest
guest $ exit
logout
Connection to 192.168.12.3 closed.
$