Docker 添加容器SSH服务
很多时候我们需要登陆到容器内部操作,此时我们就需要开启容器的SSH支持了,下面的小例子将具体介绍三种分配IP地址的方法,分别是pipworl分配,commit分配,Docker分配等.
基于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
参考文献:《Docker技术入门与实战》《Docker基础与实战》
Docker 添加容器SSH服务的更多相关文章
- Docker创建支持ssh服务的容器和镜像
原文链接:Docker创建支持ssh服务的容器和镜像 1. 这里使用的centos作为容器,所以首先下载centos的images # sudo docker pull centos 2. 下载后执行 ...
- docker中安装ssh服务
系统:Debian Docker 目标:在docker(debian系统)中安装ssh服务,实现远程登陆和控制docker 步骤: 初始状态:通过docker pull debian得到的一个debi ...
- Docker微容器+微服务将颠覆传统的软件架构
从我的观点看:Docker是一个微容器,一个云计算的微PaaS容器,类似JVM但比其更强大的容器,直接基于Linux内核,支持各种语言,它比VM虚拟机更加轻量,能够在Linux或云计算IaaS等平台上 ...
- docker练习-容器和服务
使用定义容器 Dockerfile Dockerfile定义容器内环境中发生的事情.对网络接口和磁盘驱动器等资源的访问在此环境中进行虚拟化,该环境与系统的其他部分隔离,因此您需要将端口映射到外部世界, ...
- 创建支持ssh服务的docker容器和镜像
http://www.kongxx.info/blog/?p=57 1. 这里使用的centos作为容器,所以首先下载centos的imagessudo docker pull centos 2. 下 ...
- Docker实战-为镜像添加SSH服务
1.基于docker commit命令创建 Docker提供了docker commit命令,支持用户提交自己对定制容器的修改,并生成新的镜像. 命令格式为:docker commit CONTAIN ...
- Docker实战(七)之为镜像添加SSH服务
1.基于commit命令创建 Docker提供了docker commit命令,支持用户提交自己对制定容器的修改,并生成新的镜像.命令格式为docker commit CONTAINER [REPOS ...
- 为Docker镜像添加SSH服务
一.基于commit命令创建 1. 首先下载镜像 $ docker run -it ubuntu:16.04 /bin/bash 2. 安装SSH服务 #更新apt缓存 root@5ef1d31632 ...
- 添加ssh服务构建新镜像-docker commit 方式01
添加ssh服务构建新镜像-docker commit 方式 1:docker commit构建自定义镜像---一般不推荐使用这种方式构建新镜像 1:ubuntu基础镜像下载 ubuntu@ubuntu ...
随机推荐
- BZOJ3331压力
码量略大. 题意就是求路径必经点. tarjan缩点,所有的非割点只有是起点终点时才必经,直接开个ans数组就OK了. 至于割点,因为缩完点之后的图是vDcc和割点共同组成的,而且题目说连通,那就是棵 ...
- 0.JQuery学习
jQuery 教程 jQuery 是一个 JavaScript 库. jQuery 极大地简化了 JavaScript 编程. jQuery 简介 jQuery 库可以通过一行简单的标记被添加到网页中 ...
- UEFI和GPT
好就没用linux了,这几天在win8笔记本上用虚拟机装了下,也准备装到硬盘上和win8双系统使用,发现一些概念已经跟不上时代了. 一个是在虚拟机中装的时候,分配了虚拟硬盘分区时,提示选择分区表类型, ...
- Linux编程之文件锁
1. 使用 fcntl() 给记录加锁 使用 fcntl() 能够在一个文件的任意部分上放置一把锁,这个文件部分既可以是一个字节,也可以是整个文件.这种形式的文件加锁通常被称为记录加锁,但这种称谓是不 ...
- 【python / mxnet / gluoncv / jupyter notebook】变换场景的同一行人多重识别
程序环境为高性能集群:CPU:Intel Xeon Gold 6140 Processor * 2(共36核心)内存:512GB RAMGPU:Tesla P100-PCIE-16GB * 2 数 ...
- fMRI数据分析处理原理及方法————转自网络
fMRI数据分析处理原理及方法 来源: 整理文件的时候翻到的,来源已经找不到了囧感觉写得还是不错,贴在这里保存. 近年来,血氧水平依赖性磁共振脑功能成像(Blood oxygenation level ...
- 代码实现:键盘录入一个int类型的整数,对其求二进制表现形式
package com.loaderman.test; import java.math.BigDecimal; import java.math.BigInteger; import java.ut ...
- Django之缓存配置
01-什么是缓存 缓存(cache),其作用是缓和较慢存储的高频次请求,简单来说,就是加速满存储的访问效率. 02-几种缓存配置 # 内存缓存:local-memory caching CACHES ...
- 关于ckeditor粘贴图片自动上传
在之前在工作中遇到在富文本编辑器中粘贴图片不能展示的问题,于是各种网上扒拉,终于找到解决方案. 其原理为一下步骤: 监听粘贴事件:[用于插入图片] 获取光标位置:[记录图片插入位置] 获取剪切板内容: ...
- linux常用命令(20)用SecureCRT来上传和下载文件
用SSH管理linux服务器时经常需要远程与本地之间交互文件.而直接用SecureCRT自带的上传下载功能无疑是最方便的,SecureCRT下的文件传输协议有ASCII.Xmodem.Zmodem. ...