差異處

這裏顯示兩個版本的差異處。

連向這個比對檢視

- 兩邊的前次修訂版 前次修改
下次修改
-tech:docker [2014/11/10 16:29]
– [Image Template] jonathan
+ 前次修改
+tech:docker [2025/04/10 12:51] (目前版本)
– [清除目前主機端未使用的 docker images] jonathan
@@ 行 -1 +1,197 @@ 移除 建立
 ====== Docker 語法與操作整理 ======
 
 ===== 安裝程序 =====
 ==== Ubuntu 22.04 ====
   * 安裝語法 
     * 標準安裝 <cli>
 sudo apt-get update
 sudo apt-get install ca-certificates curl gnupg
 sudo install -m 0755 -d /etc/apt/keyrings
 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
 sudo chmod a+r /etc/apt/keyrings/docker.gpg
 
 # Add the repository to Apt sources:
 echo \
   "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
   "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
   sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
 sudo apt-get update
 
 sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
 </cli>
 
 ==== Ubuntu 20.04 ====
   * 安裝語法 
     * 標準安裝 <cli>
 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
 sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
 sudo apt install docker.io docker-compose-plugin
 </cli>
     * 指定 docker 版本 <cli>
 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
 sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
 sudo apt-get install docker-ce=5:19.03.14~3-0~ubuntu-focal docker-ce-cli=5:19.03.14~3-0~ubuntu-focal docker-compose-plugin containerd.io -y
 </cli> 
   * 設定特定使用者使用 docker 權限 Exp. jonathan<cli>
 sudo usermod -aG docker jonathan
 </cli>
   * 安裝 rootless docker 方式<cli>
 curl -s https://get.docker.com/ | bash
 dockerd-rootless-setuptool.sh install
 </cli>
 
 <note>
   * 如果要在 rootless docker 讓 container 能夠 listen 1024 以下的 Port 需要執行 <cli>
 sudo setcap cap_net_bind_service=+ep "/usr/bin/rootlesskit"
 systemctl --user restart docker
 </cli>
 </note>
 
 ==== 刪除已經不執行的 docker container ====
   * 主要是在 docker run 之後, 如果沒有指定 --rm 就會在容器被停止或執行離開後留下, 可以使用 <cli>docker ps -a</cli>查看這些沒執行的容器, 當這樣的容器超過一定數量後, 就無法在這主機上建立新容器, 會出現類似空間不足的錯誤訊息
   * 解決方式
     - 透過<cli>docker container prune</cli>將這些停止的容器刪除
     - 檢查如果有 crontab 設定自動啟動容器, 要在 docker run 命令後加上 --rm 參數
 
 ==== 更新 docker compose 內相同 image 的最新版方式 ====
   * 參考 - https://stackoverflow.com/questions/49316462/how-to-update-existing-images-with-docker-compose
   * 因為有很多使用的 image 都是 latest 的 tag , 簡單更新與移除舊 image 方式如下<cli>
 docker compose pull
 docker compose up --force-recreate --build -d
 docker image prune -f
 </cli>
 
 ==== 設定自動清除 docker log =====
   * 主要是建立 /etc/docker/daemon.json 這設定檔, 定義自動分割與刪除 Exp. log size 最大 10m, 保留最近 3 份 <file>
 {
   "log-opts": {"max-size": "10m", "max-file": "3"}
 }
 </file>
 
 ==== 清除目前主機端未使用的 docker images =====
   * 先刪除已經 exited 狀態的 docker 程序<cli>
 docker rm $(docker ps -a -q -f status=exited)
 </cli>
   * <cli>
 sudo docker system prune -a -f
 docker volume ls -qf dangling=true | xargs --no-run-if-empty docker volume rm
 </cli>
 
 ==== 匯出與匯入 docker images =====
   * 當離線環境或自己 build 出的 image 就需要用到此功能
   * Exp. ai-gen-doc:1.1.3
     - 在來源主機匯出方式 <cli>
 docker save -o ai-gen-doc-1.1.3.tar ai-gen-doc:1.1.3
 </cli>
     - 在來源主機傳輸檔案到目標主機 <cli>
 scp ai-gen-doc-1.1.3.tar [email protected]:/path/to/destination/
 </cli>
     * 到目標主機匯入方式 <cli>
 docker load -i ai-gen-doc-1.1.3.tar
 </cli>
 
 ===== 開始下載與測試 Template =====
   * CentOS <code sh>
 docker pull centos
 </code>
   * Fedora <code sh>
 docker pull fedora
 docker run -i -t fedora /bin/bash
 </code>
     * 輸入 exit 就可以結束與離開
     * 輸入 CTRL-p + CTRL-q 可以離開 (docker container 繼續在背景執行)
 
 ===== 基本操作方式 =====
 ==== Image Template ====
   * 找目前 Internet 已存在的 Image Template **docker search <keyword>**<code sh>
 docker search ubuntu</code>
   * 安裝 Image Template **docker pull <img tmp name>**<code sh>
 docker pull centos</code>
   * 列出目前已安裝的 Image Template **docker images**<code sh>
 docker images</code>
   * 刪除不需要的 Image Template **docker rmi <IMAGE ID>**<code sh>
 docker rmi 2a973533a1af</code>
   * 建立自己的 Image Template **docker commit -m="<Message>" -a="<Author Name>" <CONTAINER ID> <REPOSITORY>:<TAG>**<code sh>
 docker commit -m="Add trysrvtool and pingserver" -a="Jonathan Tsai" c299814447ed tryweb/tryimg01:v1</code>
   * 對 Image Template 增加 TAG **docker tag <IMAGE ID> <REPOSITORY>:<New TAG>**<code sh>
 docker tag dc30d39a01da tryweb/phplist:latest</code>
   * 將 Image Template 存成檔案 **docker save <img tmp name> > <img tmp name>.tar** Exp. busybox<cli>
 docker save busybox > busybox.tar
 </cli>
   * 將 Image Template 檔案匯入 **docker load --input <img tmp name>.tar** Exp. busybox<cli>
 docker load --input busybox.tar
 </cli>
 
 <note>
   * 顯示 Images 的 Digest <cli>docker images --digests</cli>
   * 顯示特定格式 Images 資訊 Exp. iiiorg/devops-api <cli>docker images iiiorg/devops-api --format "{{.ID}}: {{.Repository}}:{{.Tag}} {{.Digest}}" | grep devops-api:1</cli>結果顯示如下:<cli>
 fcfbe89fe52a: iiiorg/devops-api:1 sha256:d6ce6ffa86c37b387cc07ac5cecb92fd97457b96b155cc2692658312be1b8ea5
 </cli>
 </note>
 
 ==== Container ====
   * 想要 sh 進入操作有 ENTRYPOINT 的 image 容器
     * 啟動一個臨時容器, Exp. certbot/dns-cloudflare:latest<cli>docker run -it --rm --entrypoint /bin/sh certbot/dns-cloudflare:latest</cli>
     * 進入一個啟動容器, Exp. certbot <cli>docker exec -it certbot /bin/sh -c sh</cli>
   * 查詢有哪些 docker container 存在 **docker ps --all**<code sh>
 docker ps --all
 </code>在 STATUS 欄位可以看到是否運中還是離開(Exited)狀態
   * 使用 bash 進入到運行中的 docker container **docker exec -it <CONTAINER ID> or <NAMES> /bin/bash**<cli>
 ~$ docker exec -it c789b6b5ee99 bash
 bash-5.0#
 </cli>
   * 切換到運行中的 docker container **docker attach <CONTAINER ID> or <NAMES>**<code sh>
 docker attach silly_hawking
 </code>
   * 啟動離開(Exited)狀態的 docker container **docker start <CONTAINER ID> or <NAMES>**<code sh>
 docker start 2522259349a9
 </code>
   * 查看 docker container 的 Console 訊息 **docker logs <CONTAINER ID> or <NAMES>**<code sh>
 docker logs 2522259349a9
 </code>
   * 查看 docker container 的詳細資訊 **docker inspect <CONTAINER ID> or <NAMES>**<code sh>
 docker inspect 2522259349a9
 docker inspect -f "{{ .NetworkSettings }}" 2522259349a9
 </code>
   * 備份 docker container <code sh>
 
 </code>
   * 關閉啟動中的 docker container (成為離開狀態)**docker stop <CONTAINER ID> or <NAMES>**<code sh>
 docker stop 2522259349a9
 </code>
   * 刪除已關閉(離開狀態)的 docker container**docker rm <CONTAINER ID> or <NAMES>**<code sh>
 docker rm 2522259349a9
 </code>
   * 查看 image 內的相關訊息 **docker run -i -t <image> <shell cmd>** <cli>
 docker run -i -t php:7.0.33-cli-jessie bash
 </cli>
 
 ===== 針對 docker compose 內其中一個 container 更改設定後重新啟動 =====
   * 參考 - https://stackoverflow.com/questions/37609662/docker-compose-restart-only-updated-images
   * 處理方式 Exp. iii-devops-lite-ui<cli>
 docker-compose up -d --no-deps iii-devops-lite-ui
 </cli>
 
 ===== 預計測試項目 =====
   * DNS (named)
   * Proxy (nginx)
   * Web Server (apache+php)
   * Mail Server (sendmail+MailScanner)
   * [[tech:docker:phplist|PHPList]]
   * [[tech:docker:openvpn|VPN Server (openvpn)]]
   * SVN Server (subversion)
   * DB Server (mysql / postgresql)
   * File Server (ceph)
   * docker mrtg howto
   * docker container live migration howto
   * [[tech:docker:howto:storage|docker storage howto]]
   * [[tech:docker:howto:backup|docker backup / restore howto]]
   * [[tech:docker:howto:autostart|docker container auto start howto]]
 
 ===== 參考網址 =====
   * http://www.liquidweb.com/kb/how-to-install-docker-on-centos-6/
   * https://docs.docker.com/userguide/
   * https://docs.docker.com/engine/reference/commandline/images/
 
 {{tag>安裝 Docker 虛擬化 k8s}}