Docker容器学习整理

一、使用Docker镜像
1.1 docker常用命令
1.2 创建镜像
1.3 存出和载入镜像
1.4 上传镜像

二、操作docker容器
2.1 创建容器
2.2 终止容器
2.3 进入容器
2.4 删除容器
2.5 导入和导出容器

三、访问Docker仓库

一、docker基本管理
1.1 docker常用命令
1.1.1 docker images # 列出本机已有镜像
1.1.2 tag命令添加镜像标签
1.1.3 docker inspect 查看镜像详细信息
1.1.4 history 查看镜像历史
1.1.5 docker search 搜索镜像
1.1.6 docker rmi 删除镜像

1.1.1 docker images 命令详解:

列出镜像:

[root@node1 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/centos    latest              5182e96772bf        7 days ago          200 MB
docker.io/nginx     latest              c82521676580        2 weeks ago         109 MB

常用参数:

-a , —all=true|false     # 列出所有的镜像文件(包括临时文件),默认为否;
—digests=true|false    # 列出镜像的数字摘要值,默认为否;
-q , —quiet=true|false  # 仅输出ID信息,默认为否

—digests=true|false # 列出镜像的数字摘要值,默认为否;

[root@node1 ~]# docker images --digests
REPOSITORY          TAG                 DIGEST                                                                    IMAGE ID            CREATED             SIZE
docker.io/centos    latest              sha256:6f6d986d425aeabdc3a02cb61c02abb2e78e57357e92417d6d58332856024faf   5182e96772bf        7 days ago          200 MB
docker.io/nginx     latest              sha256:d85914d547a6c92faa39ce7058bd7529baacab7e0cd4255442b04577c4d1f424   c82521676580        2 weeks ago         109 MB

-q , —quiet=true|false  # 仅输出ID信息,默认为否
[root@node1 ~]# docker images -q
5182e96772bf
c82521676580

1.1.2 tag命令添加镜像标签

[root@node1 ~]# docker tag centos:latest ylcentos:latest
[root@node1 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/centos    latest              5182e96772bf        7 days ago          200 MB
ylcentos            latest              5182e96772bf        7 days ago          200 MB

centos:latest 镜像的ID和 ylcentos:latest 完全一致,它们实际指向同一个镜像文件,只是别名不同,docker tag命令添加的标签实际上起到了类似链接的作用;

1.1.3 docker inspect 查看镜像详细信息
包括:制作者、适应架构、各层的数字摘要等

扫描二维码关注公众号,回复: 2792867 查看本文章
[root@node1 ~]# docker inspect ylcentos:latest
[
    {
        "Id": "sha256:5182e96772bf11f4b912658e265dfe0db8bd314475443b6434ea708784192892",
        "RepoTags": [
            "docker.io/centos:latest",
            "ylcentos:latest"
        ],
        "RepoDigests": [
            "docker.io/centos@sha256:6f6d986d425aeabdc3a02cb61c02abb2e78e57357e92417d6d58332856024faf"
        ],
        "Parent": "",
        "Comment": "",
        "Created": "2018-08-06T19:21:48.235227329Z",
        "Container": "d60ffc9ddd12462af4bdcdbe45b74f3b3f99b46607ada80c3ed877b7def84250",
        "ContainerConfig": {
            "Hostname": "d60ffc9ddd12",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "/bin/sh",
                "-c",
                "#(nop) ",
                "CMD [\"/bin/bash\"]"
            ],
            "ArgsEscaped": true,
            "Image": "sha256:748eacc0f236df2fc9ba87c4d76a66cb10742120387e99e2acdb9454915c841d",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {
                "org.label-schema.build-date": "20180804",
                "org.label-schema.license": "GPLv2",
                "org.label-schema.name": "CentOS Base Image",
                "org.label-schema.schema-version": "1.0",
                "org.label-schema.vendor": "CentOS"
            }
        },
        "DockerVersion": "17.06.2-ce",
        "Author": "",
        "Config": {
            "Hostname": "",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "/bin/bash"
            ],
            "ArgsEscaped": true,
            "Image": "sha256:748eacc0f236df2fc9ba87c4d76a66cb10742120387e99e2acdb9454915c841d",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {
                "org.label-schema.build-date": "20180804",
                "org.label-schema.license": "GPLv2",
                "org.label-schema.name": "CentOS Base Image",
                "org.label-schema.schema-version": "1.0",
                "org.label-schema.vendor": "CentOS"
            }
        },
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 199723824,
        "VirtualSize": 199723824,
        "GraphDriver": {
            "Name": "overlay2",
            "Data": {
                "MergedDir": "/var/lib/docker/overlay2/b06aedc45e998ab1b8761a2ddd98a6b75fc73f293dba4693ca8bcb0ee1aa5d6b/merged",
                "UpperDir": "/var/lib/docker/overlay2/b06aedc45e998ab1b8761a2ddd98a6b75fc73f293dba4693ca8bcb0ee1aa5d6b/diff",
                "WorkDir": "/var/lib/docker/overlay2/b06aedc45e998ab1b8761a2ddd98a6b75fc73f293dba4693ca8bcb0ee1aa5d6b/work"
            }
        },
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:1d31b5806ba40b5f67bde96f18a181668348934a44c9253b420d5f04cfb4e37a"
            ]
        }
    }
]

返回的是JSON格式的内容,如果只需要其中一项可以用-f 参数来指定

[root@node1 ~]# docker inspect -f "{{ .Architecture }}" ylcentos
amd64

1.1.4 history 查看镜像历史
查看nginx:latest 镜像的创建过程

[root@node1 ~]# docker history nginx:latest
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
c82521676580        2 weeks ago         /bin/sh -c #(nop)  CMD ["nginx" "-g" "daem...   0 B                 
<missing>           2 weeks ago         /bin/sh -c #(nop)  STOPSIGNAL [SIGTERM]         0 B                 
<missing>           2 weeks ago         /bin/sh -c #(nop)  EXPOSE 80/tcp                0 B                 
<missing>           2 weeks ago         /bin/sh -c ln -sf /dev/stdout /var/log/ngi...   22 B                
<missing>           2 weeks ago         /bin/sh -c set -x  && apt-get update  && a...   53.7 MB             
<missing>           2 weeks ago         /bin/sh -c #(nop)  ENV NJS_VERSION=1.15.2....   0 B                 
<missing>           2 weeks ago         /bin/sh -c #(nop)  ENV NGINX_VERSION=1.15....   0 B                 
<missing>           3 weeks ago         /bin/sh -c #(nop)  LABEL maintainer=NGINX ...   0 B                 
<missing>           4 weeks ago         /bin/sh -c #(nop)  CMD ["bash"]                 0 B                 
<missing>           4 weeks ago         /bin/sh -c #(nop) ADD file:919939fa0224727...   55.3 MB             

1.1.5 docker search 搜索镜像
可以搜索远端仓库中共享的镜像,默认搜素官方仓库中的镜像;

—automated=true|false # 仅显示自动创建的镜像,默认为否
—no-trunc=true|false # 输出信息不截断显示,默认为否
-s # 指定仅显示为指定星级以上的镜像,默认为0,即输出所有镜像

[root@node1 ~]# docker search --automated -s 3 nginx
Flag --automated has been deprecated, use --filter=automated=true instead
Flag --stars has been deprecated, use --filter=stars=3 instead
INDEX       NAME                                                             DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
docker.io   docker.io/jwilder/nginx-proxy                                    Automated Nginx reverse proxy for docker c...   1381                 [OK]
docker.io   docker.io/richarvey/nginx-php-fpm                                Container running Nginx + PHP-FPM capable ...   609                  [OK]
docker.io   docker.io/jrcs/letsencrypt-nginx-proxy-companion                 LetsEncrypt container to use with nginx as...   394                  [OK]
docker.io   docker.io/webdevops/php-nginx                                    Nginx with PHP-FPM                              109                  [OK]
docker.io   docker.io/zabbix/zabbix-web-nginx-mysql                          Zabbix frontend based on Nginx web-server ...   61                   [OK]
docker.io   docker.io/bitnami/nginx                                          Bitnami nginx Docker Image                      57                   [OK]
docker.io   docker.io/1and1internet/ubuntu-16-nginx-php-phpmyadmin-mysql-5   ubuntu-16-nginx-php-phpmyadmin-mysql-5          43                   [OK]
docker.io   docker.io/tobi312/rpi-nginx                                      NGINX on Raspberry Pi / armhf                   20                   [OK]
docker.io   docker.io/blacklabelops/nginx                                    Dockerized Nginx Reverse Proxy Server.          12                   [OK]
docker.io   docker.io/wodby/drupal-nginx                                     Nginx for Drupal container image                10                   [OK]
docker.io   docker.io/nginxdemos/hello                                       NGINX webserver that serves a simple page ...   8                    [OK]
docker.io   docker.io/webdevops/nginx                                        Nginx container                                 8                    [OK]
docker.io   docker.io/1science/nginx                                         Nginx Docker images that include Consul Te...   4                    [OK]

1.1.6 docker rmi 删除镜像

1.1.6.1 使用标签删除镜像
命令格式:docker rmi IMAGE[IMAGE…] # 其中image可以为标签或者ID

[root@node1 ~]# docker rmi ylcentos:latest
Untagged: ylcentos:latest
Untagged: docker.io/centos@sha256:6f6d986d425aeabdc3a02cb61c02abb2e78e57357e92417d6d58332856024faf

本地的centos:latest 镜像是否会受此命令的影响?当同一镜像有多个标签的时候,docker rmi命令指示删除该镜像多个标签中的指定标签而已,并不影响镜像文件。因此上面的操作相当于知识删除了镜像5182e96772bf的一个标签而已;

但是当镜像只剩下一个标签的时候要注意,此时再使用docker rmi命令会彻底删除镜像

1.1.6.2 使用镜像ID删除镜像

当使用docker rmi命令,并且后面跟上镜像的ID(也可以是能进行区分的部分ID串前缀)时,会先尝试删除所有指向该镜像的标签,然后删除该镜像文件本身。

如果想要强行删除镜像,可以使用-f参数

[root@node1 ~]# docker rmi -f ylcentos:latest
Untagged: ylcentos:latest

注意:通常并不推荐使用-f参数来强行删除一个存在容器依赖的镜像;正确的做法是,先先删除依赖该镜像的所有容器,再来删除镜像;

1.2 创建镜像

创建镜像的方法有三种:
1、基于已有镜像的容器创建
2、基于本地模版导入
3、基于Dockerfile创建

1.2.1 基于已有镜像的容器创建
使用命令 docker commit
命令格式: docker commit [OPTIONS] CONTAINER [REPOSITORY[ : TAG]]

-a , —author=“”    # 作者信息
-c , —change=[] : 提交的时候执行Dockerfile指令
-m , —message=“” : 提交信息
-p , —pause=true : 提交时暂停容器运行
[root@node1 ~]# docker run -it centos:latest /bin/bash
[root@8eebcce9722a /]# touch test

记住容器的ID为:8eebcce9722a
此时该容器跟原centos:latest 镜像相比,已经发生了改变,可以使用 docker commit 命令来提交为一个新的镜像,提交时可以使用ID或名称来指定容器;

[root@node1 ~]# docker commit -m "Added a new file" -a "Docker Newbee" 8eebcce9722a test:0.1
sha256:7c0264a9876f6eb69d90b93ed3dcc2a651ddffc59b11cf3bf3729ef9e3b9ece5

docker commit提交完新的镜像后,会返回新创建的镜像ID信息,例如:7c0264a9876f6eb69d90b93ed3dcc2a651ddffc59b11cf3bf3729ef9e3b9ece5

此时新创建的镜像 test:0.1已经存在于本地镜像列表当中:

[root@node1 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
test                0.1                 7c0264a9876f        8 minutes ago       200 MB
docker.io/centos    latest              5182e96772bf        7 days ago          200 MB
docker.io/nginx     latest              c82521676580        2 weeks ago         109 MB

1.2.2 基于本地模版导入

用户也可以直接从一个操作系统模板文件导入一个镜像,主要是用docker import命令;
命令格式: docker import [OPTION] file|URL|-[REPOSITORY[:tag]]

1.3 存出和载入镜像

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

1.3.1 存出镜像

[root@node1 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
test                0.1                 7c0264a9876f        8 minutes ago       200 MB
docker.io/centos    latest              5182e96772bf        7 days ago          200 MB
docker.io/nginx     latest              c82521676580        2 weeks ago         109 MB
You have new mail in /var/spool/mail/root
[root@node1 ~]# docker save -o test_0.1.tar test:0.1
[root@node1 images]# ll
total 406848
-rw------- 1 root root 208305664 Aug 14 15:46 test_0.1.tar

用户可以通过复制 test_0.1.tar 文件将该镜像分享给他人;

1.3.2 载入镜像

[root@node1 images]# docker load --input test_0.1.tar 
1cee2207e92e: Loading layer [==================================================>] 2.048 kB/2.048 kB
Loaded image: test:0.1

或者:
[root@node1 images]# docker load < test_0.1.tar 
1cee2207e92e: Loading layer [==================================================>] 2.048 kB/2.048 kB
Loaded image: test:0.1
[root@node1 images]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
test                0.1                 7c0264a9876f        32 minutes ago      200 MB
docker.io/centos    latest              5182e96772bf        7 days ago          200 MB
docker.io/nginx     latest              c82521676580        2 weeks ago         109 MB

1.4 上传镜像

可以使用docker push 命令上传镜像到仓库,默认上传到DockerHub官方仓库(需要登录)

命令格式:
docker push NAME[:TAG] | [REGISTRY_HOST[:REGISTRY_PORT]/] NAME[:TAG]

二、操作docker容器

容器是Docker的另一个核心概念,简单来说,容器是镜像的一个运行实例。所不同的是,镜像是静态的只读文件,而容器带有运行时需要的可写文件层。如果认为虚拟机时模拟运行的一整套操作系统(包括内核、应用运行态环境和其他系统环境)和跑在上面的应用,那么Docker容器就是独立运行的一个(或一组)应用,以及它们必需的运行环境。

2.1 创建容器

2.1.1 docker create 新建一个镜像

[root@node1 images]# docker create -it centos:latest
d166acc28fb35b0998a8fd275219c36019270ebba005d819424dff01c9cfa912

[root@node1 images]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
d166acc28fb3        centos:latest       "/bin/bash"              16 seconds ago      Created                                         angry_dubinsky

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

2.1.2 docker start 启动一个容器

[root@node1 images]# docker start d166acc28fb3
d166acc28fb3

使用docker ps查看运行的容器
[root@node1 images]# docker ps 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
d166acc28fb3        centos:latest       "/bin/bash"         9 minutes ago       Up 11 seconds                           angry_dubinsky

2.1.3 docker run 新建镜像并启动容器

docker run等价于先执行docker create命令,再执行docker start命令

例如:

[root@node1 images]# docker run centos /bin/echo  'Hello World!'
Hello World!

这和在本地直接执行/bin/echo ‘Hello World!’几乎感觉不出任何区别。
当利用docker run 创建并启动容器时,docker在后台运行的标准操作包括:

  • 检查本地是否存在指定的镜像,不存在就从公有仓库下载;
  • 利用镜像创建一个容器,并启动该容器;
  • 分配一个文件系统容器,并在只读的镜像层外面挂载一层可读写层;
  • 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中;
  • 从网桥的地址池配置一个IP地址给容器;
  • 执行用户指定的应用程序;
  • 执行完毕后容器被自动终止;

下面启动一个bash终端,允许用户进行交互

[root@node1 images]# docker run -it centos:latest /bin/bash
[root@367ec9a9e5b3 /]# 

[root@367ec9a9e5b3 /]# pwd
/
[root@367ec9a9e5b3 /]# 
[root@367ec9a9e5b3 /]# ls
anaconda-post.log  bin  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@367ec9a9e5b3 /]# ps
  PID TTY          TIME CMD
    1 ?        00:00:00 bash
   16 ?        00:00:00 ps

在容器内用ps命令查看进程,可以看到,只运行了bash应用,并没有运行其他无关进程;

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

有时候,执行docker run会出错,因为命令无法正常执行容器会直接退出,此时可以查看退出的错误代码:

默认情况下,常见错误代码包括:

*     125 : docker daemon 执行出错,例如指定了不支持的Docker命令参数;
*     126 : 所指定命令无法执行,例如权限出错;
*     127 : 容器内命令无法找到;

命令执行后出错,会默认返回错误码。

2.1.4、守护态运行

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

例如:

[root@node1 images]# docker run -d centos /bin/sh -c "while true;do echo hello world;sleep 1;done"
972fa26b30d3704d42659bf07163101c6df1f8284094694672a5e77208908a1d

容器启动后会返回一个唯一的id,也可以通过docker ps命令来查看容器信息;

[root@node1 images]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
972fa26b30d3        centos              "/bin/sh -c 'while..."   5 seconds ago       Up 5 seconds                            relaxed_spence

如果要获取容器的输出信息,可以如下使用docker logs命令:

[root@node1 images]# docker logs 972fa26b30d3
hello world
hello world
hello world

2.2 终止容器

可以使用docker stop来终止一个运行中的容器。
命令格式:docker stop [-t | —time[=10]][CONTAINER…]

首先向容器发送SIGTERM信号,等待一段超时时间(默认为10S)后,在发送SIGKILL信号来终止容器:

[root@node1 images]# docker stop 972fa26b30d3
972fa26b30d3

docker ps -qa命令看到所有容器ID,例如:

[root@node1 images]# docker ps -qa
972fa26b30d3
367ec9a9e5b3
e9cd796bf46b
2711b952d41a
d166acc28fb3

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

docker restart

[root@node1 images]# docker restart 972fa26b30d3
972fa26b30d3

2.3 进入容器

2.3.1 attach 命令

attach是Docker自带的命令,命令格式为:
    docker attach [—detach-key[=[]]] [—no-stdin] [—sig-proxy[=true]] CONTAINER
[root@node1 images]# docker run -itd centos
519fe978cd650b265d76b5703c7e322cfabcbb35863a4e73294baff1e6590f31

[root@node1 images]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
519fe978cd65        centos              "/bin/bash"              6 seconds ago       Up 5 seconds                            elegant_bassi

[root@node1 images]# docker attach elegant_bassi
[root@519fe978cd65 /]#

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

2.3.2 exec 命令

命令格式:

docker exec [-d | —detach] [—detach-key[=[]]] [-I | —interactive] [—privileged]  [-t | —tty] [-u | —user[=USER]] CONTAINER COMMAND [ARG…]
[root@node1 images]# docker exec -it 519fe978cd65 /bin/bash
[root@519fe978cd65 /]# 

可以看到,一个bash终端打开了,在不影响容器内其他应用的前提下,用户可以很容易与容器进行交互。

注意:通过指定 -it 参数来保持标准输入打开,并且分配一个伪终端。通过exec命令对容器执行操作是最为推荐的方式;

2.3.3 nsenter 工具

提示:生产场景是不使用docker attach的,需要我们使用nsenter这个工具,这个工具包含在util-linux软件包里面;
[root@linux-node1 ~]# yum install util-linux -y
Centos7默认最小化已经安装

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

PID=$(docker inspect —format “{{ .State.Pid }}”)  <container>

[root@node1 images]# docker inspect -f "{{ .State.Pid }}" 519fe978cd65
29435
[root@node1 images]# docker inspect -f "{{ .State.Pid }}" elegant_bassi
29435

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

[root@node1 images]# nsenter --target 29435 -m -u -i -n -p
[root@519fe978cd65 /]# 

例子:
[root@node1 images]# docker run -itd centos
48aa2e39595a3f1ed63b872eeb0efd5f651ed39fe8d506779dd3287cdf120402

[root@node1 images]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
48aa2e39595a        centos              "/bin/bash"         7 seconds ago       Up 6 seconds                            hardcore_davinci

[root@node1 images]# docker inspect -f "{{ .State.Pid }}" 48aa2e39595a
29624
[root@node1 images]# nsenter --target 29624 -m -u -i -n -p
[root@48aa2e39595a /]# 

2.4 删除容器

可以使用 docker rm 命令来删除处于终止或退出状态的容器;

命令格式:docker rm [-f | —force] [-l | —link] [-v | —volumes] CONTAINER[CONTAINER…]

主要支持的选项包括:
-f , —force=false : 是否强行终止并删除一个运行中的容器;
-l , —link=false : 删除容器的连接,但保留容器;
-v, —volumes=false : 删除容器挂载的数据卷;

例如,查看处于终止状态的容器,并删除:

[root@node1 images]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
972fa26b30d3        centos              "/bin/sh -c 'while..."   4 hours ago         Exited (137) 3 hours ago                        relaxed_spence

[root@node1 images]# docker rm 972fa26b30d3
972fa26b30d3

默认情况下,docker rm命令智能删除处于终止或退出状态的容器,并不能删除还处于运行状态的容器。

如果要直接删除一个运行中的容器,可以添加-f 参数。Docker会先发送SIGKILL信号给容器,终止其中的应用,之后强行删除;

例子:

[root@node1 images]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
48aa2e39595a        centos              "/bin/bash"              3 hours ago         Up 3 hours                                      hardcore_davinci

[root@node1 images]# docker rm 519fe978cd65
Error response from daemon: You cannot remove a running container 519fe978cd650b265d76b5703c7e322cfabcbb35863a4e73294baff1e6590f31. Stop the container before attempting removal or use -f

[root@node1 images]# docker rm -f 48aa2e39595a
48aa2e39595a

2.5 导入和导出容器

有些时候,需要将容器从一个系统迁移到另外一个系统,此时可以使用Docker的导入和导出功能,这也是Docker自身提供的一个重要特性;

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

命令格式:
docker export [-o | —output[=“”]] CONTAINER
其中,可以通过-o 选项来指定导出的tar文件名,也可以直接通过重定向来实现。

[root@node1 images]# docker export -o centos_7.1.tar 519fe978cd65
或者
[root@node1 images]# docker export 519fe978cd65 > centos_7.2.tar
[root@node1 images]# ll
total 813680
-rw------- 1 root root 208294400 Aug 15 15:45 centos_7.1.tar
-rw-r--r-- 1 root root 208294400 Aug 15 15:46 centos_7.2.tar

之后,可将导出的tar文件传输到其他机器上,然后再通过导入命令导入到系统中,从而实现容器的迁移;

2.5.2 导入容器

导出的文件又可以使用 docker import命令导入变成镜像

[root@node1 images]# docker import centos_7.1.tar test/centos:v1.0  
sha256:6433c6458e515b27e4e98387685f6d791c34ff5c4b55184b13e075a51b08d5ac

[root@node1 images]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
test/centos         v1.0                6433c6458e51        31 seconds ago      200 MB

docker load命令来导入一个镜像文件,与docker export命令十分相似;

实际上,既可以使用docker load命令来导入镜像存储文件到本地镜像库,也可以使用docker import命令来导入一个容器快照到本地镜像库。

这两者的区别在与容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也更大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。

猜你喜欢

转载自blog.51cto.com/11019859/2160616