我們在製作 Docker Container 時,都是希望我們以後可以持續使用這個 Container (~除非你這 Container 是拋棄式的~),對 Docker 來說建個 Container 是一件 So Easy 的事,但如何多次使用就一起來看看。
從官方 Docker Command Document 來看
Save - Save one or more images to a tar archive
Ecport - Export a container’s filesystem as a tar archive
從語意 (如果看不懂 去問 google 大神吧) 來看,好像 Export 才是我們想要的 ? 我們繼續看下去 ~
首先,pull 一個 ubuntu 的 Image 下來
root@ubuntu:~# docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
50aff78429b1: Pull complete
f6d82e297bce: Pull complete
275abb2c8a6f: Pull complete
9f15a39356d6: Pull complete
fc0342a94c89: Pull complete
Digest: sha256:ec0e4e8bf2c1178e025099eed57c566959bb408c6b478c284c1683bc4298b683
Status: Downloaded newer image for ubuntu:latest
看一下 Image 是否有被 pull 下來
root@ubuntu:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 00fd29ccc6f1 10 days ago 111MB
建個 Container 起來
root@ubuntu:~# docker run -itd --name ubuntu ubuntu bash
10fe4f9a01edbe3cdba8af9dc66ab8cec6e05418548a7cdd5ac53050bc547fcd
進去 Container 內
root@ubuntu:~# docker exec -it ubuntu bash
root@10fe4f9a01ed:/#
執行 apt-get update 並下載 nginx
apt-get update
apt-get install nginx
觀看 etc 底下的目錄會有個 nginx 的資料夾
root@10fe4f9a01ed:/# cd /etc/
root@10fe4f9a01ed:/etc# ls
X11 cron.weekly fonts init.d ld.so.conf mke2fs.conf pam.d rc4.d sgml terminfo
adduser.conf dbus-1 fstab inputrc ld.so.conf.d modules-load.d passwd rc5.d shadow timezone
alternatives debconf.conf gai.conf insserv legal mtab profile rc6.d shells tmpfiles.d
apt debian_version group insserv.conf libaudit.conf networks profile.d rcS.d skel ucf.conf
bash.bashrc default gshadow insserv.conf.d localtime nginx rc.local resolv.conf subgid udev
bash_completion.d deluser.conf host.conf issue login.defs nsswitch.conf rc0.d rmt subuid ufw
bindresvport.blacklist dhcp hostname issue.net logrotate.d opt rc1.d securetty sysctl.conf update-motd.d
binfmt.d dpkg hosts kernel lsb-release os-release rc2.d security sysctl.d xdg
cron.daily environment init ld.so.cache machine-id pam.conf rc3.d selinux systemd xml
root@10fe4f9a01ed:/etc# cd n
networks nginx/ nsswitch.conf
root@10fe4f9a01ed:/etc# cd nginx/
exit 離開 Container
root@10fe4f9a01ed:/etc# exit
exit
root@ubuntu:~#
先來做 Save 動作
root@ubuntu:~# docker save ubuntu > ubuntu_save.tar
root@ubuntu:~# ls
ubuntu_save.tar
再來做 Export 動作
docker export ubuntu > ubuntu_export.tar
這時,看目錄底下的檔案應該會有兩個 tar 檔
root@ubuntu:~# ls
ubuntu_export.tar ubuntu_save.tar
root@ubuntu:~#
把之前的 Container 和 Image 全清掉
docker stop ubuntu
docker rm ubuntu
docker rmi ubuntu
這時的應該沒有任何 Image 存在
root@ubuntu:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
載入 ubuntu_save.tar
root@ubuntu:~# docker load < ubuntu_save.tar
48e0baf45d4d: Loading layer [==================================================>] 114.5MB/114.5MB
d2f8c05d353b: Loading layer [==================================================>] 15.87kB/15.87kB
5a876f8f1a3d: Loading layer [==================================================>] 14.85kB/14.85kB
6458f770d435: Loading layer [==================================================>] 5.632kB/5.632kB
f17fc24fb8d0: Loading layer [==================================================>] 3.072kB/3.072kB
Loaded image: ubuntu:latest
root@ubuntu:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 00fd29ccc6f1 10 days ago 111MB
建立 Container
root@ubuntu:~# docker run -itd --name ubuntu ubuntu bash
8fe3b78d91d4bf77142aed558466539bd438cf8cfe38562e709b7a90c8cfc4f6
進去 Container 內
root@ubuntu:~# docker exec -it ubuntu bash
root@8fe3b78d91d4:/#
觀看 etc 底下的目錄
root@8fe3b78d91d4:/# cd /etc/
root@8fe3b78d91d4:/etc# ls
X11 cron.weekly fstab inputrc ld.so.conf.d modules-load.d profile rc6.d skel udev
adduser.conf dbus-1 gai.conf insserv legal mtab profile.d rcS.d subgid update-motd.d
alternatives debconf.conf group insserv.conf libaudit.conf networks rc.local resolv.conf subuid xdg
apt debian_version gshadow insserv.conf.d localtime nsswitch.conf rc0.d rmt sysctl.conf
bash.bashrc default host.conf issue login.defs opt rc1.d securetty sysctl.d
bash_completion.d deluser.conf hostname issue.net logrotate.d os-release rc2.d security systemd
bindresvport.blacklist dhcp hosts kernel lsb-release pam.conf rc3.d selinux terminfo
binfmt.d dpkg init ld.so.cache machine-id pam.d rc4.d shadow timezone
cron.daily environment init.d ld.so.conf mke2fs.conf passwd rc5.d shells tmpfiles.d
root@8fe3b78d91d4:/etc#
exit 離開 Container
root@8fe3b78d91d4:/etc# exit
exit
root@ubuntu:~#
載入 ubuntu_export.tar
root@ubuntu:~# cat ubuntu_export.tar | docker import - ubuntu
sha256:7dbfd4a258743f2a0bb39122622c57a8239bc804892df715fb0ab6b2e0da4beb
root@ubuntu:~#
建立 Container
root@ubuntu:~# docker run -itd --name ubuntu ubuntu bash
9c510ab5fb1f8acdfbd797f5b769b49d87e22a44ae2da0fe90737f7ba1439c78
進去 Container 內
root@ubuntu:~# docker exec -it ubuntu bash
root@9c510ab5fb1f:/#
觀看 etc 底下的目錄
root@9c510ab5fb1f:/# cd /etc/
root@9c510ab5fb1f:/etc# ls
X11 cron.weekly fonts init.d ld.so.conf mke2fs.conf pam.d rc4.d sgml terminfo
adduser.conf dbus-1 fstab inputrc ld.so.conf.d modules-load.d passwd rc5.d shadow timezone
alternatives debconf.conf gai.conf insserv legal mtab profile rc6.d shells tmpfiles.d
apt debian_version group insserv.conf libaudit.conf networks profile.d rcS.d skel ucf.conf
bash.bashrc default gshadow insserv.conf.d localtime nginx rc.local resolv.conf subgid udev
bash_completion.d deluser.conf host.conf issue login.defs nsswitch.conf rc0.d rmt subuid ufw
bindresvport.blacklist dhcp hostname issue.net logrotate.d opt rc1.d securetty sysctl.conf update-motd.d
binfmt.d dpkg hosts kernel lsb-release os-release rc2.d security sysctl.d xdg
cron.daily environment init ld.so.cache machine-id pam.conf rc3.d selinux systemd xml
root@9c510ab5fb1f:/etc#
exit 離開 Container
root@9c510ab5fb1f:/etc# exit
exit
root@ubuntu:~#
透過上述的觀看 etc 底下的檔案,你發現了什麼 ?
export 會將容器內所改變的東西全部打包匯出,可 save 單純只儲存 Image ,所以為了持續使用 Container 要使用 export 這個指令
好啦,那今天的內容就到這邊結束囉。 我們下期再會 ~ ~