创建新的镜像的有三种方式,一种是在原来的镜像基础上进行commit的修改产生新的镜像,一种是导入模版,还有一种就是通过dockerfile文件生成。
下面是一个基于dockerfile生成含有ssh服务的实例:
dockerfile脚本:
#设置要使用的镜像(必填) FROM ubuntu:16.04 #作者的信息(非必填) MAINTAINER callmelx
#运行命令,在镜像加载的时候 RUN apt-get update
#安装ssh服务 RUN apt-get install -y openssh-server RUN mkdir -p /var/run/sshd RUN mkdir -p /var/run/.ssh #取消pam限制:注释session reuired pam_loginuid.so/ RUN sed -ri 's/session reuired pam_loginuid.so/#session required pam_loginuid.so/g' /etc/pam.d/sshd
#将本地的公钥载入容器中。。。
宿主机的公钥生成:
ssh-keygen -t rsa echo ~/.ssh/id_rsa.pub>>authorized_keys
编写run.sh脚本
run.sh
#!/bin/bash
/usr/sbin/sshd -D
继续上面的dockerfile的编写
#将本地宿主机的公钥导入容器 :ADD 【宿主机目录地址】 【容器目录地址】 ADD authorized_keys /root/.ssh/authorized_keys #增加自启动脚本 ADD run.sh /run.sh #开放22端口 EXPOSE 22 #设置开机自动启动,如果指定命令的话cmd中的命令会被覆盖 CMD ["/run.sh"] #注意这里是双引号,否则不起作用。
创建镜像:
docker build -t ssh:dockerfile(自定义镜像名) .
.表示当前目录下的dockerfile,build的后面必须是文件夹也就是 "."
进行add命令的时候,需要加载的文件放到dockerfile的文件夹内,外部文件无法访问,dockerfile在加载文件时,现在当前文件夹中查找文件,如果没有回到/var/lib/docker/tmp/ 中查找
运行ssh服务
docker run -d -p 10023:22 ssh:dockerfile
解释一下dockerfile中的指令:
FROM: 第一行必须指定的基础镜像
MAINTAINER: 维护者信息
RUN:镜像的操作指令一种是以shell的方式运行,也可以指定终端
ADD:将宿主机中的文件加载到容器中。跟COPY类似
EXPOSE:告诉docker服务暴露的端口号
CMD:容器启动时运行的指令,每个dockerfile只能有一个cmd,如果后多条,最后一条生效。
建议:建议每次新建dockerfile的时候,最好新建一个文件夹,将所有需要加载的文件都放到该文件目录下。