web-dev-qa-db-ja.com

OSX(boot2docker)でdockerコンテナとssh接続を取得する方法

私はOSXでdockerを boot2docker で使用しています。

ターミナルから実行中のコンテナにSsh接続を取得したい。

しかし、私はこれを行うことはできません:(

Dockerが仮想マシンで実行されているためだと思います。

16
Valikos Ost

VMで実行されているコンテナへのsshを有効にするには、いくつかのことを行う必要があります。

  1. コンテナにsshdをインストールして実行します( )。 sshdはデフォルトでは存在しません。これは、コンテナは通常1つのプロセスしか実行しないためですが、必要な数だけ実行できます。
  2. EXPOSEイメージ作成の一部としてのポート(通常は22)。これにより、コンテナーを実行すると、デーモンがコンテナー内のEXPOSE'dポートに接続し、何かが公開される可能性があります。コンテナの外。
  3. コンテナを実行するときは、そのポートをマップする方法を決定する必要があります。 Dockerに自動的に実行させることも、明示的に実行させることもできます。明示的にすることをお勧めします:docker run -p 42222:22 ... VMのポート42222をコンテナのポート22にマップします。
  4. ポートマップをVMに追加して、ポートをホストに公開します。たとえば、VMが実行されていない場合は、次のようなマッピングを追加できます。VBoxManage modifyvm "boot2docker-vm" --natpf1 "containerssh,tcp,,42222,,42222"

次に、ホストから、ホストのポート42222にsshで接続して、コンテナーのsshデーモンに到達できるようにする必要があります。

上記の手順を実行すると、次のようになります。

$ VBoxManage modifyvm "boot2docker-vm" --natpf1 "containerssh,tcp,,42222,,42222"
$ ./boot2docker start
[2014-04-11 12:07:35] Starting boot2docker-vm...
[2014-04-11 12:07:55] Started.
$ docker run -d -p 42222:22 dhrp/sshd
Unable to find image 'dhrp/sshd' (tag: latest) locally
Pulling repository dhrp/sshd
2bbfe079a942: Download complete 
c8a2228805bc: Download complete 
8dbd9e392a96: Download complete 
11d214c1b26a: Download complete 
27cf78414709: Download complete 
b750fe79269d: Download complete 
cf7e766468fc: Download complete 
082189640622: Download complete 
fa822d12ee30: Download complete 
1522e919ec9f: Download complete 
fa594d99163a: Download complete 
1bd442970c79: Download complete 
0fda9de88c63: Download complete 
86e22a5fdce6: Download complete 
79d05cb13124: Download complete 
ac72e4b531bc: Download complete 
26e4b94e5a13b4bb924ef57548bb17ba03444ca003128092b5fbe344110f2e4c
$ docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                   NAMES
26e4b94e5a13        dhrp/sshd:latest    /usr/sbin/sshd -D      6 seconds ago       Up 3 seconds        0.0.0.0:42222->22/tcp   loving_einstein     
$ ssh root@localhost -p 42222
The authenticity of Host '[localhost]:42222 ([127.0.0.1]:42222)' can't be established.
RSA key fingerprint is ....
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[localhost]:42222' (RSA) to the list of known hosts.
root@localhost's password: screencast
Welcome to Ubuntu 12.04 LTS (GNU/Linux 3.12.1-tinycore64 x86_64)

 * Documentation:  https://help.ubuntu.com/

The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.

root@26e4b94e5a13:~# exit
logout

つまり、ssh-> localhost 42222-> VMポート42222-> containerポート22が表示されます。

32
Andy

Dockerは、Docker1.3.0にdocker execコマンドを追加しました。以下を使用して、実行中のコンテナーに接続できます。

docker exec -it <container id> /bin/bash

これにより、実行中のコンテナーのbashプロンプトに接続されます。

32
user848337

実行中のコンテナにアクセスしたいだけの場合は、 nsenter の使用を検討してください。これは、Dockerコンテナに入力するために使用できる簡単なbashスクリプト( Chris Jonesが提案 )です。 $PATHのどこかにdocker-enterとchmod +xとして保存します

#!/bin/bash
set-e
# Check for nsenter. If not found, install it
boot2docker ssh '[ -f /var/lib/boot2docker/nsenter ] || docker run --rm -v /var/lib/boot2docker/:/target jpetazzo/nsenter'
# Use bash if no command is specified
args=$@
if[[ $# = 1 ]]; then
    args+=(/bin/bash)
fi

boot2docker ssh -t Sudo /var/lib/boot2docker/docker-enter "${args[@]}"

次に、docker-enter 89af3d(または入力したい構成)を実行できます。

1
Michael_Scharf

同じOS、Docker18.09.2のホストで実行されているUbuntu16.04イメージに対してこれをテストしました。これは、マイナーな変更を加えたboot2Dockerでも機能するはずです。

イメージを作成します。バックグラウンドコンテナで実行します(youruser rootの場合があります):

$ docker run -ditu <youruser> <imageId>

シェルでそれに取り付けます:

$ docker exec -it <containerId> /bin/bash

Openssh-serverをインストールします(Sudoは、ユーザーがrootでない場合にのみ必要です。コマンドは、boot2Dockerでは異なる場合があります)。

$ Sudo apt-get install -y openssh-server

それを実行します:

$ Sudo service ssh start

(次の手順はオプションです。ユーザーがパスワードを持っている場合は、それをスキップして、各ssh接続でパスワードを入力できます)

クライアントホストでRSAキーを作成します。

$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/youruser/.ssh/id_rsa):
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/youruser/.ssh/id_rsa.
Your public key has been saved in /home/youruser/.ssh/id_rsa.pub.

Dockerイメージで、ディレクトリ$HOME/.sshを作成します。

$ cd
$ mkdir .ssh && cd .ssh
$ vi authorized_keys

クライアントマシンの$HOME/.ssh/id_rsa.pubの内容をコピーしてDockerイメージのauthorized_keysに貼り付け、ファイルを保存します。

(オプションのステップの終了)

画像のIPアドレスを書き留めます。

$ cat /etc/hosts
127.0.0.1   localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2  63448863ac39
^^^^^^^^^^ this

これで、クライアントホストからの接続が有効になります。

$ ssh 172.17.0.2
Enter passphrase for key '/home/youruser/.ssh/id_rsa': 
Welcome to Ubuntu 16.04.6 LTS (GNU/Linux 4.15.0-46-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage
Last login: Fri Apr  5 09:50:30 2019 from 172.17.0.1

もちろん、Dockerfileで上記の手順を非対話的に適用することができます。

0
PJ_Finnegan

入力するコンテナに名前を付けるだけでよい、Michaelの回答のわずかに変更されたバリアント(APPNAME):

boot2docker ssh '[ -f /var/lib/boot2docker/nsenter ] || docker run --rm -v /var/lib/boot2docker/:/target jpetazzo/nsenter'

boot2docker ssh -t Sudo /var/lib/boot2docker/docker-enter $(docker ps | grep $APPNAME | awk '{ print $1 }')
0
Barrett Clark