前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Docker使用Centos镜像安装Openssh服务

Docker使用Centos镜像安装Openssh服务

作者头像
Devops海洋的渔夫
修改2020-07-06 09:46:08
3.6K0
修改2020-07-06 09:46:08
举报
文章被收录于专栏:Devops专栏

需求

默认从docker hub中下载的Centos镜像是没有安装Openssh功能,不提供ssh服务的。

但是在某些场景下,则是需要容器内部提供ssh服务,让外部可以ssh访问进去。本次,我要解决的一个场景就是使用Pycharm通过ssh同步代码上传至容器内,进行服务调试。

当然,本章节主要还是讲如何给Centos镜像构建使用Openssh,提供SSH服务。

构建步骤

下载centos镜像

代码语言:javascript
复制
docker pull centos:7

执行如下:

代码语言:javascript
复制
[root@dev docker_ssh_centos]# docker pull centos:7
7: Pulling from library/centos
Digest: sha256:4a701376d03f6b39b8c2a8f4a8e499441b0d567f9ab9d58e4991de4472fb813c
Status: Image is up to date for centos:7
docker.io/library/centos:7
[root@dev docker_ssh_centos]#

启动centos容器

代码语言:javascript
复制
docker run -it centos:7 /bin/bash

执行如下:

代码语言:javascript
复制
# 采用 it 直接进入容器
[root@dev docker_ssh_centos]# docker run -it centos:7 /bin/bash

# 进入容器内
[root@4eb13e778da3 /]# ls
anaconda-post.log  bin  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@4eb13e778da3 /]#

安装passwd

代码语言:javascript
复制
yum install passwd -y

执行如下:

代码语言:javascript
复制
[root@dev docker_ssh_centos]# docker run -it centos:7 /bin/bash
# 在容器内安装 passwd
[root@4eb13e778da3 /]# yum install passwd -y
Loaded plugins: fastestmirror, ovl
...                                                                                                                 | 7.6 MB  00:00:04     
(4/4): base/7/x86_64/primary_db                                                                                                                        | 6.0 MB  00:00:04     
Package passwd-0.79-5.el7.x86_64 already installed and latest version
Nothing to do
# 提示已经安装了
[root@4eb13e778da3 /]#

修改Centos root密码

代码语言:javascript
复制
[root@dev docker_ssh_centos]# docker run -it centos:7 /bin/bash
# 在容器内使用 passwd 修改 root 密码
[root@4eb13e778da3 /]# passwd
Changing password for user root.
New password: 
Retype new password: 
passwd: all authentication tokens updated successfully.
[root@4eb13e778da3 /]#

这个密码自己记住就好了,不过后面尽量采用公钥来访问,禁用密码。

安装openssh

代码语言:javascript
复制
yum install openssh-server -y

执行如下:

代码语言:javascript
复制
[root@dev docker_ssh_centos]# docker run -it centos:7 /bin/bash
# 在容器内安装openssh
[root@4eb13e778da3 /]# yum install openssh-server -y
...
Installed:
  openssh-server.x86_64 0:7.4p1-21.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-21.el7          tcp_wrappers-libs.x86_64 0:7.6-77.el7         

Complete!
[root@4eb13e778da3 /]#

生成容器的公钥、私钥

如果需要容器提供的SSH服务,那么则需要生成一下公钥和私钥。具体对应的文件名,可以通过查看ssh的配置文件来确认,如下:

代码语言:javascript
复制
# 容器内进行 /etc/ssh 路径
[root@27b93fcccc51 ssh]# pwd             
/etc/ssh
[root@27b93fcccc51 ssh]# 
[root@27b93fcccc51 ssh]# ls
moduli  sshd_config
[root@27b93fcccc51 ssh]#
# 查看配置文件
[root@27b93fcccc51 ssh]# cat sshd_config 

# 启动ssh服务默认所需要的RSA key,需要我们手动生成
HostKey /etc/ssh/ssh_host_rsa_key
#HostKey /etc/ssh/ssh_host_dsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key

生成三个HostKey的命令如下:

代码语言:javascript
复制
ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
ssh-keygen -t rsa -f /etc/ssh/ssh_host_ecdsa_key
ssh-keygen -t rsa -f /etc/ssh/ssh_host_ed25519_key

执行如下:

代码语言:javascript
复制
[root@27b93fcccc51 ssh]# ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):  # 回车
Enter same passphrase again:  # 回车
Your identification has been saved in /etc/ssh/ssh_host_rsa_key.
Your public key has been saved in /etc/ssh/ssh_host_rsa_key.pub.
The key fingerprint is:
SHA256:Tx4eA0ymIH+W6uOiqdcdNAaEvpwgKlKqbd3uzlHGm+0 root@27b93fcccc51
The key's randomart image is:
+---[RSA 2048]----+
|  .oo   o        |
|  .o.. *         |
| .  ..= o        |
|o o  ++. .       |
|o= o.o .S =      |
|= +.  .o O +     |
|+. ooo..o =      |
|..=.ooo. .       |
|=+ ..+=   E      |
+----[SHA256]-----+
[root@27b93fcccc51 ssh]# 
[root@27b93fcccc51 ssh]# ls
moduli  ssh_host_rsa_key  ssh_host_rsa_key.pub  sshd_config
[root@27b93fcccc51 ssh]# 
[root@27b93fcccc51 ssh]# ssh-keygen -t rsa -f /etc/ssh/ssh_host_ecdsa_key
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): # 回车
Enter same passphrase again: # 回车
Your identification has been saved in /etc/ssh/ssh_host_ecdsa_key.
Your public key has been saved in /etc/ssh/ssh_host_ecdsa_key.pub.
The key fingerprint is:
SHA256:92VaqkgZaHelx/YvkteK4+kr0B3DAxRStfsbNtE8sf4 root@27b93fcccc51
The key's randomart image is:
+---[RSA 2048]----+
|        .o+o.    |
|         ..  .   |
|           oo  . |
|       .   +=. oo|
|      o S.+.=+=oo|
|     . ..=.+.O...|
|        o.  +.*o |
|       . ...++o=o|
|        . .+*=ooE|
+----[SHA256]-----+
[root@27b93fcccc51 ssh]# 
[root@27b93fcccc51 ssh]# ssh-keygen -t rsa -f /etc/ssh/ssh_host_ed25519_key
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): # 回车
Enter same passphrase again: # 回车
Your identification has been saved in /etc/ssh/ssh_host_ed25519_key.
Your public key has been saved in /etc/ssh/ssh_host_ed25519_key.pub.
The key fingerprint is:
SHA256:WlDnJO9RgvhQi5ojsdd2cGYmgkJi7T7pbRVDXBnFpzU root@27b93fcccc51
The key's randomart image is:
+---[RSA 2048]----+
|.o.   .o=+O..    |
|+  o  o=.O + E   |
|. + . *o* + + .  |
| . + = @.. o     |
|  + * o S .      |
|   * o =         |
|  . o o          |
|   . o           |
|    .            |
+----[SHA256]-----+
[root@27b93fcccc51 ssh]# 
# 查看生成的key文件
[root@27b93fcccc51 ssh]# ls
moduli  ssh_host_ecdsa_key  ssh_host_ecdsa_key.pub  ssh_host_ed25519_key  ssh_host_ed25519_key.pub  ssh_host_rsa_key  ssh_host_rsa_key.pub  sshd_config
[root@27b93fcccc51 ssh]#

创建允许外部访问的认证文件

代码语言:javascript
复制
# 创建认证文件
[root@4eb13e778da3 .ssh]# mkdir -p ~/.ssh
[root@4eb13e778da3 .ssh]#   > ~/.ssh/authorized_keys
[root@4eb13e778da3 .ssh]# 
[root@4eb13e778da3 .ssh]# cat authorized_keys 
[root@4eb13e778da3 .ssh]# ls
authorized_keys
[root@4eb13e778da3 .ssh]#

后续有需要访问容器的外部公钥直接加上去这个文件就可以了。

编写容器的服务启动脚本

代码语言:javascript
复制
# 在/目录下,创建一个 run.sh 的脚本
vi /run.sh

# 设置脚本内容启动 sshd 服务
#!/bin/bash
/usr/sbin/sshd -D

# 设置可执行权限
chmod +x /run.sh

执行如下:

后面启动容器的时候,将需要启动的服务写到这里就可以了。

退出容器,保存镜像

输入exit退出容器,然后通过docker ps查看刚刚使用的容器,将容器commit为一个新的镜像。

执行如下:

代码语言:javascript
复制
# 执行exit退出容器
[root@4eb13e778da3 /]# exit
exit
[root@dev docker_ssh_centos]# 
# 通过 docker ps -a 查看使用过的所有未删除的容器,刚刚退出7秒钟的就是我们刚刚操作的容器
[root@dev docker_ssh_centos]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS                 NAMES
4eb13e778da3        centos:7            "/bin/bash"              29 minutes ago      Exited (0) 7 seconds ago                         peaceful_darwin

# 根据容器的 CONTAINER ID 使用 commit 命令生成一个新的镜像 centos:7-ssh
[root@dev docker_ssh_centos]# docker commit 4eb13e778da3 centos:7-ssh
sha256:3aaa9ee819e62a7d2c7d52b635eff6f80130c923a8b38a7a4cd5cf36f2542c80
[root@dev docker_ssh_centos]# 

# 查看新生成的容器镜像,那么这个镜像启动的容器就已经安装好了 ssh 的服务功能
[root@dev docker_ssh_centos]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              7-ssh               3aaa9ee819e6        3 seconds ago       318MB

启动容器

代码语言:javascript
复制
docker run -d --name centos7_ssh -p 2222:22 centos:7-ssh /run.sh

# 参数说明:
-d 后台启动
--name 指定容器名称
-p 2222:22 将容器的22端口服务映射到宿主机的 2222 端口上

执行如下:

代码语言:javascript
复制
# 启动容器,并且执行 /run.sh 脚本,启动ssh服务
[root@dev docker_ssh_centos]# docker run -d --name centos7_ssh -p 2222:22 centos:7-ssh /run.sh
5cc134321f63ac365835bac764865a82f6f405d2b7387572edffc8c8c090c867
[root@dev docker_ssh_centos]# 
# 查看启动的容器
[root@dev docker_ssh_centos]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                  NAMES
5cc134321f63        centos:7-ssh        "/run.sh"           3 seconds ago       Up 2 seconds        0.0.0.0:2222->22/tcp   centos7_ssh
[root@dev docker_ssh_centos]# 
# 测试使用ssh访问容器
[root@dev docker_ssh_centos]# ssh root@127.0.0.1 -p 2222
The authenticity of host '[127.0.0.1]:2222 ([127.0.0.1]:2222)' can't be established.
RSA key fingerprint is SHA256:Tx4eA0ymIH+W6uOiqdcdNAaEvpwgKlKqbd3uzlHGm+0.
RSA key fingerprint is MD5:77:6b:f8:cd:6d:ed:86:eb:a0:10:85:dd:02:00:0c:a1.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[127.0.0.1]:2222' (RSA) to the list of known hosts.
root@127.0.0.1's password: 
[root@5cc134321f63 ~]# 
[root@5cc134321f63 ~]# 
[root@5cc134321f63 ~]# ls
anaconda-ks.cfg
[root@5cc134321f63 ~]#

好了,到此为止,已经可以在外部通过SSH服务访问到容器内部了。

更多精彩原创Devops文章,快来关注我的Devops社群吧:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 需求
  • 构建步骤
    • 下载centos镜像
      • 启动centos容器
        • 安装passwd
          • 修改Centos root密码
            • 安装openssh
              • 生成容器的公钥、私钥
                • 创建允许外部访问的认证文件
                  • 编写容器的服务启动脚本
                    • 退出容器,保存镜像
                      • 启动容器
                      相关产品与服务
                      容器服务
                      腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                      领券
                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档