# Docker ### 主講人:黃夙賢 --- ## 虛擬化技術 - 虛擬化(Virtualization),將將硬體軟體化,可直覺的分配運算資源 (例:CPU、Memory) - Virutalbox、Vmware ![](https://i.imgur.com/LOQqFkB.png) --- ## 為什麼雲端運算的龍頭老大Google不用虛擬機器(VM) - 硬體獨立了,作業系統卻還是要重複安裝 - 動輒數GB的虛擬化映像檔,讓應用程式的安裝與復原費時費力 - 設定複雜 - 虛擬機器安裝動輒數分鐘到數小時 - 容器化(Container)技術的誕生 --- ## 容器化技術 - 利用作業系統(Linux)的隔離技術,達成作業系統(OS)以上的虛擬化 - 常用在idc機房,多為Linux核心 ![](https://i.imgur.com/4E4dajB.png) --- ## 伺服器 vs. VM vs. Container ![](https://i.imgur.com/nm5L1pL.png) --- ## Container 相對於 VM - Container不是用來取代VM,是相輔相成 - Container讓程式部屬自動化 - 可以自動化部屬,就有辦法達成自動備援、系統容錯 --- ## Docker容器技術 - 2013年由Docker Inc公司基於GO語言開發,2019年被Mirantis公司收購 - 最多個人使用的容器化技術,也最簡單 - https://www.docker.com/ ![](https://i.imgur.com/mWsgVNA.png) --- ## Docker架構 ![](https://i.imgur.com/CCTCU3C.png) --- - Docker Hub雲端儲存相關Docker Image(映像檔) - 需要時,會從雲端Pull(抓取)一份Docker image至本地端 - Docker run可以執行映像檔成為Dcoker Container(容器) - Docker Container之間透過Docker Network聯外以及容器間互相溝通 - 資料儲存於Docker Volume --- ## 安裝Docker - curl -fsSL https://get.docker.com -o get-docker.sh (下載docker安裝檔) - sudo sh get-docker.sh (執行docker安裝檔) - sudo usermod -aG docker $USER (把docker加入使用者群組) - newgrp docker - exit(先離開環境再進去,exit之後再ssh進伺服器) - docker version (檢查docker是否安裝成功) - docker run hello-world --- ![](https://i.imgur.com/rOvvHQP.png) --- ## Docker初體驗 - 最簡單的hello-world - docker run hello-world - 先去docker hub抓取一份hello-world的image到本地端 - 本地端有了image,可重複執行成hello-world容器 --- ![](https://i.imgur.com/5thu2Dd.png) --- ## Docker Image - docker image ls (顯示目前本機中有多少映像檔,常打成docker images) - docker image rm -f hello-world(移除hello-world映像檔) - docker image ls --- ![](https://i.imgur.com/6LWEnNq.png) --- ## Docker run - docker run <映像檔> <指令> - -d 背景執行 - -it 進入容器 - -p 通訊埠對應 - -v volume容器卷對應 - \-\-name 給定容器名稱 - \-\-rm 執行後刪除 --- ![](https://i.imgur.com/0N72fMZ.png) --- ## Docker run 常駐範例 - 前置作業 - 在虛擬機關機狀態下->網路(介面卡)->新增一通訊埠轉接->8080 to 80 - 重新啟動虛擬機 ![](https://i.imgur.com/H3kbgo4.png) --- ## Docker run 常駐範例 - docker run -d --name web -p 80:80 tutum/apache-php - tutum/apache-php為automated容器,執行後會存在 - -d當作背景程式執行 - \-\-name給予此容器web名稱 - -p 80 port跟容器的80 port相對應 --- ![](https://i.imgur.com/x7deTBv.png) --- - 使用本機的瀏覽器,輸入http://localhost:8080,出現下圖表示成功 ![](https://i.imgur.com/0EQ45Va.png =600x) --- - docker ps (查詢有哪些服務) - docker rm -f web (刪除web容器服務) - docker ps ![](https://i.imgur.com/oE3D5xy.png) --- ## Docker Volume - docker volume資料卷是用來儲存容器資料 - 可以把資料跟容器執行程式分開來,獨立管理資料 - 即使容器不在,只要資料卷存在,依舊可以回復容器狀態。 ![](https://i.imgur.com/5hwOhly.png) --- ## Docker Volume 範例 - mkdir web - cd web - wget https://raw.githubusercontent.com/shhuangmust/html/111-1/immust_7_footer.html ![](https://i.imgur.com/wTT4GFm.png =800x) --- - docker run -d --name web -p 80:80 -v /home/ansible/web:/var/www/html tutum/apache-php - (如有修正連結請按n) ![](https://i.imgur.com/u0e3uuA.png) --- - http://localhost:8080/immust_7_footer.html ![](https://i.imgur.com/q46k3dX.jpg) --- - 刪除容器 - docker rm -f web - 刪除web目錄及檔案 - sudo rm -rf web --- # Docker Network (Docker網路連結) --- - docker將容器連上網路的方法:每個容器的網卡是eth0,每一個新增容器會透過vethX介面,跟docker預設的聯外網卡docker0連線,再透過docker0跟真正的實體網卡eth0往外連。因此我們可以自己新增docker network取代docker0,來控制容器間的對外連線。 ![](https://i.imgur.com/I7luvrD.png) --- ## Docker預設網路介面 - ip addr (或者ip ad,可看到docker預設網路卡docker0) ![](https://i.imgur.com/ujnC5Ei.png) --- - docker run -d --name web tutum/apache-php (執行一個apache-php容器) - docker ps - docker exec -it web bash (進入web的bash介面) - ip addr (觀察目前web容器使用的network介面,有個eth0虛擬網卡) - exit --- ![](https://i.imgur.com/Efjvyw4.png) --- - ip addr (web容器使用的veth128e25c網路介面) - docker rm –f web - ip addr (刪除容器後,veth128e25c也消失了) ![](https://i.imgur.com/KEmK0Zm.png) --- ## 新增docker network來連接不同的容器 - docker network ls (查詢目前有哪些docker network介面) - docker network create mybridge(新增mybridge網路介面) - docker network ls (查詢是否建立成功) ![](https://i.imgur.com/i7euYxy.png) --- - ip addr (多了一個br-xxx的網路介面,就是mybridge) ![](https://i.imgur.com/Kb4tQ7q.png) --- ## 建立一個利用Mybridge串連的Mysql + phpmyadmin的應用 - mysql是網路常用的免費資料庫 - phpmyadmin是mysql常用的網路管理介面 --- - docker run -d --network mybridge --name db -p 3306:3306 -e MYSQL\_ROOT\_PASSWORD=abc1234 mysql (建立一個密碼為abc1234的mysql) - docker ps - docker run -d --network mybridge --name myadmin -p 80:80 phpmyadmin (建立一個phpmyadmin) ![](https://i.imgur.com/8QoyfR7.png) --- - http://localhost:8080 - id:root - pwd:abc1234 ![](https://i.imgur.com/KvVmvCu.png) --- ## 刪除所有執行中的Docker Container - docker rm -f $(docker ps -aq) --- ## Docker Compose - 使用docker run可以啟動單一的docker container,但是如果要啟動多個 docker container,需要輸入多次docker run,還要建立起之間的docker network連結 - docker compose主要的目的,就是在docker-compose.yml檔內,設定所有要一起啟動的docker container --- ## 下載Docker Compose - sudo apt install docker-compose-plugin - docker compose version --- ![](https://i.imgur.com/anG98zg.png) --- ## docker-compose.yml - docker-compose.yml是docker如何啟動多個服務的yaml檔案 ```yaml= version: '3' services: db: image: mysql ports: - 3306:3306 environment: MYSQL_ROOT_PASSWORD: abc1234 myadmin: image: phpmyadmin ports: - 80:80 ``` --- ## 下載docker-compose.yml - wget https://github.com/shhuangmust/bigdata/raw/main/docker-compose.yml ![](https://i.imgur.com/RIkjIhR.png) --- ## 啟動docker compose - docker compose up -d - docker compose ps (查看啟動的服務) ![](https://i.imgur.com/yf6uXDq.png) --- ![](https://i.imgur.com/H8a0gbX.png) --- ## 停止docker compose服務 - docker compose stop ![](https://i.imgur.com/TsKj3XK.png) --- ## 移除docker套件 - sudo apt-get remove --auto-remove docker - sudo apt-get purge docker-ce - sudo rm -rf /var/lib/docker
{"metaMigratedAt":"2023-06-17T14:41:35.474Z","metaMigratedFrom":"YAML","title":"Docker","breaks":true,"contributors":"[{\"id\":\"ef0225b9-6c2a-4012-82c9-fa1031d2c4db\",\"add\":6453,\"del\":668}]"}
    511 views