天天看點

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

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

<code>啟動一個centos容器,然後安裝基本的軟體</code>

<code>[root@docker ~]</code><code># docker run -itd --name sshd centos /bin/bash      </code>

<code>a67a5c8ae426a841ad6c6aca6186f7fc585410471a6dfe69a1fc0e28d5a05953</code>

<code>[root@docker ~]</code><code># docker exec -it sshd /bin/bash</code>

<code>[root@a67a5c8ae426 /]</code><code># wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo</code>

<code>[root@a67a5c8ae426 /]</code><code># yum install wget vim ntpdate net-tools -y</code>

<code>安裝</code><code>ssh</code><code>服務端</code>

<code>[root@a67a5c8ae426 /]</code><code># yum clean all</code>

<code>[root@a67a5c8ae426 /]</code><code># yum install openssh-server -y</code>

<code>修改容器密碼(提前yum -y reinstall cracklib-dicts)</code>

<code>[root@a67a5c8ae426 /]</code><code># echo "123456" |passwd --stdin root</code>

<code>産生公私鑰</code>

<code>[root@a67a5c8ae426 /]</code><code># ssh-keygen -t rsa</code>

<code>Generating public</code><code>/private</code> <code>rsa key pair.</code>

<code>Enter </code><code>file</code> <code>in</code> <code>which</code> <code>to save the key (</code><code>/root/</code><code>.</code><code>ssh</code><code>/id_rsa</code><code>): </code>

<code>Created directory </code><code>'/root/.ssh'</code><code>.</code>

<code>Enter passphrase (empty </code><code>for</code> <code>no passphrase): </code>

<code>Enter same passphrase again: </code>

<code>Your identification has been saved </code><code>in</code> <code>/root/</code><code>.</code><code>ssh</code><code>/id_rsa</code><code>.</code>

<code>Your public key has been saved </code><code>in</code> <code>/root/</code><code>.</code><code>ssh</code><code>/id_rsa</code><code>.pub.</code>

<code>The key fingerprint is:</code>

<code>SHA256:tJ01c3RqkgtNijf6D9q6SXZJ9ZFQUvpbrnkCmW55T9Y root@a67a5c8ae426</code>

<code>The key's randomart image is:</code>

<code>+---[RSA 2048]----+</code>

<code>|            +o+ .|</code>

<code>|         . + * + |</code>

<code>|        o = X *  |</code>

<code>|       . = * X . |</code>

<code>|        S + .oo .|</code>

<code>|         o .+  +.|</code>

<code>|        o =. o. E|</code>

<code>|       o = o+ o=.|</code>

<code>|        =o....o+.|</code>

<code>+----[SHA256]-----+</code>

<code>[root@a67a5c8ae426 /]</code><code># cd ~/.ssh/</code>

<code>[root@a67a5c8ae426 .</code><code>ssh</code><code>]</code><code># ls</code>

<code>id_rsa  id_rsa.pub</code>

<code>[root@a67a5c8ae426 .</code><code>ssh</code><code>]</code><code># cp id_rsa.pub authorized_keys</code>

<code>authorized_keys  id_rsa  id_rsa.pub</code>

<code>[root@a67a5c8ae426 .</code><code>ssh</code><code>]</code><code># </code>

<code>執行sshd指令,有報錯:</code>

<code>[root@a67a5c8ae426 .</code><code>ssh</code><code>]</code><code># /usr/sbin/sshd</code>

<code>Could not load host key: </code><code>/etc/ssh/ssh_host_rsa_key</code>

<code>Could not load host key: </code><code>/etc/ssh/ssh_host_ecdsa_key</code>

<code>Could not load host key: </code><code>/etc/ssh/ssh_host_ed25519_key</code>

<code>sshd: no hostkeys available -- exiting.</code>

<code>解決辦法:</code>

<code>[root@a67a5c8ae426 .</code><code>ssh</code><code>]</code><code># ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key   //均是一路回車</code>

<code>[root@a67a5c8ae426 .</code><code>ssh</code><code>]</code><code># ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key</code>

<code>[root@a67a5c8ae426 .</code><code>ssh</code><code>]</code><code># ssh-keygen -t rsa -f /etc/ssh/ssh_host_ecdsa_key</code>

<code>[root@a67a5c8ae426 .</code><code>ssh</code><code>]</code><code># ssh-keygen -t rsa -f /etc/ssh/ssh_host_ed25519_key</code>

<code>再次執行sshd指令,如果沒有報錯,說明可以啟動了</code>

<code>[root@a67a5c8ae426 .</code><code>ssh</code><code>]</code><code># netstat -tnlp</code>

<code>Active Internet connections (only servers)</code>

<code>Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID</code><code>/Program</code> <code>name    </code>

<code>tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      160</code><code>/sshd</code>            

<code>tcp6       0      0 :::22                   :::*                    LISTEN      160</code><code>/sshd</code>            

<code>-----------------------啟動</code><code>ssh</code><code>,如果報錯如下(這是centos7下的一個bug)-------------------------</code>

<code>[root@a67a5c8ae426 .</code><code>ssh</code><code>]</code><code># systemctl status sshd</code>

<code>Failed to get D-Bus connection: Operation not permitted</code>

<code>解決辦法如下:</code>

<code>先把上面的容器關閉(docker stop container-</code><code>id</code><code>),然後重新啟動容器,啟動時加上參數--privileged(特權參數,也可以是--privileged=</code><code>true</code><code>,如果啟動容器中挂載目錄沒有權限也可以添加此參數)和</code><code>/sbin/init</code><code>(代替</code><code>/bin/bash</code><code>),如下:</code>

<code>[root@docker ~]</code><code># docker run -itd --privileged --name sshd centos /sbin/init </code>

<code>[root@docker ~]</code><code># docker ps</code>

<code>CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES</code>

<code>884db829911f        centos              </code><code>"/sbin/init"</code>        <code>33 seconds ago      Up 31 seconds                           sshd</code>

<code>[root@docker ~]</code><code># </code>

<code>其實指令</code><code>/sbin/init</code><code>和</code><code>/usr/sbin/init</code><code>運作容器都可以。</code>

<code>[root@docker ~]</code><code># ll -ld /sbin/init </code>

<code>lrwxrwxrwx 1 root root 22 Jan 30 17:17 </code><code>/sbin/init</code> <code>-&gt; ..</code><code>/lib/systemd/systemd</code>

<code>[root@docker ~]</code><code># ll -ld /usr/sbin/init </code>

<code>lrwxrwxrwx 1 root root 22 Jan 30 17:17 </code><code>/usr/sbin/init</code> <code>-&gt; ..</code><code>/lib/systemd/systemd</code>

<code>然後按照容器的ID進去,這個時候再根據</code><code>/bin/bash</code><code>進入容器(前面加</code><code>exec</code> <code>-it參數),接着重新開機</code><code>ssh</code><code>服務就ok了</code>

<code>[root@884db829911f /]</code><code># yum install wget vim net-tools ntpdate openssh-server -y</code>

<code>[root@884db829911f /]</code><code># systemctl restart sshd.service</code>

<code>[root@884db829911f /]</code><code># echo "123456" |passwd --stdin root</code>

<code>檢視</code><code>ssh</code><code>端口,發現22端口已經開啟</code>

<code>[root@884db829911f /]</code><code># netstat -tnlp|grep sshd</code>

<code>tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      220</code><code>/sshd</code>            

<code>tcp6       0      0 :::22                   :::*                    LISTEN      220</code><code>/sshd</code>            

<code>[root@884db829911f /]</code><code>#</code>

然後docker ps檢視下容器,送出更改為新鏡像,運作新的鏡像

<code>884db829911f        centos              </code><code>"/sbin/init"</code>        <code>6 minutes ago       Up 6 minutes                            sshd</code>

<code>關閉容器</code>

<code>[root@docker ~]</code><code># docker stop sshd</code>

<code>sshd</code>

<code>接着送出改為新的鏡像,送出名為wangssh的鏡像(送出成功後,之前建立的容器可以選擇删除(docker </code><code>ps</code> <code>-a 檢視);當然不删除也不影響。建議不要删除,可以再次啟用送出新的鏡像以便他用。)</code>

<code>[root@docker ~]</code><code># docker commit sshd centos7.4-ssh</code>

<code>sha256:e990237344dcb59c45b68fd91e952af6419415d78d0c2ac86fba68c22ff00d6</code>

<code>送出成功後,使用docker images可以檢視到</code>

<code>[root@docker ~]</code><code># docker images</code>

<code>REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE</code>

<code>centos7.4-</code><code>ssh</code>       <code>latest              e990237344dc        31 seconds ago      363MB</code>

<code>centos              latest              ff426288ea90        3 weeks ago         207MB</code>

<code>然後運作新的鏡像</code>

<code>[root@docker ~]</code><code># docker run -d -p 2022:22 centos7.4-ssh /usr/sbin/sshd -D         </code>

<code>7a5441309940af66119989aac03ef79fddd8d145c10fc19a7ec937802b86df29</code>

<code>[root@docker ~]</code><code>#</code>

<code>上面運作指令中的參數解釋:</code>

<code>-d   背景運作容器</code>

<code>-p   容器端口映射到主機[可選]</code>

<code>使用docker </code><code>ps</code><code>檢視運作的容器</code>

<code>CONTAINER ID        IMAGE               COMMAND               CREATED             STATUS              PORTS                  NAMES</code>

<code>7a5441309940        centos7.4-</code><code>ssh</code>       <code>"/usr/sbin/sshd -D"</code>   <code>28 seconds ago      Up 26 seconds       0.0.0.0:2022-&gt;22</code><code>/tcp</code>   <code>laughing_yonath</code>

<code>此時你可以直接連接配接容器,也可以通過端口映射連接配接容器(使用之前建立的容器密碼123456登陸)</code>

<code>[root@docker ~]</code><code># ssh -p2022 root@localhost </code>

<code>The authenticity of host </code><code>'[localhost]:2022 ([::1]:2022)'</code> <code>can't be established.</code>

<code>ECDSA key fingerprint is b1:37:95:96:11:1c:60:fd:8c:e2:e7:b3:3a:68:b6:85.</code>

<code>Are you sure you want to </code><code>continue</code> <code>connecting (</code><code>yes</code><code>/no</code><code>)? </code><code>yes</code>

<code>Warning: Permanently added </code><code>'[localhost]:2022'</code> <code>(ECDSA) to the list of known hosts.</code>

<code>root@localhost's password: </code>

<code>[root@7a5441309940 ~]</code><code>#</code>

如果要想做ssh無密碼登陸的信任關系,隻需要将實體機本地的~/.ssh/id_rsa.pub拷貝到容器裡的~/.ssh/authorized_keys即可

<code>接着上面ID為7a5441309940的容器登陸後的操作:</code>

<code>[root@docker ~]</code><code># ssh-keygen -t rsa</code>

<code>[root@docker ~]</code><code># ssh-copy-id -i /root/.ssh/id_rsa.pub IP位址</code>

<code>将實體機本地的~/.</code><code>ssh</code><code>/id_rsa</code><code>.pub拷貝到容器裡</code>

<code>[root@docker ~]</code><code># docker cp ~/.ssh/id_rsa.pub 7a5441309940:/root/.ssh/</code>

<code>然後到容器裡将id_rsa.pub拷貝為authorized_keys</code>

<code>[root@docker ~]</code><code># docker exec -it 7a5441309940 /bin/bash</code>

<code>[root@7a5441309940 /]</code><code># cd ~/.ssh/</code>

<code>[root@7a5441309940 .</code><code>ssh</code><code>]</code><code># cp id_rsa.pub authorized_keys</code>

<code>接着送出為新鏡像</code>

<code>7a5441309940        centos7.4-</code><code>ssh</code>       <code>"/usr/sbin/sshd -D"</code>   <code>40 minutes ago      Up 40 minutes       0.0.0.0:2022-&gt;22</code><code>/tcp</code>   <code>laughing_yonath</code>

<code>[root@docker ~]</code><code># docker stop 7a5441309940</code>

<code>7a5441309940</code>

<code>[root@docker ~]</code><code># docker commit 7a5441309940 centos7.4-ssh:v1</code>

<code>sha256:80da77f10ad4337dc6f41e84b65d6b2f74370c974bacb819f5c127276075282e</code>

<code>[root@docker ~]</code><code># docker run -d -p 2022:22 centos7.4-ssh:v1 /usr/sbin/sshd -D           </code>

<code>40501782a73f27eac93fe5f2d3ceac3ff83650c5f3a1cead02d7af6898686cb7</code>

<code>最後嘗試</code><code>ssh</code><code>方式連接配接容器,發現可以無密碼登陸了~</code>

<code>[root@docker ~]</code><code># ssh -p2022 root@localhost</code>

<code>Last login: Wed Jan 31 09:13:33 2018 from gateway</code>

<code>[root@40501782a73f ~]</code><code>#</code>

當登入到容器後,如何可以檢視下容器ip

<code>第一種方式:</code>

<code>40501782a73f        centos7.4-</code><code>ssh</code><code>:v1    </code><code>"/usr/sbin/sshd -D"</code>   <code>3 minutes ago       Up 3 minutes        0.0.0.0:2022-&gt;22</code><code>/tcp</code>   <code>vigorous_borg</code>

<code>[root@docker ~]</code><code># docker inspect 40501782a73f |grep IPAddress            </code>

<code>            </code><code>"SecondaryIPAddresses"</code><code>: null,</code>

<code>            </code><code>"IPAddress"</code><code>: </code><code>"172.17.0.2"</code><code>,</code>

<code>                    </code><code>"IPAddress"</code><code>: </code><code>"172.17.0.2"</code><code>,</code>

<code>第二種方式:</code>

<code>[root@docker ~]</code><code># docker inspect --format='{{.NetworkSettings.IPAddress}}' 40501782a73f</code>

<code>172.17.0.2</code>

<code>第三種方式:</code>

<code>登陸到容器裡使用“yum </code><code>install</code> <code>net-tools”,安裝後就可以使用</code><code>ifconfig</code><code>指令檢視ip了 </code>

<code> </code> 

<code>當知道了容器的ip後,就可以使用</code><code>ssh</code><code>直接連接配接容器的22端口即可!</code>

<code>[root@docker ~]</code><code># ssh 172.17.0.2</code>

<code>Last login: Wed Jan 31 09:21:45 2018 from gateway</code>

本文轉自 dengaosky 51CTO部落格,原文連結:http://blog.51cto.com/dengaosky/2067424,如需轉載請自行聯系原作者