zoukankan      html  css  js  c++  java
  • dockerfile操作

    一、docker镜像的两种方式

    1、docker commit:将容器提交为镜像

    2、Dockerfile:从读取Dokerfile里的一组指令去自动化构建镜像

    二、Dockerfile的规则

    1、#为注释

    2、指令(大写),内容(小写)(强烈建议)

    3、Docker是按顺序从上到下依次执行Dockerfile里的指令集合

    4、每个Dockerfile的第一个非注释行指令必须是"FROM"指令,用于为构建镜像指定基准镜像,后续指令运行与此基准镜像提供的运行环境中

    三、Dockerfile核心指令

    1、USER/WORKDIR指令

    USER:指定容器启动时,哪个用户启动进程

    WORKDIR:启动容器后的PWD目录

    例子

    [root@redis-01 dockerfile]# vim Dockerfile
    FROM docker.io/skychengp/nginx:1.12.2
    USER nginx
    WORKDIR /usr/share/nginx/html

    以docker.io/skychengp/nginx:1.12.2为基准镜像,以nginx用户执行指令,将当前目录切换到/usr/share/nginx/html

    构建镜像

    [root@redis-01 dockerfile]# docker build . -t docker.io/skychengp/nginx:1.12.2_with_user_workdir
    Sending build context to Docker daemon  2.048kB
    Step 1/3 : FROM docker.io/skychengp/nginx:1.12.2
     ---> 4037a5562b03
    Step 2/3 : USER nginx
     ---> Running in 340c2c31ad73
    Removing intermediate container 340c2c31ad73
     ---> dcc5cb25c6dd
    Step 3/3 : WORKDIR /usr/share/nginx/html
     ---> Running in 9bf8f48ace8f
    Removing intermediate container 9bf8f48ace8f
     ---> 6f0cee4e00a3
    Successfully built 6f0cee4e00a3
    Successfully tagged skychengp/nginx:1.12.2_with_user_workdir
    [root@redis-01 dockerfile]# 

    查看镜像

    [root@redis-01 home]# docker images
    REPOSITORY                                                                                                                                  TAG                        IMAGE ID            CREATED             SIZE
    skychengp/nginx                                                                                                                             1.12.2_with_user_workdir   6f0cee4e00a3        24 seconds ago      108MB

    运行容器

    [root@redis-01 home]# docker run -it --rm --name nginx-user skychengp/nginx:1.12.2_with_user_workdir /bin/bash
    nginx@d76e073c7816:/usr/share/nginx/html$ pwd
    /usr/share/nginx/html

      nginx@d76e073c7816:/usr/share/nginx/html$ whoami
      nginx

    我们发现,容器已经切换到指定的WORKDIR下了,当前用户为nginx

    2、ADD/EXPOSE指令

    ADD:将指定的宿主机文件复制到容器里

    EXPOSE:指定需要暴露的容器端口

    例子:

    [root@redis-01 dockerfile]# vim Dockerfile

      FROM docker.io/skychengp/nginx:1.12.2
      WORKDIR /usr/share/nginx/html
      ADD index.html /usr/share/nginx/html/index.html
      EXPOSE 80

    将当前目录的index.html复制到容器的/usr/share/nginx/html/下,并将容器的80端口暴露出来

    构建镜像

    [root@redis-01 dockerfile]# docker build . -t skychengp/nginx:1.12.2_with_add_expose
    Sending build context to Docker daemon   5.12kB
    Step 1/4 : FROM docker.io/skychengp/nginx:1.12.2
     ---> 4037a5562b03
    Step 2/4 : WORKDIR /usr/share/nginx/html
     ---> Running in f7d8bd79ceb5
    Removing intermediate container f7d8bd79ceb5
     ---> eaceba47349e
    Step 3/4 : ADD index.html /usr/share/nginx/html/index.html
     ---> a14c13a9c08b
    Step 4/4 : EXPOSE 80
     ---> Running in e5654fc46f3a
    Removing intermediate container e5654fc46f3a
     ---> d38127bfd87a
    Successfully built d38127bfd87a
    Successfully tagged skychengp/nginx:1.12.2_with_add_expose

    运行容器

    [root@redis-01 dockerfile]# docker run -it --rm --name nginx-add -P skychengp/nginx:1.12.2_with_add_expose /bin/bash
    root@ebeb678e4a3c:/usr/share/nginx/html# pwd
    /usr/share/nginx/html
    root@ebeb678e4a3c:/usr/share/nginx/html# whoami
    root
    root@ebeb678e4a3c:/usr/share/nginx/html# ls
    50x.html  index.html

    可以看到index.html已经复制到容器里了

    运行nginx

    root@207d0109917b:/usr/share/nginx/html# nginx -g "daemon off;"

    查看80端口,用netstat命令发现没有,先安装net-tools包

    root@ebeb678e4a3c:/usr/share/nginx/html# apt-get update 
    root@ebeb678e4a3c:/usr/share/nginx/html# apt-get install net-tools
    root@207d0109917b:/usr/share/nginx/html# netstat -tunlp|grep 80
    tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      327/nginx: master p 

    在宿主机上查看容器

    [root@redis-01 ~]# docker ps -a|grep nginx
    207d0109917b        skychengp/nginx:1.12.2_with_add_expose                                                                                                      "/bin/bash"              5 minutes ago       Up 5 minutes        0.0.0.0:32769->80/tcp   nginx-add

    容器的80端口被随机映射到了宿主机的一个32769端口上

    访问宿主机的32769

    [root@redis-01 home]# curl http://172.28.5.120:32769
    <!DOCTYPE html>
    <!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title></head> <body link=#0000cc> <div id=wrapper> <div id=head> <div class=head_wrapper> <div class=s_form> <div class=s_form_wrapper> <div id=lg> <img hidefocus=true src=//www.baidu.com/img/bd_logo1.png width=270 height=129> </div> <form id=form name=f action=//www.baidu.com/s class=fm> <input type=hidden name=bdorz_come value=1> <input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8> <input type=hidden name=rsv_bp value=1> <input type=hidden name=rsv_idx value=1> <input type=hidden name=tn value=baidu><span class="bg s_ipt_wr"><input id=kw name=wd class=s_ipt value maxlength=255 autocomplete=off autofocus></span><span class="bg s_btn_wr"><input type=submit id=su value=百度一下 class="bg s_btn"></span> </form> </div> </div> <div id=u1> <a href=http://news.baidu.com name=tj_trnews class=mnav>新闻</a> <a href=http://www.hao123.com name=tj_trhao123 class=mnav>hao123</a> <a href=http://map.baidu.com name=tj_trmap class=mnav>地图</a> <a href=http://v.baidu.com name=tj_trvideo class=mnav>视频</a> <a href=http://tieba.baidu.com name=tj_trtieba class=mnav>贴吧</a> <noscript> <a href=http://www.baidu.com/bdorz/login.gif?login&amp;tpl=mn&amp;u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class=lb>登录</a> </noscript> <script>document.write('<a href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u='+ encodeURIComponent(window.location.href+ (window.location.search === "" ? "?" : "&")+ "bdorz_come=1")+ '" name="tj_login" class="lb">登录</a>');</script> <a href=//www.baidu.com/more/ name=tj_briicon class=bri style="display: block;">更多产品</a> </div> </div> </div> <div id=ftCon> <div id=ftConw> <p id=lh> <a href=http://home.baidu.com>关于百度</a> <a href=http://ir.baidu.com>About Baidu</a> </p> <p id=cp>&copy;2017&nbsp;Baidu&nbsp;<a href=http://www.baidu.com/duty/>使用百度前必读</a>&nbsp; <a href=http://jianyi.baidu.com/ class=cp-feedback>意见反馈</a>&nbsp;京ICP证030173号&nbsp; <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>

    可以成功访问到index.html

    3、RUN/ENV指令

    RUN:构建镜像时执行命令

    ENV:设置环境变量

    例子:设置容器时区与宿主机一致,构建镜像时,自动下载net-tools包以及procps包

    [root@redis-01 dockerfile]# vim Dockerfile
    FROM docker.io/skychengp/nginx:1.12.2
    WORKDIR /usr/share/nginx/html
    ADD index.html /usr/share/nginx/html/index.html
    ENV TZ=Asia/Shanghai

      RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone && apt-get update && apt-get install procps -y && apt-get in stall net-tools -y

     

    设置TZ时区环境变量为Asia/Shanghai

    在创建镜像时,将/usr/share/zoneinfo/Asia/Shanghai 文件软连接到/etc/localtime下,并将Asia/Shanghai写入文件/etc/timezone里

    创建镜像

    [root@redis-01 dockerfile]# docker build . -t skychengp/nginx:1.12.2_with_cmd
    Sending build context to Docker daemon   5.12kB
    Step 1/6 : FROM docker.io/skychengp/nginx:1.12.2
     ---> 4037a5562b03
    Step 2/6 : WORKDIR /usr/share/nginx/html
     ---> Running in 8612c111ba58
    Removing intermediate container 8612c111ba58
     ---> 93b67d852c63
    Step 3/6 : ADD index.html /usr/share/nginx/html/index.html
     ---> e6901139b882
    Step 4/6 : ENV TZ=Asia/Shanghai
     ---> Running in c38a494baaa1
    Removing intermediate container c38a494baaa1
     ---> 4838c5ac4ac5
    Step 5/6 : RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone && apt-get update && apt-get install procps -y && apt-get install net-tools -y
     ---> Running in fd6deb060d46
    Get:1 http://security.debian.org/debian-security stretch/updates InRelease [53.0 kB]
    Ign:2 http://deb.debian.org/debian stretch InRelease
    Get:3 http://security.debian.org/debian-security stretch/updates/main amd64 Packages [799 kB]
    Get:4 http://deb.debian.org/debian stretch-updates InRelease [93.6 kB]
    Get:5 http://deb.debian.org/debian stretch Release [118 kB]
    Get:6 http://nginx.org/packages/debian stretch InRelease [2866 B]
    Get:7 http://deb.debian.org/debian stretch-updates/main amd64 Packages [2711 B]
    Get:8 http://deb.debian.org/debian stretch Release.gpg [2410 B]
    Get:9 http://nginx.org/packages/debian stretch/nginx amd64 Packages [25.4 kB]
    Get:10 http://deb.debian.org/debian stretch/main amd64 Packages [9610 kB]
    Fetched 10.7 MB in 36s (290 kB/s)
    Reading package lists...
    Reading package lists...
    Building dependency tree...
    Reading state information...
    The following additional packages will be installed:
      libprocps6 psmisc
    The following NEW packages will be installed:
      libprocps6 procps psmisc
    0 upgraded, 3 newly installed, 0 to remove and 36 not upgraded.
    Need to get 431 kB of archives.
    After this operation, 1434 kB of additional disk space will be used.
    Get:1 http://deb.debian.org/debian stretch/main amd64 libprocps6 amd64 2:3.3.12-3+deb9u1 [58.5 kB]
    Get:2 http://deb.debian.org/debian stretch/main amd64 procps amd64 2:3.3.12-3+deb9u1 [250 kB]
    Get:3 http://deb.debian.org/debian stretch/main amd64 psmisc amd64 22.21-2.1+b2 [123 kB]
    debconf: delaying package configuration, since apt-utils is not installed
    Fetched 431 kB in 1s (360 kB/s)
    Selecting previously unselected package libprocps6:amd64.
    (Reading database ... 7027 files and directories currently installed.)
    Preparing to unpack .../libprocps6_2%3a3.3.12-3+deb9u1_amd64.deb ...
    Unpacking libprocps6:amd64 (2:3.3.12-3+deb9u1) ...
    Selecting previously unselected package procps.
    Preparing to unpack .../procps_2%3a3.3.12-3+deb9u1_amd64.deb ...
    Unpacking procps (2:3.3.12-3+deb9u1) ...
    Selecting previously unselected package psmisc.
    Preparing to unpack .../psmisc_22.21-2.1+b2_amd64.deb ...
    Unpacking psmisc (22.21-2.1+b2) ...
    Setting up psmisc (22.21-2.1+b2) ...
    Setting up libprocps6:amd64 (2:3.3.12-3+deb9u1) ...
    Setting up procps (2:3.3.12-3+deb9u1) ...
    update-alternatives: using /usr/bin/w.procps to provide /usr/bin/w (w) in auto mode
    update-alternatives: warning: skip creation of /usr/share/man/man1/w.1.gz because associated file /usr/share/man/man1/w.procps.1.gz (of link group w) doesn't exist
    Processing triggers for libc-bin (2.24-11+deb9u3) ...
    Reading package lists...
    Building dependency tree...
    Reading state information...
    The following NEW packages will be installed:
      net-tools
    0 upgraded, 1 newly installed, 0 to remove and 36 not upgraded.
    Need to get 248 kB of archives.
    After this operation, 963 kB of additional disk space will be used.
    Get:1 http://deb.debian.org/debian stretch/main amd64 net-tools amd64 1.60+git20161116.90da8a0-1 [248 kB]
    debconf: delaying package configuration, since apt-utils is not installed
    Fetched 248 kB in 0s (258 kB/s)
    Selecting previously unselected package net-tools.
    (Reading database ... 7142 files and directories currently installed.)
    Preparing to unpack .../net-tools_1.60+git20161116.90da8a0-1_amd64.deb ...
    Unpacking net-tools (1.60+git20161116.90da8a0-1) ...
    Setting up net-tools (1.60+git20161116.90da8a0-1) ...
    Removing intermediate container fd6deb060d46
     ---> d43dd42ab96d
    Step 6/6 : CMD nginx -g "daemon off;"
     ---> Running in c942c4da119a
    Removing intermediate container c942c4da119a
     ---> 402ce91f3b96
    Successfully built 402ce91f3b96
    Successfully tagged skychengp/nginx:1.12.2_with_cmd

    运行容器

    [root@redis-01 dockerfile]# docker run -it --name nginx-env skychengp/nginx:1.12.2_with_env_run /bin/bash
    root@d58efda0c124:/usr/share/nginx/html# pwd
    /usr/share/nginx/html
    root@d58efda0c124:/usr/share/nginx/html# ls
    50x.html  index.html
    root@d58efda0c124:/usr/share/nginx/html# printenv
    TZ=Asia/Shanghai
    HOSTNAME=d58efda0c124
    NJS_VERSION=1.12.2.0.1.14-1~stretch
    NGINX_VERSION=1.12.2-1~stretch
    PWD=/usr/share/nginx/html
    HOME=/root
    TERM=xterm
    SHLVL=1
    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    _=/usr/bin/printenv
    root@d58efda0c124:/usr/share/nginx/html# 

    可以看到TZ环境变量设置成功,

    root@d58efda0c124:/usr/share/nginx/html# cat /etc/timezone 
    Asia/Shanghai

    查看/etc/timezone文件为指定的时区,查看容器时间

    root@d58efda0c124:/usr/share/nginx/html# date
    Tue Dec  1 17:15:08 CST 2020

    已经和宿主机保持一致,可以运行ps命令

    root@6ba956ab2615:/usr/share/nginx/html# ps aux
    USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
    root         1  0.0  0.0   4280   640 ?        Ss   22:19   0:00 /bin/sh -c nginx -g "daemon off;"
    root         6  0.0  0.0  32400  3228 ?        S    22:19   0:00 nginx: master process nginx -g daemon off;
    nginx        7  0.0  0.0  32872  1816 ?        S    22:19   0:00 nginx: worker process
    root         8  0.0  0.0  18120  1992 pts/0    Ss   22:19   0:00 /bin/bash
    root        21  0.0  0.0  36628  1580 pts/0    R+   22:24   0:00 ps aux

    4、CMDENTRYPOINT指令

    CMD:运行容器时指定的命令

    例子:构建nginx镜像,运行容器时自动运行nginx

    FROM docker.io/skychengp/nginx:1.12.2
    WORKDIR /usr/share/nginx/html
    ADD index.html /usr/share/nginx/html/index.html
    ENV TZ=Asia/Shanghai
    

      RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone && apt-get update && apt-get install procps -y && apt-get install net-tools -y
     CMD nginx -g "daemon off;"

     

    构建镜像

    [root@redis-01 dockerfile]# docker build . -t skychengp/nginx:1.12.2_with_cmd
    Sending build context to Docker daemon   5.12kB
    Step 1/6 : FROM docker.io/skychengp/nginx:1.12.2
     ---> 4037a5562b03
    Step 2/6 : WORKDIR /usr/share/nginx/html
     ---> Running in 8612c111ba58
    Removing intermediate container 8612c111ba58
     ---> 93b67d852c63
    Step 3/6 : ADD index.html /usr/share/nginx/html/index.html
     ---> e6901139b882
    Step 4/6 : ENV TZ=Asia/Shanghai
     ---> Running in c38a494baaa1
    Removing intermediate container c38a494baaa1
     ---> 4838c5ac4ac5
    Step 5/6 : RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone && apt-get update && apt-get install procps -y && apt-get install net-tools -y
     ---> Running in fd6deb060d46
    Get:1 http://security.debian.org/debian-security stretch/updates InRelease [53.0 kB]
    Ign:2 http://deb.debian.org/debian stretch InRelease
    Get:3 http://security.debian.org/debian-security stretch/updates/main amd64 Packages [799 kB]
    Get:4 http://deb.debian.org/debian stretch-updates InRelease [93.6 kB]
    Get:5 http://deb.debian.org/debian stretch Release [118 kB]
    Get:6 http://nginx.org/packages/debian stretch InRelease [2866 B]
    Get:7 http://deb.debian.org/debian stretch-updates/main amd64 Packages [2711 B]
    Get:8 http://deb.debian.org/debian stretch Release.gpg [2410 B]
    Get:9 http://nginx.org/packages/debian stretch/nginx amd64 Packages [25.4 kB]
    Get:10 http://deb.debian.org/debian stretch/main amd64 Packages [9610 kB]
    Fetched 10.7 MB in 36s (290 kB/s)
    Reading package lists...
    Reading package lists...
    Building dependency tree...
    Reading state information...
    The following additional packages will be installed:
      libprocps6 psmisc
    The following NEW packages will be installed:
      libprocps6 procps psmisc
    0 upgraded, 3 newly installed, 0 to remove and 36 not upgraded.
    Need to get 431 kB of archives.
    After this operation, 1434 kB of additional disk space will be used.
    Get:1 http://deb.debian.org/debian stretch/main amd64 libprocps6 amd64 2:3.3.12-3+deb9u1 [58.5 kB]
    Get:2 http://deb.debian.org/debian stretch/main amd64 procps amd64 2:3.3.12-3+deb9u1 [250 kB]
    Get:3 http://deb.debian.org/debian stretch/main amd64 psmisc amd64 22.21-2.1+b2 [123 kB]
    debconf: delaying package configuration, since apt-utils is not installed
    Fetched 431 kB in 1s (360 kB/s)
    Selecting previously unselected package libprocps6:amd64.
    (Reading database ... 7027 files and directories currently installed.)
    Preparing to unpack .../libprocps6_2%3a3.3.12-3+deb9u1_amd64.deb ...
    Unpacking libprocps6:amd64 (2:3.3.12-3+deb9u1) ...
    Selecting previously unselected package procps.
    Preparing to unpack .../procps_2%3a3.3.12-3+deb9u1_amd64.deb ...
    Unpacking procps (2:3.3.12-3+deb9u1) ...
    Selecting previously unselected package psmisc.
    Preparing to unpack .../psmisc_22.21-2.1+b2_amd64.deb ...
    Unpacking psmisc (22.21-2.1+b2) ...
    Setting up psmisc (22.21-2.1+b2) ...
    Setting up libprocps6:amd64 (2:3.3.12-3+deb9u1) ...
    Setting up procps (2:3.3.12-3+deb9u1) ...
    update-alternatives: using /usr/bin/w.procps to provide /usr/bin/w (w) in auto mode
    update-alternatives: warning: skip creation of /usr/share/man/man1/w.1.gz because associated file /usr/share/man/man1/w.procps.1.gz (of link group w) doesn't exist
    Processing triggers for libc-bin (2.24-11+deb9u3) ...
    Reading package lists...
    Building dependency tree...
    Reading state information...
    The following NEW packages will be installed:
      net-tools
    0 upgraded, 1 newly installed, 0 to remove and 36 not upgraded.
    Need to get 248 kB of archives.
    After this operation, 963 kB of additional disk space will be used.
    Get:1 http://deb.debian.org/debian stretch/main amd64 net-tools amd64 1.60+git20161116.90da8a0-1 [248 kB]
    debconf: delaying package configuration, since apt-utils is not installed
    Fetched 248 kB in 0s (258 kB/s)
    Selecting previously unselected package net-tools.
    (Reading database ... 7142 files and directories currently installed.)
    Preparing to unpack .../net-tools_1.60+git20161116.90da8a0-1_amd64.deb ...
    Unpacking net-tools (1.60+git20161116.90da8a0-1) ...
    Setting up net-tools (1.60+git20161116.90da8a0-1) ...
    Removing intermediate container fd6deb060d46
     ---> d43dd42ab96d
    Step 6/6 : CMD nginx -g "daemon off;"
     ---> Running in c942c4da119a
    Removing intermediate container c942c4da119a
     ---> 402ce91f3b96
    Successfully built 402ce91f3b96
    Successfully tagged skychengp/nginx:1.12.2_with_cmd
    运行容器
    [root@redis-01 dockerfile]# docker run --name=nginx-cmd -p81:80 --rm skychengp/nginx:1.12.2_with_cmd

    访问http://127.0.0.1:81,成功返回页面,容器打印日志

    [root@redis-01 dockerfile]# docker run --name=nginx-cmd -p81:80 --rm skychengp/nginx:1.12.2_with_cmd
    172.28.5.120 - - [01/Dec/2020:22:19:17 +0800] "GET / HTTP/1.1" 200 2381 "-" "curl/7.29.0" "-"
  • 相关阅读:
    第十四节、FAST角点检测(附源码)
    第三十六节,目标检测之yolo源码解析
    《理财市场情绪监测系统》代码实现【1】之行业词库
    python numpy 下载地址
    hive 添加自增列
    excel做回归分析的应用【风控数据分析】
    SELECT a.loginname,a.deviceid,a.time,Row_Number() OVER (partition by a.loginname ORDER BY a.deviceid desc,a.time asc) rank
    hive cst 时间转换
    hive以文件创建表
    以当前日期命名或复制文件夹
  • 原文地址:https://www.cnblogs.com/sky-cheng/p/14071239.html
Copyright © 2011-2022 走看看