「二」创建一个带 ssh 服务的基础镜像(修订版)--使用 Dockerfile 创建,sshdockerfile


创建文件夹

首先,创建一个叫做 sshd_ubuntu 的文件夹,用于存放我们的 Dockerfile 、脚本文件、以及其他文件。

$ mkdir sshd_ubuntu
$ ls
sshd_ubuntu
$ cd sshd_ubuntu/
$ touch Dockerfile run.sh
$ ls
Dockerfile  run.sh

编写 shell 脚本和 authorized_keys 文件

其中脚本文件 run.sh 的内容与上一小节一致

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

创建 authorized_keys 文件

$ ssh-keygen
#根据提示生成访问密钥
$ cat ~/.ssh/id_rsa.pub >authorized_keys
#复制公钥到 authorized_keys 文件中

下面是 Dockerfile 的内容及解释

#设置继承镜像
FROM ubuntu:14.04
#提供一些作者的信息
MAINTAINER dwj_zz@163.com
#下面开始运行命令,此处更改ubuntu的源为国内163的源
RUN echo "deb http://mirrors.163.com/ubuntu/ trusty main restricted universe multiverse" > /etc/apt/sources.list
RUN echo "deb http://mirrors.163.com/ubuntu/ trusty-security main restricted universe multiverse" >> /etc/apt/sources.list
RUN echo "deb http://mirrors.163.com/ubuntu/ trusty-updates main restricted universe multiverse" >> /etc/apt/sources.list
RUN echo "deb http://mirrors.163.com/ubuntu/ trusty-proposed main restricted universe multiverse" >> /etc/apt/sources.list
RUN echo "deb http://mirrors.163.com/ubuntu/ trusty-backports main restricted universe multiverse" >> /etc/apt/sources.list
RUN apt-get update

#安装 ssh 服务
RUN apt-get install -y openssh-server
RUN mkdir -p /var/run/sshd
RUN 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"]

创建镜像

$ sudo docker build -t sshd:dockerfile .
Sending build context to Docker daemon 5.632 kB
Sending build context to Docker daemon
Step 0 : FROM ubuntu:14.04
^Z
[1]+  Stopped                 sudo docker build -t sshd:dockerfile .
#这里我发现创建的速度好慢,于是暂停创建过程,先查看下本地 images
$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
sshd                ubuntu              7aef2cd95fd0        12 hours ago        255.2 MB
busybox             latest              e72ac664f4f0        3 weeks ago         2.433 MB
ubuntu              latest              ba5877dc9bec        3 months ago        192.7 MB
#原来我们的 ubuntu 镜像是使用默认的 latest 标签,而我们在 Dockerfile 中一般都是指定版本标签。
$ sudo docker tag ba5 ubuntu:14.04
$ pwd
/home/xxx/sshd_ubuntu
$ sudo docker build -t sshd:dockerfile .
#这里注意一下,在最后还有一个 “.” ,表示使用当前目录的 Dockerfile
Sending build context to Docker daemon 5.632 kB
Sending build context to Docker daemon
Step 0 : FROM ubuntu:14.04
 ---> ba5877dc9bec
Step 1 : MAINTAINER dwj_zz@163.com
 ---> Running in 188d74d02d35
 ---> 473eb019b331
Removing intermediate container 188d74d02d35
#使用 Dockerfile 创建,他会帮你删除中间无用的文件层
Step 2 : RUN echo "deb http://mirrors.163.com/ubuntu/ trusty main restricted universe multiverse" > /etc/apt/sources.list
 ---> Running in f52e2a583db5
 ---> bd4ceef2ee19
Removing intermediate container f52e2a583db5
Step 3 : RUN echo "deb http://mirrors.163.com/ubuntu/ trusty-security main restricted universe multiverse" >> /etc/apt/sources.list
 ---> Running in 897d65dfe9be
 ---> 9cd736f11928
Removing intermediate container 897d65dfe9be
Step 4 : RUN echo "deb http://mirrors.163.com/ubuntu/ trusty-updates main restricted universe multiverse" >> /etc/apt/sources.list
 ---> Running in ec3433db813e
 ---> 3fca0b605de4
Removing intermediate container ec3433db813e
Step 5 : RUN echo "deb http://mirrors.163.com/ubuntu/ trusty-proposed main restricted universe multiverse" >> /etc/apt/sources.list
 ---> Running in 4a0fe165598f
 ---> f6d1c7af36c8
Removing intermediate container 4a0fe165598f
Step 6 : RUN echo "deb http://mirrors.163.com/ubuntu/ trusty-backports main restricted universe multiverse" >> /etc/apt/sources.list
 ---> Running in 209179c21053
 ---> 0cda758c9f3c
Removing intermediate container 209179c21053
Step 7 : RUN apt-get update
 ---> Running in 1fd40eb66f7b
Ign http://archive.ubuntu.com trusty-proposed InRelease
Get:1 http://archive.ubuntu.com trusty-proposed Release.gpg [933 B]
Get:2 http://archive.ubuntu.com trusty-proposed Release [110 kB]
Get:3 http://archive.ubuntu.com trusty-proposed/main amd64 Packages [160 kB]
...
#为了节约篇幅,删去一些无关紧要的内容
Fetched 11.3 MB in 1min 37s (116 kB/s)
Reading package lists...
 ---> 0f132591eddc
Removing intermediate container 1fd40eb66f7b
Step 8 : RUN apt-get install -y openssh-server
 ---> Running in 399e4ea726d2
Reading package lists...
Building dependency tree...
Reading state information...
The following extra packages will be installed:
  ca-certificates krb5-locales libck-connector0 libedit2 libgssapi-krb5-2
  libidn11 libk5crypto3 libkeyutils1 libkrb5-3 libkrb5support0
  libpython-stdlib libpython2.7-minimal libpython2.7-stdlib libwrap0 libx11-6
  libx11-data libxau6 libxcb1 libxdmcp6 libxext6 libxmuu1 ncurses-term
  openssh-client openssh-sftp-server openssl python python-chardet
  python-minimal python-requests python-six python-urllib3 python2.7
  python2.7-minimal ssh-import-id tcpd wget xauth
Suggested packages:
  krb5-doc krb5-user ssh-askpass libpam-ssh keychain monkeysphere rssh
  molly-guard ufw python-doc python-tk python2.7-doc binutils binfmt-support
The following NEW packages will be installed:
  ca-certificates krb5-locales libck-connector0 libedit2 libgssapi-krb5-2
  libidn11 libk5crypto3 libkeyutils1 libkrb5-3 libkrb5support0
  libpython-stdlib libpython2.7-minimal libpython2.7-stdlib libwrap0 libx11-6
  libx11-data libxau6 libxcb1 libxdmcp6 libxext6 libxmuu1 ncurses-term
  openssh-client openssh-server openssh-sftp-server openssl python
  python-chardet python-minimal python-requests python-six python-urllib3
  python2.7 python2.7-minimal ssh-import-id tcpd wget xauth
0 upgraded, 38 newly installed, 0 to remove and 29 not upgraded.
Need to get 7599 kB of archives.
After this operation, 35.3 MB of additional disk space will be used.
Get:1 http://mirrors.163.com/ubuntu/ trusty/main libedit2 amd64 3.1-20130712-2 [86.7 kB]
...
Running hooks in /etc/ca-certificates/update.d....done.
Processing triggers for ureadahead (0.100.0-16) ...
 ---> 62f952643e33
Removing intermediate container 399e4ea726d2
Step 9 : RUN mkdir -p /var/run/sshd
 ---> Running in aa1c4d469284
 ---> e81557dd4887
Removing intermediate container aa1c4d469284
Step 10 : RUN mkdir -p /root/.ssh
 ---> Running in 0626987081d0
 ---> 23882ee06756
Removing intermediate container 0626987081d0
Step 11 : RUN sed -ri 's/session    required     pam_loginuid.so/#session    required     pam_loginuid.so/g' /etc/pam.d/sshd
 ---> Running in 3808c650bf85
 ---> 6c0ca1d20d7f
Removing intermediate container 3808c650bf85
Step 12 : ADD authorized_keys /root/.ssh/authorized_keys
 ---> a64bbd8ae617
Removing intermediate container 16e2d93d6ef0
Step 13 : ADD run.sh /run.sh
 ---> 230711022f7d
Removing intermediate container 137e56188d7b
Step 14 : RUN chmod 755 /run.sh
 ---> Running in a876e4ea378e
 ---> 32d74bbb7406
Removing intermediate container a876e4ea378e
Step 15 : EXPOSE 22
 ---> Running in eeaf9352ca11
 ---> 901e3fa9f596
Removing intermediate container eeaf9352ca11
Step 16 : CMD /run.sh
 ---> Running in 48c37db83ffb
 ---> 570c26a9de68
Removing intermediate container 48c37db83ffb
Successfully built 570c26a9de68
#最后,返回告诉我们创建成功,镜像 id 号是570c26a9de68,让我们来查看下
$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
sshd                dockerfile          570c26a9de68        4 minutes ago       246.5 MB
sshd                ubuntu              7aef2cd95fd0        12 hours ago        255.2 MB
busybox             latest              e72ac664f4f0        3 weeks ago         2.433 MB
ubuntu              14.04               ba5877dc9bec        3 months ago        192.7 MB
ubuntu              latest              ba5877dc9bec        3 months ago        192.7 MB

测试镜像,运行容器

我们使用刚才我们创建的 sshd:dockerfile 来运行一个容器,看看时候达到我们的要求。

$ sudo docker ps
#这是上一小节,我们用 ”commit“ 方式建立的容器
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                 NAMES
3ad7182aa47f        sshd:ubuntu         "/run.sh"           12 hours ago        Up 3 seconds        0.0.0.0:100->22/tcp   focused_ptolemy
$ sudo docker run -d -p 101:22 sshd:dockerfile
#注意到,跟上一小节运行的容器的命令不一样,不需要在输入命令‘/run.sh’了,因为已经在 Dockerfile 中定义了自启动命令。
890c04ff8d769b604386ba4475253ae8c21fc92d60083759afa77573bf4e8af1
$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                 NAMES
890c04ff8d76        sshd:dockerfile     "/run.sh"           4 seconds ago       Up 3 seconds        0.0.0.0:101->22/tcp   high_albattani
3ad7182aa47f        sshd:ubuntu         "/run.sh"           12 hours ago        Up 28 seconds       0.0.0.0:100->22/tcp   focused_ptolemy

在本地新开一个终端,连接到新建的容器

> ssh 192.168.1.200 -p 101
The authenticity of host '[192.168.1.200]:101 ([192.168.1.200]:101)' can't be established.
ECDSA key fingerprint is d1:59:f1:09:3b:09:79:6d:19:16:f4:fd:39:1b:be:27.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[192.168.1.200]:101' (ECDSA) to the list of known hosts.
Welcome to Ubuntu 14.04 LTS (GNU/Linux 3.2.0-37-generic x86_64)

 * Documentation:  https://help.ubuntu.com/

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@890c04ff8d76:~#
测试成功

linux基础命令

Linux常用命令大全

系统信息
arch 显示机器的处理器架构(1)
uname -m 显示机器的处理器架构(2)
uname -r 显示正在使用的内核版本
dmidecode -q 显示硬件系统部件 - (SMBIOS / DMI)
hdparm -i /dev/hda 罗列一个磁盘的架构特性
hdparm -tT /dev/sda 在磁盘上执行测试性读取操作
cat /proc/cpuinfo 显示CPU info的信息
cat /proc/interrupts 显示中断
cat /proc/meminfo 校验内存使用
cat /proc/swaps 显示哪些swap被使用
cat /proc/version 显示内核的版本
cat /proc/net/dev 显示网络适配器及统计
cat /proc/mounts 显示已加载的文件系统
lspci -tv 罗列 PCI 设备
lsusb -tv 显示 USB 设备
date 显示系统日期
cal 2007 显示2007年的日历表
date 041217002007.00 设置日期和时间 - 月日时分年.秒
clock -w 将时间修改保存到 BIOS

关机 (系统的关机、重启以及登出 )
shutdown -h now 关闭系统(1)
init 0 关闭系统(2)
telinit 0 关闭系统(3)
shutdown -h hours:minutes & 按预定时间关闭系统
shutdown -c 取消按预定时间关闭系统
shutdown -r now 重启(1)
reboot 重启(2)
logout 注销

文件和目录
cd /home 进入 '/ home' 目录'
cd .. 返回上一级目录
cd ../.. 返回上两级目录
cd 进入个人的主目录
cd ~user1 进入个人的主目录
cd - 返回上次所在的目录
pwd 显示工作路径
ls 查看目录中的文件
ls -F 查看目录中的文件
ls -l 显示文件和目录的详细资料
ls -a 显示隐藏文件
ls *[0-9]* 显示包含数字的文件名和目录名
tree 显示文件和目录由根目录开始的树形结构(1)
lstree 显示文件和目录由根目录开始的树形结构(2)
mkdir dir1 创建一个叫做 'dir1' 的目录'
mkdir dir1 dir2 同时创建两个目录
mkdir -p /tmp/dir1/dir2 创建一个目录树
rm -f file1 删除一个叫做 'file1' 的文件'
rmdir dir1 删除一个叫做 'dir1' 的目录'
rm -rf dir1 删除一个叫做 'dir1' 的目录并同时删除其内容
rm -rf dir1 dir2 同时删除两个目录及它们的内容
mv dir1 new_dir 重命名/移动 一个目录
cp file1 file2 复制一个文件
cp dir/* . 复制一个目录下的所有文件到当前工作目录
cp -a &#4......余下全文>>
 


相关内容