docker镜像的创建commit及dockerfile

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

docker镜像的创建commit及dockerfile
在docker 1.3版本以前使⽤attach进⼊容器会经常出现卡死的情况,之后官⽅退出了exec命令,从宿主机进⼊,但是从其他远程主机进⼊使⽤ssh服务来维护是⽤户熟悉的⽅法。

所以这⾥来创建⼀个带有ssh服务的镜像。

基于docker commit命令和dockerfile创建。

基于commit命令
commit命令格式为docker commit CONTAINER [REPOSITORY[:TAG]],⽤户提交对容器的修改,并⽣成新的镜像。

⾸先使⽤ubuntu镜像来创建⼀个容器,尝试使⽤ssh命令⽆效。

# docker run -it ubuntu /bin/bash
因为ubuntu官⽅镜像中没有软件包的缓存⽂件,使⽤apt-get update更新即可,也可以修改源来配置。

然后安装ssh。

# apt-get update
# apt-get install ssh -y
运⾏ssh需要⽬录/var/run/sshd存在,创建启动服务
# mkdir -p /var/run/sshd
# /usr/sbin/sshd -D &
然后可以看到已经运⾏,netstat命令可能也没有,安装即可apt-get install net-tools
此处还需要修改ssh服务的安全登录配置,取消pam登录限制,如下图注释即可。

然后复制需要登录的公钥信息(这⾥为本地主机)。

使⽤ssh-keygen可以⽣成。

复制id_rsa.pub的内容到容器中的/root/.ssh/authorized_keys
创建ssh服务执⾏⽂件,然后退出容器
# vim /run.sh
# chmod +x run.sh
使⽤docker commit保存修改的容器,然后运⾏
# docker commit CONTAINER ID ssh:ubuntu
# docker run -d -p :22 ssh:ubuntu /run.sh
最后可以在宿主机上通过随机⽣成的32779端⼝来访问登录容器了:
使⽤dockerfile创建镜像
创建⼀个⽬录sshd_ubuntu,分别创建⽂件如下:
authorized_keys⽂件内容同样的复制
# cat /root/.ssh/id_rsa.pub > authorized_keys
然后编写Dockerfile⽂件如下,源⾃⾏修改即可:
FROM ubuntu:latest
MAINTAINER from whychz@ by boss yan
RUN rm -rf /etc/apt/sources.list
RUN apt-get update
RUN apt-get install -y openssh-server
RUN mkdir -p /var/run/sshd
RUN mkdir -p /root/.ssh
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"]
然后使⽤docker build创建镜像。

最后的"."(点)表⽰当前⽬录中的Dockerfile
# docker build -t ubuntu:sshserver .
执⾏完成之后docker images查看镜像
最后运⾏容器,ssh测试是否成功
# docker run -d -p :22 ubuntu/sshserver --name ssh
# ssh 192.168.2.189 -p 32782 可以看到通过ssh已经进来了容器
Dockerfile介绍
Dockerfile是⼀个⽂本格式的配置⽂件,可以使⽤Dockerfile快速创建⾃定义的镜像。

基本结构
Dockerfile由⼀⾏⾏命令语句组成,⽀持#注释。

⼀般分为四个部分:基础镜像,维护者信息,镜像操作指令和容器启动时执⾏指令。

⼀开始必须指明所基于的镜像,接下来会说明维护者信息。

后⾯则是镜像的操作,⽐如RUN指令,每运⾏⼀条,镜像会添加新的⼀层,并提交。

最后是CMD指令,来指定运⾏容器时的操作命令。

指令
FROM
格式为 FROM <image>或 FROM <image>:tag。

指明所基于的镜像。

必须为第⼀条指令,如果在⼀个Dockerfile⽂件⾥创建多个镜像可多次使⽤,每个镜像⼀次。

MAINTAINER
格式为 MAINTAINER <name>,指定维护者信息
RUN
运⾏指定的命令
RUN命令有两种格式
1. RUN <command>
2. RUN ["executable", "param1", "param2"]
第⼀种后边直接跟shell命令,在linux操作系统上默认 /bin/sh -c。

第⼆种是类似于函数调⽤。

可将executable理解成为可执⾏⽂件,后⾯就是两个参数。

两种写法⽐对:
RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME
RUN ["/bin/bash", "-c", "echo hello"]
注意:多⾏命令不要写多个RUN,原因是Dockerfile中每⼀个指令都会建⽴⼀层。

多少个RUN就构建了多少层镜像,会造成镜像的臃肿、多层,不仅仅增加了构件部署的时间,还容易出错。

RUN书写时的换⾏符是\
CMD
容器启动时要运⾏的命令
语法有三种格式
1. CMD ["executable","param1","param2"] 使⽤exec执⾏,推荐⽅式
2. CMD ["param1","param2"] 提供给ENTRYPOINT默认参数
3. CMD command param1 param2 在/bin/sh中执⾏,提供需要交互的应⽤
举例说明两种写法:
CMD [ "sh", "-c", "echo $HOME"]
CMD [ "echo", "$HOME" ]
这⾥边包括参数的⼀定要⽤双引号,不能是单引号。

原因是参数传递后,docker解析的是⼀个JSON array。

每个dockerfile只能有⼀条CMD命令。

指定了多条就只有最后⼀条会被执⾏。

如果启动容器时候制定了运⾏的命令,则也会覆盖掉CMD指定的命令。

EXPOSE
格式为EXPOSE <port>[<port>...]
例如:EXPOSE 22 80 433
告诉docker服务器容器暴露的端⼝号
ENV
格式为ENV<key><value>
指定环境变量,会被后续的RUN指令使⽤,并在容器内保持运⾏
ADD
格式为<src><dest>
将指定的<src>到容器中的<dest>。

<src>可以是dockerfile所在⽬录的⼀个相对路径,可以是⼀个url,也可以是⼀个tar⽂件(⾃动解压为⽬录)
COPY
⼜是⼀个复制命令
语法如下:
1. COPY <src>... <dest>
2. COPY ["<src>",... "<dest>"]
与ADD的区别是COPY的<src>只能是本地⽂件,其他⽤法⼀致
ENTRYPOINT
格式为:
1. ENTRYPOINT ["executable", "param1", "param2"]
2. ENTRYPOINT command param1 param2
配置容器启动后执⾏的命令,不可被docker run覆盖。

每个Dockerfile中只能有⼀个ENTRTPOINT,指定多个时,只有最后⼀个⽣效。

VOLUME
格式为:
VOLUME ["/data"]
可实现挂载功能,可以将内地⽂件夹或者其他容器种得⽂件夹挂在到这个容器种
["/data"]可以是⼀个JsonArray ,也可以是多个值。

所以如下⼏种写法都是正确的
VOLUME ["/var/log/"]
VOLUME /var/log
VOLUME /var/log /var/db
⼀般的使⽤场景为需要持久化存储数据时
容器使⽤的是AUFS,这种⽂件系统不能持久化数据,当容器关闭后,所有的更改都会丢失,所以当数据需要持久化时⽤这个命令。

USER
设置启动容器的⽤户,可以是⽤户名或UID,下⾯的两种写法是正确的:
USER daemo
USER UID
如果设置了容器以daemon⽤户去运⾏,那么RUN, CMD 和 ENTRYPOINT 都会以这个⽤户去运⾏。

也可以在之前创建所需要的⽤户,如:RUN useradd user1,临时获取权限不推荐sudo⽽使⽤gosu。

WORKDIR
格式:WORKDIR /path/to/workdir
对后续的RUN,CMD,ENTRYPOINT,COPY,ADD配置⼯作⽬录。

如果不存在则会创建,也可以设置多次
如:
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
结果是/a/b/c
WORKDIR也可以解析环境变量
如:
ENV DIRPATH /path
WORKDIR $DIRPATH/$DIRNAME
RUN pwd
pwd的执⾏结果是/path/$DIRNAME
ONBUILD
格式:ONBUILD [INSTRUCTION]
这个命令只对当前镜像的⼦镜像⽣效。

⽐如当前镜像为A,在Dockerfile种添加:
ONBUILD RUN ls -al
这个 ls -al 命令不会在A镜像构建或启动的时候执⾏,但是如果有⼀个镜像B是基于A镜像构建的,那么这个ls -al 命令会在B镜像构建的时候
被执⾏。

镜像的创建
docker build [path],命令会读取指定路径下的Dockerfile,并将该路径下所有内容发送给Docker服务端,由服务端来创建镜像。

因此建议⼀般放置Dockerfile⽬录为空⽬录。

指定镜像的标签信息使⽤-t选项。

如上⾯例⼦的docker build -t ubuntu:sshserver .。

相关文档
最新文档