zoukankan      html  css  js  c++  java
  • 菜鸟系列docker——docker镜像上(3)

    1. 镜像image

    镜像和容器的关系就和安装包和程序的关系一样,有了镜像才可以启动容器,容器是镜像的一个运行实例。

    1.1 镜像的结构

    通过第二节仓库,可能很多看官已经查看到镜像是分层的,接下来将对镜像进行详细介绍。首先,通过一个我们最熟悉对hello-world开始入门。此处涉及很多关于镜像对命令。

    • 通过docker pull一个镜像
    [centos@jiliguo ~]$ docker pull hello-world
    Using default tag: latest
    latest: Pulling from library/hello-world
    1b930d010525: Pull complete 
    Digest: sha256:92695bc579f31df7a63da6922075d0666e565ceccad16b59c3374d2cf4e8e50e
    Status: Downloaded newer image for hello-world:latest
    
    • 通过docker images查看镜像
    [centos@jiliguo ~]$ docker images hello-world
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    hello-world         latest              fce289e99eb9        3 months ago        1.84kB
    
    • 通过docker run运行镜像
    [centos@jiliguo ~]$ docker run hello-world
    
    Hello from Docker!
    This message shows that your installation appears to be working correctly.
    

    那么这个镜像包含写什么呢?我们查看一下构建该镜像对dockerfile文件
    https://hub.docker.com/
    查找hello-world镜像
    在Supported tags and respective Dockerfile links选择一个查看即可

    FROM scratch
    COPY hello /
    CMD ["/hello"]
    

    这个文件就三行,其含义是 from一个基础镜像,拷贝hello文件,容器启动时执行hello文件。这里基础镜像是scratch,其含义是从0开始对,没有依赖其他镜像。
    我们看看nginx这个镜像对dockerfile。

    FROM debian:stretch-slim
    
    LABEL maintainer="NGINX Docker Maintainers <docker-maint@nginx.com>"
    
    ENV NGINX_VERSION 1.14.2-1~stretch
    ENV NJS_VERSION   1.14.2.0.2.6-1~stretch
    # run后面太长了,省略下
    RUN ....
    RUN ln -sf /dev/stdout /var/log/nginx/access.log 
    	&& ln -sf /dev/stderr /var/log/nginx/error.log
    EXPOSE 80
    
    STOPSIGNAL SIGTERM
    
    CMD ["nginx", "-g", "daemon off;"]
    

    通过nginx可以看出,它是依赖于debian镜像对基础上创建的。

    接下来将通过nginx的dockerfile文件详细介绍docker镜像的结构
    dockerfile文件里,每一个命令都可以看成一层,第一层 from,第二层label,第三层env,第四层也是env。这样描述可能不是很清晰,接下来我们通过nginx的dockerfile构建一个镜像。让各位更加直观的感受下docker镜像分层。
    -----一个尴尬的分割线,还是毕竟长----- 看一部分哈

    [centos@jiliguo docker]$ docker build -t mynginx:v1.0 .
    Sending build context to Docker daemon  6.144kB
    Step 1/9 : FROM debian:stretch-slim
    stretch-slim: Pulling from library/debian
    27833a3ba0a5: Already exists 
    Digest: sha256:bade11bf1835c9f09b011b5b1cf9f7428328416410b238d2f937966ea820be74
    Status: Downloaded newer image for debian:stretch-slim
     ---> c08899734c03
    Step 2/9 : LABEL maintainer="NGINX Docker Maintainers <docker-maint@nginx.com>"
     ---> Running in d01ec5c5a51c
    Removing intermediate container d01ec5c5a51c
     ---> 2c123195c3f6
    Step 3/9 : ENV NGINX_VERSION 1.14.2-1~stretch
     ---> Running in 0adfc50e4af7
    Removing intermediate container 0adfc50e4af7
     ---> 088f48b30338
    Step 4/9 : ENV NJS_VERSION   1.14.2.0.2.6-1~stretch
     ---> Running in 6f1ed07ec93b
    Removing intermediate container 6f1ed07ec93b
    

    再次确认了每行都是一层了吧。

    1.2 分层结构

    其实分层有个很大的优势,因为他将一个镜像分层了,则层之间是可以资源复用的,怎么说呢。如果我们需要对nginx再封装多个服务,则这多个服务对nginx层是可以复用的,这样的话就只需要保留一个nginx镜像。

    note:即使复用了一些层,但是各个容器是相互隔离的,并不会因为某个容器修改了一个文件,另一个容器相对的文件也被修改了。

    在容器启动的后,容器整个架构就在最上层存在一个容器层,下面都是镜像层,只有容器层是可写的。所有对容器修改等操作都发生再容器层。

    image

    1.3 镜像相关命令

    1. docker images 查看镜像
    2. docker pull 获取镜像
    3. docker push 上传镜像
    4. docker build 构建镜像
    5. docker search 查找镜像
    6. docker tag 给镜像打标签
    7. docker rmi 删除镜像
    8. docker save/load 保存/加载镜像
    9. docker commit 构建镜像
    有兴趣的关注IT程序员客栈哦

    如果你觉得写的不错,请移步www.itkezhan.top或者关注公众号IT程序员客栈
  • 相关阅读:
    多维数组的理解
    C++ STL 中erase()的使用需要小心
    大整数相加和大整数相乘
    project1_calculator(使用tkinter实现python计算器,含有具体过程与注释)
    (转)在Source Insight中看Python代码
    class12_pack_grid_place 放置位置
    (转)AttributeError: module 'tkinter' has no attribute 'messagebox'
    class10_Frame 框架
    class9_Menubar 菜单
    class8_Canvas 画布
  • 原文地址:https://www.cnblogs.com/i-dandan/p/10741601.html
Copyright © 2011-2022 走看看