使用Docker镜像和仓库

一、镜像的简单使用  
  查看使用过的镜像
    docker images
    基础镜像是存在与Docker是Registory仓库的(仓库名称未Docker hub,类似于Github),镜像是聚合存在的,如ubuntu镜像内,存在各个版本的ubuntu镜像,现在宿主机内已经有Ubuntu的latest镜像,下面拉取12.04版本的ubuntu镜像验证镜像是聚合的。
    docker pull ubuntu:12.04
    
    每个镜像有一个标签,例如上面提到的12.04就是一个标签,可以使用      镜像:标签        的形式指定一个镜像,如果不指定,默认使用最新的镜像。
    使用指定标签的镜像:docker run -t -i --name lcl1 ubuntu:12.04 /bin/basn
    
    查看Docker Hub上的公共镜像(以查找mysql镜像为例)
    说明:查到到的镜像有NAME(镜像名称)、DESCRIPTION(描述)、STARS(星,星越高,欢迎度越高,类似GitHub的Stars)、OFFICIAL(是否官方提供)、AUTOMATED(是否Docker Hub自动构建的)
    docker search mysql
    
    
二、构建镜像
    (一)、commit构建(不推荐使用)
    1、首先创建Docker Hub账号,用于共享和发布镜像
    2、注册完毕后,使用docker login 登陆docker  (退出可以使用docker logout)
  
    3、使用commit命令创建镜像
    先创建一个容器(docker run -i -t ubuntu /bin/bash
    然后再容器内安装Apache(apt-get  -yqq update         apt-get -y install apache2
    最后使用commit提交镜像(docker commit 565774155eab lcl1988/apache2
    查看新提交的镜像(docker images lcl1988/apache2
    
    可以对commit增加更丰富的属性信息:docker commit -m "lcl de xin jingXiang" -a "lcl1988" 565774155eab lcl1988/apache2:webServer  (其中,-m是提交信息,-a是作者名称, :后跟的webserver是新镜像的标签)
    可以使用inspect查看提交镜像的详细信息:docker inspect lcl1988/apache2:webServer
    
    4、使用新创近的镜像运行一个容器: docker run -t -i lcl1988/apache2:webServer /bin/bash  下图可以说明,已运行成功。
    
 
(二)Dockerfile构建(推荐使用,原因:该种方式更具备可重复性、透明性及幂等性)
    创建一个文件夹,创建一个新文件作为dockerfile文件(创建docker镜像时加载)
    
    vim新创建的dockerfile文件,加入需要运行的内容
    说明:a、所有的关键字都需要大写    b、必须要有FROM的基础镜像语句  c、每个RUN命令执行成功都会创建一个镜像,后续的镜像都是再上一层镜像的基础上运行的
    以下命令的解释,先使用#加了一行注释,使用FROM语句做基础镜像,MAINTAINER描述作者名称及邮箱,RUN命令构建镜像(第一个RUN安装ngnix,第二个RUN为nginx创建一个index页面并未页面增加输出),最后开放80端口。
    备注:其中安装nginx的语句可以替换为RUN ["apt-get","install","-y","nginx"],就是把所有的参数都放在【】中,避免shell被篡改的危险。
    
   基于dockerfile创建新镜像: docker build -t="lcl1988/nginx2" .
      
    可以为镜像设置标签
      
    查看新创建的镜像:docker images lcl1988/nginx2
    
    查看一个镜像的构建流程:docker history 7069eab1f6ba
    
 
三、从新镜像启动容器
    启动新容器:docker run -d -p 127.0.0.1:12345:80 --name lclcontains lcl1988/nginx2:v1 nginx -g "daemon off;"
    命令说明:红色IP可以省略,如果省略,默认映射的是本机(127.0.0.1),也可以指定映射指定IP的宿主机。
                    绿色端口可以省略,如果不省略,则使用指定的宿主机端口与docker的指定端口做映射,如果省略,则docker可以再宿主机上选择一个32768~61000的端口与开放端口映射
                    -d,以分离的方式运行;-p,需要向宿主机公开哪些端口
    例如:不指定IP与宿主机端口:docker run -d -p 80 --name lclcontains lcl1988/nginx2:v1 nginx -g "daemon off;"
              指定端口12345:docker run -d -p 12345:80 --name lclcontains1 lcl1988/nginx2:v1 nginx -g "daemon off;"
              指定本机的23456端口:docker run -d -p 127.0.0.1:23456:80 --name lclcontains2 lcl1988/nginx2:v1 nginx -g "daemon off;"
    
    查看docker端口映射:docker ps -l (下图可见80端口与宿主机的32768端口映射)
    
    也可以直接查看固定的端口映射(类似精确查看,可以使用port命令,port后可以跟容器ID,也可以跟容器名称):docker port 81a59b420b01 80
    
    还有一个更猛更简捷的参数 -P(上面是小写,这里是大写),使用该参数,无需指定暴露的端口,再dockerfile文件中使用EXPOSE指令公开的端口都会被暴露再宿主机上。
    docker run -d -P --name lclcontains3 lcl1988/nginx2:v1 nginx -g "daemon off;"
    
    有了上述文件的映射,就可以再宿主机上去访问:curl localhost:12345
    
    五、dockerFile命令
    在dockerfile内可以设置很多指令,例如:CMD、ENTRYPOINT、WORKDIR、EVN、USER、VOLUME、ADD、COPY、LABEL、STOPSIGNAL、ARG、ONBUILD
    接下来逐一说明每个命令的作用及用法
    1、CMD:指定容器启动时需要执行的命令,用法:CMD ["bin/true"]  特殊说明:run命令会覆盖CMD命令
    
    如果运行时使用了命令,则CMD中指定的命令就会被覆盖:
    
    2、ENTRYPOINT:作用与CMD一致,区别:ENTRYPOINT的命令不会被覆盖,如果运行时有命令,两者的命令都会被执行
    3、WORKDIR:指定工作目录
    
    4、ENV:设置环境变量
    
    5、VOLUME:添加一个卷
    6、ADD:将构建目录的文件复制到新的镜像中,复制的内容可以时本地的文件,也可以时通过URL获取的网络上其他地址的文件
    7、COPY:作用同ADD,区别:COPY只操作本地文件,而ADD可以操作url地址中的对应的文件
    8、LABEL:可以添加元数据(使用键值对的形式,为镜像添加说明,例:LABEL version="1.0"),同一个LABEL标签可以写多个键值对,多个键值对用空格区分,尽量不要用多个LABEL,因为多个LABEL会创建多个镜像
    9、STOPSIGNAL:用来设置停止容器时发送什么系统调用信号给容器,此处提别说明,该信号必须时内核系统中合法的数字,例如9,或者时SIGNAME格式中的信号名称。
    10、ARG:用来定义可以在build命令运行时传递给构建运行时的命令
    11、ONBUILD:添加触发器
六、将镜像推送到Docker Hub
    docker tag lclnginx lcl1988/nginx2   此处有两点需要注意,第一,必须要闲使用docker login进行登陆,否则会报错;第二,上传时必须使用a/b的格式,具体原因可以查看docker镜像命名规则(没有/的镜像是基础镜像,私人上传的镜像必须是有/)。
    
    可以登陆Docker Hub查看是否已上传成功
    
        除了通过push命令推送镜像外,还可以在Docker Hub连接Git Hub做自动化构建上传镜像,该功能后续说明。
        删除镜像:docker rmi lcl1988/cmdtest:v1   此处可以删除多个镜像,多个镜像以空格区分,同样的,可以使用docker rmi $(docker images -a -q)删除全部
            说明:删除镜像时,一定要确保没有容器在使用这个镜像,否则会报错。
        
    运行私有Docker Registry
    运行基于容器的registry: docker run -p 5000:5000 registry:2
    查看容器: docker images lcl1988/nginx2
    使用新的registry为镜像打标:docker tag 7069eab1f6ba docker.lcl1988.com:5000/lcl1988/nginx2
    将镜像推送到新registry:docker push docker.lcl1988.com:5000/lcl1988/nginx2
    说明:需要使用Docker公司开源的代码,构建自己的Docker registry (下述截图中报错就是因为不存在自己搭建的registry)
    
    
posted @ 2019-09-27 10:07  李聪龙  阅读(522)  评论(0编辑  收藏  举报