10.2 使用Dockerfile创建
在第一部分中笔者曾介绍过Dockerfile的基础知识,下面将介绍如何使用Dockerfile来创建一个支持SSH服务的镜像。
1.创建工作目录
首先,创建一个sshd_ubuntu工作目录:
- $ mkdir sshd_ubuntu
- $ ls
- sshd_ubuntu
在其中,创建Dockerfile和run.sh文件:
- $ cd sshd_ubuntu/
- $ touch Dockerfile run.sh
- $ ls
- Dockerfile run.sh
2.编写run.sh脚本和authorized_keys文件
脚本文件run.sh的内容与上一小节中一致:
- #!/bin/bash
- /usr/sbin/sshd -D
在宿主主机上生成SSH密钥对,并创建authorized_keys文件:
- $ ssh-keygen -t rsa
- ...
- $ cat ~/.ssh/id_rsa.pub >authorized_keys
3.编写Dockerfile
下面是Dockerfile的内容及各部分的注释,可以对比上一节中利用docker commit命令创建镜像过程,所进行的操作基本一致:
- #设置继承镜像
- FROM ubuntu:14.04
- #提供一些作者的信息
- MAINTAINER docker_user (user@docker.com)
- #下面开始运行更新命令
- 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"]
4.创建镜像
在sshd_ubuntu目录下,使用docker build命令来创建镜像。这里需要注意最后还有一个“.”,表示使用当前目录中的Dockerfile:
- $ cd sshd_ubuntu
- $ docker build -t sshd:Dockerfile .
如果读者使用Dockerfile创建自定义镜像,那么需要注意的是Docker会自动删除中间临时创建的层,还需要注意每一步的操作和编写的Dockerfile中命令的对应关系。
命令执行完毕后,如果读者可见“Successfully built XXX”字样,则说明镜像创建成功。可以看到,以上命令生成的镜像ID是570c26a9de68。
在本地查看sshd:Dockerfile镜像已存在:
- $ 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
5.测试镜像,运行容器
使用刚才创建的sshd:Dockerfile镜像来运行一个容器。
直接启动镜像,映射容器的22端口到本地的10122端口:
- $ docker run -d -p 10122:22 sshd:Dockerfile
- 890c04ff8d769b604386ba4475253ae8c21fc92d60083759afa77573bf4e8af1
- $ 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:10122->22/tcp high_albattani
在宿主主机新打开一个终端,连接到新建的容器:
- $ ssh 192.168.1.200 -p 10122
- root@890c04ff8d76:~#
效果与上一小节一致,镜像创建成功。
