zoukankan      html  css  js  c++  java
  • docker入门实战3 镜像、容器、仓库

    三、镜像

    如何使用pull命令从docker hub仓库中下载镜像到本地;如何查看本地已有的镜像信息;如何在远端仓库使用search命令进行搜索和过滤;如何删除镜像标签和镜像文件;如何创建用户定制的镜像并且保存为外部文件;如何向docker hub仓库中推送自己的镜像。

    3.1 获取镜像

    镜像是docker运行容器的前提。

    使用docker pull命令从网络上下载镜像。格式为docker pull NAME[:TAG]。如果不显式指定TAG,则默认会选择latest标签,即下载仓库中最新版本的镜像。

    默认从默认注册服务器中的仓库下载。如果选择从其它注册服务器的仓库下载,需要在仓库名称前指定完整的仓库注册服务器地址。例如:

    sudo docker pull dl.dockerpool.com:5000/ubuntu

    下载镜像到本地后,即可随时使用该镜像了,例如利用该镜像创建一个容器,在其中运行bash应用。

    sudo docker run -t -i ubuntu /bin/bash

    3.2 查看镜像信息

    使用docker images命令可以列出本地主机上已有的镜像。

    sudo docker images

    1)来自于哪个仓库,比如Ubuntu库;

    2)镜像的标签信息,比如14.04;

    3)镜像的ID号(唯一);

    4)创建时间;

    5)镜像大小。

    其中镜像ID唯一标识了镜像。

    TAG信息用于标记来自同一个仓库的不同镜像。

    可以用docker tag命令为本地镜像添加新的标签。多个不同标签的镜像可以指向同一个镜像文件,此时它们的镜像ID相同只是别名不同而已。标签在这里起到了引用或快捷键方式的作用。

    使用docker inspect命令可以获取该镜像的详细信息。其后指出镜像ID。

    sudo docker inspect 5506de2b643b

    docker inspect命令返回的是一个JSON格式的消息,如果我们只要其中一项内容时,可以使用-f参数来指定,例如,获取镜像的Architecture信息:

    sudo docker inspect -f {{".Architecture"}} 550

    这里的550是镜像ID的有效区分前缀,可以用ID的前若干个字符组成的可区分字串来替代完整的ID。

    3.3 搜寻镜像

    使用docker serach命令可以搜索远端仓库中共享的镜像,默认搜索docker hub官方仓库中的镜像。

    用法为docker search TERM,支持的参数包括:

      --automated=false仅显示自动创建的镜像。

      --no-trunc=false输出信息不截断显示。

      -s, --stars=0指定仅显示评价为指定星级以上的镜像。

    例如:sudo docker search mysql

    返回了很多包含关键字的镜像,其中包括镜像名字、描述、星级(表示该镜像的受欢迎程度)、是否官方创建、是否自动创建等。

    3.4 删除镜像

    使用镜像的标签删除镜像:

    使用docker rmi命令删除,格式为docker rmi IMAGE [IMAGE...],其中IMAGE可以为标签或ID。

    sudo docker rmi docker.io/ubuntu

    如果一个镜像有多个标签,那么删除其中一个不影响其它。

    使用镜像ID删除镜像:

    当使用docker rmi命令后面跟上镜像的ID(也可以是ID能进行区分的部分前缀串)时,会先尝试删除所有指向该镜像的标签,然后删除该镜像文件本身。当有该镜像创建的容器存在时,镜像文件默认是无法被删除的。

    使用docker ps -a命令可以看到本机上存在的所有容器。

    容器依赖于镜像。删除镜像会显示存在容器依赖,如果有容器依赖时-f强制删除镜像,会保留下镜像的ID但删除了镜像。

    如果没有容器依赖镜像则会直接删除镜像。

    容器也有唯一的容器ID。

    可以先删除依赖镜像的容器,再删除镜像。

    sudo docker rm e81

    这删除了依赖容器ID为e81的所有容器。

    3.5 创建镜像

    三种方法创建镜像:基于已有镜像的容器创建、基于本地模板导入、基于Dockerfile创建。

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

    docker commit命令,其命令格式为docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG] ],主要选项包括:

    1)-a ,--author=""作者消息

    2)-m,--message=""提交消息。

    3)-p ,--pause=true提交时暂停容器运行。

    例子-利用之前获取的ubuntu镜像来修改:

    sudo docker run -ti ubuntu /bin/sh

    //进入ubuntu的命令行

    touch test

    //创建test文件

    exit

    //退出

    //回到本地主机

    sudo docker commit -m "Add a new file test" -a "xyy" [原容器ID] [我们设置的镜像名称:标签]

    //顺利的话,命令会返回新创建的镜像的ID信息,例如9dhaeefye7w6ee

    //此时查看本地镜像列表,即可看到新创建的镜像

    基于本地模板导入:

    可以直接从一个操作系统模板文件导入一个镜像

    sudo cat ubuntu-14.04-x86_64-minimal.tar.gz |docker import - ubuntu:14.04

    然后查看新导入的镜像,已经在本地存在了。

    导入的须是tar文件。

    基于Dcokerfile导入:

    3.6 存出和载入镜像

    可以使用docker save和docker load命令来存出和载入镜像。

    存出镜像:

    如果要存出镜像到本地文件,可以使用docker save命令。

    例如,存出本地的ubuntu:14.04镜像为文件ubuntu_14.04.tar:

    sudo docker save -o ubuntu_14.04.tar ubuntu:14.04

    载入镜像:

    可以使用docker load从存出的本地文件中再导入到本地镜像库,例如从文件ubuntu_14.04.tar导入镜像到本地镜像列表:

    sudo docker load --input ubuntu_14.04.tar

    或  sudo docker load < ubuntu_14.04.tar

    这将导入镜像以及其相关的元数据信息(包括标签等)。

    3.7 上传镜像

    可以使用docker push命令上传镜像到仓库,默认上传到DockerHub官方库(需要登录),命令格式为docker push NAME[: TAG]。

    四、容器

    容器是docker另一个核心概念。容器是镜像的一个运行实例,所不同的是,它带有额外的可写文件层。

    本章介绍容器的相关操作:创建一个容器、启动容器、终止一个容器、进入容器内执行操作、删除容器和通过导入导出容器来实现容器迁移等。

    4.1 创建容器

    Docker容器十分轻量级,用户可以随时创建或删除容器。

    新建容器:

    可以使用docker create命令新建一个容器,例如:

    sudo docker create -it ubuntu :latest

    docker ps -a

    使用docker create命令新建的容器处于停止状态,可以使用docker start命令来启动它。

    新建并启动容器:(上一章的:docker run -ti ubuntu /bin/bash 是先创建容器再启动容器

    启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态(stopped)的容器重新启动。所需要的命令主要为docker run,等价于先执行docker create命令,再执行docker start命令。

    当利用docker run来创建并启动容器时,docker在后台运行的标准操作包括:

    1)检查本地是否存在指定的镜像,不存在就从共有仓库下载。

    2)利用镜像创建并启动一个容器。

    3)分配一个文件系统,并在只读的镜像层外面挂载一层可读写层。

    4)从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去。

    5)从地址池配置一个IP地址给容器。

    6)执行用户指定的应用程序。

    7)执行完毕后容器被终止。

    docker run -ti 中

    -t 选项让docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上,

    -i 选项让容器的标准输入保持打开。

    用户可以按Ctrl+d或输入exit命令来退出容器。

    对于所创建的bash容器,当使用exit命令退出后,该容器就自动处于终止状态。对于docker容器来说,当运行的应用退出后,容器也就没有继续运行的必要了。

    守护态运行:

    更多的时候,需要让docker容器在后台以守护态(Daemonized)形式运行。用户可以通过添加 -d 参数来实现。

    sudo docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"

    终止容器:

    可以使用docker stop来终止一个运行中的容器,命令的格式为docker stop [-t | --time[=10] ]。它首先向容器发送SIGTERM信号,等待一段时间后(默认为10秒),再发送SIGKILL信号终止容器。

    当docker容器中指定的应用终结时,容器也自动终止。

    docker stop [容器ID]

    处于终止状态的容器,可以通过docker start命令来重新启动。

    docker start [容器ID]

    此外,docker restart命令会将一个运行态的容器终止,然后再重新启动它。

    4.3 进入容器

    在使用-d参数时,容器启动后会进入后台,用户无法看到容器中的信号。某些时候如果需要进入容器进行操作,有多种方法,包括使用docker attach命令、docker exec命令,以及nsenter工具等。

    attch命令:

    docker attach是docker自带的命令。

    sudo docker attach [容器ID或容器NAME]

    使用attach有时候并不方便。当多个窗口同时attach到同一个容器的时候,所有窗口都会同步显示。当某个窗口因命令阻塞时,其它窗口也无法执行操作了。

    exec命令:

    可直接在容器内运行命令。例如进入一个ubuntu容器并启动bash:

    sudo docker exec -ti [容器ID]  /bin/bash

    exec命令用于已打开的容器。

    nsenter工具:

    nsenter工具在util-linux包2.23版本后包含。如果系统中util-linux包没有该命令,可以按照下面的方法从源码安装:

    curl https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz | tar -zxf-; cd util-linux-2.24;

    ./configure --without-ncurses

    make nsenter && sudo cp nsenter /usr/local/bin

    为了使用nsenter连接到容器,还需要找到容器的进程的PID,可以通过下面的命令获取:

    PID=$(docker inspect --format "{ { .State.Pid } }" [container])

    通过这个PID,就可以连接到这个容器:

    nsenter --target $PID --mount --uts --ipc --net --pid

    4.4 删除容器

    可以使用docker rm命令删除处于终止状态的容器,命令格式为docker rm [OPTIONS] CONTAINER [CONTAINER...]。支持的选项包括:

    1)-f,--force=false强行终止并删除一个运行中的容器。

    2)-l,--link=false删除容器的连接,但保留容器。

    3)-v,--volumes=false删除容器挂载的数据卷。

    4.5 导入和导出容器

    导出容器:

    导出容器是指导出一个已经创建的容器到一个文件,不管此时这个容器是否处于运行状态,可以使用docker export命令,该命令的格式为docker export CONTAINER。

    例如:docker export [容器ID] > 文件名.tar

    可将容器导出的文件传输到其它机器上导入成为镜像。

    导入容器:

    导出的文件又可以使用docker import命令导入,成为镜像,例如:

    cat test_for_run.tar | sudo docker import - test/ubuntu:v1.0

    前一章有一个docker load命令导入镜像存储文件到本地的镜像库,也可以使用docker import命令来导入一个容器快照到本地镜像库。这两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也要大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。

    4.6 容器小结

    容器是直接提供应用服务的组件,也是docker实现快速的启停和高效服务性能的基础。

    五、仓库

    仓库repository是集中存放镜像的地方。

    容易与其混淆的是注册服务器(registry)。注册服务器是存放仓库的具体服务器,每个服务器上可有多个仓库,每个仓库下可有多个镜像。

    5.1 docker hub

    官方维护了一个公共仓库https://hub.docker.com。

    登录:

    通过执行docker login命令来输入用户名、密码和邮箱来完成注册和登录。注册成功后,本地用户目录的.dockerfg中将保存用户的认证信息。

    基本操作:

    用户无需登录即可通过docker search命令来查找官方仓库中的镜像,并利用docker pull命令将它下载到本地。

    在查找时候通过-s N参数可以指定仅显示评价为N星以上的镜像。

    登录后用户可用docker push将本地镜像推送到docker hub。

    自动创建

    自动创建(automated builds)功能对于需要经常升级镜像内程序来说十分方便。有时候,用户创建了镜像,安装了某个软件,如果软件发布新版本则需要手动更新镜像。

    而自动创建功能使得用户通过docker hub指定跟踪一个目标网站(目前支持GitHub或bitbucket)上的项目,一旦项目发现新的提交,则自动执行创建。

    5.2 docker pool简介

    docker pool(http://dockerpool.com)是国内专业的docker技术社区,目前也提供了官方镜像的下载管理服务。

    5.3 创建和使用私有仓库

    使用registry镜像创建私有仓库:

    安装docker后,可以通过官方提供的registry镜像来简单搭建一套本地私有仓库环境:

    sudo docker run -d -p 5000:5000 registry

    这将自动下载并启动一个registry容器,创建本地的私有仓库服务。

    默认情况下,会将仓库创建在容器的/tmp/registry目录下。可以通过-v参数来将镜像文件存放在本地的指定路径上。

    sudo docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry

    此时,在本地将启动一个私有仓库服务,监听端口为5000。

    管理私有仓库镜像:

    docker push

    其它可访问本机的可用curl http://[本机ip]:5000/v1/search查看仓库中的镜像。

    可用docker pull获取镜像。

  • 相关阅读:
    BZOJ 3122 SDOI2013 随机数生成器
    【BZOJ 1178】【APIO 2009】CONVENTION会议中心
    【BZOJ 3242】【UOJ #126】【CodeVS 3047】【NOI 2013】快餐店
    【BZOJ 2118】墨墨的等式
    【BZOJ 4547】【HDU 5157】小奇的集合
    【BZOJ 4455】【UOJ #185】【ZJOI 2016】小星星
    【BZOJ 3879】SvT
    【BZOJ 4104】【THUSC 2015】解密运算
    【POJ 2482】Stars in Your Window
    【HDU 2089】不要62
  • 原文地址:https://www.cnblogs.com/cjj-ggboy/p/12625818.html
Copyright © 2011-2022 走看看