[Centos8] 安裝及設定docker

URL Link //n.sfs.tw/14643

2020-05-20 11:27:27 By 張○○

docker 是一個提供應用程式容器的服務,相對於vm是作業系統的容器。簡單的來說,docker 有點像遊戲模擬器,可以玩很多的遊戲,就算是不同的作業系統,只要能裝上模擬器就能玩。

影像(images、相當於遊戲的rom檔)藉由docker執行後,可以形成容器(container),這就是執行後的實體,裡面跑著這個其中的images file,進階及有能力的使用者可以包裝及建立自己的images,也可以發布到公開或私有的平台分享給其它人。相關的觀念堆薦可以參考[8]的詳細介紹。

系統

CentOS Linux release 8.0.1905 (Core)

以下不同linux版本安裝大同小異,docker指令基本上是一樣的。

docker安裝

一、安裝 repos

# yum install -y yum-utils
# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
docker除了上面的stable版本外,還有 nightly(下一版次的主要版本,但可能還需要測試和除錯)和test兩種版本,在此 repository已預設有這二個版本的設定,只要enable即可:dnf config-manager --enable docker-ce-nightly 或是修改設定檔亦可。
這部分可參考官網[1]。

上面錯誤可以試試

Adding repo from: https://download.docker.com/linux/centos/docker-ce.repo

 

二、移除舊版docker

如果之前有安裝過其它版本的docker,可先移除以免造成版本衝突

# dnf remove docker  docker-client  docker-client-latest  docker-common \
docker-latest docker-latest-logrotate docker-logrotatedocker-engine

 

三、安裝docker

這裡我手動安裝 containerd.io,因為新版本需求的版本 >1.2.2但repos只能提供到1.2.0所以下載rpm裝,請參看錯誤排除一:

下載rpm,網址如[5]。

安裝rpm

# dnf install containerd.io-1.2.6-3.3.fc30.x86_64.rpm

 

完畢後,再裝 docker即可

# dnf install docker-ce docker-ce-cli

最後安裝完版本

# dnf list docker-ce docker-ce-cli containerd.io
Installed Packages
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

設定開機啟動並啟動

# systemctl enable --now docker

查看運作裝態

# systemctl is-active docker
# systemctl status docker

啟動及停止

# systemctl start docker
# systemctl stop docker

常用Docker指令--for image

docker的指令和git有點類似,列舉數個常用的指令

查看安裝的 images

# docker images

移除已安裝的images

# docker rmi <IMAGE ID>

例: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]

# docker image prune

 

尋找images

# docker search <套件關鍵字>

例: docker search gitlab

這是尋找網路上的套件[12],本機的  images檔會放在 /var/lib/docker/    

 

安裝images

# docker pull <REPOSITORY/NAME>

例: docker pull kopkop/termgifmaker

例: docker pull docker pull gitlab/gitlab-ce:15.8.3-ce.0

 

建立container

# docker run <參數> <IMAGE ID>

<參數>有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

# docker ps -a
CONTAINER ID    IMAGE           COMMAND             CREATED          STATUS             PORTS              NAMES
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功能來更名

# docker rename <CONTAINER ID/NAMES> new_name

停止/啟動 container

# docker stop <CONTAINER ID>
# docker start <CONTAINER ID>

刪除container

# docker rm <CONTAINER ID>
# docker kill <CONTAINER ID>

rm 和 kill 的差別是kill只是中止程式,容器實體還在,kill後要重新執行用start即可,可用 docker ps -a 來查看

移除所有未執行的container [10]

# docker container prune

查看設定及狀態

# docker inspect <CONTAINER ID>
# docker inspect <IMAGE ID>
列出目前的container
# docker container ls
即時 container 執行狀態
# docker stats
# docker port
# docker top <CONTAINER ID>

進到容器中

# docker exec -ti <CONTAINER ID> /bin/bash

-t:可看到容器中的畫面,換句話說,如果只想叫用容器裡面的程式,不必加此參數

-i:鍵盤輸入到容器中,想在容器中操作,這個參數一定要和 -t 連用,不然你會不知道你在幹嘛。

範例 docker  exec -ti bd7d9e9a2db6 /bin/bash

複製檔案

從外面複製到container中

docker cp <src-path> <CONTAINER ID>:<dest-path> 

從container中拷出來

docker cp <CONTAINER ID>:<src-path> <local-dest-path> 

 

查看記錄

# docker logs -f <CONTAINER ID>
# docker logs <CONTAINER ID>

-f 即時查看

查看在碟空間及容量

By Container

docker ps --size

All

docker system df -v

 

自己建立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去做客製作

二、建立

# docker build -t php:7.4-apache-mysqli . --no-cache

-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

[4] https://blog.hellosanta.com.tw/%E7%B6%B2%E7%AB%99%E8%A8%AD%E8%A8%88/%E4%BC%BA%E6%9C%8D%E5%99%A8/%E6%95%99%E4%BD%A0%E4%B8%80%E6%AC%A1%E5%AD%B8%E6%9C%83%E5%AE%89%E8%A3%9D-docker-%E9%96%8B%E5%A7%8B%E7%8E%A9%E8%BD%89-container%C2%A0%E5%AE%B9%E5%99%A8%E4%B8%96%E7%95%8C

[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

[14] https://hub.docker.com/

[15] How to analyze disk usage of a Docker container