介紹影片:
更多介紹文:
線上教學:
更多站內文章:
Virtual Machines
虛擬化通常都是透過在 Host OS 上安裝 hypervisor ,由 hypervisor 來管理不同虛擬主機,每個虛擬主機都需要安裝不同的作業系統。
Docker
Docker 提供應用程式在獨立的 container 中執行,這些 container 並不需要像虛擬化一樣額外依附在 hypervisor 或 guest OS 上,是透過 Docker Engine 來進行管理。
Virtual Machines v.s Docker
man docker <command> man docker build man docker rmi
// 搜尋 Docker Hub 上的 image name docker search lamp // 顯示已下載所有 image name docker images // 檢視既有 image 的詳細資訊 docker inspect <image-name> // 網路下載 image docker pull ubuntu:13.10 // 刪除已下載的 image docker rmi <image-name> // 刪除所有 images docker rmi $(docker images -q) // 刪除所有 images,除了 my-images 以外 docker rmi $(docker images | grep -v 'ubuntu\|my-image' | awk {'print $3'}) // 刪除所有 <none> 的有問題 images docker rmi $(docker images -f "dangling=true" -q) // 刪除與 myapp/myimage 相關的 <none> 的 images docker rmi $(docker images myapp/myimage -f "dangling=true" -q) // 列出所有 images 之間繼承的關係 docker run --rm -v /var/run/docker.sock:/var/run/docker.sock nate/dockviz images -t
TIPs:
搜尋 Docker Hub 有哪些 images 可下載,https://registry.hub.docker.com/。
image 不用刻意下載,當開啟 container 時,如果 image 不存在,系統會自動下載。
Image Name 格式 <REPOSITORY>:<TAG> 例如 buntu:13.10
更多 dockviz 進階的應用
https://fabianlee.org/2017/05/24/doc...using-dockviz/
// 開啟並進入 container 的 console
docker run -it <image-name> /bin/bash
docker run -it --name <container-name> <image-name> /bin/bash
// 以 daemon 方式啟動 container
docker run -d -p 11180:80 <image-name>
docker run -d --name web <image-name>
TIP: 啟動 container 時可以自訂名稱以方便管理
docker run -d -p 80:80 --rm <image-name>
加上 --rm 時,當停止 container 時,會自動被刪除(與 docker rm 指令相同),且無法使用啟動指令
(docker start) 只能使用 docker run 啟動。
// 檢查目前已經啟動的 containers
docker ps
docker ps -a
// 檢視開啟中 container 的詳細資訊,包含 Volumes、IP、Hostname 等等
docker inspect <container-id>
// 刪除指定的 container
docker rm <container-id>
// 刪除所有的 containers
NOTE: 小心,這也會刪除正在執行的 container
docker ps -a -q | xargs -n 1 docker rm
docker rm $(docker ps -aq)
// 刪除所有已經終止的 container
docker ps -a | grep "Exited" | awk '{print $1}' | xargs docker rm
NOTE: 這常用於在重新啟動 container 或 rebuild image 時遇到錯誤訊息的解決方法。
// 停止 container
docker stop <container-id>
// Stop all containers
docker stop $(docker ps -aq)
// 匯出 container
docker export <container-id> > ubuntu-mysql.tar
// 匯入 container
cat ubuntu-mysql.tar | docker import - <image-name>
// 跳離目前開啟中的 container
按下 Ctrl P 後再按 Ctrl Q
NOTE: 如果無法成功跳離,原因可能是 Ctrl+P 是 Bash 內定的快捷鍵(回到前一個指令)
// 重新進入開啟中的 container
docker attach <container-id>
或
docker attach <container-name>
如果 container 是以 daemon 啟動,改用以下方式
docker exec -it <container-id/name> /bin/bash
// 儲存開啟中 container 內容
docker commit <container-id> <image-name>
// 顯示指定 container 的 IP
docker inspect <container-id> | grep IPAddress | cut -d '"' -f 4
複製/搬移 container 至另一部主機
## Stop the container docker stop <container-name> ## Save container image docker commit <container-name> mycontainerimage docker save mycontainerimage | gzip > mycontainerimage.tar.gz ## Load container image to destination host gunzip -c mycontainerimage.tar.gz | docker load ## Transfer image without creating a file docker save mycontainerimage | gzip | ssh root@203.0.113.1 'gunzip | docker load'
TIP:
執行 exit 可以離開目前的 container,回到原先的 Linux
一旦離開 container,所有之前做過的變更,將全部失效,如果要保留做過的變更,必須使用 commit 產生一個新的 image。
-p 將 Host 的 port 11180 轉送至 container 的 port 80
(https://docs.docker.com/userguide/dockervolumes/)
Docker 的 Data Volume 是一個很特別的目錄設計,主要用在不同 containers 之間的資料分享,永久保存資料等。
主要特點:
// 啟用 volume docker run -t -i -p 80:80 -v /webapp alang/centos5-lamp_php51
TIPs:
- 在 container 內會自動新增一個目錄名為 /webapp,儲存到這個目錄的所有資料都會被保留。
被保留的資料會儲存到 host 的某個特定目錄內,即使 container 被移除,這些資料還是會存在,要如何找到這個特定目錄:
docker inspect -f {{.Volumes}} <container-id>
一般預設會是
/var/lib/docker/vfs/dir/bfebd8cb6......- 由於 container 關閉後再啟動的 container ID 會不同,所以同一個 volume 在 host 上的目錄名稱也會不同。
檢查版本資訊
// 檢查 Docker 版本 docker version // Docker 更多資訊 docker info
host 與 container 間交換檔案
#> docker cp <container-name>:/etc/nginx/nginx.conf /data/web/conf #> docker cp host_source_path my_container:destination_path #> docker cp -a host_source_path my_container:destination_path
DB container 的備份方式
在 host 新增 cron 15 2 * * * docker exec mysql bash -c "mysqldump --defaults-extra-file=/root/root.cnf -u root --all-databases | gzip > /mnt/db_backups/database_`date '+\%Y\%m\%d'`.sql.gz" root.cnf 是 root 密碼檔,內容為 [client] password={my-mysql-root-password}
取得 container IP
#> docker inspect <container_id> | grep -i ipaddr
#> docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <container_id>
清除沒用的物件
這會清除所有已停止的 container,沒有在用的docker層網路介面與 <none> 不完整的 image。 #> docker system prune 上述指令會保留 volume 裡的資料,如果要一併清除,須加上 --volumes #> docker system prune -a --volumes
NOTE: 服務一旦佈署完成,docker-compose.yml 的路徑如果有變更,就不能繼續使用指令 docker-compose 來管理 container,不過已經啟動的服務運行不會影響,但關閉後就無法再被啟動。
新增與啟動所有應用服務
docker-compose up -d docker-compose up -d <service-name>
Build the image of the service
docker-compose build <service-name> docker-compose up --rebuild <service-name>
目前的應用服務狀態
docker-compose ps
停止/啟動所有應用服務但不要結束所屬 container
docker-compose stop docker-compose start
如果 container 屬性沒有異動,只是所屬的服務需要重啟載入新設定,可以使用這。
停止所有應用服務並結束所屬 container 執行
docker-compose down docker-compose stop <service-name> docker-compose rm -f <service-name>
NOTE:
- 如果有修改 docker-compose.yml,必須使用 down 關閉服務後,用 up -d 重新啟動。
- 停止服務後,重新啟動只能使用 docker-compose up -d
檢視服務啟動失敗的日誌
docker-compose logs
執行某個應用服務的特定程序
docker-compose exec <service-name> sh -c "pwd"
文件 | 大小 | 日期 | 附件上傳者 | |||
---|---|---|---|---|---|---|
docker-logo.png 無描述 | 97.73 KB | 15:04, 15 Nov 2014 | alang | 動作 | ||
VM-vs-Docker.png 無描述 | 29.42 KB | 15:18, 15 Nov 2014 | alang | 動作 |