有时候我们想把 Docker 环境提供给别人,但是又不想提供宿主机,那么可以在 Docker 容器内运行 SSH 服务,使容器保持运行并提供给对方使用即可,下面我们以 CentOS 7.6 的 Docker 镜像为例进行配置。

首先开启 Docker 环境,为了方便可以提前映射宿主机的端口:

docker run -it -p 20022:22 centos:7.6.1810 /bin/bash

然后进入后安装相关的环境:

yum install passwd openssl openssh-server -y
# 可选安装必要的网络工具
yum install net-tools iproute

安装后生成相应的 host key:

ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N ''
ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N ''
ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N ''

然后建议修改 SSH 配置文件中的 UseDNS 为 no 关闭 DNS 来提升性能:

sed -i "s/#UseDNS.*/UseDNS no/g" /etc/ssh/sshd_config
# 或者安装 vim 然后修改也可以
yum install vim

然后可以后台启动 SSH 服务:

/usr/sbin/sshd

启动之后,可以查看端口号以及容器网络的 IP:

netstat -tln | grep 22
ip addr

然后修改 root 用户密码:

passwd root

设置后可以尝试从外部连接容器:

# 宿主机可以直接连接容器的 IP 例如
ssh 172.17.0.2
# 也可以连接映射的端口
ssh localhost -p 20022
# 其他外部机器可以使用宿主机的 IP 来连接
ssh <host-ip> -p 20022

如果刚才运行容器忘记指定 -p 参数,那么可以将修改的镜像保存,然后再运行:

docker commit -m "<commit content>" -a "<auther>" <container-id> centos:7.6.1810-ssh
# 查看镜像
docker images
# 启动镜像
docker run --rm -it -p 20022:22 -d centos:7.6.1810-ssh /usr/sbin/sshd -D

然后就可以使用 SSH 客户端连接了,综合上面这些步骤我们可以直接编写 Dockerfile 创建镜像,例如:

FROM centos:7.6.1810
RUN yum install passwd openssl openssh-server net-tools iproute -y
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N '' && ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N '' && ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N ''
RUN sed -i "s/#UseDNS.*/UseDNS no/g" /etc/ssh/sshd_config
RUN echo "root-123456" | passwd --stdin root
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]

然后打包镜像即可:

docker build -t centos:7.6.1810-ssh .

打包后即可从镜像启动容器:

docker run -p 20022:22 -d centos:7.6.1810-ssh

最后就可以通过 SSH 客户端连接了。

Docker 内安装 SSH 服务的更多相关文章

  1. docker中安装ssh服务

    系统:Debian Docker 目标:在docker(debian系统)中安装ssh服务,实现远程登陆和控制docker 步骤: 初始状态:通过docker pull debian得到的一个debi ...

  2. 在CentOS7.5上安装Docker,在Docker中拉取CentOS7.5镜像并安装SSH服务

    # 安装docker yum install -y docker # 启动docker systemctl start docker # 加入开机启动 systemctl enable docker ...

  3. Docker 添加容器SSH服务

    很多时候我们需要登陆到容器内部操作,此时我们就需要开启容器的SSH支持了,下面的小例子将具体介绍三种分配IP地址的方法,分别是pipworl分配,commit分配,Docker分配等. 基于commi ...

  4. Docker创建支持ssh服务的容器和镜像

    原文链接:Docker创建支持ssh服务的容器和镜像 1. 这里使用的centos作为容器,所以首先下载centos的images # sudo docker pull centos 2. 下载后执行 ...

  5. 为Docker镜像添加SSH服务

    一.基于commit命令创建 1. 首先下载镜像 $ docker run -it ubuntu:16.04 /bin/bash 2. 安装SSH服务 #更新apt缓存 root@5ef1d31632 ...

  6. 安装ssh服务

    1.先更新下源 sudo apt-get update 2.安装ssh服务 sudo apt-get openssh-server 3.配置ssh-server,配置文件位于/etc/ssh/sshd ...

  7. Ubuntu安装SSH服务

    1 SSH服务 Ubuntu默认并没有安装ssh服务,如果通过ssh远程连接到Ubuntu,需要自己手动安装ssh-server(openssh-server). 1.1 检测是否安装SSH服务 出现 ...

  8. docker 容器开启ssh服务

    ssh服务安装 安装ssh服务 #yum install openssh-server -y 安装passwd(修改密码需要) #yum install passwd -y 修改sshd_config ...

  9. ubuntu16.04安装ssh服务,并实现远程访问

    一.查看是否安装了ssh服务 apt-cache policy openssh-client openssh-server ubuntu默认安装了openssh-client,openssh-serv ...

  10. Ubuntu-18.04 下修改root用户密码,安装SSH服务,允许root用户远程登录,安装vsftp服务器

    修改root用户密码 打开终端,输入 sudo passwd root 指令: 安装SSH服务 ssh默认端口号是22,可以在/etc/ssh/sshd_config文件中修改 查看服务器否开启:ne ...

随机推荐

  1. mybatis批量插入的四种方式

    一.循环插入 public void insert(List<User> userList) { userList.forEach(user -> userDao.insert(us ...

  2. pg distinct 改写递归优化(德哥的思路)

    德哥的优化思路巨牛逼,这种递归思维真的太吊了,我目前就缺递归思路. 下面SQL1000W行数据,列的选择性很低,只有两个值('1'和'11')都是字符串类型,'1'只有一条数据,'11'有999999 ...

  3. esp8266 I2C 实例解析及源码分析

    一  前言 作为一个方案商兼芯片开发者,研究芯片和功能实现除了基本的工作需要,还有一层就是也变成了一种职业习惯.从芯片到方案,发现很多方案公司的人水平都比较堪忧,只会调用api,根本不会看底层的代码实 ...

  4. C++ Concurrency in Action 读书笔记三:并发操作的同步

    Chapter 4 并发操作的同步·Synchronizing concurrent operations

  5. .NET Emit 入门教程:第四部分:构建类型(Type)

    前言: 在动态生成代码的过程中,构建类型(Type)是至关重要的一步. 通过使用 Emit 中的 TypeBuilder,我们可以定义和创建各种类型,包括类.结构体和接口. 本节将深入探讨如何使用 T ...

  6. 记一次查询优化,mybatis查询oracle卡,直接拿sql数据库查询很快

    调整前 <select id="getList" resultMap="BaseResultMap" parameterType="java.u ...

  7. KingbaseES checkpoint_timeout参数对wal日志量的影响

    前言 在KingbaseESV8R6数据库中,必须先将更改写入WAL日志(老版本称为 xlog),然后才能将这些更改从内存shared_buffer 写入到磁盘. 前两天有个同事遇到一个问题,wal日 ...

  8. c语言的printf常用的一些转换说明符及其含义

    整数类型: %d: 十进制整数 (decimal: 十进制的) %u: 无符号整数 (unsigned: 无符号的) %i: 十进制整数 (integer: 整数) %o: 八进制数 (octal: ...

  9. Android将数据导入到已有的excel表格_0

    用到的jxl2.6.12 jar 包下载地址: https://mvnrepository.com/artifact/net.sourceforge.jexcelapi/jxl/2.6.12

  10. 32位x86处理器编程架构

    1. IA-32架构的基本执行环境 1.1 寄存器的扩展   为了在汇编语言程序中使用经过扩展(Extend) 的寄存器:   在32位模式下,为了生成32位物理地址,处理器需要使用32位的指令指针寄 ...