1. 程式人生 > >Docker容器學習整理

Docker容器學習整理

lib ln -s vol 2.4 ubi sta 場景 創建 臨時文件

一、使用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 查看鏡像詳細信息
包括:制作者、適應架構、各層的數字摘要等

[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命令來導入一個容器快照到本地鏡像庫。

這兩者的區別在與容器快照文件將丟棄所有的歷史記錄和元數據信息(即僅保存容器當時的快照狀態),而鏡像存儲文件將保存完整記錄,體積也更大。此外,從容器快照文件導入時可以重新指定標簽等元數據信息。

Docker容器學習整理