容器的導入導出以及清理

導出容器

如果要導出本地某個容器,可以使用docker export命令:

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
8e847a221af5        ubuntu              "/bin/bash"              14 hours ago        Exited (0) 5 seconds ago                        distracted_lalande
888b1857981e        ubuntu              "/bin/bash"              14 hours ago        Exited (0) 14 hours ago                         boring_dijkstra
c74c8288ae0b        ubuntu:14.04        "/bin/bash"              15 hours ago        Exited (0) 15 hours ago                         awesome_goldstine

$ docker export 888 > ubuntu.tar
$ ls
Applications        IdeaProjects        Pictures        eclipse-workspace   ubuntu.tar

注意:導出容器的容器ID可以簡寫,去前面三個字符

可以看見我們把容器已經導出了。

導入容器

可以使用docker import從容器快照文件中再導人爲鏡像,在操作這個之前,我們可以找個容器,進去修改一些東西。
再將修改的容器導入爲鏡像文件,然後查看我們修改的文件是否還存在:

B000000094106A:~ zhanghao53$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
8e847a221af5        ubuntu              "/bin/bash"         14 hours ago        Exited (0) 12 minutes ago                       distracted_lalande
888b1857981e        ubuntu              "/bin/bash"         14 hours ago        Exited (0) 14 hours ago                         boring_dijkstra
c74c8288ae0b        ubuntu:14.04        "/bin/bash"         15 hours ago        Exited (0) 15 hours ago                         awesome_goldstine
B000000094106A:~ zhanghao53$ docker start 888
888

$ docker exec -it 888 bash
root@888b1857981e:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@888b1857981e:/# mkdir zhanghao
root@888b1857981e:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  zhanghao
root@888b1857981e:/# cd zhanghao/
root@888b1857981e:/zhanghao# ls
root@888b1857981e:/zhanghao# vim
bash: vim: command not found
root@888b1857981e:/zhanghao# apt-get update
Get:1 http://archive.ubuntu.com/ubuntu bionic InRelease [242 kB]                         
Get:2 http://archive.ubuntu.com/ubuntu bionic-updates InRelease [65.4 kB]
... ...
Fetched 24.9 MB in 35s (721 kB/s)                                                                                                            
Reading package lists... Done
root@888b1857981e:/zhanghao# apt-get install vim
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following additional packages will be installed:
  file libexpat1 libgpm2 libmagic-mgc libmagic1 libmpdec2 libpython3.6 libpython3.6-minimal libpython3.6-stdlib libreadline7 libsqlite3-0
  libssl1.1 mime-support readline-common vim-common vim-runtime xxd xz-utils
Suggested packages:
  gpm readline-doc ctags vim-doc vim-scripts
The following NEW packages will be installed:
  file libexpat1 libgpm2 libmagic-mgc libmagic1 libmpdec2 libpython3.6 libpython3.6-minimal libpython3.6-stdlib libreadline7 libsqlite3-0
  libssl1.1 mime-support readline-common vim vim-common vim-runtime xxd xz-utils
0 upgraded, 19 newly installed, 0 to remove and 0 not upgraded.
Need to get 12.7 MB of archives.
After this operation, 61.0 MB of additional disk space will be used.
......

root@888b1857981e:/zhanghao# vim fasdfa.txt
root@888b1857981e:/zhanghao# ls -l
total 4
-rw-r--r-- 1 root root 138 May 10 02:45 fasdfa.txt

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
888b1857981e        ubuntu              "/bin/bash"         14 hours ago        Up 4 minutes                            boring_dijkstra
$ docker export 888 > ubuntu.tar
B000000094106A:~ zhanghao53$ ls
Applications        IdeaProjects        Pictures        eclipse-workspace   ubuntu.tar

$ cat ubuntu.tar | docker import - test/ubuntu:v1.0
sha256:cde190ed9432a2b79d0d2a389d4b41e26b9c50d0f314c6b2130a430956f6bbf9
$ docker images;
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
test/ubuntu         v1.0                cde190ed9432        16 seconds ago      168.5 MB
ubuntu              14.04               8cef1fa16c77        12 days ago         222.9 MB
ubuntu              latest              452a96d81c30        12 days ago         79.62 MB
ubuntu              17.10               e4422b8da209        12 days ago         99.22 MB

$ docker run -dit cde /bin/bash
373635d352ca2c4582aa9aa8373d8108c1f92f647a364e20814d7970f84dc367
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
373635d352ca        cde                 "/bin/bash"         8 seconds ago       Up 7 seconds                            amazing_leavitt
888b1857981e        ubuntu              "/bin/bash"         14 hours ago        Up 7 minutes                            boring_dijkstra

$ docker exec -it 373 bash
root@373635d352ca:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  zhanghao
root@373635d352ca:/# cd zhanghao/
root@373635d352ca:/zhanghao# ls -l
total 4
-rw-r--r-- 1 root root 138 May 10 02:45 fasdfa.txt

除此之外還可以通過指定URL或者某個目錄來導入:

docker import http://example.com/exampleimage.tgz example/imagerepo

刪除容器

使用docker rm 'CONTAINER ID'命令可以刪除容器

在Docker 1.13版本以後,可以使用docker container prune我的版本你不符合,大家可以自己實驗一下

save、load、export、import的區別

首先明確一點save、load是操作鏡像的,而export、import是操作容器的,這個是根本的區別。

save 和 load

Save命令用於持久化鏡像,可以通過下面的命令來保存鏡像:

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
f96b8d635fab        ubuntu              "/bin/bash"         13 minutes ago      Up 13 minutes                           sick_fermi
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              452a96d81c30        12 days ago         79.62 MB
$ docker save 452 > ubuntu:latest.tar
$ ls -lh ubuntu\:latest.tar 
-rw-r--r--  1 soygrow  INTERNAL\Domain Users    78M  5 10 11:41 ubuntu:latest.tar

// 首先把容器和鏡像都刪了
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

// 從保存的鏡像文件中加載
$ docker load < ubuntu\:latest.tar
65bdd50ee76a: Loading layer [==================================================>] 82.09 MB/82.09 MB
ec75999a0cb1: Loading layer [==================================================>] 15.87 kB/15.87 kB
67885e448177: Loading layer [==================================================>] 8.192 kB/8.192 kB
8db5f072feec: Loading layer [==================================================>] 5.632 kB/5.632 kB
059ad60bcacf: Loading layer [==================================================>] 3.072 kB/3.072 kB
Loaded image ID: sha256:452a96d81c30a1e426bc250428263ac9ca3f47c9bf086f876d11cb39cf57aeec

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
<none>              <none>              452a96d81c30        12 days ago         79.62 MB

$ docker tag 452 ubuntu:latest
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              452a96d81c30        12 days ago         79.62 MB

注意:docker load 加載鏡像後repository和tag名稱都爲none,這裏可以使用 docker tag 命令添加相應的REPOSITORY和TAG

export 和 import

首先這兩個命令是操作容器的,和save、load不同,這兩個命令的使用方法在上文中已經介紹了。

區別

  • docker import可以重新指定鏡像的名字,docker load不可以
  • docker export導出的版本會比原來的版本小點,因爲導出的版本會丟失歷史和元數據

導出後再導入(exported-imported)的鏡像會丟失所有的歷史,而保存後再加載(saveed-loaded)的鏡像沒有丟失歷史和層(layer)。這意味着使用導出後再導入的方式,你將無法回滾到之前的層(layer),同時,使用保存後再加載的方式持久化整個鏡像,就可以做到層回滾(可以執行docker tag 來回滾之前的層)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章