docker镜像

创建镜像

镜像概述
docker镜像是docker容器技术的核心,也是应用打包构建发布的标准格式。一个完整的镜像可以支撑多个容器的运行。

镜像构建方式

  • 基于已有的容器创建镜像
  • 基于本地模板创建镜像
  • 基于dockerfile创建镜像

镜像构建

  • 基于已有容器创建镜像 好比于一个容器的导入与导出
    基于现有镜像创建主要使用docker commit 命令,也就是将一个容器里运行的程序以及环境打包成一个新的镜像
    格式:docker commit (选项) 容器 ID/名称 仓库名称:[标签]

    -m:说明信息
    -a:作者信息
    -p:生成过程中停止容器的运行

    [root@localhost ~]# docker run -it centos:7 /bin/bash  #启动并进入容器
    [root@94ae368b757b /]# touch whml  创建一个文件
    [root@localhost ~]# docker commit -m "whml test images" -a "whml" 94ae368b757b centos:new
    -m :说明信息
    -a :作者  
    #打包成一个名字叫做centos:new的镜像
    [root@localhost ~]# docker images
    REPOSITORY   TAG       IMAGE ID       CREATED              SIZE
    centos       new       4eedfa364e2a   About a minute ago   589MB
    [root@localhost ~]# docker run -it centos:new /bin/bash
    [root@672f7166243b /]# ls
    whml
    
  • 基于本地模板导入镜像
    也就是别人导出一个新的镜像,自己在导入使用

  • 基于Dockerfile创建镜像
    Docker镜像结构:镜像是由多层堆叠构成的(可以使用命令docker history 镜像:标签来查看),Docker镜像默认存储在/var/lib/docker/目录中。容器其实就是在镜像最上面加了一层读写层。

    docker 镜像特点:

    • dockerfile中的每一个指令都会创建一个新的镜像层
    • 镜像层可以被缓存和复用,类似于快照
    • 当Dockerfile中的指令被修改,复制的文件变化或者构建镜像时指定的变量更换,那对应的镜像层换粗也将会失效
    • 某一层的镜像缓存失效,后面所有的镜像缓存层都会失效
    • 镜像层是不可变的,如果某一层中添加一个文件,然后某一层中删除它,则镜像中依然会包含该文件,只是这个文件在docker容器中不可见了

    dockerfile介绍:
    Dockerfile是一种可以被Docker程序解释的脚本,由多条指令堆叠组成,每条指令都对应linux下的一条命令。
    Dockerfile结构:基础镜像信息,维护者信息,镜像操作,容器启动执行指令

    Dockerfile详解

    • Dockerfile 的指令根据作用分为:构建指令:构建生成镜像中使用的,不会在image容器上执行,设置指令:设置image属性。

    • from 镜像:Tag
      构建指令,必须指定且需要在dockerfile文件中其他指令的前面,后续的指令都依赖于改指令指定的image,from指令指定的基础image可以是官方远程仓库中的,也可以位于本地仓库

    • MAINYAINER 作者信息
      执行docker inspect可以查看

    • RUN指令
      run可以运行任何被基础image支持的命令。

    • CMD[“要运行的程序”,“参数1”,“参数2”]
      设置指令,容器启动时要执行的操作,只能在文件中存在一次,多条只执行最后一条

    • ENTRYPOINT(设置container启动执行的操作)
      设置指令,指定容器启动时执行的命令,可以多次所设置,但只有最后一个有效。

    • USER 用户名/UID
      设置指令,设置启动容器的用户,默认是root

    • EXPOSE端口(暴露端口)

    • ENV环境变量,变量值
      在image中设置一个环境变量,可以通过docker inspect 查看 或者docker run --env key=value 设置修改环境变量

    • Copy 源文件 目标文件
      copy命令用于将于Dockerfile所在目录中的文件在镜像构建阶段从宿主机拷贝到镜像中,可以将文件直接复制到镜像中,将目录中的内容复制到镜像中不包括目录

    • ADD源文件 目标文件
      更高级的复制,相对于copy,可以压缩文件并把它们添加到镜像中,还可以从URL拷贝文件到镜像中,但是会创建更多的镜像层,镜像的size会更大。

    • Volume ["目录"]
      关联数据卷的

    • workdir
      设置指令相当于cd命令。

    • onbuild命令
      指定一所生产的镜像作为一个基础镜像时所要运行的命令

    • HealthCheck
      健康检查
      https://www.cnblogs.com/ityouknow/p/8595384.html

    • Dockerfile构建SSHD镜像(包含ssh服务,包括密钥对连接)
      基于Dockerfile制作镜像,首先要建立工作目录,然后创建Dockerfile文件,需要运行的脚本,以及要复制到容器中的文件

      docker images  #查看已有镜像
      mkdir sshd    #创建一个新的目录
      ssh-keygen    #创意一个密钥对
      cp .ssh/id_rsa.pud sshd/  #将密钥对复制到目录中
      cd sshd  
      vim Dockerfile  #目录中写入Dockerfile
      ls
      Dockerfile id_rsa.pud    #查看目录内容
      docker build -t sshd.new .   #.在当前目录执行这条命令
      docker images sshd:new  #查看创建的镜像
      docker run -p -d 2222:22 --name sshd-test --restart=always sshd:new  #启动这个镜像容器,并赋值端口
      netstat -lnpt | grep :22  #查看镜像端口
      ssh localhost -p 2222  #用ssh连接本机localhost端口2222并进入,因为有密钥
      
  • Dockerfile构建httpd镜像

    #开局都是要创建一个新的目录,在目录里创建一个新的Dockerfile文件
    docker build -t sshd.new .
    #主要是Dockerfile文件内容
    
sshd.Dockerfile
#基于镜像
FROM centos:7

#镜像作者信息
MAINTAINER whml<whml@163.com>

#安装相关依赖包
RUN yum -y install openssh-server net-tools openssh-devel lsof telnet

#开始安装
RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config
RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
ADD id_rsa.pud /root/.ssh/authorized_keys

RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

#打开暴露端口
EXPOSE 22

#启动
CMD ["/usr/sbin/sshd" , "-D"]

  • 基于Dockerfile创建mysql
  • 基于Dockerfile创建Tomcat
  • 基于Dockerfile创建nginx
    ...
原文地址:https://www.cnblogs.com/wml3030/p/15458745.html