[TOC] # Docker Docker History: 2010年 San Franciscro Of United State dotCloud為(Platform-as-a-Service, Pass) 平台即服務供應商。底層技術上,dotCloud平台利用了Linux的LXC容器技術。 為了方便創建和管理這些容器,dotCloud基於Google公司推出的Go語言開發了一套內部工具,之後被命名為Docker,Docker就是這樣誕生的。 public docker image repository # 容器化 容器化: 是軟體開發的一種方法,在這種方法中,程式和他所依賴的組件和集合包,以及相關的環境變數、配置文件都會被完全打包成容器鏡像,進行單元測試,最後將這個容器部屬到服務器的操作系統中。 一致的運行環境: 避免開發環境或測試環境、生產環境的不一致導致一些Bug的產生,而Docker鏡像提供除了內核外完整的運行時環境,確保了應用運行環境的一致性。 更輕鬆的搬移程式碼: 由於Docker確保了執行環境的一致性,使得程式的搬移更加容易,Docker可以在很多平台上運行,無論是物理機、虛擬機、公有雲、私有雲、或是一般電腦其運行結果都會是一致的。 持續交付和部署: 對開發和運維(DevOps)人員來說,最希望的就是一次創建或配置,可以再任意地方正常運行。使用Dockerfile訂製程式鏡像來實現持續集成、持續交付、部署。而且使用Dockerfile使鏡像構建透明化,不僅僅開發團隊可以理解程式運行的環境,也方便DevOps團隊理解程式運行所需條件,幫助更好的生展環境中部署該鏡像。 更輕鬆的維護和擴展: Docker使用的分層儲存以及鏡像的技術,使得程式重複部分的重複使用更為容易,也使得程式的維護及更新更加簡單,基於基礎鏡像進一步擴展的鏡像,也變得非常簡單。此外,Docker團隊同各個開源項目團隊一起維護了,一大批高質量的官方鏡像,既可以直接在生產環境使用,又可以做為基礎進一步的訂製,大大的降低了應用服務的鏡像製作成本。 ### CentOS 7 下載教學 https://iter01.com/578383.html ### Windows Terminal https://www.kwchang0831.dev/dev-env/wsl/centos ### Wsl https://ithelp.ithome.com.tw/articles/10255920 https://ubuntu.com/tutorials/install-ubuntu-on-wsl2-on-windows-10#2-install-wsl Wsl PID https://askubuntu.com/questions/1379425/system-has-not-been-booted-with-systemd-as-init-system-pid-1-cant-operate Windows 進入Wsl資料夾方法 資料夾目錄輸入 \\wsl$ ### ubuntu可能要運行 wsl.exe install ### 開啟 docker服務 sudo service docker start ### 修改image拉取的網域 daemon.json vi /etc/docker/daemon.json ### vim 編輯器 https://linux.vbird.org/linux_basic/centos7/0310vi.php ### docker run hello-world ![](https://i.imgur.com/lpDOXma.png) ### image分層 ![](https://i.imgur.com/y9H8DGE.png) 表示該image已經存在 ### Volume 數據卷 可將資料從Container同步到Server上,做數據持久化。 ### Registry 註冊中心 官方提供 https://hub.docker.com Repository registry image可以讓我們在自己本機搭建一個repository # docker command-line ### 查image清單 docker images docker image ls REPOSITORY:image在repository中的名稱。 TAG: image tag IMAGE ID: image ID CREATED: image createTime SIZE: image size 這些image都是儲存在Server或是Local的/var/lib/docker目錄下。 ### 刪除image 刪除image docker rmi [image name] docker rmi [image id] docker rmi [image name + image tag] ex: docker rmi redis (如果未指定預設刪除 redis:latest) docker rmi redis:5 docker rmi 226c4c322bdb ### 從網路上搜尋image docker search [search image name] NAME: image name DESCRIPTION: image description STARS: popularity OFFICIAL: 是否為官方建構的 AUTOMATED: 自動構建,表示該image由Docker Hub自動構建流程創建。 ### 拉取image docker pull [image] # Container command-line ### 查詢Container 查詢正在運行的Container: docker ps 查詢停止的Container:(-f就是filter的意思) docker ps -f status=exited 查詢所有Container: docker ps -a 查詢最後一次運行的Container: docker ps -l 列出最近創建的n個Container: docker ps -n 5 列出最後運行的n個Container: docker ps -l -n 3 ### 創建Container 創建並且進入Container: docker run -it --name [Container Name] [image Name]:tag /bin/bash docker run [OPTIONS] IMAGE [COMMAND] [ARG...] -i: 表示運行容器 -t:表示容器啟動後會進入其命令行,加入這兩個參數後,容器創建就能登入進去。即分配一個偽終端; --name: 給這個容器一個名稱 很像C#中 var myRedis = new redis的概念 -v 表示目錄映射關係(前者是宿主機目錄,後者是映射到宿主機的目錄,可以使用多個 -v做多個目錄或文件映射。注意:最好做目錄映射在宿主機上做修改,然後共享到容器上。 -d 在run後面加上-d參數,則會創建一個守護式容器在後台運行 (這樣創建容器後不會自動登錄容器,如果只加-i -t兩個參數,創建容器後會自動進容器裡)。 -p: 映射port號 把container的port號映射到server的port號 (server or localhost)的port:(docker container)的port。 -P: 隨機映射port號 把server的隨機port號映射到container的port號上。 ex: docker run --name myRedis -p 80:80 redis docker run -it --name myNginx -p 80:80 nginx ### 刪除Container docker rm [NAMES] docker rm [CONTAINER ID] ### 退出Container exit ### 守護方式創建Container docker run -di --name [Container Name] [image Name]:tag ### 守護式容器登錄方式 docker exec -it [Container Name]or[Container ID] /bin/bash ### 停止與啟動容器 docker stop [Container Name]or[Container ID] docker start [Container Name]or[Container ID] ### 文件複製 如果需要將文件複製到容器內可以使用cp命令 docker cp 需要複製的文件或目錄 [Container Name]:[Container Path] ex docker cp testWoody.txt myNginx:/etc 也可以將文件容器內複製出來 docker cp [Container Name]:[Container Path] 需要複製的文件或目錄 ex docker cp myNginx:/etc/WoodyTest3.txt /root/ ### 目錄掛載 (Container Volume Operation) 我們可以在創建容器的時候,將宿主機的目錄與容器內的目錄進行映射,這樣我們就可以通過修改宿主機某個目錄的文件從而去影響容器,而且這個操作是雙向綁定的,也就是說容器內的操作也會影響到宿主機,實現備份功能。 但是容器被刪除的時候,宿主機的內容並不會被刪除。如果多個容器掛載同一個目錄,其中一個容器的內容被刪除,其他容器的內容也不會受到影響。 :::success 容器與宿主機之間的Volume屬於引用的關係,Volume是從外界掛載到容器內部中的,所以可以脫離容器的生命週期而獨立存在,正是由於Volume的生命週期並不等同於容器的生命週期,在容器退出或者刪除以後,Volume仍然不會受到影響,Volume的生命週期會一直持續到沒有容器使用它為止。 ::: 創建容器添加 <font color=orange>-v</font> 參數,格式為 <font color=orange>宿主機目錄:容器目錄</font> ex docker run -di -v /mydata/docker_centod/data:/usr/local/data --name centos7-01 centos:7 ex docker run -di --name myNginx02 -p 81:80 -v /mydata/docker_nginx/:/woody/confi ### 多目錄掛載 ex docker run -di -v /宿主機目錄:/容器目錄 -v /宿主機目錄2:/容器目錄2 [image Name] :::info 掛載的相關訊息會在容器中的Mounts看到,如果創立時沒有綁定任何資料來源,那Mounts就會是[]空陣列,所以如果一開始創建沒有綁定,其中一個做法就是找到容器的Config文件中的Mounts,修改其內容。 ::: ### 匿名掛載 # 暫列其他 ### vi 建立並編輯檔案 ex vi WoodyTest01.txt ### cat 觀看檔案內容 ex cat WoodyTest01.txt ### docker inspect 查看容器的所有相關訊息 ex docker inspect [Container Name] https://www.bilibili.com/video/BV1344y1B7xv?p=22&spm_id_from=pageDriver&vd_source=d245a3d8337eba59934877dec9ee317e https://linux.vbird.org/linux_basic/centos7/0310vi.php