基于 Dockfile 给镜像增加 SSH 服务

使用 Dockfile 给镜像上增加 ssh 服务。

布置环境

阿里云轻量应用服务器 镜像信息:Ubuntu 16.04

拉取 ubuntu:latest 镜像

docker pull ubuntu:latest

完成后,查看镜像是否成功下载

~ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              3556258649b2        3 weeks ago         64.2MB

创建工作目录

新建 sshd-ubuntu 文件夹

mkdir sshd_ubuntu

在其中新建 Dockerfilerun.sh 文件

cd sshd_ubuntu
touch Dockerfile run.sh

编写 run.sh 和 authorized_keys 文件

  • run.sh 此处书写 容器运行时 执行的命令
    #!/bin/bash
    /usr/sbin/sshd -D
  • authorized_keys 此处书写宿主机中生成的 ssh 公钥
    ssh-keygen -t rsa 
    cat ~/.ssh/id_rsa.pub > authorized_keys

编写 Dockerfile

#设置继承镜像
FROM ubuntu:latest

#作者信息
MAINTAINER docker_user (user@docker.com)

#先更新缓存,安装ssh服务
RUN apt-get update \
    && apt-get install -y openssh-server \
    &&  mkdir -p /var/run/sshd \
    && 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

#设置自启动命令
CMD ["/run.sh"]
  • RUN 运行指定命令。格式为 RUN commend 或 RUN ["executable", ”paraml”, ”param2"]

    前者是在 shell 终端执行,即 /bin/sh -c ; 后者指令会被解析为 json,所以必须为双引号使用 exec 执行,不启动 shell 环境。
    每条 RUN 指令将在当前镜像基础上执行指定命令,并提交为新的镜像层 ,所以,RUN命令能合并则合并,尽量减少镜像层。

  • CMD 用来指定启动容器时默认执行的命令 。 CMD ["executable ",”paraml ” , "param2 "]

    每个 Dockerfile 中只能有一条CMD命令,多条的话,只有最后一条执行。
    如果用户启动容器时候手动指定了运行的命令(作为 run 命令的参数),则会覆盖掉
    CMD 指定的命令 。

  • ADD 添加内容到镜像 。格式 ADD ,该命令将复制指定的< src>路径下内容到容器中的< dest>路径下 。

    其中可以是 Dockerfile所在目录的一个相对路径(文件或目录);也可以是一个URL ;还可以是一个 tar 文件(自动解压为目录) 可以是镜像内绝对路径,或者相对于工作目录( WORKDIR)的相对路径 。 *路径支持正则格式,例如: ADD .c /code/**

  • COPY 复制内容到镜像 。格式 COPY

    COPY 与 ADD 指令功能类似,当使用本地目录为源目录时,推荐使用 COPY。

创建镜像

在 sshd_ubuntu 目录下,使用 docker build创建镜像。

docker build -t sshd:dockerfile .

注意上面命令末尾的 . 号指的是当前目录

查看镜像是否安装创建成功

~ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
sshd                dockerfile      e35f180c1e98        5 hours ago         207MB
ubuntu              latest              3556258649b2        3 weeks ago         64.2MB

测试镜像,运行容器

  1. 使用刚才创建的 sshd:dockerfile 镜像来运行一个容器。
    直接启动镜像,映射容器的 22 端口到本地的 10086 端口:
    docker run -d -p 10086:22 --name sshd-test sshd:dockerfile  

    2.查看容器是否成功启动

    ~ docker ps
    CONTAINER ID        IMAGE                 COMMAND             CREATED             STATUS              PORTS                   NAMES
    c2c2e2688046        sshd:dockerfile   "/run.sh"           5 hours ago         Up 5 hours          0.0.0.0:10086->22/tcp   sshd-test

    3.查看 docker 运行的IP地址

    ~ ifconfig docker|grep inet
    inet addr:172.17.0.1  Bcast:172.17.255.255  Mask:255.255.0.0

地址为 172.17.0.1

4.通过 ssh 连接容器

~ ssh 172.17.0.1 -p 10086
Welcome to Ubuntu 18.04.2 LTS (GNU/Linux 4.4.0-93-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

This system has been minimized by removing packages and content that are
not required on a system that users do not log into.

To restore this content, you can run the 'unminimize' command.
Last login: Thu Aug 15 11:38:03 2019 from 172.17.0.1
-bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)
root@c2c2e2688046:~#    

连接成功!

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!