Docker镜像

原创
2019/05/04 20:46
阅读数 33

Docker

一、基本概念

Docker包括三个基本概念

镜像(image)
容器(container)
仓库(repository)

理解了这三个概念,就理解了Docker的整个生命周期。


二、Docker镜像、Docker容器、Docker仓库

docker镜像就是一个只读的模板。
例如:一个镜像可以包含一个完整的ubuntu操作系统环境,里面仅安装了Apache或用户需要的其他应用程序。
镜像可以用来创建Docker容器。
Docker提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像直接使用。


Docker容器

DOcker利用容器来运行应用。

容器是从镜像创建的运行实例.它可以被启动、开始、停止、删除。每个容器都是互相隔离的、保证安全的平台。

可以把容器看作是一个简易的LINUX环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。

注:镜像是只读的,容器在启动的时候创建一层可写层作为最上层。


Docker仓库

仓库是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签

仓库分为公开仓库和私有仓库两种形式。

最大的公开仓库是DOcker Hub,存放了数量庞大的镜像供用户下载。国内的公开仓库包括Docker Pool等,可以提供大陆用户更稳定快速的访问。

当然,用户也可以在本地网络内创建一个私有仓库。

当用户创建了自己的镜像后,就可以使用 push 命令将它上传到公有或者私有仓库,这样下次再另外一台机器上使用这个镜像时候,只需要从仓库上 pull 下来就可以了。

三、安装

Ubuntu系列安装Docker
通过系统自带包安装

$    sudo    apt-get    update
$    sudo    apt-get    install    -y    docker.io
$    sudo    ln    -sf    /usr/bin/docker.io    /usr/local/bin/docker
$    sudo    sed    -i    '$acomplete    -F    _docker    docker'    /etc/bash_completion.d/docker.io


如果使用操作系统自带包安装    Docker,目前安装的版本是比较旧的    0.9.1。 要安装更新的版本,可以通过
使用    Docker    源的方式。
要安装最新的    Docker    版本,首先需要安装    apt-transport-https    支持,之后通过添加源来安装。


$    sudo    apt-get    install    apt-transport-https
$    sudo    apt-key    adv    --keyserver    hkp://keyserver.ubuntu.com:80    --recv-keys    36A1D7869245C8950F966E92D8576A8BA88D21E9
$    sudo    bash    -c    "echo    deb    https://get.docker.io/ubuntu    docker    main    >    /etc/apt/sources.list.d/docker.list"
$    sudo    apt-get    update
$    sudo    apt-get    install    lxc-docker


CentOS    系列安装    Docker

CentOS7    系统     CentOS-Extras    库中已带    Docker,可以直接安装:

$    sudo    yum    install    docker

安装之后启动    Docker    服务,并让它随系统启动自动加载。


$    sudo    service    docker    start
$    sudo    chkconfig    docker    on


四、Docker镜像

Docker运行容器前需要本地存在对应的镜像,如果镜像不存在本地,Docker会从镜像仓库下载(默认是Docker Hub公共注册服务器中的仓库)。

本章介绍:

从仓库获取镜像。
管理本地主机上的镜像
介绍镜像实现的基本原理


1,获取镜像

可以使用 docker pull  命令来从仓库获取所需要的镜像。

下面的例子将从Docker Hub仓库下载一个Ubuntu12.04操作系统的镜像。

docker pull ubuntu:12.04

Pulling    repository    ubuntu
ab8e2728644c:    Pulling    dependent    layers
511136ea3c5a:    Download    complete
5f0ffaa9455e:    Download    complete
a300658979be:    Download    complete
904483ae0c30:    Download    complete
ffdaafd1ca50:    Download    complete
d047ae21eeaf:    Download    complete

下载过程中,会输出获取镜像的每一层信息。
该命令实际上相当于 sudo    docker    pull    registry.hub.docker.com/ubuntu:12.04   命令,即从注册服务器registry.hub.docker.com中的 ubuntu 仓库下载标记为12.04的镜像。

有时候官方仓库注册服务器下载较慢,可以从其他仓库下载。从其他仓库下载时需要指定完整的仓库注册服务器地址。例如:

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

完成后,即可随时使用该镜像了,例如创建一个容器,让其中运行 bash 应用。

docker run -t -i ubuntu:12.04 /bin/bash


2,列出本地镜像

使用 docker images 显示本地已有的镜像。

docker images


REPOSITORY            TAG            IMAGE    ID                CREATED                        VIRTUAL    SIZE
ubuntu                12.04                74fe38d11401        4    weeks    ago        209.6    MB
ubuntu                precise        74fe38d11401        4    weeks    ago        209.6    MB
ubuntu                14.04                99ec81b80c55        4    weeks    ago        266    MB
ubuntu                latest            99ec81b80c55        4    weeks    ago        266    MB
ubuntu                trusty            99ec81b80c55        4    weeks    ago        266    MB

在列出信息中,可以看到几个字段信息

来自于哪个仓库,比如ubuntu
镜像的标记,比如14.04
它的ID号(唯一)
创建时间
镜像大小

其中镜像的ID唯一标识了镜像,注意到ubuntu:14.04和ubuntu:trusty具有相同的镜像ID,说明它们实际上是同一镜像。

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

例如使用下面的命令指定使用镜像ubuntu:14.04来启动一个容器。

docker run -t -i ubuntu:14.04 /bin/bash

如果不指定具体的标记,则默认使用lastest标记信息。


3,创建镜像

创建镜像有很多方法,用户可以从Docker Hub获取已有镜像并更新,也可以利用本地文件系统创建一个。

修改已有镜像

先使用下载的镜像启动容器

docker run -t -i training/sinatra /bin/bash
root@0b2616b0e5a8:/#

注意:记住容器的ID,稍后还会用到。

在容器中添加json和gem两个应用。

root@0b2616b0e5a8:/#    gem    install    json

当结束后,我们使用exit来退出,现在我们的容器已经被我们改变了,使用 docker commit 命令来提交更新后的副本

$    sudo    docker    commit    -m    "Added    json    gem"    -a    "Docker    Newbee"    0b2616b0e5a8    ouruser/sinatra:v2
4f177bd27a9ff0f6dc2a830403925b5360bfe0b93d476f7fc3231110e7f71b1c

其中,    -m    来指定提交的说明信息,跟我们使用的版本控制工具一样;    -a    可以指定更新的用户信息;之
后是用来创建镜像的容器的    ID;最后指定目标镜像的仓库名和    tag    信息。创建成功后会返回这个镜像的    ID
信息

使用     docker    images    来查看新创建的镜像。

$    sudo    docker    images

REPOSITORY           TAG            IMAGE    ID                CREATED                VIRTUAL       SIZE
training/sinatra    latest        5bc342fa0b91            10    hours    ago        446.7    MB
ouruser/sinatra        v2            3c59e02ddd1a            10    hours    ago        446.7    MB
ouruser/sinatra        latest        5db5f8471261            10    hours    ago        446.7    MB

之后,可以使用新的镜像来启动容器

$    sudo    docker    run    -t    -i    ouruser/sinatra:v2    /bin/bash
root@78e82f680994:/#


4,利用Dockerfile来创建镜像

使用docker commit来扩展一个镜像比较简单,但是不方便在一个团队中分享。我们可以使用 docker build 来创建一个新的镜像。为此,
首先需要创建一个Dockerfile,包含一些如何创建镜像的指令。

新建一个目录和一个Dockerfile

mkdir sinatra
cd sinatra
touch Dockerfile

Dockerfile中每一条指令都创建镜像的一层,例如:

#    This    is    a    comment
FROM    ubuntu:14.04
MAINTAINER    Docker    Newbee    <newbee@docker.com>
RUN    apt-get    -qq    update
RUN    apt-get    -qqy    install    ruby    ruby-dev
RUN    gem    install    sinatra

Dockerfile基本的语法是:

使用#来注释
from 指令告诉Docker使用哪个镜像作为基础
接着是维护者的信息
run 开头的指令会在创建中运行,比如安装一个软件包,在这里使用apt-get来安装了一些软件

编写完成Dockerfile后可以使用 docker build 来生成镜像

$    sudo    docker    build    -t="ouruser/sinatra:v2"    .
Uploading    context        2.56    kB
Uploading    context
Step    0    :    FROM    ubuntu:14.04
    --->    99ec81b80c55
Step    1    :    MAINTAINER    Newbee    <newbee@docker.com>
    --->    Running    in    7c5664a8a0c1
    --->    2fa8ca4e2a13
Removing    intermediate    container    7c5664a8a0c1
Step    2    :    RUN    apt-get    -qq    update
    --->    Running    in    b07cc3fb4256
    --->    50d21070ec0c
Removing    intermediate    container    b07cc3fb4256
Step    3    :    RUN    apt-get    -qqy    install    ruby    ruby-dev
    --->    Running    in    a5b038dd127e
Selecting    previously    unselected    package    libasan0:amd64.
(Reading    database    ...    11518    files    and    directories    currently    installed.)
Preparing    to    unpack    .../libasan0_4.8.2-19ubuntu1_amd64.deb    ...
Setting    up    ruby    (1:1.9.3.4)    ...
Setting    up    ruby1.9.1    (1.9.3.484-2ubuntu1)    ...
Processing    triggers    for    libc-bin    (2.19-0ubuntu6)    ...
    --->    2acb20f17878
Removing    intermediate    container    a5b038dd127e
Step    4    :    RUN    gem    install    sinatra
    --->    Running    in    5e9d0065c1f7
Successfully    installed    rack-protection-1.5.3
Successfully    installed    sinatra-1.4.5
4    gems    installed
    --->    324104cde6ad
Removing    intermediate    container    5e9d0065c1f7
Successfully    built    324104cde6ad

其中 -t 标记来添加tag,指定新的镜像的用户信息。

可以看到    build    进程在执行操作。它要做的第一件事情就是上传这个    Dockerfile    内容,因为所有的操作都要
依据    Dockerfile    来进行。 然后,Dockfile    中的指令被一条一条的执行。每一步都创建了一个新的容器,在
容器中执行指令并提交修改(就跟之前介绍过的     docker    commit    一样)。当所有的指令都执行完毕之
后,返回了最终的镜像    id。所有的中间步骤所产生的容器都被删除和清理了。
*注意一个镜像不能超过    127    层
此外,还可以利用     ADD    命令复制本地文件到镜像;用     EXPOSE    命令来向外部开放端口;用     CMD    命令来
描述容器启动后运行的程序等。例如
#    put    my    local    web    site    in    myApp    folder    to    /var/www
ADD    myApp    /var/www
#    expose    httpd    port
EXPOSE    80
#    the    command    to    run
CMD    ["/usr/sbin/apachectl",    "-D",    "FOREGROUND"]
现在可以利用新创建的镜像来启动一个容器。
$    sudo    docker    run    -t    -i    ouruser/sinatra:v2    /bin/bash
root@8196968dac35:/#
还可以用     docker    tag    命令来修改镜像的标签。
$    sudo    docker    tag    5db5f8471261    ouruser/sinatra:devel
$    sudo    docker    images    ouruser/sinatra
REPOSITORY                                        TAG                    IMAGE    ID                        CREATED                                VIRTUAL    SIZE
ouruser/sinatra                    latest        5db5f8471261        11    hours    ago            446.7    MB
ouruser/sinatra                    devel            5db5f8471261        11    hours    ago            446.7    MB
ouruser/sinatra                    v2                        5db5f8471261        11    hours    ago            446.7    MB

*注:更多用法,请参考 Dockerfile 章节。

要从本地文件系统导入一个镜像,可以使用    openvz(容器虚拟化的先锋技术)的模板来创建:    openvz    的
模板下载地址为 templates 。


比如,先下载了一个    ubuntu-14.04    的镜像,之后使用以下命令导入:
sudo    cat    ubuntu-14.04-x86_64-minimal.tar.gz        |docker    import    -    ubuntu:14.04
然后查看新导入的镜像。
docker    images
REPOSITORY                                        TAG                                                                    IMAGE    ID                                                CREATED                                                    VIRTUAL    SIZE
ubuntu                                                        14.04                                                            05ac7c0b9383                                17    seconds    ago                        215.5    MB

5  上传镜像

用户可以通过     docker    push    命令,把自己创建的镜像上传到仓库中来共享。例如,用户在    Docker    Hub    上
完成注册后,可以推送自己的镜像到仓库中。

$    sudo    docker    push    ouruser/sinatra
The    push    refers    to    a    repository    [ouruser/sinatra]    (len:    1)
Sending    image    list
Pushing    repository    ouruser/sinatra    (3    tags)


6,存出和载入镜像

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

$    sudo    docker    images
REPOSITORY                                        TAG                                                                    IMAGE    ID                                                CREATED                                                    VIRTUAL    SIZE
ubuntu                                                        14.04                                                            c4ff7513909d                                5    weeks    ago                                    225.4    MB
...
$sudo    docker    save    -o    ubuntu_14.04.tar    ubuntu:14.04

载入镜像

可以使用     docker    load    从导出的本地文件中再导入到本地镜像库,例如

$    sudo    docker    load    --input    ubuntu_14.04.tar

或者

$    sudo    docker    load    <    ubuntu_14.04.tar

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


7,移除本地镜像

如果要移除本地的镜像,可以使用     docker    rmi    命令。注意     docker    rm    命令是移除容器。

$    sudo    docker    rmi    training/sinatra
Untagged:    training/sinatra:latest
Deleted:    5bc342fa0b91cabf65246837015197eecfa24b2213ed6a51a8974ae250fedd8d
Deleted:    ed0fffdcdae5eb2c3a55549857a8be7fc8bc4241fb19ad714364cbfd7a56b22f
Deleted:    5c58979d73ae448df5af1d8142436d81116187a7633082650549c52c3a2418f0

注意:在删除镜像之前要先用     docker    rm    删掉依赖于这个镜像的所有容器。


 

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部