Dockerのネットワークを勉強するためにCentOS7イメージでsshdを起動させてみました。
様々なサイトを参考にさせて頂いて外部からssh接続ができました。
環境
・CentOS Linux release 7.3.1611 (Core)
・Kernel: 3.10.0-514.16.1.el7.x86_64
・Docker version 17.03.1-ce, build c6d412e
Docker-ceをインストールするとネットワークが追加されます。
docker0,vethb7deb96@if12,vethcd238da@if30がDocker用仮想ネットワークのようです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
$ ip add 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:b3:f3:9c brd ff:ff:ff:ff:ff:ff inet 192.168.1.1/24 brd 192.168.1.255 scope global eno16777736 valid_lft forever preferred_lft forever inet6 2408:212:d01:b100:20c:29ff:feb3:f39c/64 scope global noprefixroute dynamic valid_lft 13818sec preferred_lft 12018sec inet6 fe80::20c:29ff:feb3:f39c/64 scope link valid_lft forever preferred_lft forever 3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP link/ether 02:42:50:58:7d:a6 brd ff:ff:ff:ff:ff:ff inet 172.17.0.1/16 scope global docker0 valid_lft forever preferred_lft forever inet6 fe80::42:50ff:fe58:7da6/64 scope link valid_lft forever preferred_lft forever 13: vethb7deb96@if12: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP link/ether ce:f1:61:93:6c:4b brd ff:ff:ff:ff:ff:ff link-netnsid 1 inet6 fe80::ccf1:61ff:fe93:6c4b/64 scope link valid_lft forever preferred_lft forever 31: vethcd238da@if30: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP link/ether f6:3a:54:e8:62:cb brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet6 fe80::f43a:54ff:fee8:62cb/64 scope link valid_lft forever preferred_lft forever |
CentOS7のDockerイメージを使用してコンテナを作成、起動してアタッチします。
ipコマンドが無いのでインストールしてipアドレスを確認すると172.17.0.4/16が割り当てられていました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
$ docker run -it --name mycentos7 centos /bin/bash [root@0b8436fd3fc0 /]# ip bash: ip: command not found [root@0b8436fd3fc0 /]# yum -y install iproute [root@0b8436fd3fc0 /]# ip add 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 34: eth0@if35: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP link/ether 02:42:ac:11:00:04 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 172.17.0.4/16 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::42:acff:fe11:4/64 scope link valid_lft forever preferred_lft forever [root@0b8436fd3fc0 /]# ip route default via 172.17.0.1 dev eth0 172.17.0.0/16 dev eth0 proto kernel scope link src 172.17.0.4 |
特に何も設定していないのですが、yum installも可能なのでコンテナ内から外部へNATされているのでしょうか。
さてsshdですがコンテナ作成で特権レベルとポートマッピングを指定する必要がありました。
提供されているCentOS7イメージ(もしかしてコンテナ?)はセキュリティ上、いろいろと制限が掛けられているようでsystemdもそのひとつのようです。
通常でコンテナを起動させるとエラーでサービスが起動できません。
1 2 3 |
[root@e5a771ed1ca0 /]# yum -y install openssh-server [root@e5a771ed1ca0 /]# systemctl start sshd Failed to get D-Bus connection: Operation not permitted |
--privileged
で特権レベルでコンテナを起動、 -p 60022:22
でホストの60022をコンテナの22にポートマッピングです。
ホストのポートとコンテナのポートの関連付けだけなのでホストでsshdが起動していなければ22:22でもいいと思います。
1 2 3 4 5 6 |
$ docker run --privileged -d --name centos7-sshd -p 60022:22 centos /sbin/init 4e96d2ec37494d6cba2d4312fd084c450715b9d014a5c8443dbb9f9d5f43fc32 $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4e96d2ec3749 centos "/sbin/init" 5 seconds ago Up 5 seconds 0.0.0.0:60022->22/tcp centos7-sshd |
インタラクティブでcentos7-sshdのbashを実行します。
1 2 |
$ docker exec -it centos7-sshd /bin/bash [root@4e96d2ec3749 /]# |
sshdをインストール
1 |
[root@4e96d2ec3749 /]# yum -y install openssh-server |
sshdの起動
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
[root@4e96d2ec3749 /]# systemctl start sshd [root@4e96d2ec3749 /]# systemctl status sshd ● sshd.service - OpenSSH server daemon Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled) Active: active (running) since Mon 2017-04-17 12:59:15 UTC; 1min 15s ago Docs: man:sshd(8) man:sshd_config(5) Main PID: 50 (sshd) CGroup: /docker/4e96d2ec37494d6cba2d4312fd084c450715b9d014a5c8443dbb9f9d5f43fc32/system.slice/sshd.service └─50 /usr/sbin/sshd -D ‣ 50 /usr/sbin/sshd -D Apr 17 12:59:15 4e96d2ec3749 systemd[1]: Starting OpenSSH server daemon... Apr 17 12:59:15 4e96d2ec3749 sshd[50]: Server listening on 0.0.0.0 port 22. Apr 17 12:59:15 4e96d2ec3749 sshd[50]: Server listening on :: port 22. Apr 17 12:59:15 4e96d2ec3749 systemd[1]: Started OpenSSH server daemon. |
ユーザーの作成
1 2 3 4 5 6 |
[root@4e96d2ec3749 /]# useradd guest01 [root@4e96d2ec3749 /]# passwd guest01 Changing password for user guest01. New password: Retype new password: passwd: all authentication tokens updated successfully. |
これで準備が整ったので外部からコンテナ(centos7-sshd)にssh接続してみます。
ホストIP:60022に接続することになります。
先程作成したユーザー:guest01でログインできると思います。