zoukankan      html  css  js  c++  java
  • docker容器CentOS+ssh

    参考:【创建支持SSH服务的CentOS镜像】【通过Dockerfile创建支持SSH服务的CentOS镜像】


    第一篇是生成docker容器后,在容器中执行各种命令安装ssh,第二篇是用Dockerfile来实现的。写的都很清楚,这里再稍微延伸一点点。

    1、在/root目录下新建sshd_centos目录用于存放Dockerfile和其他相关文件。

    mkdir sshd_centos
    #进入该目录
    cd sshd_centos

    2、新建在容器中启动sshd服务的脚本

    vim run.sh

    脚本内容如下:

    #!/bin/bash
    /usr/sbin/sshd -D

    3、在宿主机上生成RSA密钥

    ssh-keygen -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key

    然后将生成的密钥复制到sshd_centos目录中

    cp /etc/ssh/ssh_host_rsa_key /etc/ssh/ssh_host_rsa_key.pub /root/sshd_centos
    cat ssh_host_rsa_key.pub>authorized_keys

    5、在/root/sshd_centos目录下新建Dockerfile文件

    vim Dockerfile

    Dockerfile内容:

    #生成的新镜像以centos镜像为基础
    FROM centos
    MAINTAINER by test(test@163.com)
    #升级系统
    RUN yum -y update
    #安装openssh-server
    RUN yum -y install openssh-server
    #修改/etc/ssh/sshd_config
    RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config
    #将密钥文件复制到/etc/ssh/目录中
    ADD ssh_host_rsa_key /etc/ssh/ssh_host_rsa_key
    ADD ssh_host_rsa_key.pub /etc/ssh/ssh_host_rsa_key.pub
    RUN mkdir -p /root/.ssh
    ADD authorized_keys /root/.ssh/authorized_keys
    #将ssh服务启动脚本复制到/usr/local/sbin目录中,并改变权限为755
    ADD run.sh /usr/local/sbin/run.sh
    RUN chmod 755 /usr/local/sbin/run.sh
    #变更root密码为test
    RUN echo "root:test"|chpasswd
    #开放窗口的22端口
    EXPOSE 22
    #运行脚本,启动sshd服务
    CMD ["/usr/local/sbin/run.sh"]

    FROM centos,指明基础镜像,可以先用docker search centos查看一下有哪些镜像,这里用的是官方镜像:


    RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config 的意思是,编辑sshd的配置文件/etc/ssh/sshd_config,将其中UsePAM参数设置成“no”,

    -i,直接修改并保存,
    s,替换文本中的字符串
    g,全面替换标记, /g 标记会替换每一行中的所有匹配,如果没有g标记,则只有每行第一个匹配的被替换
    sed命令详见【http://man.linuxde.net/sed】
    如下会匹配file文件中每一行的第一个book替换为books: 
    sed -i 's/book/books/g' file
    
    

    此时 /root/sshd_centos目录下应该存在如下文件:

    Dockerfile
    run.sh
    ssh_host_rsa_key
    ssh_host_rsa_key.pub

    6、使用docker build生成镜像文件

    docker build -t centos_sshd:v1 .

    注意命令最后面是一个”.”,这说明Dockerfile是在当前目录下。 
    执行完成后,会在最后显示类似如下:

    Successfully built 21fbbc4

    7、以新创建的镜像新建容器

    docker run -d -p 10022:22 centos_sshd:v1 /usr/local/sbin/run.sh

    8、ssh连接容器

    查看容器IP为 172.17.0.2 :

    docker inspect 容器ID

    这里其实已经接近尾声了,但是连接容器浪费了几乎一下午的时间,连接的时候总是如下提示:

    ssh root@172.17.0.2 -p 10022
    ssh: connect to host 172.17.0.2 port 10022: Connection refused

    期间尝试查看防火墙状态:

    service   iptables status

    防火墙转发规则:

    iptables -t nat -nL

    容器中的配置文件等,无果,后来尝试了如下成功了:

    ssh root@172.17.0.2 -p 22

    但是明明端口绑定到了10022,为什么会出现这种情况?

    原来连接容器要用宿主机的IP和绑定的端口,而不是用容器的IP,容器是宿主机的一个进程,用如下连接容器成功:

    ssh root@92.168.195.1 -p 10022
  • 相关阅读:
    java高并发
    阿里网盘挂载到本地主机
    frp突破内网ip限制教程
    docker学习总结(流水线、redis集群、网络待)
    git\svn提交记录规范
    【寻径06】如何突破学习瓶颈学习笔记
    leetcode 每日一题解题859. 亲密字符串
    字符串格式的json字符串转换为json格式的字符串
    如何使用github发布自己的静态项目
    软考第一课总结考前介绍(1)
  • 原文地址:https://www.cnblogs.com/kuboy/p/7910893.html
Copyright © 2011-2022 走看看