docker容器里安装ssh

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介:

docker安装ssh

通过命令行安装

1.pull ubuntu镜像
docker pull ubuntu:latest

2.启动并进入bash
docker run -it -d ubuntu:lastest /bin/bash

# 查看刚刚运行容器的id
docker ps

# 在容器中执行bash命令
docker exec -it id /bin/bash


3.安装openssh-server并启动

apt-get update
apt-get install openssh-server
# 启动之前需手动创建/var/run/sshd,不然启动sshd的时候会报错

mkdir -p /var/run/sshd

# sshd以守护进程运行

/usr/sbin/sshd -D &

# 安装netstat,查看sshd是否监听22端口

apt-get install net-tools
netstat -apn | grep ssh

如果已经监听22端口,说明sshd服务启动成功


4.ssh登陆

# 生成ssh key

ssh-keygen -t rsa

# 修改sshd-config允许root登陆

sed -i 's+PermitRootLogin prohibit-password+PermitRootLogin yes' /etc/ssh/sshd-config

修改完sshd-config之后需要重启sshd服务

// 找到pid

ps -aux | grep ssh
kill -9 pid
/usr/sbin/sshd -D &

查看容器ip

ifconfig

在主机上进行登陆
ssh root@ip
就可以登录成功了,但是注意这里是docker容器的宿主机才能登陆成功,如果需要其他机器登陆,可以在启动docker的时候进行端口映射

// 11122宿主机端口,22为容器端口

docker run -it -p 11122:22 

// 在其他机器上可以使用以下命令登陆,假设宿主机ip为192.168.1.101

ssh -p 11122 root@192.168.1.101

5.保存容器

// 把id为id的容器保存

docker commit id sshd:ubuntu

// 停止容器

docker stop id

通过dockerfile
# 以最新的Ubuntu镜像为模板

FROM ubuntu:latest


// 将本目录下的sources.list作为容器的一个文件

ADD sources.list /root/sources.list

// 使用阿里Ubuntu源,更新快

RUN cp /root/sources.list /etc/apt/sources.list.d/aliyun.list


RUN apt-get update
RUN apt-get install -y openssh-server
RUN apt-get install -y net-tools
RUN apt-get install -y vim
RUN mkdir -p /var/run/sshd
RUN mkdir -p mkdir/root/.ssh/

// 修改root密码,便于远程登录

RUN echo root:123456 | chpasswd

// 将key生成在指定文件内
RUN ssh-keygen -q -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key -P '' -N ''

// 配置ssh可以使用root登陆
RUN sed -i 's/PermitRootLogin without-password/PermitRootLogin yes/' /etc/ssh/sshd_config

// 开放22端口
EXPOSE 22

CMD /usr/sbin/sshd -D &
根据Dockerfile build镜像
docker build -t nginx:ubuntu .   






[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos7             7.3.1611            d5ebea14da54        2 weeks ago         311 MB
<none>              <none>              d5c154b612c8        2 weeks ago         311 MB
test                latest              ecefde07358f        11 weeks ago        599.6 MB
learn/ping          latest              fea07d84b0df        4 months ago        196.7 MB
docker.io/tomcat    latest              ebb17717bed4        4 months ago        355.4 MB
docker.io/centos    latest              980e0e4c79ec        6 months ago        196.7 MB
nginx               1.9                 c8c29d842c09        9 months ago        182.7 MB
docker.io/redis     2.8.19              dd9fe7db5236        22 months ago       110.7 MB
  
[root@localhost ~]# docker run -i -t   centos7:7.3.1611 /bin/bash
  
[root@a3c8baf6961e /]# cat /etc/redhat-release

CentOS Linux release 7.3.1611 (Core)
  
[root@a3c8baf6961e /]# yum install wget vim

[root@a3c8baf6961e /]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
  
安装ssh服务端
[root@a3c8baf6961e /]# yum cleal all

[root@a3c8baf6961e /]# yum install passwd

[root@a3c8baf6961e /]# yum install openssh-server

  
修改容器密码(提前yum -y reinstall cracklib-dicts

[root@a3c8baf6961e /]# echo "123456" |passwd --stdin root
  
产生公私钥
[root@a3c8baf6961e /]# ssh-keygen -t rsa     //一路回车
[root@a3c8baf6961e /]# cd ~/.ssh/
[root@a3c8baf6961e .ssh]# ls
id_rsa  id_rsa.pub
[root@a3c8baf6961e .ssh]# cp id_rsa.pub  authorized_keys
[root@a3c8baf6961e .ssh]# ls
authorized_keys  id_rsa  id_rsa.pub
  
执行sshd命令,有报错:

[root@a3c8baf6961e .ssh]# /usr/sbin/sshd

Could not load host key: /etc/ssh/ssh_host_rsa_key
Could not load host key: /etc/ssh/ssh_host_dsa_key
Could not load host key: /etc/ssh/ssh_host_ecdsa_key
Could not load host key: /etc/ssh/ssh_host_ed25519_key
  
解决办法:
[root@a3c8baf6961e .ssh]# ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key     //均是一路回车
[root@a3c8baf6961e .ssh]# ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
[root@a3c8baf6961e .ssh]# ssh-keygen -t rsa -f /etc/ssh/ssh_host_ecdsa_key
[root@a3c8baf6961e .ssh]# ssh-keygen -t rsa -f /etc/ssh/ssh_host_ed25519_key
  
再次执行sshd命令,如果没有报错,说明可以启动了
[root@a3c8baf6961e .ssh]# /usr/sbin/sshd
[root@a3c8baf6961e .ssh]#
 
-----------------------启动ssh,如果报错如下(这是centos7下的一个bug)-------------------------

[root@a3c8baf6961e .ssh]# systemctl restart sshd.service

Failed to get D-Bus connection: Operation not permitted

这个报错在之前的文档里就已经提到过了

解决办法如下:
先把上面的容器关闭(docker stop container-id),然后重新启动容器,启动时加上参数--privileged(特权参数,也可以是--privileged=true,如果启动容器中挂载目录没有权限也可以添加此参数)和/sbin/init(代替/bin/bash),如下:

[root@localhost ~]#  docker run --privileged -i -t centos7:7.3.1611 /sbin/init   
   
上面的容器启动后,会一直在卡着的状态中,先不用管,打开另一个终端窗口,查看容器

[root@localhost ~]# docker ps

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
af40bd07fa0f        centos7:7.3.1611    "/sbin/init"        28 seconds ago      Up 28 seconds                                 nauseous_shirley
 
然后按照容器的ID进去,这个时候再根据/bin/bash进入容器(前面加exec -it参数),接着重启ssh服务就ok了

[root@localhost ~]# docker exec -it af40bd07fa0f /bin/bash

[root@af40bd07fa0f /]# systemctl restart sshd.service

[root@af40bd07fa0f /]# echo "123456" |passwd --stdin root    
//注意这里由于上述特殊情况重新启动了容器,之前创建的root密码无效了(这就相当于重新另起了一个容器),需要重新修改下root密码!!可以随便创建个用户,然后切换到root,测试下之前创建的root密码是否还有效!
--------------------------------------------------------------------------------------------------
查看ssh端口,发现22端口已经开启

[root@af40bd07fa0f /]# ss -a|grep ssh
tcp    LISTEN     0      128     *:ssh                   *:*                   
tcp    LISTEN     0      128    :::ssh                  :::*                   
[root@af40bd07fa0f /]# ss -ln|grep 22
u_dgr  UNCONN     0      0         * 26884224              * 26885412          
tcp    LISTEN     0      128       *:22                    *:*                 
tcp    LISTEN     0      128      :::22                   :::* 


然后docker ps查看下容器,提交更改为新镜像,运行新的镜像 

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
af40bd07fa0f        centos7:7.3.1611    "/sbin/init"        21 minutes ago      Up 21 minutes                                 nauseous_shirley
 
记住这个容器ID,然后关闭

[root@localhost ~]# docker stop af40bd07fa0f
af40bd07fa0f
接着提交改为新的镜像,使用上一步的容器ID,提交名为wangssh的镜像(提交成功后,之前创建的容器可以选择删除(docker ps -a 查看);当然不删除也不影响。
建议不要删除,可以再次启用提交新的镜像以便他用。)

[root@localhost ~]# docker commit af40bd07fa0f wangssh

sha256:ca5e393b7605949e58c1067c1bc73d99d52f47107756f0ade1725ca04886fd71
[root@localhost ~]#
 
提交成功后,使用docker images可以查看到

[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
wangssh             latest              ca5e393b7605        57 seconds ago      327.1 MB
centos7             7.3.1611            d5ebea14da54        2 weeks ago         311 MB
 
然后运行新的镜像
[root@localhost ~]# docker run -d -p 220:22 wangssh /usr/sbin/sshd -D

b0a845a3dedeac7b46002d1c8514077309d88dcc0667b7080bc1ab67d70eb167
docker: Error response from daemon: Cannot start container b0a845a3dedeac7b46002d1c8514077309d88dcc0667b7080bc1ab67d70eb167: [9] System error: SELinux policy denies access..
如上出现上面的报错,这是由于selinux造成的!需要关闭selinux,如下:

[root@localhost ~]# setenforce 0

[root@localhost ~]# getenforce
Permissive
 
然后再次运行新的镜像,就成功了!

[root@localhost ~]# docker run -d -p 220:22 wangssh /usr/sbin/sshd -D

0a7c1406361ef52dcc5c32801e4c7c231078594cd7010375ea33fe3024cc9126

[root@localhost ~]#
上面运行命令中的参数解释:
-d   后台运行容器
-p   容器端口映射到主机[可选]
 
使用docker ps查看运行的容器

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND               CREATED              STATUS              PORTS                     NAMES
0a7c1406361e        wangssh             "/usr/sbin/sshd -D"   About a minute ago   Up About a minute   0.0.0.0:220->22/tcp       focused_hawking
 
此时你可以直接连接容器,也可以通过端口映射连接容器(使用之前创建的容器密码123456登陆)

[root@localhost ~]# ssh -p220 root@localhost

root@localhost's password:

[root@0a7c1406361e ~]#
------------------------------------------------------------------------------------------------------------------
如果要想做ssh无密码登陆的信任关系,只需要将物理机本地的~/.ssh/id_rsa.pub拷贝到容器里的~/.ssh/authorized_keys即可

接着上面ID为aea267757cc9的容器登陆后的操作:

[root@localhost ~]# docker exec -it aea267757cc9 /bin/bash

[root@aea267757cc9 /]# ssh-keygen -t rsa    //一路回车
 
将物理机本地的~/.ssh/id_rsa.pub拷贝到容器里

[root@localhost ~]# docker cp ~/.ssh/id_rsa.pub aea267757cc9:/root/.ssh/
 
然后到容器里将id_rsa.pub拷贝为authorized_keys

[root@aea267757cc9 /]# cd ~
[root@aea267757cc9 ~]# cd .ssh/
[root@aea267757cc9 .ssh]# cp id_rsa.pub authorized_keys
 
接着提交为新镜像
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
aea267757cc9        centos7:7.3.1611    "/sbin/init"        About an hour ago   Up 38 minutes                                 admiring_hodgkin
fc726a6a27d2        centos              "/bin/bash"         3 months ago        Up 3 months         0.0.0.0:32772->80/tcp     web1
9d99c7b9451b        centos              "/bin/bash"         3 months ago        Up 3 months         0.0.0.0:32769->8080/tcp   web3
[root@localhost ~]# docker stop aea267757cc9
aea267757cc9

[root@localhost ~]# docker commit aea267757cc9 hahassh

sha256:906bf1bd2a156b1222def7d3d21fbc2cd7e963fc923f5a6da92e6b45954688d9
[root@localhost ~]# setenforce 0

[root@localhost ~]# docker run -d -p 220:22 hahassh /usr/sbin/sshd -D
8b9c153463c73122cfd787a27190a8665f54fe77fa51601d521baab5a9234f2e
 
最后尝试ssh方式连接容器,发现可以无密码登陆了~

[root@localhost ~]# ssh -p220 root@localhost

Last login: Mon Mar 13 10:03:54 2017
---------------------------------------------------------------------------------------------------------------------
当登陆到容器后,可以查看下容器ip

第一种方式:

[root@localhost ~]# docker ps

CONTAINER ID        IMAGE               COMMAND               CREATED             STATUS              PORTS                     NAMES
b220fabf815a        wangssh             "/usr/sbin/sshd -D"   6 hours ago         Up About an hour    0.0.0.0:20020->22/tcp     gigantic_goldwasser
fc726a6a27d2        980e0e4c79ec        "/bin/bash"           3 months ago        Up About an hour    0.0.0.0:32768->80/tcp     web1
9d99c7b9451b        980e0e4c79ec        "/bin/bash"           3 months ago        Up About an hour    0.0.0.0:32769->8080/tcp   web3

[root@localhost ~]# docker inspect b220fabf815a |grep IPAddress

            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.2",
                    "IPAddress": "172.17.0.2",
 
第二种方式:
[root@localhost ~]# docker inspect --format='``.`NetworkSettings`.`IPAddress`' b220fabf815a
172.17.0.2
 
第三种方式:

登陆到容器里使用“yum install net-tools”,安装后就可以使用ifconfig命令查看ip了 
 
当知道了容器的ip后,就可以使用ssh直接连接容器的22端口即可!
[root@localhost ~]# ssh 172.17.0.2

root@172.17.0.2's password:
Last login: Tue Mar 14 09:11:27 2017 from 172.17.0.1

[root@b220fabf815a ~]#


一. 从docker hub 下载centos 官方镜像
hr:centos7 hr$ docker pull centos:7 


下载完后,查看本地资源库:
hr:centos7 hr$ docker images
REPOSITORY      TAG         IMAGE ID      CREATED       VIRTUAL SIZE
  centos        7          ce20c473cd8a    7 weeks ago     172.3 MB


运行容器
hr:centos7 hr$ docker run -i -t centos:7 /bin/bash 


二. 安装passwd,openssl,openssh-server

[root@b5926410fe60 /]# yum install passwd openssl openssh-server -y


启动sshd:

# /usr/sbin/sshd -D

这时报以下错误:

[root@ b5926410fe60 /]# /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 




执行以下命令解决:

[root@b5926410fe60 /]# ssh-keygen -q -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key -N ''  
[root@b5926410fe60 /]# ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N ''
[root@b5926410fe60 /]# ssh-keygen -t dsa -f /etc/ssh/ssh_host_ed25519_key -N '' 


然后,修改 /etc/ssh/sshd_config 配置信息:

UsePAM yes 改为 UsePAM no 

UsePrivilegeSeparation sandbox 改为 UsePrivilegeSeparation no


[root@b5926410fe60 /]# sed -i "s/#UsePrivilegeSeparation.*/UsePrivilegeSeparation no/g" /etc/ssh/sshd_config

[root@b5926410fe60 /]# sed -i "s/UsePAM.*/UsePAM no/g" /etc/ssh/sshd_config


修改完后,重新启动sshd

[root@b5926410fe60 /]# /usr/sbin/sshd -D  


三. 修改root 密码
 [root@b5926410fe60 /]# passwd root

四. 查看容器ip地址(如果宿主机是linux操作系统则跳过这一步)

[root@b5926410fe60 /]# ip addr ls eth0

84: eth0@if85: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP 
  link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
  inet 172.17.0.2/16 scope global eth0
    valid_lft forever preferred_lft forever
  inet6 fe80::42:acff:fe11:2/64 scope link 
    valid_lft forever preferred_lft forever

五. 将当前容器保存为镜像

hr:centos7 hr$ docker ps -all

CONTAINER ID IMAGE    COMMAND    CREATED       STATUS          PORTS   NAMES
b5926410fe60 centos:7  "/bin/bash" 4 minutes ago    Exited (0) 4 seconds ago      centos7ssh


hr:centos7 hr$ docker commit b5926410fe60 herong/centos7-ssh


六. 在宿主机上基于新创建的镜像启动新的容器

--先删除之前的容器

hr:centos7 hr$ docker ps -all

CONTAINER ID    IMAGE   COMMAND       CREATED       STATUS           PORTS        NAMES
4122f818a741    herong/centos7-ssh:latest  "/usr/sbin/sshd"  13 seconds ago   Exited (0) 13 seconds ago            happy_mclean


hr:centos7 hr$ docker rm -f 4122f818a741




--基于新镜像运行容器

hr:centos7 hr$ docker run -d -p 10022:22 herong/centos7-ssh:latest /usr/sbin/sshd -D


--查看映射端口是否成功

hr:centos7 hr$ docker ps -all

CONTAINER ID    IMAGE   COMMAND        CREATED       STATUS       PORTS          NAMES
4966d35fe0a3    herong/centos7-ssh:latest  "/usr/sbin/sshd -D"  3 seconds ago    Up 3 seconds    0.0.0.0:10022->22/tcp  compassionate_kowalevski


hr:centos7 hr$ docker port 4966d35fe0a3

22/tcp -> 0.0.0.0:10022


七. 从宿主机连接到容器

  w 如果宿主机是非linux操作系统,则需要通过docker-machine ip连到容器

  -- 查看docker-machine Ip地址

  hr:centos7 hr$ docker-machine ip default
  192.168.99.100


  --通过docker-machine ip 连接到容器,输入之前设置的密码即可登录成功

  hr:centos7 hr$ ssh root@192.168.99.100 -p 10022

  The authenticity of host '[192.168.99.100]:10022 ([192.168.99.100]:10022)' can't be established.
  ECDSA key fingerprint is SHA256:d3JNckcTVv1ASJlwv+IT/bJwlzMC4U1T/PmsKYIHMhQ.
  Are you sure you want to continue connecting (yes/no)? yes
  Warning: Permanently added '[192.168.99.100]:10022' (ECDSA) to the list of known hosts.
  root@192.168.99.100's password: 

  [root@4966d35fe0a3 ~]# pwd
  /root


  w 如果宿主机是linux操作系统,则通过第4步查看到的ip地址连接

  hr:centos7 hr$ ssh root@172.17.0.2 -p 10022



vi /etc/ssh/sshd_config


RSAAuthentication yes #启用 RSA 认证

PubkeyAuthentication yes #启用公钥私钥配对认证方式

AuthorizedKeysFile .ssh/authorized_keys #公钥文件路径(和上面生成的文件同)

PermitRootLogin yes #root能使用ssh登录123456




1、启动一个docker容器
# docker run -t -i ubuntu/ruby:v1 /bin/bash




2、然后在容器里,安装openssh-server openssh-client
# apt-get install openssh-server openssh-client




3、完成之后,修改root密码
# passwd




4、退出容器,并保存以上修改
# docker commit 3ea7a99a0025 ubuntu/ruby:v2




5、停止,并删除刚才的容器


# docker stop [container-id]  


# docker rm [container-id]




查看容器id
# docker ps -a




查看镜像列表
# docker images




6、用刚保存的镜像,后台启动一个新的容器
 docker run --name [image-name] -i -t -p 50001:22 [image-id]




例: # docker run -d -p 50001:22 ubuntu/ruby:v2 /usr/sbin/sshd -D




7、ssh远程登录该容器




# ssh root@localhost -p 50001


如果想要通过ssh密钥登录,则在第2步,修改 /etc/ssh/sshd_config 文件,将RSAAuthentication 和 PubkeyAuthentication 后面的值都改成yes ,保存。




将本地.ssh下的id_rsa.pub上传到容器中的 id_rsa.pub,





 # mv /root/.ssh/id_rsa.pub/root/.ssh/authorized_keys,然后 # chmod 600 /root/.ssh/authorized_keys 即可.










本文转自 chengxuyonghu 51CTO博客,原文链接:http://blog.51cto.com/6226001001/1953310,如需转载请自行联系原作者
目录
相关文章
|
10天前
|
监控 NoSQL 时序数据库
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
141 77
|
18天前
|
监控 Docker 容器
在Docker容器中运行打包好的应用程序
在Docker容器中运行打包好的应用程序
|
3天前
|
关系型数据库 应用服务中间件 PHP
实战~如何组织一个多容器项目docker-compose
本文介绍了如何使用Docker搭建Nginx、PHP和MySQL的环境。首先启动Nginx容器并查看IP地址,接着启动Alpine容器并安装curl测试连通性。通过`--link`方式或`docker-compose`配置文件实现服务间的通信。最后展示了Nginx配置文件和PHP代码示例,验证了各服务的正常运行。
16 3
实战~如何组织一个多容器项目docker-compose
|
1天前
|
关系型数据库 MySQL 数据库
docker高级篇(大厂进阶):安装mysql主从复制
docker高级篇(大厂进阶):安装mysql主从复制
37 24
|
2天前
|
NoSQL 算法 Redis
docker高级篇(大厂进阶):安装redis集群
docker高级篇(大厂进阶):安装redis集群
49 24
|
12天前
|
数据建模 应用服务中间件 nginx
docker替换宿主与容器的映射端口和文件路径
通过正确配置 Docker 的端口和文件路径映射,可以有效地管理容器化应用程序,确保其高效运行和数据持久性。在生产环境中,动态替换映射配置有助于灵活应对各种需求变化。以上方法和步骤提供了一种可靠且易于操作的方案,帮助您轻松管理 Docker 容器的端口和路径映射。
53 3
|
19天前
|
负载均衡 网络协议 算法
Docker容器环境中服务发现与负载均衡的技术与方法,涵盖环境变量、DNS、集中式服务发现系统等方式
本文探讨了Docker容器环境中服务发现与负载均衡的技术与方法,涵盖环境变量、DNS、集中式服务发现系统等方式,以及软件负载均衡器、云服务负载均衡、容器编排工具等实现手段,强调两者结合的重要性及面临挑战的应对措施。
46 3
|
19天前
|
存储 安全 数据安全/隐私保护
Docker 容器化应用管理更加高效,但数据安全和业务连续性成为关键。
在数字化时代,Docker 容器化应用管理更加高效,但数据安全和业务连续性成为关键。本文探讨了 Docker 应用的备份与恢复策略,涵盖备份的重要性、内容、方法及常见工具,制定备份策略,恢复流程及注意事项,并通过案例分析和未来趋势展望,强调备份与恢复在保障应用安全中的重要性。
25 2
|
Ubuntu 网络安全 Docker
|
1月前
|
监控 Ubuntu Linux
使用VSCode通过SSH远程登录阿里云Linux服务器异常崩溃
通过 VSCode 的 Remote - SSH 插件远程连接阿里云 Ubuntu 22 服务器时,会因高 CPU 使用率导致连接断开。经排查发现,VSCode 连接根目录 ".." 时会频繁调用"rg"(ripgrep)进行文件搜索,导致 CPU 负载过高。解决方法是将连接目录改为"root"(或其他具体的路径),避免不必要的文件检索,从而恢复正常连接。