• docker学习构建镜像---第三章节


    一.docker镜像使用

    运行docker容器时,使用的镜像如果在本地不存在,docker会自动从docker镜像仓库中下载,默认是从docker hub公共镜像源下载
    在这里,我们需要了解:管理和使用本地的docker镜像,创建镜像
    列出本地镜像列表:docker images

    [root@k8s-01 ~]# docker images
    REPOSITORY                                    TAG                 IMAGE ID            CREATED             SIZE
    k8s.gcr.io/kube-proxy                         v1.13.1             fdb321fd30a0        6 days ago          80.2MB
    k8s.gcr.io/kube-apiserver                     v1.13.1             40a63db91ef8        6 days ago          181MB
    k8s.gcr.io/kube-controller-manager            v1.13.1             26e6f1db2a52        6 days ago          146MB
    k8s.gcr.io/kube-scheduler                     v1.13.1             ab81d7360408        6 days ago          79.6MB
    k8s.gcr.io/coredns                            1.2.6               f59dcacceff4        6 weeks ago         40MB
    quay.io/external_storage/cephfs-provisioner   latest              8d09a3e96942        2 months ago        401MB
    k8s.gcr.io/etcd                               3.2.24              3cab8e1b9802        3 months ago        220MB
    quay.io/coreos/flannel                        v0.10.0-amd64       f0fad859c909        11 months ago       44.6MB
    k8s.gcr.io/pause                              3.1                 da86e6ba6ca1        12 months ago       742kB
    ubuntu                                        15.10               9b9cb95443b5        2 years ago         137MB
    training/webapp                               latest              6fae60ef3446        3 years ago         349MB
    

    参数说明:

    • REPOSITORY:表示镜像的仓库员
    • TAG:镜像的标签
    • IMAGE ID:镜像ID
    • CREATED:镜像的创建时间
    • SIZE:镜像大小
      同一个仓库源可以有多个TAG,表示这个仓库源的多个不同版本。我们使用REPOSITORY:TAG来定义不同的镜像
      我们在使用docker镜像的时候,如果不指定一个镜像的版本标签,docker默认使用laster镜像

    二.创建镜像

    当我们从docker镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行修改:

    • 从已经创建的容器中更新镜像,并且提交这个镜像
    • 使用dockerfile指令来创建一个新的镜像

    2.1 更新镜像

    更新镜像之前,我们需要使用镜像来创建一个容器

    [root@k8s-01 ~]# docker ps -l
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
    cb2ea5793288        training/webapp     "python app.py"     About an hour ago   Up About an hour    0.0.0.0:32768->5000/tcp   laughing_engelbart
    [root@k8s-01 ~]# docker exec -it cb2ea5793288 /bin/bash 
    root@cb2ea5793288:/opt/webapp# touch yushengyin.txt
    root@cb2ea5793288:/opt/webapp# cat yushengyin.txt 
    TEST CHUANGJIAN JINGXIANG
    

    我们进入容器中创建了一个yushengyin.txt的文件,并写入了一行文本,下面我们通过docker commit来提交容器副本

    [root@k8s-01 ~]# docker commit -m "add yushengyin.txt" -a "yuhaohao" cb2ea5793288 modify/webapp:v2 
    sha256:64647147dc09efb200997c2544ecaf22581fb392536512075d3e8ef36937740b
    

    提交修改的参数说明:

    • -m:提交的描述信息
    • -a:指定提交的镜像作者
    • cb2ea5793288:容器的ID
    • modify/webapp:v2:指定要创建的目标镜像名和TAG

    下面我们通过docker images查看我们更新的镜像modify/webapp:v2

    [root@k8s-01 ~]# docker images
    REPOSITORY                                    TAG                 IMAGE ID            CREATED             SIZE
    modify/webapp                                 v2                  64647147dc09        5 seconds ago       349MB
    training/webapp                               latest              6fae60ef3446        3 years ago         349MB
    

    使用新更新的镜像启动一个容器:

    [root@k8s-01 ~]# docker run -i -t modify/webapp:v2 /bin/bash 
    root@16d6341b43c5:/opt/webapp# ls
    Procfile  app.py  requirements.txt  tests.py  yushengyin.txt
    

    可以看出新更新的镜像包含我们修改的内容

    2.2 Dockerfile介绍

    我们使用docker build,从零开始来构建一个新的镜像。构建镜像之前,我们需要创建一个Dockfile文件,需要包含一组指令来告诉docker如何构建我们的镜像:
    docker有10几条命令可用于构建镜像,下面简要介绍这些命令
    ADD:ADD命令有两个参数,源和目标,它的基本作用是从源系统的文件系统上复制文件到目前容器的文件系统。如果源是一个URL,那么该URL的内容将被下载并复制到容器中。
    如:

    Usage: ADD [source directory or URL] [destination directory]
    ADD /my_app_folder /my_app_folder
    

    CMD:和RUN命令相似,CMD可以用于执行特定的命令。和RUN不同的是,这些命令不是在镜像构建的时候执行的,而是在用镜像构建容器后被调用
    如:

    Usage 1: CMD application "argument", "argument", ..
    CMD "echo" "Hello docker!"
    

    ENTRYPOINT:配置容器启动后执行的命令,并且不可以被docker run提供的参数覆盖,每个Dockerfile中只能有一个ENTRYPOINT,当指定多个时,只有最后一个起效。ENTRYPOINT帮助你配置一个容器使之可执行化,如果你结合CMD命令和ENTRYPOINT命令,你可以从CMD命令中移除"application"而仅仅保留参数。参数将传递给ENTRYPOINT命令。

    # Usage: ENTRYPOINT application "argument", "argument", ..
    # Remember: arguments are optional. They can be provided by CMD
    # or during the creation of a container.
    ENTRYPOINT echo
    # Usage example with CMD:
    # Arguments set with CMD can be overridden during *run*
    CMD "Hello docker!"
    ENTRYPOINT echo
    

    ENV:ENV命令用于设置环境变量,这些变量以"key=value"的形式存在,并可以在容器内被脚本或者程序调用。这个机制在给容器中运行应用带来了极大的方便。

    # Usage: ENV key value
    ENV SERVER_WORKS 4
    

    EXPOSE:EXPOSE用来指定端口,使容器内的应用可以通过端口和外界交互

    # Usage: EXPOSE [port]
    EXPOSE 8080
    

    FROM:FROM命令可能是最重要的Dockerfile命令,该命令定义了使用哪个基础镜像启动构建流程。基础镜像可以为任意镜像,如果基础镜像没有被发现,docker将试图从docker image index来查找该镜像。FROM命令必须是Dockerfile的首个命令

    #Usage: FROM [image name]
    FROM ubuntu 
    

    MAINTAINER:我建议这个命令放在dockerfile的起始部分,虽然理论上它可以放置于dockerfile的任意位置。这个命令用于生命作者,并应该放在RROM的后面。

    # Usage: MAINTAINER [name]
    MAINTAINER authors_name 
    

    RUN:RUN命令是dockerfile执行命令的核心部分,它接受命令作为参数 并用于创建镜像。不像CMD命令,RUN命令用于创建镜像(在之前commit的层之上形成的层)

    # Usage: RUN [command]
    RUN aptitude install -y riak
    

    USER:USER命令用于设置运行容器的UID

    # Usage: USER [UID]
    USER 751
    

    VOLUME:VOLUME命令用于让你的容器访问宿主机上的目录

     # Usage: VOLUME ["/dir_1", "/dir_2" ..]
     VOLUME ["/my_files"]
    

    WORKDIR:WORKDIR命令用于设置CMD指明的命令的运行目录

     # Usage: WORKDIR /path
    WORKDIR ~/
    

    2.3 构建镜像

    [root@k8s-01 ~]# cat Dockerfile
    FROM    centos:6.7
    MAINTAINER      Fisher "fisher@sudops.com"
    
    RUN     /bin/echo 'root:123456' |chpasswd
    RUN     useradd runoob
    RUN     /bin/echo 'runoob:123456' |chpasswd
    RUN     /bin/echo -e "LANG="en_US.UTF-8"" >/etc/default/local
    EXPOSE  22
    EXPOSE  80
    CMD     /usr/sbin/sshd -D
    

    这里每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。

    • 第一条FROM,指定使用哪个镜像源
    • RUN指令告诉docker在镜像内指定命令,安装了什么
    • 然后我们使用Dockerfile文件,通过docker build命令来构建一个镜像

    执行镜像的构建:

    [root@k8s-01 docker]# docker build -t yushengyin/centos:6.7 .
    Sending build context to Docker daemon  2.048kB
    Step 1/9 : FROM    centos:6.7
    6.7: Pulling from library/centos
    cbddbc0189a0: Pull complete 
    Digest: sha256:da0f2d8fb80e6f82ec8b89c2723cfd6c910196ac3894b681f5b001af7d9cf82d
    Status: Downloaded newer image for centos:6.7
     ---> 192ad0341c8b
    Step 2/9 : MAINTAINER      yushengyin "yushengyin@163.com"
     ---> Running in b1986e6eb7e1
    Removing intermediate container b1986e6eb7e1
     ---> 280571722c0a
    Step 3/9 : RUN     /bin/echo 'root:123456' |chpasswd
     ---> Running in 2a9e4ed352de
    Removing intermediate container 2a9e4ed352de
     ---> 77256a924e7a
    Step 4/9 : RUN     useradd runoob
     ---> Running in e1312eb6a6a3
    Removing intermediate container e1312eb6a6a3
     ---> 8e551279ca45
    Step 5/9 : RUN     /bin/echo 'runoob:123456' |chpasswd
     ---> Running in 4bfbfee565f6
    Removing intermediate container 4bfbfee565f6
     ---> 3988c5ef7688
    Step 6/9 : RUN     /bin/echo -e "LANG="en_US.UTF-8"" >/etc/default/local
     ---> Running in ca280bc04666
    Removing intermediate container ca280bc04666
     ---> 448d1cf226c2
    Step 7/9 : EXPOSE  22
     ---> Running in 714f2bd21f68
    Removing intermediate container 714f2bd21f68
     ---> 8ae1b8ebab8a
    Step 8/9 : EXPOSE  80
     ---> Running in dd99b9df58d0
    Removing intermediate container dd99b9df58d0
     ---> 63f66a55adea
    Step 9/9 : CMD     /usr/sbin/sshd -D
     ---> Running in 62c5810140bd
    Removing intermediate container 62c5810140bd
     ---> 4f2531db0da1
    Successfully built 4f2531db0da1
    Successfully tagged yushengyin/centos:6.7
    

    查看镜像:

    [root@k8s-01 docker]# docker images
    REPOSITORY                                    TAG                 IMAGE ID            CREATED             SIZE
    yushengyin/centos                             6.7                 4f2531db0da1        15 seconds ago      191MB
    

    使用新镜像启动一个容器:

    [root@k8s-01 docker]# docker run -t -i yushengyin/centos:6.7 /bin/bash
    [root@4d65228dd85a ~]# id runoob
    uid=500(runoob) gid=500(runoob) groups=500(runoob)
    

    上面的镜像包含我们创建的用户runoob

    设置标签:
    我们可以用docker tag命令,给镜像添加一个新的标签

    [root@k8s-01 docker]# docker tag 4f2531db0da1 yushengyin/centos:dev
    [root@k8s-01 docker]# docker images
    REPOSITORY                                    TAG                 IMAGE ID            CREATED             SIZE
    yushengyin/centos                             6.7                 4f2531db0da1        2 minutes ago       191MB
    yushengyin/centos                             dev                 4f2531db0da1        2 minutes ago       191MB
    

    参考链接:http://www.runoob.com/docker/docker-image-usage.html

  • 相关阅读:
    cd /etc/init.d查看centos下自己注册的服务
    添加提前闭合标签 之后添加js可以执行js
    networkinterface 获取本机ip
    docker学习遇到的问题
    乌班图安装
    c3p0连接错误 An attempt by a client to checkout a Connection has timed out.
    【Spring开发】—— Spring注入静态变量
    mysql命令行导入导出
    IE8下不支持console.log()
    菜鸟教程
  • 原文地址:https://www.cnblogs.com/yuhaohao/p/10151289.html
Copyright © 2020-2023  润新知