Docker 是從2013年一個開源專案開始,藉由linux核心提供的cgroup、namespaces等資源分離特異功能,將應用程式與作業系統剝離,在特性上主要就是做出資源隔離和管理。
若是要說到區隔,其實在KVM也是利用Kernel,但是需要完整模擬BIOS,所以會有一點損耗是很正常的。
Docker的技術不屬於從CPU模擬虛擬化,比較像從核心之上對作業區分隔然後部分模擬作業系統。其實在X86上,FreeBSD就曾經創造jail的技術做程序的區隔,而可惜的是沒有人挺下去 (因為你安裝一個Free的作業系統,然後叫使用者進jail) 。正是站在風口上連豬都會飛,正當市場上虛擬化還在火熱時,誰知道後面docker風潮正也開始了。
在docker上檔案系統是有layer(高檔)的,拿到執行pid的環境(container)才會開出讀寫層,其餘靜態的就是影像(images)。
其餘docker還處理了系統資源的跨接,如網路、volume、設備等,畢竟在POSIX設計的作業系統,Everything is a file.
再來我就馬虎帶一些常用指令做參考,$container可以用名稱name或是hash帶入命令,hash只要到可辨識程度。
# starts or stop a container
docker start $container
docker stop $container
docker restart $container
# 把USB裝置帶入 $container
docker run -it --device=/dev/ttyUSB0 $container /bin/bash
# 察看containers
docker ps -a
# 從registry取出image
docker pull $image
# 送image回去registry
docker push $image
# Prune清除系統
docker system prune
docker container prune
docker image prune
# 刪除停止的containers
docker rm -v $(docker ps -a -q -f status=exited)
另外介紹Dockerfile,這是用來創造docker build的設定檔。基本上撰寫可以參考別人的文章,我自己撰寫的方法就是嘗試錯誤法,先試一版,掛掉的點重新拼正確命令,看看會不會繼續動,就繼續寫Dockerfile。
這樣寫得有點單薄,所以加料一下
containerd預設安裝會用socket通訊,但是後面會用tcp來通訊
調整方法如下,編輯/etc/systemd/system/docker.service.d/startup_options.conf
# /etc/systemd/system/docker.service.d/override.conf
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375
然後
root@Kris:~ # systemctl daemon-reload
root@Kris:~ # systemctl restart docker.service
root@Kris:~ # nmap -p 2375 localhost
Starting Nmap 7.60 ( https://nmap.org ) at 2019-09-24 23:26 CST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000084s latency).
PORT STATE SERVICE
2375/tcp open docker
Nmap done: 1 IP address (1 host up) scanned in 0.29 seconds
root@Kris:~ #
成功在port 2375跑了起來
REF:
https://github.com/wsargent/docker-cheat-sheet
https://success.docker.com/article/how-do-i-enable-the-remote-api-for-dockerd