zoukankan      html  css  js  c++  java
  • Docker镜像管理基础与基于容器的镜像制作示例

    一、Docker镜像

      Docker镜像是启动Docker容器的一个非常重要的组件。Docker各组件之间的关系如图:

      Docker镜像含有启动容器所需要的文件系统及其内容,因此Docker镜像用于创建并启动容器。并且Docker镜像是采用分层构建,联合挂载的机制实现的。那什么是分层构建,联合挂载呢?如图:

      在分层构建机制中,最底层为bootfs,用于系统引导的文件系统,包括bootloader和kernel,容器启动完成后会被卸载以节省内存资源。在bootfs之上的是rootfs,这里就是docker容器的根文件系统,要指出的是在docker中,由内核挂载为“只读模式”,而后通过“联合挂载”额外挂载一个可写层。

      例如我们需要做一个httpd的Docker镜像,通常是在一个最小的Linux系统之上利用分层构建技术再新建一个层用来构建httpd服务。所有的写操作都只能在writable层实现。

    二、Overlayfs和Aufs

      要实现分层构建需要特殊的文件系统来支持,最早是使用Aufs,但现在Docker中默认的是使用Overlayfs。

    三、Docker Registry

      启动容器时,Docker daemon会试图从本地获取相关的镜像;本地镜像不存在时,其将从Registry中下载该镜像并保存到本地,在不指定Registry时会默认指向dockerhub。Docker Registry分类:Sponsor Registry、Mirror Registry、Vendor Registry、Private Registry。

      Registry是由repository和index组成。repository可分为顶层仓库和用户仓库,用户仓库的格式为“用户名/仓库名”。镜像的开发与维护:

    四、基于容器的Docker镜像制作示例

      下面举一个简单的小例子:在busybox镜像的基础上制作一个网页镜像,每次启动运行这个镜像时,这个网页页面都会自动存在并运行。

      1.启动一个最小系统,如busybox,创建一个页面:

    ]# docker run --name box1 -it busybox
    / # ls
    bin   dev   etc   home  proc  root  sys   tmp   usr   var
    / # mkdir -p /data/html
    / # vi /data/html/index.html
    <h1>Hello Docker.</h1>

      2.保证容器处于运行状态,使用docker commit命令制作:

    ~]# docker commit -h
    Flag shorthand -h has been deprecated, please use --help
    Usage:    docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
    Create a new image from a container's changes
    Options:
      -a, --author string    Author (e.g., "John Hannibal Smith
                            <hannibal@a-team.com>")
      -c, --change list      Apply Dockerfile instruction to the
                             created image
      -m, --message string   Commit message
      -p, --pause            Pause container during commit (default true) #容器运行时还在不停的生成新文件,为了完整性,可以使用这一选项。
    ~]# docker commit -p box1 
    sha256:15cb8525323f4287b2977b4f0d4809421aaab194b39985ad8f3cd32b9a721bc9
    ~]# docker image ls
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    <none>              <none>              15cb8525323f        38 seconds ago      1.2MB
    busybox             latest              3a093384ac30        2 weeks ago         1.2MB

      <none>就是刚才制作的的镜像,因为没有指定Repository名和Tag所以显示为<none>。为了使用便利,也可以用 docker tag 打上标签和Repository名:

    ~]# docker tag 15cb8525323f ready/httpd:v0.1
    ~]# docker image ls
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    ready/httpd         v0.1                15cb8525323f        6 minutes ago       1.2MB
    busybox             latest              3a093384ac30        2 weeks ago         1.2MB

      启动镜像,可以看到文件都在:

    ~]# docker run --name new1 -it ready/httpd:v0.1
    / # ls data/html/index.html 
    data/html/index.html
    / #

      3.查看docker容器启动时默认运行的程序

      用 docker inspect 命令可以查看容器启动时默认运行的程序:

    ~]# docker inspect new1
    ...略去...
    "Cmd": [
             "sh" #说明启动时默认运行的是shell
        ]
    ...略去...
    ~]# docker inspect nginx:1.14-alpine
    "
    Cmd": [ "nginx", "-g", "daemon off;" #nginx必须运行在前台,不然就代表启动即停止 ]

      用 docker commit 修改容器启动时默认运行的程序:

    ~]# docker commit -a "Ready" -c 'CMD ["/bin/httpd","-f","-h","/data/html"]' -p new1 ready/httpd:v0.2
    sha256:d2eee7f29cc73a7bd64487752133772be8dd69fbf6c2f0db92ff07e33bc8c5ee

      -a :是指明作者,-c :是修改默认配置,上面的示例只是修改了CMD的参数。

      启动新镜像,现在默认运行的不是shell了,所以不使用-it选项:

    ~]# docker container run --name new2 ready/httpd:v0.2

      再启一个终端,用curl命令就可以直接访问这个容器的页面了:

    ~]# curl 172.17.0.2
    <h1>Hello Docker.</h1>

     4.做好容器后就能根据需要push到容器仓库中了

      可以根据实际情况push到docker hub或者阿里云的容器仓库,或者其他的仓库。

      虽然这个容器中的httpd服务和网页都已经搭建好了,但只有容器的宿主机和同一宿主机上的其他容器能够访问这个页面,这是因为容器的网卡是链接在宿主机上的虚拟网卡上的,如果要外部能访问容器的网页,需要打开宿主机Linux的核心转发功能。

  • 相关阅读:
    SpringBoot--整合Mybatis
    SpringBoot--使用JDBC连接mysql
    使用docker创建mysql容器
    iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 3306 -j DNAT --to-destination 172.17.0.2:3306 ! -i docker0: iptables: No chain/target/match by that name
    SpringBoot--配置文件
    yqq命令
    vim/vm命令后提示错误:Found a swap file by the name ".dockerfile.swp"
    推荐一个十分好看的开源博客系统
    [转]技术的热门度曲线
    逆向学习笔记(2)-这是代码还是数据
  • 原文地址:https://www.cnblogs.com/readygood/p/10283950.html
Copyright © 2011-2022 走看看