zoukankan      html  css  js  c++  java
  • Docker镜像与仓库(四)

    Dockerfile方式创建镜像
    https://hub.docker.com/_/centos/ #找一个centos6.6 的dockerfile链接
    [root@linux-node1 ~]# wget https://github.com/CentOS/sig-cloud-instance-images/blob/8911843d9a6cc71aadd81e491f94618aded94f30/docker/Dockerfile 
    
    [root@linux-node1 ~]# mkdir docker
    [root@linux-node1 ~]# mv Dockerfile docker
    [root@linux-node1 ~]# cd docker
    [root@linux-node1 docker]# echo > Dockerfile 
    [root@linux-node1 docker]# cat Dockerfile 
    #This is dockerfile for nginx
    
    #基础镜像
    FROM centos
    #维护者信息
    MAINTAINER zsq zsq@qq.com
    #相关操作
    RUN rpm -ivh https://mirrors.aliyun.com/epel/7/x86_64/Packages/e/epel-release-7-11.noarch.rpm
    RUN yum install nginx -y
    #添加文件
    ADD index.html /usr/share/nginx/html/index.html
    #参数
    RUN echo "daemon off;" >>/etc/nginx/nginx.conf
    #设置开放端口
    EXPOSE 80
    #执行命令
    CMD ["nginx"]
    
    #ADD index.html 这个文件需要我们在当前目录下有才可以,我们配置我们可以准备好,然后使用ADD命令进行添加或修改
    
    [root@linux-node1 docker]# touch index.html
    
    [root@linux-node1 docker]# cat index.html 
    <h1>This is test page</h1>
    
    [root@linux-node1 docker]# docker build -t w787815/nginx /root/docker/ #使用docker build进行构建
    
    [root@linux-node1 docker]# docker run -it --rm  w787815/nginx bash
    [root@44c794f53ef1 /]# nginx
    
    [root@linux-node1 docker]# curl 192.168.158.2
    <h1>This is test page<h1>

    Dockerfile参数解释

    FROM
    
    格式:FROM<image>或FROM<image>:<tag>。
    解释:FROM是Dockerfile里的第一条指令(必须是),后面跟有效的镜像名(如果该镜像你的本地仓库没有则会从远程仓库Pull取)。然后后面的其它指令FROM的镜像中执行。
    
    MAINTAINER
    
    格式:MAINTAINER <name>
    解释:指定维护者信息。
    
    RUN
    
    格式:RUN <command>或 RUN["executable", "param1", "param2"]。
    解释:运行命令,命令较长使可以使用来换行。推荐使用上面数组的格式
    
    CMD
    
    格式:
    CMD ["executable","param1","param2"] 使用 exec 执行,推荐方式;
    CMD command param1 param2 在 /bin/sh 中执行,提供给需要交互的应用;
    CMD ["param1","param2"] 提供给ENTRYPOINT的默认参数;
    解释: 
    CMD指定容器启动是执行的命令,每个Dockerfile只能有一条CMD命令,如果指定了多条,只有最后一条会被执行。如果你在启动容器的时候也指定的命令,那么会覆盖Dockerfile构建的镜像里面的CMD命令。
    
    ENTRYPOINT
    
    格式:
       ENTRYPOINT ["executable", "param1","param2"]
       ENTRYPOINT command param1 param2(shell中执行)。
    解释:和CMD类似都是配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。 
      每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效。ENTRYPOINT没有CMD的可替换特性,也就是你启动容器的时候增加运行的命令不会覆盖ENTRYPOINT指定的命令。 
     所以生产实践中我们可以同时使用ENTRYPOINT和CMD, 
    例如:
    
    ENTRYPOINT ["/usr/bin/rethinkdb"]
    CMD ["--help"]
    USER
    
    格式:USER daemon
    解释:指定运行容器时的用户名和UID,后续的RUN指令也会使用这里指定的用户。
    
    EXPOSE
    
    格式:EXPOSE<port> [<port>...]
    解释:设置Docker容器内部暴露的端口号,如果需要外部访问,还需要启动容器时增加-p或者-P参数进行分配。
    
    ENV
    
    格式:ENV<key> <value>
    ENV <key>=<value> ...
    解释:设置环境变量,可以在RUN之前使用,然后RUN命令时调用,容器启动时这些环境变量都会被指定
    
    ADD
    
    格式:
       ADD <src>... <dest>
    ADD ["<src>",... "<dest>"]
    解释:将指定的<src>复制到容器文件系统中的<dest> 
    所有拷贝到container中的文件和文件夹权限为0755,uid和gid为0 
    如果文件是可识别的压缩格式,则docker会帮忙解压缩
    
    VOLUME
    
    格式:VOLUME ["/data"]
    解释:可以将本地文件夹或者其他container的文件夹挂载到container中。
    
    WORKDIR
    
    格式:WORKDIR/path/to/workdir
    解释:切换目录,为后续的RUN、CMD、ENTRYPOINT 指令配置工作目录。 
    可以多次切换(相当于cd命令), 
     也可以使用多个WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。例如
    
    WORKDIR /a
    WORKDIR b
    WORKDIR c
    RUN pwd
    则最终路径为 /a/b/c。
    ONBUILD 
    ONBUILD 指定的命令在构建镜像时并不执行,而是在它的子镜像中执行
    
    ARG
    
    格式:ARG<name>[=<default value>]
    解释:ARG指定了一个变量在docker build的时候使用,可以使用--build-arg <varname>=<value>来指定参数的值,不过如果构建的时候不指定就会报错。
    View Code
    Docker仓库
    Docker的仓库是DockerHub,类似于github,github有一个开源的软件叫gitlab。Docker也有一个开源软件docker registry
    
    [root@linux-node1 ~]# docker pull registry #pull registry镜像
    
    [root@linux-node1 opt]# cd
    [root@linux-node1 ~]# cd /opt/
    [root@linux-node1 opt]# rm -rf *

    #提升安全、我们做一个认证
    [root@linux-node1 opt]# mkdir auth [root@linux-node1 opt]# docker run --entrypoint htpasswd registry:2 -Bbn w787815 zhou.shu2 > auth/htpasswd [root@linux-node1 opt]# cat auth/htpasswd #密码是加密的 w787815:$2y$05$f0AV12yb8AikVTTDlymMgu5r9yZCiMiVe2btRieYUL2dzbQ6M8BT2 #默认是5000端口
    #把本机的6000端口映射到5000
    #
    --restart=always #docker server重启、容器跟着一起启动
    #-v #挂载到容器的根auth目录下
    #-e"REGISTRY_AUTH=htpasswd" #认证参数是httpasswd
    #-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" #注册认证
    #-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd #用的文件是哪些

    [root@linux-node1 opt]# docker run -d -p 6000:5000 --restart=always --name registry1 -v `pwd`/auth:/auth -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd registry 1fa62130c89de73b1d5c9ebc029a1f1567133af83b4e7703b97f44f25a24bb21
    [root@linux
    -node1 opt]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1fa62130c89d registry "/entrypoint.sh /e..." 3 minutes ago Up 3 minutes 0.0.0.0:6000->5000/tcp registry1 [root@linux-node1 ~]# docker login 127.0.0.1:6000 #本地测试登录 Username: w787815 Password: Login Succeeded #通过登录以后上传镜像 [root@linux-node1 opt]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE w787815/nginx latest 9363c9d402fe 11 hours ago 422 MB [root@linux-node1 opt]# docker tag 9363c9d402fe 127.0.0.1:6000/w787815/nginx [root@linux-node1 opt]# docker push 127.0.0.1:6000/w787815/nginx docker registry使用的是https,所以当用docker pull命令下载远程镜像时,如果远程docker registry是非https的时候就会报下面的错误。 [root@linux-node2 ~]# docker pull 10.10.10.188:6000/w787815/nginx Using default tag: latest Error response from daemon: Get https://10.10.10.188:6000/v2/: http: server gave HTTP response to HTTPS client
  • 相关阅读:
    Spring Session Logout
    VC6.0 error LNK2001: unresolved external symbol _main解决办法
    JDBC数据库编程基本流程
    JDBC连接SQL Server2008
    JDK的下载、安装及环境变量的配置
    奇数阶幻方口诀
    ping: sendto: Network is unreachable
    new/delete和malloc/free的区别
    MFC的消息管理
    VC++之自定义消息
  • 原文地址:https://www.cnblogs.com/w787815/p/9417420.html
Copyright © 2011-2022 走看看