SSH 是最常见的远程连接协议,这里通过 Alpine 和 OpenSSH 搭建一个示例。
在 Linux 服务器中通常以后台任务启动,但是在 Docker 中,需要让容器绑定到 sshd 服务进程上,因此需要前台启动 sshd 进程,也就是添加 -D
参数,同时,还可以通过 -p
自定义端口。
基础镜像
这里直接使用最简单的 alpine 作为基础镜像。
----- 搜索下,一般就是alpine直接下载
# docker search alpine
# docker pull alpine
登录后检查域名解析是否可用,如果报 bad address
错误可以将 /etc/resolv.conf
中的 nameserver
替换为 8.8.8.8
再重试。其中 alpine 使用 apk 来管理包,如下是常见的命令。
----- 替换镜像地址
# sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
----- 更新仓库APKINDEX.tar.gz元文件,一般保存/var/cache/apk(alpine)、/var/lib/apk、/etc/apk/cache目录中
# apk update
----- 安装包,也可以指定版本号
# apk add --no-cache openssh tzdata
# apk add --update-cache --repository http://mirrors.ustc.edu.cn/alpine/v3.4/main/ --allow-untrusted openssh
----- 卸载包
# apk del openssh
----- 升级所有软件或者指定部分软件
# apk upgrade
# apk add --upgrade openssh
----- 搜索软件包,通过-v显示详情,通过-d通过软件包描述查询
# apk search openssh
----- 查看软件包信息
# apk info # 查看所有已经安装的软件包
# apk info -a openssh # 显示完整的软件包信息
# apk info --who-owns /bin/ls # 显示指定文件属于的包
创建 Dockerfile 文件
在临时目录下创建目录,执行命令 mkdir /tmp/alpine-ssh && cd /tmp/alpine-ssh && touch Dockerfile
创建文件,其内容如下。
# 使用最新的基础镜像
FROM alpine:latest
# 作者描述信息
MAINTAINER andy andy@example.org
# 使用阿里云镜像源,设置时区,安装OpenSSH,修改配置,生成Key
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \
&& apk update \
&& apk add --no-cache openssh tzdata \
&& cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& sed -i "s/#PermitRootLogin.*/PermitRootLogin yes/g" /etc/ssh/sshd_config \
&& ssh-keygen -t dsa -P "" -f /etc/ssh/ssh_host_dsa_key \
&& ssh-keygen -t rsa -P "" -f /etc/ssh/ssh_host_rsa_key \
&& ssh-keygen -t ecdsa -P "" -f /etc/ssh/ssh_host_ecdsa_key \
&& ssh-keygen -t ed25519 -P "" -f /etc/ssh/ssh_host_ed25519_key \
&& echo "root:admin" | chpasswd
# 开放22端口
EXPOSE 22
# 容器启动时命令
CMD ["/usr/sbin/sshd", "-D"]
通过 docker build -t mysshd:v1 .
构建 SSH 服务镜像,然后通过如下命令查看。
# docker images mysshd
REPOSITORY TAG IMAGE ID CREATED SIZE
mysshd v1 4d3bd78f5b17 About a minute ago 15.8MB
启动镜像
通过镜像启动容器。
----- 启动镜像
# docker run -p 2020:22 -d --name sshdocker -P mysshd:v1
8ec922ee974751dace0e3c84537be10669d59361dc56aa21423c118043229f52
----- 查看容器
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8ec922ee9747 mysshd:v1 "/usr/sbin/sshd -D" 14 seconds ago Up 13 seconds 0.0.0.0:2020->22/tcp sshdocker
上述包含了端口映射,通过 ssh -p 2020 root@127.0.0.1
命令登录即可,密码如上,也就是 admin
。