docker容器内开启22 ssh_Docker 添加容器SSH服务

2023-11-16

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

该系列文章只是本人的学习笔记,文章中的文字描述是《Linux鸟哥私房菜》书中重点内容的总结,以及《RHCE 认证考试笔记》部分内容是在培训《Linux运维》时总结的,化繁为简能够在工作中快速复习掌握重点。

基于commit命令创建

Docker提供了commit命令,支持用户提交自己对定制容器的修改,并生成新的镜像.这里将介绍如何用docker commit命令,添加SSH服务的操作流程,首先默认情况下ssh服务在镜像里是没有被安装的,我们需要手动配置一下,后期生成镜像启动就方便啦.

1.首先我们先来使用Centos镜像,放入后台并进入容器内部.

[root@localhost ~]# docker pull centos:latest

[root@localhost ~]# docker run -itd --name my_ssh --net=host centos:latest

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

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

2.如果需要正常启动SSH服务,则目录/var/run/sshd必须存在,手动创建它,并启动SSH服务.

[root@c59a63bbb /]# mkdir -p /var/run/sshd

[root@c59a63bbb /]# /usr/sbin/sshd -D &

上面的启动命令会报错,这个错误解决方案是,执行下面命令,创建这些文件.

[root@c59a63bbb /]# ssh-keygen -q -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key -N ''

[root@c59a63bbb /]# ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N ''

[root@c59a63bbb /]# ssh-keygen -t dsa -f /etc/ssh/ssh_host_ed25519_key -N ''

3.然后,修改/etc/ssh/sshd_config配置信息UsePAM yes改为UsePAM no,UsePrivilegeSeparation sandbox改为UsePrivilegeSeparation no,可以用vim修改,也可以用下面命令.

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

[root@c59a63bbb /]# sed -i "s/UsePAM.*/UsePAM no/g" /etc/ssh/sshd_config 不通过pam验证

[root@c59a63bbb /]# sed -ri 's/session required pam_loginuid.so/#session

required pam_loginuid.so/g' /etc/pam.d/sshd

4.修改完后,重新启动sshd服务,并修改一个root密码.

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

[root@c59a63bbb /]# echo "root" | passwd --stdin root

[root@c59a63bbb /]# echo "/usr/sbin/sshd -D &" >> /etc/profile

5.创建一个自启动脚本文件,写入一下内容.

[root@c59a63bbb /]# vi /run.sh

#!/bin/bash

/usr/sbin/sshd -D

[root@c59a63bbb /]# chmod +x run.sh

[root@c59a63bbb /]# exit

6.保存镜像,将所退出的容器用commit命令保存为一个新的my_ssh:centos镜像.

[root@localhost ~]# docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS

e1fc02dfd24f centos:latest "/bin/bash" 4 minutes ago Up 4 minutes

[root@localhost ~]# docker commit e1fc my_ssh:centos

sha256:48997373aee923ee9b6af833de4aa9842dd090c7fee1f2569aa187e66b96231c

[root@localhost ~]# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

myssh centos 48997373aee9 25 seconds ago 280MB

centos latest 1e1148e4cc2c 10 days ago 202MB

hello-world latest 4ab4c602aa5e 3 months ago 1.84kB

7.启动容器,并添加端口映射10000-->22.其中10000是宿主主机的端口,22是容器的SSH服务监听端口.

[root@localhost ~]# docker run -itd -p 10000:22 my_ssh:centos

[root@localhost ~]# docker run -p 10000:22 -itd my_ssh:centos /run.sh

b0b073cf4bf933b291f0e0139220d09325e7dead7a1a77cacc243516c09ee931

8.在宿主主机或其他主机上上,可以通过SSH访问10022端口来登录容器.

[root@localhost ~]# ssh root@192.168.1.5 -P 10000

使用Dockerfile创建

上面的方式比较复杂,接下来我们来看一个简单的,使用dockerfile的方式来创建一个Ubuntu镜像.

1.首先,拉取一个基本镜像,并创建一个sshd_ubuntu工作目录.

[root@localhost ~]# docker pull ubuntu:latest

[root@localhost ~]# mkdir ssh_ubuntu

[root@localhost ~]# cd ssh_ubuntu/

[root@localhost ssh_ubuntu]# touch Dockerfile

[root@localhost ssh_ubuntu]# touch run.sh

2.编写run.sh以及,在宿主主机上生成SSH密钥对,并创建authorized_keys文件.

[root@localhost ssh_ubuntu]# vim run.sh

#!/bin/bash

/usr/sbin/sshd -D

[root@localhost ssh_ubuntu]# ssh-keygen -t rsa

[root@localhost ssh_ubuntu]# cat ~/.ssh/id_rsa.pub >authorized_keys

[root@localhost ssh_ubuntu]# cp -a authorized_keys /root/.ssh/

3.下面是Dockerfile的内容,这和commit命令创建镜像过程,所进行的操作基本一致.

#设置继承镜像

FROM ubuntu:latest

#提供一些作者的信息

MAINTAINER docker_user (user@docker.com)

#下面开始运行更新命令

#RUN apt-get update

#安装ssh服务

RUN apt-get install -y passwd openssh openssh-server

RUN mkdir -p /var/run/sshd

RUN mkdir -p /root/.ssh

#取消pam限制

RUN sed -ri 's/session required pam_loginuid.so/#session required pam_loginuid.so/g' /etc/pam.d/sshd

#复制配置文件到相应位置,并赋予脚本可执行权限

ADD authorized_keys /root/.ssh/authorized_keys

ADD run.sh /run.sh

RUN chmod 755 /run.sh

#开放端口

EXPOSE 22

#设置初始密码

RUN echo "root"|passwd --stdin root

#设置自启动命令

CMD ["/run.sh"]

4.创建镜像,在sshd_ubuntu目录下,使用build命令来创建镜像.这里需要注意最后还有一个".",表示使用当前目录中的Dockerfile

[root@localhost ~]# cd sshd_ubuntu

[root@localhost ssh_ubuntu]# docker build -t sshd:Dockerfile .

5.测试镜像,运行容器,并通过ssh连接一下.

[root@localhost ~]# docker run -d -p 10122:22 sshd:Dockerfile

890c04ff8d769b604386ba4475253ae8c21fc92d60083759afa77573bf4e8af1

[root@localhost ~]# ssh 192.168.1.200 -p 10122

在Docker社区中,对于是否需要为Docker容器启用SSH服务一直有争论,反对方的观点是:Docker的理念是一个容器只运行一个服务.因此,如果每个容器都运行一个额外的SSH服务,就违背了这个理念.另外认为根本没有从远程主机进入容器进行维护的必要.

使用pipwork分配

1.安装Git工具,并克隆pipwork,放入可执行目录,并给予相应的权限.

[root@localhost ~]# yum install -y git

[root@localhost ~]# git clone https://github.com/jpetazzo/pipework

[root@localhost ~]# cd pipework/

[root@localhost pipework]# cp -a pipework /usr/local/bin/

[root@localhost pipework]# chmod +x /usr/local/bin/pipework

2.将本机配置成网桥,使之能够互相通信.

[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens32

[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens32

DEVICE=eno16777728

TYPE=Ethernet

BOOTPROTO=static

BRIDGE=br0

NM_CONTROLLED=yes

ONBOOT=yes

[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-br0

[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-br0

TYPE=Bridge

DEVICE=br0

BOOTPROTO=static

IPADDR=192.168.1.13

NETMASK=255.255.255.0

GATEWAY=192.168.1.1

DNS1=8.8.8.8

DNS2=114.114.114.114

ONBOOT=yes

[root@localhost ~]# reboot

3.下载一个Centos镜像,并运行且指定--net="none",后期使用pipwork分配IP地址.

[root@localhost ~]# docker pull centos:latest

[root@localhost ~]# docker run -d --name my_ssh --restart=always --net="none" centos:latest

cf8354804431a7830a6a46999ac20240ad6402d505d3130789fdc4bbb227e4e3

4.通过命令分配IP地址,与子网掩码.

[root@localhost ~]# pipework br0 镜像名称 192.168.1.100/24

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

"SecondaryIPAddresses": null,

"IPAddress": "192.168.1.100/24",

"IPAddress": "192.168.1.100/24",

docker 给容器分配IP并可以连接SSH (新版)

1.首先创建子网

docker network create --subnet=172.1.0.0/16 mynetwork

docker network ls

2.为容器分配ip

docker run -itd --name lyshark --net mynetwork --ip 172.1.0.2 centos:latest /bin/bash

docker exec -it lyshark /bin/bash

3.安装各种软件

yum -y install net-tools passwd openssh-server openssh-clients

passwd root

4.执行ssh生成

ssh-keygen -q -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key -N ''

ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N ''

ssh-keygen -t dsa -f /etc/ssh/ssh_host_ed25519_key -N ''

5.接着修改sshd_config文件配置信息

vi /etc/ssh/sshd_config

开启 Port 22 注释

将 PermitRootLogin 的 no 改为 yes

启动ssh服务 /usr/sbin/sshd -D &

6.退出这个镜像,然后打包成新的。

docker commit lyshark mycentos 制作新的镜像

5.直接创建新的容器即可。

docker rm $(docker ps -a -q)

docker run -itd --name centos1 --net mynetwork --ip 172.1.0.2 mycentos /usr/sbin/init

docker exec -it lyshark /bin/bash

6.外网链接配置,将外网的5423端口映射到内网主机的 172.1.0.2:22口上,即可外部连接该容器

[root@localhost ~]# firewall-cmd --add-forward-port=port=5423:proto=tcp:toaddr=172.1.0.2:toport=22

success

[root@localhost ~]# firewall-cmd --add-port=5423/tcp

success

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

docker容器内开启22 ssh_Docker 添加容器SSH服务 的相关文章

  • win32汇编语言实现冒泡排序

    1 背景 现在大多数的大规模程序并不是由汇编语言来编写 原因很简单 因为太耗时了 但是汇编语言仍然被广泛运用在配置硬件设备以及优化程序的执行速度和尺寸大小等方面 特别是在逆向工程方面 更需要深入理解与熟练掌握汇编语言 针对现阶段 看汇编基本
  • unity04 解决导入fbx文件黑模问题

    左上角window gt rendering gt lighting gt new lighting settings gt 勾选auto generating
  • TensorFlow在MNIST中的应用-卷积神经网络CNN

    参考 TensorFlow技术解析与实战 用TensorFlow搭建一个卷积神经网络CNN模型 并用来训练MNIST数据集 coding utf 8 20171115 HelloZEX 卷积神经网络
  • 【软件测试】----自动化测试详解

    自动化测试指软件测试的自动化 在预设状态下运行应用程序或者系统 预设条件包括正常和异常 最后评估运行 结果 将人为驱动的测试行为转化为机器执行的过程 常见的自动化测试工具 QTP selenium Rational Robot jmeter
  • QtDesigner设计中关于PyQt5与pyside2的报错坑

    关注公众号可获取资料分享 0 前言 Qt Designer是使用Qt部件设计和构建图形用户界面 gui 的Qt工具 您可以以 what you see is what you get WYSIWYG 的方式组合和自定义窗口或对话框 并使用不
  • JSON取值(key是中文或者数字)方式详解

    先准备一个json对象用于演示 var json name zhangsan 年龄 23 404 你可能迷路了 使用JS中with关键字 with json console log name 输出 zhangsan console log
  • 基于STM32的智能电子药盒设计

    1 前言 据报告显示中国有2 3亿的60岁以上老人 占全国总人口的六分之一 在老年人中 有65 以上的老年人都是慢性病患者 其中失能和半失能老人将近四千万 并且人口还在以加速度增长 老年人的身体健康成为社会密切关注的问题 大部分的老年人都患
  • JavaScript基本包装类型

    基本包装类型 为了便于操作基本类型值 ECMAScript还提供了3个特殊的引用类型 Boolean Number和String 这些类型与其它引用类型相似 但同时也具有与各自的基本类型相应的特殊行为 实际上 每当读取一个基本类型值的时候
  • ElasticSearch-全文检索-简单使用

    简介 https www elastic co cn what is elasticsearch 全文搜索属于最常见的需求 开源的 Elasticsearch 是目前全文搜索引擎的首选 它可以快速地储存 搜索和分析海量数据 维基百科 Sta
  • 类和对象

    一 类 类描述了一组具有相同属性和行为特征的对象 对象是类的实例 类是一种数据类型 而对象是该类型的变量 在c 语言中 一个类的定义包含数据成员和成员函数两部分内容 数据成员定义该类对象的属性 不同对象的属性值可以不同 成员函数定义了该类对
  • 回归分析及实际案例:预测鲍鱼年龄

    上一篇文章 线性回归 Linear regression 算法 引入 1 线性回归 算法的优点 结果易于理解 计算不复杂 缺点 对非线性数据拟合不好 目标 平方误差和最小 求解 对参数w求导等于0 的回归系数 模型预测 函数说明 标准回归
  • 开发者必备的网站。javascript手册,css手册

    参考手册大全 更多更好的网址请到http www loveboygirl com 在 电脑技术 参考手册 下面 网站开发人员一定喜欢 很多好工具哦 希望大家多多支持 桌面版手册 开源中国 开源中国工具 msdn技术资源库 technet M
  • leptonica依赖的相关库的生成

    leptonica依赖的相关库的生成 写在前面 笔者观摩大量大佬的教程完成的本篇文章 反正我是成功了 电脑Win10 64位 VS2017版本 用到的源码由于试过太多来源 部分已经忘记哪儿来的了 有空我也传份上来 哈哈 至于为此学习过的文章
  • startActivity流程学习

    文章目录 应用完全没有启动过 应用完全没有启动过 launcher从sm 管理java层的ServiceManager 的服务列表里面找到AMS的代理对象AMSProxy 调用AMS向Zygote发出socket请求 从Zygote进程fo
  • vi的复制粘贴命令

    vi编辑器有3种模式 命令模式 输入模式 末行模式 掌握这三种模式十分重要 命令模式 vi启动后默认进入的是命令模式 从这个模式使用命令可以切换到另外两种模式 同时无论在任何模式下只要按一下 Esc 键都可以返回命令模式 在命令模式中输入字
  • SpringBoot多数据源导致mybatis驼峰映射配置失效

    SpringBoot多数据源导致mybatis驼峰映射配置失效 1 正常情况下 直接配置即可生效 比如 开启驼峰映射 开启示例 properties文件中配置 mybatis configuration map underscore to
  • 踩了大坑 : go json.Marshal时,结构体字段需要大写

    go中根据首字母的大小写来确定可以访问的权限 如果首字母大写 作用域则可以被其他的包访问 如果首字母小写 作用域则只能在本包中使用 包括接口 类型 函数和变量等 可以简单的理解成 首字母大写是公有的 首字母小写是私有的 出现问题 需要将js
  • 数据结构——图的两种遍历方法

    遍历定义 从已给的图中某一顶点出发 沿着一些边 访遍图中所有的顶点 且使每个顶点仅被访问一次 就叫做图的遍历 遍历实质 找每个顶点的邻接点的过程 图的特点 图中可能存在回路 且图的任一顶点都可能与其它顶点相通 在访问完某个顶点之后可能会沿着
  • gzip text html,Vue gzip压缩导致js无法解析 Content-Type: text/html(JS内容)(压缩完成是xxx.js.gz)...

    压缩配置 Vue config js 插件compression webpack plugin gzip压缩config plugin compressionPlugin use 代码混淆 new CompressionWebpackPlu

随机推荐

  • 识别操作系统的常用方式

    识别操作系统的方式 一 windows系统对大小写区分不是很明显 判断修改路径大小写后正常windows 报错linux 1 eg 大小写修改之后页面回显正常说明网站系统为windows 2 eg 可以判断该服务器系统为linux 二 通过
  • 计算机总线仲裁详解

    文章目录 总线仲裁 一 关于总线仲裁 二 总线仲裁的分类 1 集中仲裁方式 1 链式查询方式 2 计数器定时查询方式 3 独立请求方式 2 分布仲裁方式 总线仲裁 一 关于总线仲裁 总线仲裁来由 我们按照对总线有无控制功能将总线上所连接的各
  • SELinux深入理解

    1 简介 SELinux带给Linux的主要价值是 提供了一个灵活的 可配置的MAC机制 Security Enhanced Linux SELinux 由以下两部分组成 1 Kernel SELinux模块 kernel security
  • 中国古代数学问题——鸡兔同笼解析

    中国古代数学问题 鸡兔同笼解析 鸡兔同笼是一道古代数学问题 通过计算鸡和兔的总数量和腿的总数来求解鸡和兔的个体数量 这个问题在数学教育中经常被用来培养学生的问题解决能力和逻辑思维 下面 我们将对鸡兔同笼问题进行详细的解析 并附上相应的源代码
  • 三进制计算机_计算机数学原理之二进制

    上一节我们了解了曲线的矩形逼近 以及由此代表的模拟量的数位表示 基于以上知识 这节课我们可以开始学习二进制了 计算机原理之 二进制 对数值的数位表示 我们可以很自然的想起十进制 即所有的数字都用10个基本的符号表示 基本符号是0到9十个数字
  • c#复制一个文件到指定文件夹

    c 复制一个文件到指定文件夹 path 指定文件夹From www uzhanbao com fileName指定文件的完整路径 public void CopyFile string path string fileName FileIn
  • mybatis-plus+druid配置多套数据源

    这里我使用的是mysql和postgresql进行配置 详细讲讲会遇到的问题 1 首先引入需要用到的依赖
  • 期货开户关于基本面量化

    一 库存 供求矛盾看库存 东西没有了 缺了 就会涨价 不缺 一般不会涨 所以 一定要注意库存 去库存快的品种 特别是库存低 价格低的品种 要重点关注 库存有一点要特别注意 要是 有效去库存 通过降价让下游买货 这种 去库存 不是根本 因为库
  • 【Python】fetchone()和fetchall()

    fetchone 返回单个的元组 也就是一条记录 row 如果没有结果 则返回 None cu execute select user password from user where user s name arr cur fetchon
  • 【多目标优化算法】多目标蚱蜢优化算法(Matlab代码实现)

    个人主页 研学社的博客 欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码及详细文章讲解 1 概述
  • LeetCode 剑指 Offer 10- I. 斐波那契数列

    LeetCode 剑指 Offer 10 I 斐波那契数列 题目描述 写一个函数 输入 n 求斐波那契 Fibonacci 数列的第 n 项 即 F N 斐波那契数列的定义如下 F 0 0 F 1 1 F N F N 1 F N 2 其中
  • 用户画像统计标签(年龄段,消费周期,常用支付方式)

    年龄段 import bean HBaseMeta import org apache spark SparkContext import org apache spark sql 关联 不仅仅是一个相同的 可以 一个与两个之间 objec
  • 11.6.1:综合技巧练习 - 配置和测试网络

    实验ip分配如下 学习目标 创建 测试并配置整个实验网络 综合运用整套课程中学到的技巧 分析请求网页所涉及的事件 DNS ARP HTTP TCP IP Ethernet HDLC 分析在跟踪到 Web 服务器的路由时所涉及的事件 DNS
  • Nokogiri的使用 抓取csdn博客內容 rails

    Nokogiri 锯 使使用 Ruby 中的 XML 和 HTML 变得轻松而轻松 提供了一个明智的 易于理解的 API 阅读 编写 修改 和 查询 文档 它依赖于 libxml2 CRuby 和 xerces JRuby 等原生解析器 速
  • 光流法( Optical Flow Method)

    在计算机视觉中 光流法即可用于运动目标检测 也可以用于目标跟踪 本文主要介绍光流法在运动目标检测和目标跟踪中的区别与联系 1 光流与光流场 光流的概念最初是由 Gibson 于 1950 年首先提出来的 当人的眼睛观察运动物体时 物体的景象
  • 没有计算机网络地址怎么办,教大家电脑没有ip地址mac地址怎么办

    近日有关于电脑没有ip地址mac地址怎么办的问题受到了很多网友们的关注 大多数网友都想要知道电脑没有ip地址mac地址怎么办的具体情况 那么关于到电脑没有ip地址mac地址怎么办的相关信息 小编也是在网上进行了一系列的信息 那么接下来就由小
  • C#Replace

    在C 的字符串操作过程中 有时候需要替换字符串中的某个子字符串 此时就可以使用到字符串类自带的Replace方法来实现 Replace方法将查找到所有符合被替换的子字符串 然后将之全部替换为目标字符串 Replace方法有2个方法重载实现
  • 奇偶排序,双调排序,双调查找

    奇偶排序 奇偶排序是排序方法的一种 复杂度为O n 2 好处是可以利用处理器的并行 第一遍扫描a i a i 1 i为奇数 如果这两个次序不正确 就交换它们的次序 第二遍扫描偶数 双调排序 所谓双调序列 Bitonic Sequence 是
  • matlab 获取矩阵大小、行数、列数、元素总个数——size()/length()/numel()

    1 size size 获取数组的行数和列数 s size A 当只有一个输出参数时 返回一个行向量 该行向量的第一个元素时数组的行数 第二个元素是数组的列数 r c size A 当有两个输出参数时 size函数将数组的行数返回到第一个输
  • docker容器内开启22 ssh_Docker 添加容器SSH服务

    很多时候我们需要登陆到容器内部操作 此时我们就需要开启容器的SSH支持了 下面的小例子将具体介绍三种分配IP地址的方法 分别是pipworl分配 commit分配 Docker分配等 该系列文章只是本人的学习笔记 文章中的文字描述是 Lin