Dockerfile 分享之 SSH Server

Docker 官方网站上给出的示例里面有个 用 Dockerfile 构建 SSH Server 的例子, 我在腾讯云的主机上实验了一下, 中间添加了一些优化, 把实验过程记录如下, 希望对大家有帮助。

一. 相关的文件

1. 新建一个目录和一个 Dockerfile

mkdir y109-sshd
vim Dockerfile

2. Dockerfile 的内容如下

# docker sshd
FROM ubuntu:14.04
MAINTAINER y109<y109@qq.com>

# 使用 163.com 的源
COPY sources.list.163.txt /etc/apt/sources.list
RUN apt-get -y update

# 设置 root 密码
RUN echo 'root:bMg5kesfdsfesx9gD' | chpasswd

# 安装 openssh-server
RUN apt-get -y install openssh-server
RUN mkdir /var/run/sshd

# SSH login fix. Otherwise user is kicked off after login
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
#
# ENV NOTVISIBLE "in users profile"
RUN echo "export VISIBLE=now" >> /etc/profile

# 添加公钥(如果没有公钥可以省略)
RUN mkdir /root/.ssh
RUN echo 'ssh-rsa YOU_PUB_KEY' > /root/authorized_keys

# 容器启动后运行的程序
CMD ["/usr/sbin/sshd", "-D"]

# 打开 22 端口
EXPOSE 22
 

sources.list.163.txt 的内容如下

deb http://mirrors.163.com/ubuntu/ precise main restricted
deb-src http://mirrors.163.com/ubuntu/ precise main restricted

deb http://mirrors.163.com/ubuntu/ precise-updates main restricted
deb-src http://mirrors.163.com/ubuntu/ precise-updates main restricted

deb http://mirrors.163.com/ubuntu/ precise universe
deb-src http://mirrors.163.com/ubuntu/ precise universe
deb http://mirrors.163.com/ubuntu/ precise-updates universe
deb-src http://mirrors.163.com/ubuntu/ precise-updates universe

deb http://mirrors.163.com/ubuntu/ precise-security main restricted
deb-src http://mirrors.163.com/ubuntu/ precise-security main restricted
deb http://mirrors.163.com/ubuntu/ precise-security universe
deb-src http://mirrors.163.com/ubuntu/ precise-security universe
 

二.构建 Image

使用 docker build 来生成镜像

-t 参数是给这个镜像的 TAG

sudo docker build -t 'y109/sshd' ./
Sending build context to Docker daemon 4.608 kB
Sending build context to Docker daemon
Step 0 : FROM ubuntu:14.04
 ---> 9cbaf023786c
Step 1 : MAINTAINER y109<y109@qq.com>
 ---> Using cache
 ---> 2256ab1cc931
Step 2 : COPY sources.list.163.txt /etc/apt/sources.list
 ---> Using cache
 ---> 65536ca26964
Step 3 : RUN apt-get -y update
 ---> Using cache
 ---> 60639e42f098
Step 4 : RUN echo 'root:pass123456' | chpasswd
 ---> Using cache
 ---> 8644dd20854f
Step 5 : RUN apt-get -y install openssh-server
 ---> Using cache
 ---> 98039327bca7
Step 6 : RUN mkdir /var/run/sshd
 ---> Using cache
 ---> 9bd3b3fc7828
Step 7 : RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
 ---> Using cache
 ---> d748cb9428a0
Step 8 : RUN echo "export VISIBLE=now" >> /etc/profile
 ---> Using cache
 ---> e975cd819243
Step 9 : RUN mkdir /root/.ssh
 ---> Using cache
 ---> e561acc07675
Step 10 : RUN echo 'ssh-rsa YOU_PUBLIC_KEY'
 ---> Using cache
 ---> 8f6882a72037
Step 11 : CMD ["/usr/sbin/sshd", "-D"]
 ---> Using cache
 ---> 48cbd2c4aa70
Step 12 : EXPOSE 22
 ---> Using cache
 ---> 3101a36f0084
Successfully built 3101a36f0084

使用 docker images 命令查看镜像, 确认镜像构建成功了

sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
y109/sshd           latest              3101a36f0084        22 minutes ago      226.1 MB
<none>              <none>              23f604e547b8        28 minutes ago      226.1 MB
<none>              <none>              50647a1fb746        36 minutes ago      226.1 MB
y
...

y109/sshd就是我们刚才构建的镜像

三.创建 Container

使用 docker run 来用镜像创建一个 Container

-d : Detached mode, 使 Container 在 background 模式运行
-p : 把 22 端口映射到主机的网卡上, 格式: ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort
–name : 给 Container 指定一个名字, 一旦指定了名称这个名称就和这个 Container 绑定了, 可以用 docker ps -a 列出来

sudo docker run -d -p 10922:22 --name y109-sshd y109/sshd

我用的外网端口是 10922, 可以根据需要修改, 下一步需要确认 Container 是否正常执行了

sudo docker ps
CONTAINER ID        IMAGE               COMMAND               CREATED             STATUS              PORTS                   NAMES
fc37b83d343e        y109/sshd:latest    "/usr/sbin/sshd -D"   9 seconds ago       Up 9 seconds        0.0.0.0:10922->22/tcp   y109-sshd

看来执行成功了, 连接试试看看

ssh root@localhost -p10922
The authenticity of host '[localhost]:10922 ([127.0.0.1]:10922)' can't be established.
ECDSA key fingerprint is 4d:48:5c:61:54:d6:8f:62:70:a2:0e:ab:b7:1a:cb:f7.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[localhost]:10922' (ECDSA) to the list of known hosts.

The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.

root@80f07ad418fe:~#

已经成功连接进入 Container 了

四.关闭 Container

sudo docker stop fc3 fc3 是 Container Id fc37b83d343e 的缩写, 只要能够唯一标识这个 Container 就可以了。或者sudo docker stop y109-sshd

五.运行 Container

sudo docker start y109-sshd

相关推荐

容器服务CCS

如何构建docker镜像

如何搭建私有镜像仓库

原创声明,本文系作者授权云+社区-专栏发表,未经许可,不得转载。

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

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java进阶之路

zookeeper分布式协调机制及创建分布式锁

要了解zookeeper如何创建分布式锁,先了解一下zookeeper。zookeeper官网给出解释:Apache ZooKeeper致力于开发和维护开源服务...

571
来自专栏Kubernetes

原 荐 深度解析Kubernetes Pod

Author: xidianwangtao@gmail.com PDB的应用场景 大概在Kubernetes 1.4新增了PodDisruptionBudge...

61713
来自专栏高性能服务器开发

windows完成端口(六)

系列目录 windows完成端口(一) windows完成端口(二) windows完成端口(三) windows完成端口(四) windows完成端口(五) ...

2804
来自专栏沃趣科技

容器化RDS|计算存储分离架构下的Split-Brain

不管是架构选型还是生活, 绝大多数时候都是在做 trade off, 收获了计算存储分离带来的好处, 也意味着要忍受它带来的一些棘手问题. 本文尝试结合 Kub...

3928
来自专栏Kubernetes

深入分析Kubernetes Scheduler的优先级队列

从1.9版本开始,Kubernetes实现了基于Pod优先级的调度队列,一方面提供高优先级的Pod优先被调度的能力,另一方面减轻抢占式调度时潜在的High Pr...

6137
来自专栏鬼谷君

Zabbix配置文件详解之服务端zabbix_server

932
来自专栏酷玩时刻

t-io 集群解决方案以及源码解析

本博客是基于谭总 t-io showcase中的tio-websocket-showcase 示例来实现集群。看showcase 入门还是挺容易的,入坑(入门)...

522
来自专栏Google Dart

Flutter 构建完整应用手册-联网 顶

从大多数应用程序获取互联网上的数据是必要的。 幸运的是,Dart和Flutter为这类工作提供了工具!

662
来自专栏「3306 Pai」社区

MySQL中sync_relay_log选项对I/O thread的影响分析

搭建好的一套从库,发现延迟很高,一直追不上,从库的bin_log没开,flush_log_at_trx_commit设置为0,简化的状态如下:

831
来自专栏数据和云

Oracle公共云中的MySQL InnoDB集群(2)

在本系列的第一部分 Oracle公共云中的MySQL InnoDB集群,我们学习了如何使用Oracle Cloud配置InnoDB集群。 本文我们将了解如何以及...

3164

扫码关注云+社区