自動目錄
docker 是一個提供應用程式容器的服務,相對於vm是作業系統的容器。簡單的來說,docker 有點像遊戲模擬器,可以玩很多的遊戲,就算是不同的作業系統,只要能裝上模擬器就能玩。
影像(images、相當於遊戲的rom檔)藉由docker執行後,可以形成容器(container),這就是執行後的實體,裡面跑著這個其中的images file,進階及有能力的使用者可以包裝及建立自己的images,也可以發布到公開或私有的平台分享給其它人。相關的觀念堆薦可以參考[8]的詳細介紹。
系統
CentOS Linux release 8.0.1905 (Core)
以下不同linux版本安裝大同小異,docker指令基本上是一樣的。
docker安裝
一、安裝 repos
# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
這部分可參考官網[1]。
上面錯誤可以試試
Adding repo from: https://download.docker.com/linux/centos/docker-ce.repo
二、移除舊版docker
如果之前有安裝過其它版本的docker,可先移除以免造成版本衝突
docker-latest docker-latest-logrotate docker-logrotatedocker-engine
三、安裝docker
這裡我手動安裝 containerd.io,因為新版本需求的版本 >1.2.2但repos只能提供到1.2.0所以下載rpm裝,請參看錯誤排除一:
下載rpm,網址如[5]。
安裝rpm
完畢後,再裝 docker即可
最後安裝完版本
containerd.io.x86_64 1.2.6-3.3.fc30 @@commandline
docker-ce.x86_64 3:19.03.9-3.el7 @docker-ce-stable
docker-ce-cli.x86_64 1:19.03.9-3.el7 @docker-ce-stable
啟動docker
設定開機啟動並啟動
查看運作裝態
啟動及停止
常用Docker指令--for image
docker的指令和git有點類似,列舉數個常用的指令
查看安裝的 images
移除已安裝的images
例:docker rmi 3df7dd1bccb5
如果出現以下錯誤,那代表此images目前有container在執行/曾有執行,必需先刪除該container
Error response from daemon: conflict: unable to delete 3df7dd1bccb5 (must be forced) - image is being used by stopped container 3e8xxxxxx7d
移除空的 images,顯示為 <none>的images[11]
尋找images
例: docker search gitlab
這是尋找網路上的套件[12],本機的 images檔會放在 /var/lib/docker/
安裝images
例: docker pull kopkop/termgifmaker
例: docker pull docker pull gitlab/gitlab-ce:15.8.3-ce.0
建立container
<參數>有3 40個,列舉常用參數[7][8]
-d 背景執行
-p 伺服器Port:Docker埠
-i :則讓容器的標準輸入保持打開
-t:讓Docker分配一個虛擬終端(pseudo-tty)並綁定到容器的標準輸入上
-e:設定環境變數(AAA=BBB)
-p:Port 對應(host port:container port)
-v:資料對應(host folder:container folder)
--name:設定容器名稱,如果有設定容器名稱,後面的操作可用名稱來代替
常用Docker指令--for container
查看執行的/曾執行的container
39fcf3a412c1 17d5117a2e37 "/assets/wrapper" 55 minutes ago Up 55 minutes (healthy) 22/tcp, 443/tcp, 0.0.0.0:8000->80/tcp infallible_gauss
如果有設定容器名稱,後面的<CONTAINER ID>可用名稱來代替,也可以使用rename功能來更名
停止/啟動 container
刪除container
rm 和 kill 的差別是kill只是中止程式,容器實體還在,kill後要重新執行用start即可,可用 docker ps -a 來查看
移除所有未執行的container [10]
查看設定及狀態
# docker inspect <IMAGE ID>
列出目前的container
# docker container ls
即時 container 執行狀態
# docker stats
# docker port
# docker top <CONTAINER ID>
進到容器中
-t:可看到容器中的畫面,換句話說,如果只想叫用容器裡面的程式,不必加此參數
-i:鍵盤輸入到容器中,想在容器中操作,這個參數一定要和 -t 連用,不然你會不知道你在幹嘛。
範例 docker exec -ti bd7d9e9a2db6 /bin/bash
複製檔案
從外面複製到container中
從container中拷出來
查看記錄
# docker logs <CONTAINER ID>
-f 即時查看
查看在碟空間及容量
By Container
All
自己建立docker image
雖然 dockerhub [14]裡有非常多的 image 可供選用,但大部分的 image都缺乏足夠的說明文件,不知裡面修改了什麼。或是缺少了某些指令需要安裝。
有時候想把自己寫的程式也放到 image中,可以自己建置 image。
自己要建置的話要可以參考[8][13]的說明,非常清楚,這裡稍作簡單說明。
一、先建立腳本檔,命名為 Dockerfile, 內容大概是這樣:
FROM php:7.4-apache
MAINTAINER axer
RUN ["/bin/bash","-c","a2enmod rewrite"]
RUN apt-get update && \
alias ll='ls -l --color'
COPY www.tgz /var/www/html/
裡面相關的指令有RUN,COPY ,run就是執行在images裡的指令;copy是將檔案從外面拷背到images裡面,這裡要注意的是copy的來源檔只能是自己Dockerfile所在的目錄或其子目錄。
FROM 是由現存哪一個image去做客製作
二、建立
-t 是指新的image版本
--no-cache 是防止暫存檔,保證每次都是最新的狀況
結論
此篇介紹基本對基本的操作熟析後,下一篇會介紹docker compose 的設定。
錯誤排除
一、centos8 上出現 ontainerd.io >= 1.2.2-3 的錯誤
Problem: package docker-ce-3:19.03.9-3.el7.x86_64 requires containerd.io >= 1.2.2-3, but none of the providers can be installed
- cannot install the best candidate for the job
- package containerd.io-1.2.10-3.2.el7.x86_64 is excluded
- package containerd.io-1.2.13-3.1.el7.x86_64 is excluded
- package containerd.io-1.2.13-3.2.el7.x86_64 is excluded
- package containerd.io-1.2.2-3.3.el7.x86_64 is excluded
- package containerd.io-1.2.2-3.el7.x86_64 is excluded
- package containerd.io-1.2.4-3.1.el7.x86_64 is excluded
- package containerd.io-1.2.5-3.1.el7.x86_64 is excluded
- package containerd.io-1.2.6-3.3.el7.x86_64 is excluded
(try to add '--skip-broken' to skip uninstallable packages or '--nobest' to use not only best candidate packages)
解決:利用官網給定的指令無法安裝到centos8上,主因是containerd.io只能安裝到1.2.0版,手動下載rpm來安裝,請參考上面三、安裝docker。
二、啟動docker時失敗,記錄檔
/usr/bin/containerd: symbol lookup error: /usr/bin/containerd: undefined symbol: seccomp_api_set
containerd.service: Main process exited, code=exited, status=127/n/a
containerd.service: Failed with result 'exit-code'.
解決:因為containerd.io的版本太新導致,後來安裝1.2.6即可,請參考上面三、安裝docker。
參考資料
[1] 官網 https://docs.docker.com/engine/install/centos/
[2] https://linuxconfig.org/how-to-install-docker-in-rhel-8
[3] http://blog.stepbystep.tw/blog/post/119991918
[5] https://fedora.pkgs.org/30/docker-ce-stable-x86_64/containerd.io-1.2.13-3.2.fc30.x86_64.rpm.html
[6] Docker hub https://hub.docker.com/
[7] man docker-run
[8] IT邦邦忙 https://ithelp.ithome.com.tw/articles/10199339
[9] https://stackoverflow.com/questions/51188657/image-is-being-used-by-stopped-container
[10] https://stackoverflow.com/questions/54273206/how-to-remove-docker-containers-that-are-not-running
[11] https://stackoverflow.com/questions/33913020/docker-remove-none-tag-images
[12] https://www.freecodecamp.org/news/where-are-docker-images-stored-docker-container-paths-explained/
[13] https://ithelp.ithome.com.tw/m/articles/10191016?sc=hot
[15] How to analyze disk usage of a Docker container