1. 程式人生 > >Docker容器學習梳理--SSH方式登陸容器

Docker容器學習梳理--SSH方式登陸容器

rman ati ava hosts pair als mman ane tab

本章介紹如果通過ssh方式登陸Docker容器的操作記錄(其實不太建議直接用ssh去連接上容器的想法,雖然可以,但是有很多弊端,而且docker已經提供了容器內執行的命令,沒有必要再折騰每一個容器為sshd服務器。

啟動一個centos容器,然後安裝基本的軟件
[root@docker ~]# docker run -itd --name sshd centos /bin/bash      
a67a5c8ae426a841ad6c6aca6186f7fc585410471a6dfe69a1fc0e28d5a05953
[root@docker ~]# docker exec -it sshd /bin/bash
[root@a67a5c8ae426 /]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
[root@a67a5c8ae426 /]# yum install wget vim ntpdate net-tools -y


安裝ssh服務端
[root@a67a5c8ae426 /]# yum clean all
[root@a67a5c8ae426 /]# yum install openssh-server -y

修改容器密碼(提前yum -y reinstall cracklib-dicts)
[root@a67a5c8ae426 /]# echo "123456" |passwd --stdin root

產生公私鑰
[root@a67a5c8ae426 /]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:tJ01c3RqkgtNijf6D9q6SXZJ9ZFQUvpbrnkCmW55T9Y root@a67a5c8ae426
The key's randomart image is:
+---[RSA 2048]----+
|            +o+ .|
|         . + * + |
|        o = X *  |
|       . = * X . |
|        S + .oo .|
|         o .+  +.|
|        o =. o. E|
|       o = o+ o=.|
|        =o....o+.|
+----[SHA256]-----+
[root@a67a5c8ae426 /]# cd ~/.ssh/
[root@a67a5c8ae426 .ssh]# ls
id_rsa  id_rsa.pub
[root@a67a5c8ae426 .ssh]# cp id_rsa.pub authorized_keys
[root@a67a5c8ae426 .ssh]# ls
authorized_keys  id_rsa  id_rsa.pub
[root@a67a5c8ae426 .ssh]# 

執行sshd命令,有報錯:
[root@a67a5c8ae426 .ssh]# /usr/sbin/sshd
Could not load host key: /etc/ssh/ssh_host_rsa_key
Could not load host key: /etc/ssh/ssh_host_ecdsa_key
Could not load host key: /etc/ssh/ssh_host_ed25519_key
sshd: no hostkeys available -- exiting.
[root@a67a5c8ae426 .ssh]# 

解決辦法:
[root@a67a5c8ae426 .ssh]# ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key   //均是一路回車
[root@a67a5c8ae426 .ssh]# ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
[root@a67a5c8ae426 .ssh]# ssh-keygen -t rsa -f /etc/ssh/ssh_host_ecdsa_key
[root@a67a5c8ae426 .ssh]# ssh-keygen -t rsa -f /etc/ssh/ssh_host_ed25519_key


再次執行sshd命令,如果沒有報錯,說明可以啟動了
[root@a67a5c8ae426 .ssh]# /usr/sbin/sshd
[root@a67a5c8ae426 .ssh]# netstat -tnlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      160/sshd            
tcp6       0      0 :::22                   :::*                    LISTEN      160/sshd            
[root@a67a5c8ae426 .ssh]# 


-----------------------啟動ssh,如果報錯如下(這是centos7下的一個bug)-------------------------
[root@a67a5c8ae426 .ssh]# systemctl status sshd
Failed to get D-Bus connection: Operation not permitted
解決辦法如下:
先把上面的容器關閉(docker stop container-id),然後重新啟動容器,啟動時加上參數--privileged(特權參數,也可以是--privileged=true,如果啟動容器中掛載目錄沒有權限也可以添加此參數)和/sbin/init(代替/bin/bash),如下:
[root@docker ~]# docker run -itd --privileged --name sshd centos /sbin/init 
[root@docker ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
884db829911f        centos              "/sbin/init"        33 seconds ago      Up 31 seconds                           sshd
[root@docker ~]# 

其實命令/sbin/init和/usr/sbin/init運行容器都可以。
[root@docker ~]# ll -ld /sbin/init 
lrwxrwxrwx 1 root root 22 Jan 30 17:17 /sbin/init -> ../lib/systemd/systemd
[root@docker ~]# ll -ld /usr/sbin/init 
lrwxrwxrwx 1 root root 22 Jan 30 17:17 /usr/sbin/init -> ../lib/systemd/systemd
[root@docker ~]# 

然後按照容器的ID進去,這個時候再根據/bin/bash進入容器(前面加exec -it參數),接著重啟ssh服務就ok了
[root@docker ~]# docker exec -it sshd /bin/bash
[root@884db829911f /]# yum install wget vim net-tools ntpdate openssh-server -y
[root@884db829911f /]# systemctl restart sshd.service
[root@884db829911f /]# echo "123456" |passwd --stdin root

查看ssh端口,發現22端口已經開啟
[root@884db829911f /]# netstat -tnlp|grep sshd
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      220/sshd            
tcp6       0      0 :::22                   :::*                    LISTEN      220/sshd            
[root@884db829911f /]#


然後docker ps查看下容器,提交更改為新鏡像,運行新的鏡像

[root@docker ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
884db829911f        centos              "/sbin/init"        6 minutes ago       Up 6 minutes                            sshd
關閉容器
[root@docker ~]# docker stop sshd
sshd
接著提交改為新的鏡像,提交名為wangssh的鏡像(提交成功後,之前創建的容器可以選擇刪除(docker ps -a 查看);當然不刪除也不影響。建議不要刪除,可以再次啟用提交新的鏡像以便他用。)
[root@docker ~]# docker commit sshd centos7.4-ssh
sha256:e990237344dcb59c45b68fd91e952af6419415d78d0c2ac86fba68c22ff00d6

提交成功後,使用docker images可以查看到
[root@docker ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos7.4-ssh       latest              e990237344dc        31 seconds ago      363MB
centos              latest              ff426288ea90        3 weeks ago         207MB

然後運行新的鏡像

[root@docker ~]# docker run -d -p 2022:22 centos7.4-ssh /usr/sbin/sshd -D         
7a5441309940af66119989aac03ef79fddd8d145c10fc19a7ec937802b86df29
[root@docker ~]#
上面運行命令中的參數解釋:
-d   後臺運行容器
-p   容器端口映射到主機[可選]

使用docker ps查看運行的容器
[root@docker ~]# docker ps
CONTAINER ID        IMAGE               COMMAND               CREATED             STATUS              PORTS                  NAMES
7a5441309940        centos7.4-ssh       "/usr/sbin/sshd -D"   28 seconds ago      Up 26 seconds       0.0.0.0:2022->22/tcp   laughing_yonath

此時你可以直接連接容器,也可以通過端口映射連接容器(使用之前創建的容器密碼123456登陸)
[root@docker ~]# ssh -p2022 root@localhost 
The authenticity of host '[localhost]:2022 ([::1]:2022)' can't be established.
ECDSA key fingerprint is b1:37:95:96:11:1c:60:fd:8c:e2:e7:b3:3a:68:b6:85.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[localhost]:2022' (ECDSA) to the list of known hosts.
root@localhost's password: 
[root@7a5441309940 ~]#


如果要想做ssh無密碼登陸的信任關系,只需要將物理機本地的~/.ssh/id_rsa.pub拷貝到容器裏的~/.ssh/authorized_keys即可

接著上面ID為7a5441309940的容器登陸後的操作:
[root@docker ~]# ssh-keygen -t rsa
[root@docker ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub IP地址

將物理機本地的~/.ssh/id_rsa.pub拷貝到容器裏
[root@docker ~]# docker cp ~/.ssh/id_rsa.pub 7a5441309940:/root/.ssh/

然後到容器裏將id_rsa.pub拷貝為authorized_keys
[root@docker ~]# docker exec -it 7a5441309940 /bin/bash
[root@7a5441309940 /]# cd ~/.ssh/
[root@7a5441309940 .ssh]# cp id_rsa.pub authorized_keys

接著提交為新鏡像
[root@docker ~]# docker ps
CONTAINER ID        IMAGE               COMMAND               CREATED             STATUS              PORTS                  NAMES
7a5441309940        centos7.4-ssh       "/usr/sbin/sshd -D"   40 minutes ago      Up 40 minutes       0.0.0.0:2022->22/tcp   laughing_yonath
[root@docker ~]# 
[root@docker ~]# docker stop 7a5441309940
7a5441309940
[root@docker ~]# docker commit 7a5441309940 centos7.4-ssh:v1
sha256:80da77f10ad4337dc6f41e84b65d6b2f74370c974bacb819f5c127276075282e
[root@docker ~]# docker run -d -p 2022:22 centos7.4-ssh:v1 /usr/sbin/sshd -D           
40501782a73f27eac93fe5f2d3ceac3ff83650c5f3a1cead02d7af6898686cb7

最後嘗試ssh方式連接容器,發現可以無密碼登陸了~
[root@docker ~]# ssh -p2022 root@localhost
Last login: Wed Jan 31 09:13:33 2018 from gateway
[root@40501782a73f ~]#


當登錄到容器後,如何可以查看下容器ip

第一種方式:
[root@docker ~]# docker ps
CONTAINER ID        IMAGE               COMMAND               CREATED             STATUS              PORTS                  NAMES
40501782a73f        centos7.4-ssh:v1    "/usr/sbin/sshd -D"   3 minutes ago       Up 3 minutes        0.0.0.0:2022->22/tcp   vigorous_borg
[root@docker ~]# docker inspect 40501782a73f |grep IPAddress            
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.2",
                    "IPAddress": "172.17.0.2",
[root@docker ~]# 

第二種方式:
[root@docker ~]# docker inspect --format='{{.NetworkSettings.IPAddress}}' 40501782a73f
172.17.0.2

第三種方式:
登陸到容器裏使用“yum install net-tools”,安裝後就可以使用ifconfig命令查看ip了 
 
當知道了容器的ip後,就可以使用ssh直接連接容器的22端口即可!
[root@docker ~]# ssh 172.17.0.2
Last login: Wed Jan 31 09:21:45 2018 from gateway
[root@40501782a73f ~]#


Docker容器學習梳理--SSH方式登陸容器