zoukankan      html  css  js  c++  java
  • 《Docekr入门学习篇》——Docker镜像制作

    Docker镜像制作

    Docker镜像的构建分为两种,一种是手动构建,一种是dockerfile(自动构建)

    手动构建

    基于centos镜像进行构建制作Nginx镜像

    [root@rbtnode1 ~]# docker run --name Edward -it centos
    
    [root@429ae931a699 /]# yum install -y nginx
    
    [root@429ae931a699 /]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

    修改Nginx配置让它在前台运行

    [root@429ae931a699 /]# vim /etc/nginx/nginx.conf
    
    ...
    
    daemon off;
    
    ...
    
    [root@rbtnode1 ~]# docker ps -a
    
    CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS                      PORTS                  NAMES
    
    429ae931a699        centos                   "/bin/bash"              16 minutes ago      Exited (0) 54 seconds ago                          Edward

    修改完之后commit

    [root@rbtnode1 ~]# docker commit -m "My Nginx" 429ae931a699 edward/edward:v1
    
    sha256:3240a62fc2e57466a7938af03fc21c84c24726fd200b5009530391ddb30abfb7
    
    [root@rbtnode1 ~]# docker images
    
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    
    edward/edward       v1                  3240a62fc2e5        9 seconds ago       412 MB
    
    docker.io/nginx     latest              e445ab08b2be        8 days ago          126 MB
    
    docker.io/centos    latest              9f38484d220f        4 months ago        202 MB
    
    #注释
    
    -m 描述
    
    容器ID
    
    第一个edward是仓库的名称
    
    第二个edward是镜像的名称
    
    v1 标签,如果是最后一个版本我们可以打latest
    
    启动制作好的镜像
    [root@rbtnode1 ~]# docker run --name nginxv1 -d -p 81:80 edward/edward:v1 nginx
    
    0a38af6c6eddfc3a354760282f01ff6e16b93e4f903d7c154f038d68a10f581d
    
    [root@rbtnode1 ~]# docker ps
    
    CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS              PORTS                  NAMES
    
    0a38af6c6edd        edward/edward:v1         "nginx"                  8 seconds ago       Up 6 seconds        0.0.0.0:81->80/tcp     nginxv1

    自动构建

    Dockerfile是由一行命令和语句组成的

    Dockerfile构建步骤:

    [root@rbtnode1 ~]# mkdir /dockerfile
    
    [root@rbtnode1 ~]# cd /dockerfile
    
    [root@rbtnode1 dockerfile]# mkdir nginx
    
    [root@rbtnode1 dockerfile]# cd nginx
    
    [root@rbtnode1 nginx]#vim Dockerfile
    
    # Dockerfile
    
    FROM centos
    
    #Maintainer
    
    MAINTAINER sjny yunweizabbix@163.com
    
    #Commands
    
    RUN rpm -ivh http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
    
    RUN yum install -y nginx && yum clean all
    
    RUN echo "daemon off;" >>/etc/nginx/nginx.conf
    
    ADD index.html /usr/share/nginx/html/index.html
    
    EXPOSE 80
    
    CMD ["nginx"]
    
    [root@rbtnode1 nginx]# echo "hello world" >index.html
    
    #井号代表注释
    
    #Base image  除了注释的第一行,必须是FROM,意思就是我们需要告诉dockerfile基础镜像是什么
    
    #Maintainer 维护信息
    
    #Commands 命令
    
    #ADD index.html 这个文件需要我们在当前目录下有才可以,我们配置我们可以准备好,然后使用ADD命令进行添加或修改
    
    EXPOSE 对外端口号
    
    CMD [“nginx”] 它要启动的命令是nginx (就算是nginx服务)
    
    开始构建
    
    docker build -t mynginx:v2 .
    
    docker run --name mynginxtest -d -p 82:80 mynginx:v2

    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”,”par am2”]

    ENTRYPOINT command param1 param2 (shell中执行)

    解释:和CMD类似都是配置容器启动后执行的命令,并且不可被docker run提供的参数覆盖。

    每个dockerfile中只能有一个ENTRYPOINT,当指定多个时,只有最后一个起效。ENTRYPOINT没有CMD的可替换特性,所以生产中可以同时使用ENTRYPOINT和CMD。

    USER

    格式:USER daemon

    解释:指定运行容器时的用户名和UID。

    EXPOSE

    格式:EXPOSE<port> [<port>…]

    解释:设置docker容器内部暴露的端口号,如果需要外部访问。还需要启动容器时增加-p或者-P参数进行分配。

    ENV

    格式:ENV

          ENV =<value>…

    解释:设置环境变量,可以在RUN之前使用,然后RUN命令时调用,容器启动时这些环境变量都会被指定。

    ADD

    格式:ADD <src>… <dest>

          ADD [“”,. . . “”]

    解释:将指定的复制到容器文件系统中

    所有拷贝到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 =来指定参数的值,不过如果构建的时候不指定就会报错。

  • 相关阅读:
    P3990 [SHOI2013]超级跳马
    P4279 [SHOI2008]小约翰的游戏
    zabbix、agent端服务器图形化展示
    zabbix_agent代理端监控FTP服务
    hadoop SecondNamenode详解
    HADOOP_SECURE_DN_USER has been replaced by HDFS_DATANODE_SECURE_USER
    Linux netstat命令详解(检验本机各端口的网络连接情况)
    查看监听端口命令
    Hadoop服务的端口50070无法访问的问题
    Linux-centos6.8下关闭防火墙
  • 原文地址:https://www.cnblogs.com/FireLL/p/11609301.html
Copyright © 2011-2022 走看看