10.2 使用Dockerfile创建

在第一部分中笔者曾介绍过Dockerfile的基础知识,下面将介绍如何使用Dockerfile来创建一个支持SSH服务的镜像。

1.创建工作目录

首先,创建一个sshd_ubuntu工作目录:


  1. $ mkdir sshd_ubuntu
  2. $ ls
  3. sshd_ubuntu

在其中,创建Dockerfile和run.sh文件:


  1. $ cd sshd_ubuntu/
  2. $ touch Dockerfile run.sh
  3. $ ls
  4. Dockerfile run.sh

2.编写run.sh脚本和authorized_keys文件

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


  1. #!/bin/bash
  2. /usr/sbin/sshd -D

在宿主主机上生成SSH密钥对,并创建authorized_keys文件:


  1. $ ssh-keygen -t rsa
  2. ...
  3. $ cat ~/.ssh/id_rsa.pub >authorized_keys

3.编写Dockerfile

下面是Dockerfile的内容及各部分的注释,可以对比上一节中利用docker commit命令创建镜像过程,所进行的操作基本一致:


  1. #设置继承镜像
  2. FROM ubuntu:14.04
  3. #提供一些作者的信息
  4. MAINTAINER docker_user (user@docker.com)
  5. #下面开始运行更新命令
  6. RUN apt-get update
  7. #安装ssh服务
  8. RUN apt-get install -y openssh-server
  9. RUN mkdir -p /var/run/sshd
  10. RUN mkdir -p /root/.ssh
  11. #取消pam限制
  12. RUN sed -ri 's/session required pam_loginuid.so/#session required
  13. pam_loginuid.so/g' /etc/pam.d/sshd
  14. #复制配置文件到相应位置,并赋予脚本可执行权限
  15. ADD authorized_keys /root/.ssh/authorized_keys
  16. ADD run.sh /run.sh
  17. RUN chmod 755 /run.sh
  18. #开放端口
  19. EXPOSE 22
  20. #设置自启动命令
  21. CMD ["/run.sh"]

4.创建镜像

在sshd_ubuntu目录下,使用docker build命令来创建镜像。这里需要注意最后还有一个“.”,表示使用当前目录中的Dockerfile:


  1. $ cd sshd_ubuntu
  2. $ docker build -t sshd:Dockerfile .

如果读者使用Dockerfile创建自定义镜像,那么需要注意的是Docker会自动删除中间临时创建的层,还需要注意每一步的操作和编写的Dockerfile中命令的对应关系。

命令执行完毕后,如果读者可见“Successfully built XXX”字样,则说明镜像创建成功。可以看到,以上命令生成的镜像ID是570c26a9de68。

在本地查看sshd:Dockerfile镜像已存在:


  1. $ docker images
  2. REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
  3. sshd Dockerfile 570c26a9de68 4 minutes ago 246.5 MB
  4. sshd ubuntu 7aef2cd95fd0 12 hours ago 255.2 MB
  5. busybox latest e72ac664f4f0 3 weeks ago 2.433 MB
  6. ubuntu 14.04 ba5877dc9bec 3 months ago 192.7 MB
  7. ubuntu latest ba5877dc9bec 3 months ago 192.7 MB

5.测试镜像,运行容器

使用刚才创建的sshd:Dockerfile镜像来运行一个容器。

直接启动镜像,映射容器的22端口到本地的10122端口:


  1. $ docker run -d -p 10122:22 sshd:Dockerfile
  2. 890c04ff8d769b604386ba4475253ae8c21fc92d60083759afa77573bf4e8af1
  3. $ docker ps
  4. CONTAINER ID IMAGE COMMAND CREATED
  5. STATUS PORTS NAMES
  6. 890c04ff8d76 sshd:Dockerfile "/run.sh" 4 seconds ago
  7. Up 3 seconds 0.0.0.0:10122->22/tcp high_albattani

在宿主主机新打开一个终端,连接到新建的容器:


  1. $ ssh 192.168.1.200 -p 10122
  2. root@890c04ff8d76:~#

效果与上一小节一致,镜像创建成功。