Docker 鏡像

目錄:php

一、Docker 鏡像介紹html

二、鏡像下載java

三、查看鏡像信息node

四、搜索鏡像python

五、刪除鏡像linux

六、建立鏡像nginx

6.1 基於已有鏡像的容器建立web

6.2 基於 Dockerfile 建立redis

一、Docker 鏡像介紹docker

      Docker 鏡像跟虛擬機鏡像的概念差很少,都是能夠經過鏡像來建立虛擬機或容器,Docker 運行容器的時候首先會在本地尋找,若是本地不存在該鏡像,則會從默認的鏡像倉庫中下載(默認使用 Docker Hub 公共註冊服務器中的倉庫)

 

二、鏡像下載

      能夠經過 docker pull 命令從 docker 倉庫中下載對應的鏡像,若是不顯示地指定 TAG,則默認會選擇 latest 標籤,即下載倉庫中最新版本的鏡像。下面介紹如何下載 centos 6.6 操做系統的鏡像。

      因爲官方的鏡像源在國外,因此基本上屬於獲取不到的狀態,因此我這裏修改 docker 的配置文件,添加配置項,優先使用 163 的鏡像源

  • [root@crazy-acong ~]# cat /etc/redhat-release 
    CentOS release 6.6 (Final)
    
    [root@crazy-acong ~]# cat /etc/sysconfig/docker
    # /etc/sysconfig/docker
    #
    # Other arguments to pass to the docker daemon process
    # These will be parsed by the sysv initscript and appended
    # to the arguments list passed to docker -d
    
    # other_args=      # 註釋掉這一行,添加下一行
    other_args=--registry-mirror=http://hub.c.163.com
    
    
    DOCKER_CERT_PATH=/etc/docker
    
    # Resolves: rhbz#1176302 (docker issue #407)
    DOCKER_NOWARN_KERNEL_VERSION=1
    
    # Location used for temporary files, such as those created by
    # # docker load and build operations. Default is /var/lib/docker/tmp
    # # Can be overriden by setting the following environment variable.
    # # DOCKER_TMPDIR=/var/tmp

其它系統的配置方法能夠參考:https://yq.aliyun.com/articles/29941

 

而後能夠就能夠下載 centos6.6 的鏡像了

  • [root@crazy-acong ~]# docker pull centos:6.6
    
    # 查看docker 本地鏡像
    [root@crazy-acong ~]# docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
    centos              6.6                 d0d663863c34        7 months ago        202.6 MB

 

此時就可使用該鏡像建立容器了

  • [root@crazy-acong ~]# docker run -it centos:6.6 /bin/bash
    [root@7f3f9540ca71 /]# cat /etc/redhat-release 
    CentOS release 6.6 (Final)

 

三、查看鏡像信息

使用 docker images 命令能夠列出本地主機上已有的鏡像

  • [root@crazy-acong ~]# docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
    centos              6.6                 d0d663863c34        7 months ago        202.6 MB
    
    
    REPOSITORY    表示來自哪一個倉庫
    TAG                 鏡像的標籤
    IMAGE ID         鏡像的 ID 號(惟一)
    CREATED          建立時間
    VIRTUAL SIZE   鏡像大小

鏡像的 ID 信息比較重要,它惟一標識了鏡像

      TAG 信息用於標記來自同一個倉庫的不一樣鏡像,例如 centos 倉庫中有多個鏡像,經過 TAG 信息來區分發行版本,包括 6.六、6.七、6.八、7.0、7.1等標籤。

      可使用 docker tag 給本地的鏡像添加新的標籤,例如:

  • [root@crazy-acong ~]# docker images          
    REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
    centos              6.6                 d0d663863c34        7 months ago        202.6 MB
    centos              6.6_node01          d0d663863c34        7 months ago        202.6 MB
    
    
    # 能夠看到他們的 IMAGE ID 是相同的,說明他們指向了同一個鏡像文件,只是別名不一樣而已,標籤在這裏起到了引用或快捷方式的做用

 

使用 docker inspect 查看鏡像詳細信息

  • [root@crazy-acong ~]# docker inspect d0d663863c34
    [
    {
        "Id": "d0d663863c34e7895231820867d4ffb7e54f026f0059c3dee7fd859ee75f6b39",
        "Parent": "3690474eb5b4b26fdfbd89c6e159e8cc376ca76ef48032a30fa6aafd56337880",
        "Comment": "",
        "Created": "2016-08-30T18:21:00.214353268Z",
        "Container": "b99744612d0b8640d4df84640a3b7e2191a6cb2cadaadf19e9a937473e61a138",
        "ContainerConfig": {
            "Hostname": "b99744612d0b",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "PortSpecs": null,
            "ExposedPorts": null,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "/bin/sh",
                "-c",
                "#(nop) ADD file:a5c79d873c20d685b71d899211c5d58b90c08473604aba82a9d655a58fcd1488 in / "
            ],
            "Image": "sha256:20ae10d641a0af6f25ceaa75fdcf591d171e3c521a54a3f3a2868b602d735e11",
            "Volumes": null,
            "VolumeDriver": "",
            "WorkingDir": "",
            "Entrypoint": null,
            "NetworkDisabled": false,
            "MacAddress": "",
            "OnBuild": null,
            "Labels": {}
        },
        "DockerVersion": "1.12.1",
        "Author": "The CentOS Project \u003ccloud-ops@centos.org\u003e - ami_creator",
        "Config": {
            "Hostname": "b99744612d0b",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "PortSpecs": null,
            "ExposedPorts": null,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": null,
            "Image": "sha256:20ae10d641a0af6f25ceaa75fdcf591d171e3c521a54a3f3a2868b602d735e11",
            "Volumes": null,
            "VolumeDriver": "",
            "WorkingDir": "",
            "Entrypoint": null,
            "NetworkDisabled": false,
            "MacAddress": "",
            "OnBuild": null,
            "Labels": {}
        },
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 202602386,
        "VirtualSize": 202602386
    }
    ]
    
    # docker inspect 命令返回的是一個 JSON 格式的消息,若是咱們只須要其中的一項內容,可使用 -f 參數指定,例如,獲取鏡像的 Architecture 信息
    [root@crazy-acong ~]# docker inspect -f '{{.Architecture}}' d0d663863c34
    amd64

 

四、搜索鏡像

      使用 docker search centos 搜索 centos 鏡像,默認搜索 Docker Hub 官方倉庫中的鏡像,默認按照星級評價進行排序。

  • [root@crazy-acong ~]# docker search centos
    NAME                                   DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
    centos                                 The official build of CentOS.                   3239      [OK]       
    jdeathe/centos-ssh                     CentOS-6 6.8 x86_64 / CentOS-7 7.3.1611 x8...   63                   [OK]
    jdeathe/centos-ssh-apache-php          CentOS-6 6.8 x86_64 - Apache / PHP-FPM / P...   25                   [OK]
    nimmis/java-centos                     This is docker images of CentOS 7 with dif...   24                   [OK]
    consol/centos-xfce-vnc                 Centos container with "headless" VNC sessi...   24                   [OK]
    gluster/gluster-centos                 Official GlusterFS Image [ CentOS-7 +  Glu...   18                   [OK]
    million12/centos-supervisor            Base CentOS-7 with supervisord launcher, h...   15                   [OK]
    torusware/speedus-centos               Always updated official CentOS docker imag...   8                    [OK]
    egyptianbman/docker-centos-nginx-php   A simple and highly configurable docker co...   6                    [OK]
    nathonfowlie/centos-jre                Latest CentOS image with the JRE pre-insta...   5                    [OK]
    centos/mariadb55-centos7                                                               4                    [OK]
    harisekhon/centos-scala                Scala + CentOS (OpenJDK tags 2.10-jre7 - 2...   2                    [OK]
    harisekhon/centos-java                 Java on CentOS (OpenJDK, tags jre/jdk7-8)       2                    [OK]
    centos/redis                           Redis built for CentOS                          2                    [OK]
    timhughes/centos                       Centos with systemd installed and running       1                    [OK]
    freenas/centos                         Simple CentOS Linux interactive container       1                    [OK]
    darksheer/centos                       Base Centos Image -- Updated hourly             1                    [OK]
    blacklabelops/centos                   CentOS Base Image! Built and Updates Daily!     1                    [OK]
    repositoryjp/centos                    Docker Image for CentOS.                        0                    [OK]
    vcatechnology/centos                   A CentOS Image which is updated daily           0                    [OK]
    kz8s/centos                            Official CentOS plus epel-release               0                    [OK]
    grayzone/centos                        auto build for centos.                          0                    [OK]
    otagoweb/centos                        Apache (with PHP7), built on CentOS 7           0                    [OK]
    grossws/centos                         CentOS 6 and 7 base images with gosu and l...   0                    [OK]
    januswel/centos                        yum update-ed CentOS image                      0                    [OK]
    
    
    NAME       鏡像名稱
    DESCRIPTION   描述
    STARS       星級(表示受歡迎程度)
    OFFICIAL     是否官方建立
    AUTOMATED    是否自動建立

或者去 163 的鏡像源去搜索 https://c.163.com/hub#/m/home/

 

五、刪除鏡像

使用 docker rmi 命令能夠刪除鏡像,命令格式爲 docker rmi 鏡像名稱:TAG/鏡像ID

  • [root@crazy-acong ~]# docker rmi -f  centos:6.6
    [root@crazy-acong ~]# docker rmi -f  d0d663863c34

當一個鏡像 ID 存在多個 TAG 時,刪除其中的一個TAG 不會影響其餘的 TAG,若是該鏡像ID 只剩下一個 TAG ,此時刪除則會完全刪除鏡像文件

當該鏡像下還有容器存在的時候,刪除鏡像會報錯,可使用 docker rmi -f 強制刪除,可是不推薦這樣作,能夠先刪除容器,最後在刪除鏡像

 

六、建立鏡像

 建立鏡像的方法:

    • 基於已有鏡像的容器建立
    • 基於 Dockerfile 建立    

6.1 基於已有鏡像的容器建立

這裏基於 centos 官方的 docker 鏡像,在其安裝 nginx 服務,而後將其打包成一個鏡像

  • 將 centos 的 docker 鏡像運行起來,在運行的容器中安裝 nginx ,並設置爲不在後臺運行
  • [root@crazy-acong ~]# docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
    centos              6.6                 d0d663863c34        7 months ago        202.6 MB
    [root@crazy-acong ~]# docker run -it centos:6.6 /bin/bash
    [root@225084efe2fb /]# 
    
    # nginx 安裝參考 http://www.cnblogs.com/CongZhang/p/6548570.html
    
    # 此時 nginx 已經安裝完畢
    
    [root@225084efe2fb nginx-1.10.3]# /etc/nginx/sbin/nginx -V
    nginx version: nginx/1.10.3
    built by gcc 4.4.7 20120313 (Red Hat 4.4.7-18) (GCC) 
    built with OpenSSL 1.0.1e-fips 11 Feb 2013
    TLS SNI support enabled
    configure arguments: --user=nginx --group=nginx --prefix=/data/application/nginx-1.10.3 --with-http_stub_status_module --with-http_ssl_module
    
    [root@225084efe2fb nginx-1.10.3]# /etc/nginx/sbin/nginx -t
    nginx: the configuration file /data/application/nginx-1.10.3/conf/nginx.conf syntax is ok
    nginx: configuration file /data/application/nginx-1.10.3/conf/nginx.conf test is successful
    
    # 啓動 nginx
    [root@225084efe2fb nginx-1.10.3]# /etc/nginx/sbin/nginx 
    
    [root@225084efe2fb nginx-1.10.3]# netstat -lnpt | grep nginx 
    tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      2562/nginx 
    
    # 修改nginx 配置文件 nginx.conf 讓 nginx 不在後臺啓動
    [root@225084efe2fb nginx-1.10.3]# echo "daemon off;" >> /etc/nginx/conf/nginx.conf     # 若是不加這行則會致使容器啓動以後自動就關閉了
    
    # 退出容器
    [root@225084efe2fb nginx-1.10.3]# exit
  • 使用 docker commit 命令能夠將容器進行提交,將其變爲鏡像
  • [root@crazy-acong ~]# docker ps -a
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    225084efe2fb        centos:6.6          "/bin/bash"         28 minutes ago      Up 9 minutes                            angry_davinci   
    
    [root@crazy-acong ~]# docker commit -m "centos6.6_nginx" -a "zhangcong" 225084efe2fb centos6.6_nginx:v1
    
    -m    提交消息
    -a     做者信息
    -p     提交時暫停容器運行
  • 使用 docker images 查看新建立的鏡像
  • [root@crazy-acong ~]# docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED              VIRTUAL SIZE
    centos6.6_nginx     v1                  aa4b2a57b43e        About a minute ago   446.2 MB    # 該鏡像就是手動生成的
    centos              6.6                 d0d663863c34        7 months ago         202.6 MB
  • 啓動該鏡像
  • # 啓動該鏡像,並將服務器的 80 端口映射到容器的 80 端口
    [root@crazy-acong ~]# docker run -it -d -p 80:80 aa4b2a57b43e /etc/nginx/sbin/nginx 
    
    [root@crazy-acong ~]# docker ps -a
    CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                NAMES
    46a2ec546a50        aa4b2a57b43e        "/etc/nginx/sbin/ngi   2 seconds ago       Up 1 seconds        0.0.0.0:80->80/tcp   berserk_mayer       
    225084efe2fb        centos:6.6          "/bin/bash"            32 minutes ago      Up 13 minutes                            angry_davinci 
    
    # 此時經過訪問服務器的 80 端口就能夠訪問到容器的 nginx 提供的服務
    [root@crazy-acong ~]# curl  http://127.0.0.1
    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    <style>
        body {
            width: 35em;
            margin: 0 auto;
            font-family: Tahoma, Verdana, Arial, sans-serif;
        }
    </style>
    </head>
    <body>
    <h1>Welcome to nginx!</h1>
    <p>If you see this page, the nginx web server is successfully installed and
    working. Further configuration is required.</p>
    
    <p>For online documentation and support please refer to
    <a href="http://nginx.org/">nginx.org</a>.<br/>
    Commercial support is available at
    <a href="http://nginx.com/">nginx.com</a>.</p>
    
    <p><em>Thank you for using nginx.</em></p>
    </body>
    </html> 

 

6.2 基於 Dockerfile 建立

      Dockerfile 是一個文本格式的配置文件,可使用 Dockerfile 快速建立自定義的鏡像。

Dockerfile 由多行命令語句組成,支持以 # 開頭的註釋行,其主要分爲四部分:基礎鏡像信息、維護者信息、鏡像操做指令、容器啓動時執行命令。

  • 指令詳細說明
  • 1、FROM  指定基礎鏡像,可使用鏡像ID或者 鏡像名稱:TAG
    2、MAINTAINER    指定維護者信息
    3、RUN
    RUN<command>或RUN["executable","param1","param2"]
    前者在shell 終端中運行命令  /bin/sh -c  指定
    後者能夠指定其餘終端,例如 RUN ["/bin/bash","-c","echo hello"]
    每條RUN 指令將在當前鏡像基礎上執行指定命令,並提交爲新的鏡像,當命令較長時可使用 \ 換行
    
    4、CMD   啓動容器時執行的命令,每一個Dockerfile 只能有一條 CMD 命令,若是存在多條,則最後一條生效,若是啓動容器時指定了運行命令,則會覆蓋掉 CMD指定的命令
    CMD["executable","param1","param2"]使用exec執行,推薦方式。
    CMDcommand param1 param2在/bin/sh中執行,提供給須要交互的應用。
    CMD["param1","param2"]提供給ENTRYPOINT的默認參數。
    
    5、EXPOSE   啓動容器時暴露的端口號
    EXPOSE 80
    在啓動容器的時候使用 -P 選項,Docker 服務端會隨機一個端口映射到容器暴露的端口上,或者使用 -p 指定端口進行映射
    
    6、ENV 設置容器中的環境變量
    ENV PATH /data/application/nginx-1.10.3/sbin/:$PATH
    
    7、ADD  將外部文件複製到容器內部
    ADD<src><dest>    其中<src>能夠是Dockerfile所在目錄的一個相對路徑(文件或目錄);也能夠是一個URL;還能夠是一個tar文件(自動解壓爲目錄)。
    例如:ADD nginx-1.10.3.tar.gz /usr/local/src/
    
    8、COPY
    格式爲COPY<src><dest>。
    複製本地主機的<src>(爲Dockerfile所在目錄的相對路徑,文件或目錄)爲容器中的<dest>。目標路徑不存在時,會自動建立。
    當使用本地目錄爲源目錄時,推薦使用COPY。
    
    9、ENTRYPOINT
    有兩種格式:
    ENTRYPOINT["executable","param1", "param2"]
    ENTRYPOINTcommand param1 param2(shell中執行)。
    配置容器啓動後執行的命令,而且不可被docker run提供的參數覆蓋。
    每一個Dockerfile中只能有一個ENTRYPOINT,當指定多個ENTRYPOINT時,只有最後一個生效。
    
    10、VOLUME
    格式爲VOLUME["/data"]。
    建立一個能夠從本地主機或其餘容器掛載的掛載點,通常用來存放數據庫和須要保存的數據等。
    
    11、USER
    格式爲USER daemon。
    指定運行容器時的用戶名或UID,後續的RUN也會使用指定用戶。
    當服務不須要管理員權限時,能夠經過該命令指定運行用戶。而且能夠在以前建立所須要的用戶,例如:RUN groupadd-r postgres&&useradd-r-g postgres postgres。要臨時獲取管理員權限可使用gosu,而不推薦sudo。
    
    12、.WORKDIR
    格式爲WORKDIR/path/to/workdir。
    爲後續的RUN、CMD、ENTRYPOINT指令配置工做目錄。
    可使用多個WORKDIR指令,後續命令若是參數是相對路徑,則會基於以前命令指定的路徑。例如:
    WORKDIR /a
    WORKDIR b
    WORKDIR c
    RUN pwd
    則最終路徑爲/a/b/c。
    
    13、ONBUILD
    格式爲ONBUILD[INSTRUCTION]。
    配置當所建立的鏡像做爲其餘新建立鏡像的基礎鏡像時,所執行的操做指令。例如,Dockerfile使用以下的內容建立了鏡像image-A。
    [...]
    ONBUILD ADD . /app/src
    ONBUILD RUN /usr/local/bin/python-build --dir /app/src
    [...]
    若是基於image-A建立新的鏡像時,新的Dockerfile中使用FROM image-A指定基礎鏡像時,會自動執行ONBUILD指令內容,等價於在後面添加了兩條指令。
    FROM image-A
    #Automatically run the following
    ADD . /app/src
    RUN /usr/local/bin/python-build --dir /app/src
    使用ONBUILD指令的鏡像,推薦在標籤中註明,例如ruby:1.9-onbuild。

     

  • 建立 Dockerfile:
  • [root@crazy-acong ~]# mkdir -p /opt/docker-file/nginx/
    [root@crazy-acong ~]# cd /opt/docker-file/nginx/
    
    # 注意 Dockerfile 的文件名只能叫 Dockerfile
    [root@crazy-acong nginx]# vi Dockerfile
    # This is My first Dockerfile
    # Version 1.0
    # Author: zhangcong 
    # Email: zc_92@sina.com
    
    # 基礎鏡像
    FROM centos:6.6
    
    # 維護者信息
    MAINTAINER zhangcong zc_92@sina.com
    
    # 將 Dockerfile 文件當前目錄下的 nginx-1.10.3.tar.gz 拷貝至 容器中的 /usr/local/src/
    ADD nginx-1.10.3.tar.gz /usr/local/src/
    
    # 在容器中執行命令
    RUN yum install -y wget gcc pcre pcre-devel openssl-devel
    RUN useradd nginx -s /sbin/nologin -M
    
    
    # 在容器中切換路徑
    WORKDIR /usr/local/src/nginx-1.10.3
    
    
    # RUN
    RUN ./configure --user=nginx --group=nginx --prefix=/data/application/nginx-1.10.3 --with-http_stub_status_module --with-http_ssl_module && make && make install
    RUN ln -s /data/application/nginx-1.10.3/ /etc/nginx
    RUN ln -s /data/application/nginx-1.10.3/sbin/nginx /usr/local/sbin/
    
    RUN echo "daemon off;" >> /etc/nginx/conf/nginx.conf
    
    # 在容器中修改環境變量
    ENV PATH /data/application/nginx-1.10.3/sbin/:$PATH
    
    # 容器暴露的端口號
    EXPOSE 80
    
    # 容器啓動時執行的命令
    CMD ["nginx"]
  • 建立鏡像

 

  • # 建議存放 Dockerfile 文件的目錄不要有子目錄,由於 docker build 會去查找指定目錄下面的子目錄中是否存在 Dockerfile 文件
    [root@crazy-acong nginx]# docker build -t dockerfile_centos6.6_nginx:v1 /opt/docker-file/nginx/
    
    [root@crazy-acong nginx]# docker images
    REPOSITORY                     TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
    dockerfile_centos6.6_nginx     v1                  df047bf77a2c        52 seconds ago      443.8 MB # 這個就是剛纔經過 Dockerfile 建立的容器
    centos6.6_nginx                v1                  aa4b2a57b43e        About an hour ago   446.2 MB
    centos                         6.6                 d0d663863c34        7 months ago        202.6 MB
    hub.c.163.com/library/centos   centos6.6           d0d663863c34        7 months ago        202.6 MB

     

  • 啓動鏡像
  • [root@crazy-acong nginx]# docker run -it -d -P dockerfile_centos6.6_nginx:v1 
    
    [root@crazy-acong nginx]# docker ps -a
    CONTAINER ID        IMAGE                           COMMAND                CREATED             STATUS              PORTS                  NAMES
    b9e7249dba1a        dockerfile_centos6.6_nginx:v1   "nginx"                3 seconds ago       Up 2 seconds        0.0.0.0:4000->80/tcp   compassionate_mayer   
    46a2ec546a50        aa4b2a57b43e                    "/etc/nginx/sbin/ngi   57 minutes ago      Up 57 minutes       0.0.0.0:80->80/tcp     berserk_mayer         
    225084efe2fb        centos:6.6                      "/bin/bash"            About an hour ago   Up About an hour                           angry_davinci     
    
    [root@crazy-acong nginx]# curl 127.0.0.1:4000
    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    <style>
        body {
            width: 35em;
            margin: 0 auto;
            font-family: Tahoma, Verdana, Arial, sans-serif;
        }
    </style>
    </head>
    <body>
    <h1>Welcome to nginx!</h1>
    <p>If you see this page, the nginx web server is successfully installed and
    working. Further configuration is required.</p>
    
    <p>For online documentation and support please refer to
    <a href="http://nginx.org/">nginx.org</a>.<br/>
    Commercial support is available at
    <a href="http://nginx.com/">nginx.com</a>.</p>
    
    <p><em>Thank you for using nginx.</em></p>
    </body>
    </html>
相關文章
相關標籤/搜索