• 03-docker入门-创建 docker 镜像


    方法1:从运行的容器创建
    方法2:编写 DockFile 文件创建

    方法1:

    打包镜像

    docker commit -m "Test a change" 610 ubuntu:test_change
    "Test a change" 表示描述
    610 表示容器 ID 号
    ubuntu:test_change 表示新镜像的名字
    

      

    完成以后,可以在 docker images 中查看。


    后续可以发布到阿里云或者其他地方。


    方法2:

    编写 DockFile 文件创建(转载)

    转载自 https://blog.csdn.net/linux_player_c/article/details/53125600

    **************************************

    编写规则

    Dockerfile中的指令主要有以下几种


    1.FROM

    设置基础镜像的名称,可以采用“minhviet/centos-6.5”这种全称形式,minhviet为作者名称,centos-6.6为镜像名称。

    eg:

    FROM minhviet/centos-6.5

    要点:

    FROM必须是第一个非注释的命令;


    2.MAINTAINER

    设置创建该镜像的作者信息。

    eg:

    MAINTAINER zhang chi "********@qq.com"

    3.CMD

    CMD指令用于指定一个容器启动时需要运行的命令,这个和RUN指令有不同。RUN指令是指镜像被构建时需要运行的命令。CMD的执行可以通过exec的方式书写。

    eg:

    CMD["yum", "install", "vsftpd", "-y"]

    要点:

    1.在Dockerfile中只可以指定一个CMD命令。如果指定多个,也只有最后一个生效。 
    2.如果在容器启动命令run中指定了启动时的命令,则run中的指令会覆盖掉CMD的操作。


    4.RUN

    RUN指令是构建镜像时所需要执行的命令,他的书写方式也有两种: 
    (1)shell命令行形式;

    RUN yum install httpd -y

    (2)exec系统调用的形式。

    RUN["yum", "install", "httpd", "-y"]

    要点: 
    1.RUN的构建时在基础镜像之上按照由上到下的顺序,以层级的方式进行构建,这有些类似于git的版本控制,一旦某个RUN命令发生错误,docker将会停止构建,并且得到构建失败前最后一次正确构建的镜像ID,可以进入该镜像排查问题。


    5.ADD 
    ADD指令用来将构建环境下的文件和目录复制到镜像中,他和COPY的功能非常类似,额外的功能是:如果ADD的内容是一个压缩文件(tar、zip等文件),ADD会自动进行解压

    ADD vsftpd.conf /etc/vsftpd/vsftpd.conf
    ADD tar.nginx.gz /usr/local/nginx

    要点: 
    1.ADD的文件路径必须是build的环境内的; 
    2.如果ADD的是一个目录,则目录下的数据全部会复制到指定的目录中(目录本身不复制); 
    3.如果是压缩包会被解压缩。


    6.COPY

    COPY的左右和ADD功能十分相近,它也有两种不同的方式: 
    (1)COPY src dest (shell形式) 
    (2)COPY[“src”, “dest”]

    eg:

    COPY test_file1 test_file2 /var/www/html/

    要点: 
    1.COPY的文件路径必须是build的环境内的; 
    2.当src有多个文件时,dest必须是一个目录,而且必须以/结尾。


    7.VOLUME

    VOLUME[“/mounttest”] 
    VOLUME /mounttest

    VOLUME指令用来向基于镜像创建的容器添加卷,一个卷可以存在于一个或者多个容器中。功能如下: 
    (1)卷在容器之间可以共享和重用; 
    (2)一个容器可以不是必须和其他容器共享卷; 
    (3)即改即生效; 
    (4)对镜像更新没有影响; 
    (5)卷会一直存在直到没有容器使用它; 
    (6)可以一次指定多个卷;


    8.WORKDIR

    在容器内部设置一个工作目录,ENTRYPOINT和/或CMD指定的程序会在这个目录下执行。

    WORKDIR /opt/webapp/db
    RUN bundle install
    WORKDIR /ope/webapp
    ENTRYPOINT ["rackup"]

    这里设定了两个WORKDIR目录,在第一个目录执行了RUN命令,切换到另外一个WORKDIR,然后又执行了一个ENTRYPOINT命令。

    WORKDIR指定的目录不存在就会被主动创建出来。


    9.USER

    USER指定了该镜像启动的容器会以什么样的用户去运行。 
    eg:

    USER nginx
    USER root

    10.ONBUILD

    ONBUILD为镜像添加触发器(trigger),当一个镜像被用做其他镜像的基础镜像时,该镜像中的触发器将会被执行。

    可以认为ONBUILD的指令是紧跟在FROM之后指定的。触发器可以是任何构建指令。


    11.LABEL

    LABEL用于为DOCKER镜像添加元数据,元数据以键值对额形式展示。

    LABEL version=“1.0”
    LABEL location=“New work” type=“Data Center”

    12.STOPSIGNAL

    STOPSIGNAL指令用来设置停止容器是发送什么系统调用给容器。这个信号必须是内核系统调用表的合法数。


    13.ARG

    ARG指令用来定义可以在docker build命令运行时传递给构建运行时的变量,我们只需要在构建时使用–build-arg即可。

    ARG build
    ARG webapp_user=user

    14.ENV

    ENV指令用来在镜像构建过程中设置环境变量。

    ENV RVM_PATH /home/rvm/

    15.EXPOSE

    此命令通知Docker容器监听指定的网络端口 , EXPOSE 指令不会让容器的端口访问host主机,如果想要这样做就需要在运行容器的时候指定 -p flag发布一个端口范围或者 -P flag发布所有打开的端口。


    编写示例

    这里以zabbix的server端和zabbix的agent端两个镜像进行配置。完整的架构应该是,zabbixserver、zabbixagent和mysql。这样每个容器只负责着其中一个服务,这个是微服务的一种部署方式。让整个应用程序更下的模块化。


    zabbix_server

    首先在宿主机创建生成镜像的根目录:/mnt/zabbix_server,进入根目录编写Dockerfile文件:

    root@vs026:/# mkdir /mnt/zabbix_server/
    root@vs026:/# cd /mnt/zabbix_server/
    root@vs026:/mnt/zabbix_server# touch Dockerfile
    

      

    Dockerfile的内容如下:

    #create the zabbix server images
    FROM oraclelinux:6.7
    
    #create zabbix user
    RUN useradd zabbix
    
    #install packages
    RUN yum install gcc* mysql-devel libxml2-devel net-snmp* java* curl-devel -y
    
    #set work directory
    WORKDIR /zabbix
    
    #copy zabbix source code 
    ADD zabbix-3.2.1.tar.gz /zabbix/
    
    
    #set configure directory
    WORKDIR /zabbix/zabbix-3.2.1
    
    #configure
    CMD ./configure --enable-serer --enable-agent --with-mysql --enable-ipv6 --with-netsnmp --with-libcurl --with-libxml2 --enable-java
    
    EXPOSE 10051
    EXPOSE 10050
    

      

    其中zabbix的安装包zabbix-3.2.1.tar.gz必须要放在/mnt/zabbix_server目录下,生成镜像的过程也是分层级进行的:

    ......
    
     ---> 4128d1b8dc16
    Removing intermediate container 6615250f8d78
    Step 4 : WORKDIR /zabbix
     ---> Running in 7ede380f919e
     ---> 51715a9a86a8
    Removing intermediate container 7ede380f919e
    Step 5 : ADD zabbix-3.2.1.tar.gz /zabbix/
     ---> 18f9d0910cde
    Removing intermediate container 2199e4e6fa07
    Step 6 : WORKDIR /zabbix/zabbix-3.2.1
     ---> Running in e3fb17ad42cd
     ---> f4ad0c50486e
    Removing intermediate container e3fb17ad42cd
    Step 7 : CMD ./configure --enable-serer --enable-agent --with-mysql --enable-ipv6 --with-netsnmp --with-libcurl --with-libxml2 --enable-java
     ---> Running in 34fde4a1a447
     ---> 69100860d16e
    Removing intermediate container 34fde4a1a447
    Step 8 : EXPOSE 10051
     ---> Running in a618d5075cea
     ---> bbfcb3fefd2e
    Removing intermediate container a618d5075cea
    Step 9 : EXPOSE 10050
     ---> Running in 5c13c4d33b4e
     ---> cb9cc37d6902
    Removing intermediate container 5c13c4d33b4e
    Successfully built cb9cc37d6902
    

      

    最后显示生成镜像成功,查看生成的镜像:

    root@vs026:/mnt/zabbix_server# docker images 
    REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
    zhangchiwd371/zabbix_server   latest              cb9cc37d6902        7 minutes ago       3.094 GB
    

      

    小结

    熟悉了Dockfile的语法之后,我们可以根据业务的需求创建镜像,在部署容器的时候会极大的提高效率。

  • 相关阅读:
    协程greenlet与gevent模块
    进程通信和数据共享两种方式
    创建进程的两个方式
    queue队列吃包子
    queue队列是并发利器
    创建线程方式
    threading线程进程
    socketserver实现多用户并发聊天
    socket实现图片读取
    ZYB's Biology
  • 原文地址:https://www.cnblogs.com/alexYuin/p/8891801.html
Copyright © 2020-2023  润新知