ここで作成しているDockerコンテナは、信頼のおけるローカルネットワークのみで動作するホストで運用するものとして構築している。
ホスト上のいずれかのネットワークインターフェイスがインターネットに直接接している場合、このコンテナの運用はセキュリティの観点から非常に危険なので動作させてはいけない。
(インターネットに直に接している場合、Dockerのデフォルトではiptablesを書き換えて外部からのアクセスを許してしまうことになってしまうため厳禁である。)
★Dockerのインストールは、次のページの手順に従った。
【Linux CentOS 7】Dockerをyumでインストールする手順と簡単な動作テスト【Docker-ce 18.06.1.ce】
https://akira-arets.blogspot.com/2018/08/centos7-install-docker-and-test.html
★またその他のDockerコンテナに関する情報を一覧にした。
【Linux CentOS 7】(ベースコンテナの作成)Dockerコンテナ(CentOS7公式)にsshd、rsyslog、Postfix、crondを導入した【Docker-ce 18.06.1.ce】
【Linux CentOS 7】(ベースコンテナの作成)Dockerコンテナにdnsmasqを導入しhostsファイルの仕組みを整える方法
【Linux CentOS 7】(ベースコンテナの作成)SSH接続可能なDockerコンテナでの日本用ロケールの有効化と検証(man,dateの日本語表示)【Docker-ce 18.06.1.ce】
【Linux CentOS 7】Dockerコンテナ(CentOS7)にデスクトップ環境(MATE)を構築してVNCでリモート接続できるようにした【Docker-ce 18.06.1.ce】
【Linux CentOS 7】Dockerコンテナにボリュームをマウントしデータを永続化させる方法/ボリュームのバックアップ方法【Docker-ce 18.06.1.ce】
【Linux CentOS 7】変更済みのDockerコンテナから別名でイメージを作成することでその加えた変更を維持する手順【Docker-ce 18.06.1.ce】
【Linux CentOS 7】Dockerイメージを圧縮ファイルに保存して別のホストにコピーし復元した【Docker-ce 18.06.1.ce】
■ centos7公式イメージからコンテナを実体化した。
DockerホストマシンのTCP 222番を、コンテナのTCP 22番に通すようにした。
また、privilegedを指定して、このコンテナ動作に特権を与えている。
コンテナはバックグラウンド動作で、/sbin/initを起動するように指定した。
このコンテナの名称として、cent7-ssh を付与した。
(インターネットに直に接している場合、Dockerのデフォルトではiptablesを書き換えて外部からのアクセスを許してしまうことになってしまうため厳禁である。)
# docker run --privileged -d -p 222:22 --name centos7-ssh centos:centos7 /sbin/init
e538ae438b0bb861b9be9d2fe0e3f8877b1297b2587026b869569d4eab0b2ceb(注意)この段階ではまだSSHで使うポートを通しているだけであり、コンテナ内でSSHが動作していないためリモートアクセスは不可能である。
コンテナの動作を確認した。
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e538ae438b0b centos:centos7 "/sbin/init" 48 seconds ago Up 46 seconds 0.0.0.0:222->22/tcp centos7-ssh
■バックグラウンドで動作中のコンテナに接続した。
これは、コンテナの/bin/bashコマンドを実行すれば可能になる。
# docker exec -it centos7-ssh /bin/bash
[root@e538ae438b0b /]#プロンプトが表示されて、コンテナ内での作業が可能になった。
■上記の続きとして、コンテナ内で必要なパッケージの導入を行った。
以下は、コンテナ内での作業である。
○システムの更新
[root@e538ae438b0b /]# yum update -y
Updated:
audit-libs.x86_64 0:2.8.1-3.el7_5.1 bind-license.noarch 32:9.9.4-61.el7_5.1 centos-release.x86_64 0:7-5.1804.5.el7.centos dracut.x86_64 0:033-535.el7_5.1
kpartx.x86_64 0:0.4.9-119.el7_5.1 libblkid.x86_64 0:2.23.2-52.el7_5.1 libmount.x86_64 0:2.23.2-52.el7_5.1 libuuid.x86_64 0:2.23.2-52.el7_5.1
nss.x86_64 0:3.36.0-7.el7_5 nss-sysinit.x86_64 0:3.36.0-7.el7_5 nss-tools.x86_64 0:3.36.0-7.el7_5 systemd.x86_64 0:219-57.el7_5.3
systemd-libs.x86_64 0:219-57.el7_5.3 tzdata.noarch 0:2018f-2.el7 util-linux.x86_64 0:2.23.2-52.el7_5.1
Complete!
○sshサーバーの導入
[root@e538ae438b0b /]# yum install openssh-server
Installed:
openssh-server.x86_64 0:7.4p1-16.el7
Dependency Installed:
fipscheck.x86_64 0:1.4.1-6.el7 fipscheck-lib.x86_64 0:1.4.1-6.el7 openssh.x86_64 0:7.4p1-16.el7 tcp_wrappers-libs.x86_64 0:7.6-77.el7
Complete!
○sshサービスの有効化
(コンテナ内のシステム再起動時に自動起動されるようにする)
[root@e538ae438b0b /]# systemctl enable sshd
○sshサービスの起動
[root@e538ae438b0b /]# systemctl start sshd
○状態の確認
[root@e538ae438b0b /]# systemctl status sshd
● sshd.service - OpenSSH server daemonこれで、sshサービスが起動した。
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2018-11-07 21:38:38 UTC; 9s ago
Docs: man:sshd(8)
man:sshd_config(5)
Main PID: 286 (sshd)
CGroup: /docker/e538ae438b0bb861b9be9d2fe0e3f8877b1297b2587026b869569d4eab0b2ceb/docker/e538ae438b0bb861b9be9d2fe0e3f8877b1297b2587026b869569d4eab0b2ceb/system.slice/sshd.service
└─286 /usr/sbin/sshd -D
‣ 286 /usr/sbin/sshd -D
Nov 07 21:38:38 e538ae438b0b systemd[1]: Starting OpenSSH server daemon...
Nov 07 21:38:38 e538ae438b0b systemd[1]: Started OpenSSH server daemon.
○rootパスワードの設定を行った。
安全なローカルネットで実験しているので単純なパスワードにした。
[root@e538ae438b0b /]# passwd root
Changing password for user root.
New password:
BAD PASSWORD: The password fails the dictionary check - it does not contain enough DIFFERENT characters
Retype new password:
passwd: all authentication tokens updated successfully.
○ipコマンドを使うための準備
[root@e538ae438b0b /]# yum install iproute
Installed:○コンテナに付与されているIPアドレスを確認した。
iproute.x86_64 0:4.11.0-14.el7
Dependency Installed:
iptables.x86_64 0:1.4.21-24.1.el7_5 libmnl.x86_64 0:1.0.3-7.el7 libnetfilter_conntrack.x86_64 0:1.0.6-1.el7_3 libnfnetlink.x86_64 0:1.0.1-4.el7
Complete!
[root@e538ae438b0b /]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
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
4: eth0@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
コンテナに付与されているアドレスがDockerホストの存在する192.168.10.0/24ネットでないものになっている。
コンテナはホスト上に造られたDockerシステムによる閉じた仮想ネットワークに接続されているためである。
192.168.10.0/24ネット上のマシンからこのアドレスを直接指定して接続することはできない。
しかし、コンテナを実体化したときに、ホストマシンのTCP 222番をコンテナのTCP 22番に通す設定を行った。
だから、次のようにすれば、コンテナにSSH接続ができる。
以上でコンテナ内での作業は完了した。
■別のマシンから、上記コンテナにssh接続を試した。
(注意)
指定したIPアドレスはDocerホストのものであり、先程確認したコンテナに割り当てられたIPアドレスはない。
最初にこのコンテナをrunしたときに、ホストからコンテナへパススルーするポートを指定した。
Dockerホストのポート(TCP 222)をコンテナのポート(TCP 22)にパススルーしていることに気をつけること。
$ ssh -p 222 root@192.168.10.3
The authenticity of host '[192.168.10.3]:222 ([192.168.10.3]:222)' can't be established.コンテナにログインできた。
ECDSA key fingerprint is SHA256:
ECDSA key fingerprint is MD5:
Are you sure you want to continue connecting (yes/no)? yes
root@192.168.10.3's password:
[root@e538ae438b0b ~]#
上記のようにsshクライアントの表示では、Dockerホストマシン(192.168.10.3)のTCP 222番に接続したように見える。
しかし、上述したとおり、この接続は、コンテナのTCP 22番に通されている。
■コンテナのシャットダウン、イメージ作成、起動
○コンテナのシャットダウン
上記のsshクライアント接続、あるいは、Dockerホスト上でのコンテナコンソールで、poweroffコマンドを実行した。
[root@e538ae438b0b ~]# poweroff
Connection to 192.168.126.3 closed by remote host.
Connection to 192.168.126.3 closed.
以下は、Dockerホストでの作業である。
○コンテナの状態を確認
# docker ps -all
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESe538ae438b0b centos:centos7 "/sbin/init" 39 minutes ago Exited (130) 55 seconds ago centos7-ssh
コンテナは終了していることがわかった。
○イメージを作成
コンテナは動作中のアプリケーションのようなものだから、
いつでも起動しなおせるようにイメージとして保存しておく。
イメージ名として、image-centos7-ssh を指定した。
# docker commit centos7-ssh image-centos7-ssh
sha256:26135a0ce09116896ca7c9fc6c21f32ec9558838b8ba6c4bb49fd6e967ceead2
# docker image list | grep ssh
image-centos7-ssh latest 26135a0ce091 58 seconds ago 347MB
○コンテナを再起動し、再接続
# docker start centos7-ssh
centos7-ssh
最初の手順と同じように、コンテナに再接続できた。
# docker exec -it centos7-ssh /bin/bash
[root@e538ae438b0b /]#
○コンテナの削除
動作中のコンテナは削除不可能である。
# docker rm centos7-ssh
Error response from daemon: You cannot remove a running container e538ae438b0bb861b9be9d2fe0e3f8877b1297b2587026b869569d4eab0b2ceb. Stop the container before attempting removal or force removeそこで、いったんコンテナをストップした。
# docker stop centos7-ssh
centos7-sshそして、コンテナの削除を行った。
# docker rm centos7-ssh
centos7-ssh
○保存しておいたイメージからコンテナを実体化
削除したコンテナはリストから消えるので、docker start できなくなる。
そこで、上述したように保存したイメージからコンテナを復元した。
(インターネットに直に接している場合、Dockerのデフォルトではiptablesを書き換えて外部からのアクセスを許してしまうことになってしまうため厳禁である。)
# docker run --privileged -d -p 222:22 --name centos7-ssh image-centos7-ssh /sbin/init
8f4f4f284f6defca6e28526b7d5b1b384ac24fbb27adb921efaebb254c796f7f
コンテナに接続した。
# docker exec -it centos7-ssh /bin/bash
[root@8f4f4f284f6d /]#
あるいは、別マシンから、上述したように構築済みのssh接続を行う。
$ ssh -p 222 root@192.168.10.3
[root@8f4f4f284f6d ~]#
以上
<参考>
・Dockerサーバ構築とSSHコンテナの作成
< http://s-tech-blog.blogspot.com/2018/05/dockerssh.html > 2018年11月8日
・CentOS7のDockerイメージ
< http://d.hatena.ne.jp/chocopurin/20160121/1453382799 > 2018年11月8日
・How can I find out if a port on a remote server is open as well as a service is listening on it?
< https://serverfault.com/questions/751506/how-can-i-find-out-if-a-port-on-a-remote-server-is-open-as-well-as-a-service-is > 2018年11月8日