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@ubuntu.com by boss yan
RUN rm -rf /etc/apt/sources.list
RUN echo 'deb-src http://archive.ubuntu.com/ubuntu xenial main restricted' >> /etc/apt/sources.list
RUN echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted' >> /etc/apt/sources.list
RUN echo 'deb-src http://mirrors.aliyun.com/ubuntu/ xenial main restricted multiverse universe' >> /etc/apt/sources.list
RUN echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted' >> /etc/apt/sources.list
RUN echo 'deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted multiverse universe' >> /etc/apt/sources.list
RUN echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial universe' >> /etc/apt/sources.list
RUN echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe' >> /etc/apt/sources.list
RUN echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial multiverse' >> /etc/apt/sources.list
RUN echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial-updates multiverse' >> /etc/apt/sources.list
RUN echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse' >> /etc/apt/sources.list
RUN echo 'deb-src http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse' >> /etc/apt/sources.list
RUN echo 'deb http://archive.canonical.com/ubuntu xenial partner' >> /etc/apt/sources.list
RUN echo 'deb-src http://archive.canonical.com/ubuntu xenial partner' >> /etc/apt/sources.list
RUN echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted' >> /etc/apt/sources.list
RUN echo 'deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted multiverse universe' >> /etc/apt/sources.list
RUN echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe' >> /etc/apt/sources.list
RUN echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial-security multiverse' >> /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 .
docker镜像的创建commit及dockerfile的更多相关文章
- docker镜像的创建
获得更多资料欢迎进入我的网站或者 csdn或者博客园 昨天讲解了docker的安装与基本使用,今天给大家讲解下docker镜像的创建的方法,以及push到Docker Hub docker安装请点击右 ...
- docker镜像的创建方法docker file方式
什么是docker file文件? 简单来说,docker file文件就是一个命令文本集合,容来记录创建docker镜像的步骤 快速入门: 1.新建一个docker file文件dockerfile ...
- docker镜像的创建方法docker commit方式
Docker 提供了两种构建镜像的方法: docker commit 命令(交互式修改创建) Dockerfile 构建文件 (文本命令定义) Docker commit方法: 1.运行一个现有容器 ...
- Docker镜像的创建、存出、载入
创建镜像的方法有三种:基于已有镜像的容器创建.基于本地模板导入.基于Dockerfile创建,本博文讲解前两种. 基于已有镜像的容器创建 该方法是使用docker commit命令,其命令格式为: ...
- Docker镜像提交命令commit的工作原理和使用方法
在本地创建一个容器后,可以依据这个容器创建本地镜像,并可把这个镜像推送到Docker hub中,以便在网络上下载使用. 下面我们来动手实践. docker pull nginx:1.15.3 用命令行 ...
- 创建Python数据分析的Docker镜像+Docker自定义镜像commit,Dockerfile方式解析+pull,push,rmi操作
实例解析Docker如何通过commit,Dockerfile两种方式自定义Dcoker镜像,对自定义镜像的pull,push,rmi等常用操作,通过实例创建一个Python数据分析开发环境的Dock ...
- Docker镜像与仓库(二)Dockerfile
Docker镜像文件与仓库(二) Docker镜像文件与仓库(二) Dockerfile指令 Dockerfile格式: 1.#Comment注释2.INSTRUCTION大写的指令名 argumen ...
- 使用Dockerfile制作自己的Docker镜像
一.背景 一直以来的开发流程都是先从Docker Hub中获取到基础镜像,之后在这个镜像的基础上做开发,以满足一定的需求或者提供某种服务,并由此产生新的镜像,然后就可以push到Docker Hub中 ...
- 创建超小的Golang docker 镜像
原文: http://colobu.com/2015/10/12/create-minimal-golang-docker-images/ 本文对于创建超小的镜像非常有用 Docker是PaaS供应商 ...
随机推荐
- 微信小程序 封装请求
在写小程序的时候,每个JS文件都一大堆的请求,看得自己都眼花缭乱,下面看一下怎么对请求方法进行封装. 1,方法封装,在util文件夹下新建文件,创建request.js文件,工具文件,用于对方法封装) ...
- GIS性能策略
当一个地理平台上线运行,我们经常会遇到这些问题:1.系统刚上线时速度较快,一段时间后访问较慢?2.在地理平台目前的配置下,发布多少个服务才合理?一个服务配置多少个实例数才合适?这些问题,都涉及整个地理 ...
- JMeter JMeter远程分布式联机性能测试
JMeter远程分布式联机性能测试 by:授客 QQ:1033553122 测试环境 apache-jmeter-2.13 Java JDK版本:1.8 1. JMeter分布式测试简介 当一个 ...
- unicode编码和utf8编码的区别
编码格式不同在数据的传输和显示会有很大的影响.最近在使用的过程中发现一些网络文件 传输的编码格式问题,会影响文件的正常传输,于是查看了一下网上的资料,自己也写一篇 小总结. uicode是万国码,用1 ...
- vue axios 与 FormData 结合 提交文件 上传文件
---再利用Vue.axios.FormData做上传文件时,遇到一个问题,后台虽然接收到请求,但是将文件类型识别成了字符串,所以,web端一直报500,结果是自己大意了. 1.因为使用了new F ...
- mybatis学习系列二
1 参数处理(封装map过程)(23) 1.1)F5进入断点:Employee employee1=mapper.selectEmployeeByMap(map); 1.2)进入MapperProxy ...
- Unity3D开发之3D按钮的声音播放
这里我们首先就简易的制作一个非常简单的3D按钮![ 图中就一个cube 加个3DText,然后我们就编写代码 [RequireComponent(typeof(CompoundButton))]//特 ...
- [20171124]bbed的使用问题2.txt
[20171124]bbed的使用问题2.txt --//bbed 是探究oracle数据块的好工具,有时候不用转储,直接可以它看oracle内部块的内部结构.--//在使用中要注意一些问题,昨天又犯 ...
- Derek解读Bytom源码-持久化存储LevelDB
作者:Derek 简介 Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockchain/bytom ...
- MD5生成
/// <summary> /// 32位MD5加密 /// </summary> /// <param name="input"></p ...