docker随笔5---dockfile

创建新的镜像的有三种方式,一种是在原来的镜像基础上进行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的时候,最好新建一个文件夹,将所有需要加载的文件都放到该文件目录下。

原文地址:https://www.cnblogs.com/callmelx/p/11040438.html