跳到主要內容

發表文章

目前顯示的是有「docker」標籤的文章

在 Ubuntu 20.04 上安裝 Podman

在 Ubuntu 20.04 上安裝 Podman Podman 是一款適用於基於 Linux 操作系統的容器引擎,可在無需 daemon 的情況下管理容器。它是一個開源工具,設計上可作為 Docker 後台的替代品,並且無需以 root 權限運行。 以下是如何在 Ubuntu 20.04 上安裝 Podman 的步驟: 1. 更新系統: sudo apt update 2. 安裝 Podman 所需的套件: sudo apt install software-properties-common uidmap 3. 添加 libcontainers 軟體庫: sudo sh -c "echo 'deb http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_20.04/ /' > /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list" 4. 更新系統: sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 4D64390375060A sudo apt-get update 5. 安裝 Podman: sudo apt-get install podman 6. 測試 Podman 是否安裝成功: podman version

深入理解 Docker 網路設置:Bridge 模式原理與實現

深入理解 Docker 網路設置:Bridge 模式原理與實現 在使用 Docker 建立容器並指定網路為 Bridge 模式時,Docker 使用了多項技術來實現容器與Host的網路通信。以下將深入探討這些技術的原理以及如何實現,幫助大家更好地理解 Docker 網路設置。 使用 Veth Pair 實現容器與Host的通信 Docker 在建立容器時使用了 veth pair 技術。這是一種在容器的 Network Namespace 和Host之間建立虛擬網路介面的方法。其中一端連接到容器的 Network Namespace 中,另一端連接到Host的 docker0 介面(虛擬交換機),從而實現容器與 Host 的網路通信。 bash # Docker 在安裝過程中會建立一個 docker0 的網路介面 ip link add docker0 type bridge # 設定作為 Network Namespace 與Host通訊的 Gateway IP ip addr add 172.17.0.1/16 dev docker0 做完以上的動作後,會生成 172.17.0.0/16 的網路環境,接下來 Docker 會執行以下的動作,將容器的網路與 Host 間的網路通道給建立起來: 1. 創建 Veth Pair: bash # Docker 在安裝過程中會建立一個 docker0 的網路介面 ip link add eth0@if? type veth peer name veth????@if? 其中,eth0@if? 是容器內的網路介面名稱,veth????@if? 則是連接到 Host 的虛擬交換機(docker0)的介面名稱。(? 是一串隨機字元) 2. 將網路介面(eth0@if?)加入容器的 Network Namespace 中: bash ip link set eth0@if? netns ${CONTAINER-NAMESPACE} 3. 將另一端的介面(veth????@if?) 加入到 Host 的虛擬交換機(docker0)中: bash ip link set veth????@if? master docker0 4. 在容器的 Network Namespace 中,為 eth0@if? 介面設置 ...

[解決方法] mac 作業系統上無法使用 docker

  錯誤訊息 Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? 原因 因為 docker 的設計是走 client-server 的架構,  如果少裝了 server 的部分就會出現以上的錯誤訊息 解決方法 因為 docker daemon 需要使用 linux kernel 上的某些功能, 所以若想要在 mac 的 OS X 上使用 docker 必須額外起一台 linux VM 給 docker daemon 用  Step 1. 安裝 virtual box $ brew install virtualbox --cask   Step 2. 安裝 docker machine $ brew install docker-machine --cask   Step 3. 設定 使用 docker-machine 建立 VM 跑容器 $docker-machine create --driver virtualbox default $docker-machine restart   輸出環境變數 $docker-machine env default 如果執行以上的指令出現錯誤訊息 Error checking TLS connection: ...  可以執行以下指令重新產生憑證 $docker-machine regenerate-certs 最後套用環境變數, 讓 docker 知道要怎麼去跟這台 VM 溝通  $eval $(docker-machine env default)   測試 若做完以上的步驟沒噴錯誤訊息的話, 可以跑個 hello-world 看看 docker daemon 有沒有起來 $docker run hello-world Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world 0e03bdcc26d7: Pull complete Digest: sha...

如何使用 Cloud Build 來達到自動化測試與佈署| Create a CI/CD Pipeline On Cloud Build

前言 GCP 的 Cloud Build 是個非常好用的 DevOps 工具, 對於使用 Cloud Source Repository 的開發者來說,  不需要繁複的設定,  就能快速的建立 CI/CD Pipeline, 使推送到 Cloud Source Repository 的交付能自動觸發 Cloud Build 的事件執行測試與部署  除此之外無伺服器的平台, 不需要額外管理 CI/CD 的伺服器, 也不避擔心 Scale 的問題,  這也是許多開發者選擇 Cloud Build 的原因之一 以下就簡單的帶各位了解如何在 Cloud Build 上建立 Pipeline 跑 CI/CD 的流程 首先, 建立 Pipeline 腳本 由於 Cloud Build 是基於容器的服務, 腳本上的指令都必須跑在容器的環境內, 所以在建立腳本的時候, 需要特別地指定執行環境的容器映像( 即 Builder 的映像), 如下 - name: 'gcr.io/cloud-builders/docker'   args: ['build', '-t', 'gcr.io/myproject/myapp', '.'] 目前 GCP 上已經內建了幾個常用的容器映像讓開發者使用, 所以想要實作 CI/CD 的 Pipeline 並不一定需要自己建立 Builder 的映像檔 預設所有要被執行的腳本都需要被定義在 cloudbuild.yaml 的檔案裡 內容如下 steps: - name: 'gcr.io/cloud-builders/docker' args: ['build', '-t', 'gcr.io/myproject/myapp', '.'] - name: 'gcr.io/cloud-builders/docker'   args: ['push', 'gcr.io/myproject/myapp'] - name: 'gcr.io/cloud-buil...

淺談 Docker Network, None, Bridge, Host

前言 Docker 目前提供以下網路模式, None, Bridge, Host None 除了  loopback interface (127.0.0.1) 之外無其他網路介面, 所以無法存取外部網路 andy_lai@cloudshell:~$ docker run -it --network=none ubuntu:14.04 /bin/bash Digest: sha256:ffc76f71dd8be8c9e222d420dc96901a07b61616689a44c7b3ef6a10b7213de4 root@71aa5f112c7e:/# ifconfig lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) Host 使用和宿主機 (Host) 一樣的網路設定, 效能會比較好, 但仍不建議使用, 需要考慮網路安全性的問題, 除此之外也會使失去容器隔離的好處  Bridge Docker 預設會在宿主機 (Host) 上建立一個 docker0 的網路介面, 容器可以透過這網路介面跟外界溝通, 也可以透過這介面作容器間的溝通, 事實上 docker0 扮演著一個虛擬的網路橋接器,  當以 Bridge 的網路模式建立新的容器的時候 andy_lai@cloudshell:~$ docker run -it -p 8080:8080 my-docker docker0 會被接上虛擬網卡 veth3cc413e and...

[簡易教學] 五分鐘內學會使用Gitlab Pipeline作CI

前言 現在的Gitlab加入越來越多功能, 開發者除了可以用Gitlab作原始碼的遠端儲存庫之外, 也可以用它來作Continuously Integration(簡稱CI) 以下內容示範如何使用Gitlab Pipeline作CI 1. 開案 ( Create a Project on Gitlab ) 開案成功之後會得到儲存庫的位址, 以及設定git環境的相關指令 2. 設定工作目錄 使用以上的指令來設定git遠端儲存庫的位址 3. (Optional) 加入一些檔案 這裡以Node.js程式為例, 建立一個index.js檔案, 內容就讓它印Hello world就好 echo "console.log('Hello world')" > index.js 4. 加入腳本.gitlab-ci.yaml 我們必須加入腳本告訴gitlab去執行什麼工作 image: node:8.9-alpine stages: - buildMyApp buildApp: stage: buildMyApp script: - echo "start my job" - node index.js image : 由於CI是跑在Container內執行的, 若對runtime的環境有特別要求的話, 可以指定相應的docker image來起Container stages : 由於CI是分階段循序進行的, 我們必須把CI中的每個階段定義在這邊 buildApp : 定義任務的內容, 這邊要指定任務屬於哪一個階段 我們可以在script底下定義buildApp這個任務應該要執行什麼動作 (預期一開始先印出start my job, 然後執行Node.js 程式去印Hello world) 5. 上傳 $git add -A $git commit -m "add some file" $git push origin master 6. 最後來看結果 程式碼Push上去之後就可以進到底下頁...

如何在Container裡使用GPU

How to use GPU in docker container 前言 基本上原生的docker 容器是無法使用GPU資源 解決方法 必須使用NVIDIA的 Docker才可以讓容器吃到GPU的資源 以下是在Ubuntu上的安裝步驟 Step 1. (Optional) 安裝驅動 如果GPU的驅動已經裝好了化可以先略過這一步 sudo ubuntu-drivers autoinstall 安裝完之後可以用以下指令確認有沒有裝成功 nvidia-smi Step 2.  安裝 CUDA CUDA是個運算架構能夠輕易地時線平行運算 wget https://gist.githubusercontent.com/acerkr71a/29ecd032eeb178888fec0bb7660cc3bf/raw/03df656e945d7c56ee2d454e0ea83796e8eacfeb/install-cuda.sh && chmod +x installer.sh && ./installer.sh Step 3. 安裝NVIDIA 的 Docker wget https://gist.githubusercontent.com/acerkr71a/7c19e940f4029d86476309d63950d750/raw/a7f368c800b4ef2e23559ef5f13f97a540dc4499/install-nvidia-docker.sh && chmod +x docker-installer.sh && ./docker-installer.sh