Docker 示例 Alpine + OpenSSH

2020-09-07 container docker

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