Docker 镜像

目录:

1、Docker 镜像介绍

2、镜像下载

3、查看镜像信息

4、搜索镜像

5、删除镜像

6、创建镜像

6.1 基于已有镜像的容器创建

6.2 基于 Dockerfile 创建

1、Docker 镜像介绍

      Docker 镜像跟虚拟机镜像的概念差不多,都是可以通过镜像来创建虚拟机或容器,Docker 运行容器的时候首先会在本地寻找,如果本地不存在该镜像,则会从默认的镜像仓库中下载(默认使用 Docker Hub 公共注册服务器中的仓库)

 

2、镜像下载

      可以通过 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)

 

3、查看镜像信息

使用 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、6.8、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

 

4、搜索镜像

      使用 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/

 

5、删除镜像

使用 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 强制删除,但是不推荐这样做,可以先删除容器,最后在删除镜像

 

6、创建镜像

 创建镜像的方法:

    • 基于已有镜像的容器创建
    • 基于 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>

     

posted on 2017-04-07 11:32  奋斗中的码农  阅读(2734)  评论(1编辑  收藏  举报

导航