參考:Docker將執行中容器打包成映象並儲存到本地
問題
近期在本地虛擬機器和阿里雲伺服器上都折騰了幾個docker。然後想著在本地的樹莓派上也裝上node-red,計劃丟在實驗室裡面連PLC。結果半吊子的我,先走全域性安裝,再走docker,都以失敗告終。前者裝了nvm、node之後,執行nvm指令失敗。後者透過各種方法都是timeout
。再在網上看了一些自建的dockerhub,大致反應過來,似乎這東西不像apt一樣,而是可以自己搭個docker倉庫的。於是想著把已經裝好的docker能不能先打包傳輸到pi上面安裝,以後有空再研究自己搭個docker倉庫方便拉取。找了下,發現了文首的那篇部落格。
打包
將容器儲存為映象
docker commit <容器ID或名稱> <映象名稱>:<標籤>
具體我做的是
ssh到我的虛擬機器並檢視容器
$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5a7772b55fa0 nodered/node-red "./entrypoint.sh" 7 weeks ago Up 36 minutes (healthy) 0.0.0.0:1880->1880/tcp, :::1880->1880/tcp mynodered
把現有的容器儲存成映象
$ sudo docker commit 5a7772b55fa0 nodered_siit:latest
把映象打包成tar壓縮包並輸出
$ docker save -o node_red_img.tar nodered_siit:latest
檢視檔案
我們可以看到這個檔案就有了。接下來需要做的就是把這個虛擬機器裡的檔案傳到我的pi上面。
Linux之間傳檔案
scp
指令
$ sudo scp node_red_img.tar siit@192.168.122.43:~/
The authenticity of host '192.168.122.43 (192.168.122.43)' can't be established.
ED25519 key fingerprint is SHA256:MhT5RyOnqnKAUpPEvT/xONvVHjd3rmgi0HcTUNDq9HY.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.122.43' (ED25519) to the list of known hosts.
siit@192.168.122.43's password:
node_red_img.tar 100% 738MB 189.4MB/s 00:03
其實沒成功,傳過去後發現因為虛擬機器用的x86架構和pi的arm架構的docker不相容,所以以下內容具體實施是從虛擬機器轉到虛擬機器********************
傳完檔案過後,使用docker load
把之前打包成tar
的壓縮包載入新機器的docker images
裡面
$ sudo docker load -i node_red_img.tar
78561cef0761: Loading layer 8.082MB/8.082MB
3762a94f9dbd: Loading layer 122.1MB/122.1MB
32abe9a81c15: Loading layer 5.61MB/5.61MB
186d35b3efff: Loading layer 3.584kB/3.584kB
4d6aebb789b4: Loading layer 4.608kB/4.608kB
7de19ea56e73: Loading layer 2.56kB/2.56kB
ca873884f967: Loading layer 21.39MB/21.39MB
5f70bf18a086: Loading layer 1.024kB/1.024kB
9cc17eb232c5: Loading layer 6.144kB/6.144kB
177ddae17d50: Loading layer 8.192kB/8.192kB
2b465594d98a: Loading layer 4.608kB/4.608kB
ea698edee62f: Loading layer 4.096kB/4.096kB
ef933f1a0bd8: Loading layer 3.584kB/3.584kB
badb32c1526f: Loading layer 3.584kB/3.584kB
56aa82df8a39: Loading layer 83.09MB/83.09MB
0130bb700840: Loading layer 348.9MB/348.9MB
b82597808ede: Loading layer 6.656kB/6.656kB
5b139ee354cc: Loading layer 184.7MB/184.7MB
Loaded image: nodered_siit:latest
然後,我們透過docker images
指令檢視
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nodered_siit latest ecc9f6a2e5c5 2 days ago 746MB
可以看到新的映象已經載入。然後的操作就和以前pull
之後做的一樣,需要 docker run
了。
$ sudo docker run -d --name mynodered -p 1880:1880 nodered_siit
7a67342ceb34be393533184097ff20de9da2f6c8864199df75168560099f0f7c
docker: Error response from daemon: AppArmor enabled on system but the docker-default profile could not be loaded: running `apparmor_parser apparmor_parser --version` failed with output:
然後遇到報了個錯,缺AppArmor。就裝一下:
$ sudo apt-get install apparmor
裝完之後,sudo docker ps -a
發現新的mynodered
已經有了。
然後sudo docker start mynodered
。
然後瀏覽器開啟IP:1880
,OK,問題解決。