--- lang: zh-tw --- # Docker 簡介與樹莓派應用實例 [TOC] --- :::info 此文主要簡述並介紹 Docker 的常見使用方法,若有需要特定功能或此文章模糊的地方,可以參考[另一篇文章](https://github.com/twtrubiks/docker-tutorial) ::: 此文著重在 CLI 交互上,請使用者先行安裝好 Docker --- ## 簡介 Docker 存在的目的之一是為了取代虛擬機器,他具有以下優點與原因 - 啟動速度快 - 容量占用小 (對於多開而言) - 整體利用性高 - 使用 VM 時,通常會需要分配指定量 CPU 與 RAM 資源,因為多個作業系統需要同時並行。但 Docker 僅只有一個 Image 在後端執行,Container 將共享所所分配的資源 由 Docker 衍伸的專有名詞有以下,其定義與相依如附圖 ### Docker Hub (倉庫) - 官方 Image 儲存庫 - 使用者可以自行上傳至註冊的帳號 ### Image (映像檔) - 唯讀 (R/O) - 類似 Windows 的 ISO 安裝檔案 - 檔案大 - 包含環境、初始化設定 (設定越多則越多個層級(Layers)) - 需包含 Container 啟動的進入點 ### Container (容器) - 可讀寫 (R/W) - 使用者互動端 - 基於 Image 建立的最外層級(Layer) - 資料僅存在 Container 中 (若需要保存需要設定 Volume) -> 附圖為 Image 與 Container 的關係圖。由多層 Image Layers 與一層 Container Layer 組成。  ### Volume (卷宗) - 管理檔案的東東 - 可與主機交互 (Container <=> Host) --- ## 常用命令 https://www.runoob.com/docker/docker-command-manual.html --- ## 應用實例: 自己做個樹莓派吧 ### 建立一個 Image :::info 簡述: 1. 新增一個空目錄,建立一個新檔案名為 `Dockerfile` 用來存放 Image 設定資料 2. 選定一個系統基底(Base Image) 3. 在上方疊加更多 Layer 變成自己喜歡的樣子 4. Build 成 Image ::: :::info 大致步驟如下 1. 根據 [Wiki](https://en.wikipedia.org/wiki/Raspberry_Pi_OS),樹莓派作業系統是基於 debian 的,我們拿它作為 Base Image 2. debian 沒有的內建庫需要手動安裝,例如 `openssh-server`, `g++` 等...。要先 `update` 才可以 `install`。安裝完後要把 `update` 紀錄刪除,不然 Image 會變胖 3. 新增使用者 `pi` 並更改密碼。設定使用者到 sudo 群組下 4. 設定 ssh 訪問 5. 請 GPT 幫忙修改 PS1、alias 使終端有漂亮的顏色 6. 複製預設目錄到的使用者目錄下,例如 Desktop, Documents, Downloads...。並變更所有權 7. 設定 Container 進入點為等待 sshd 連線。若未設定,容器啟動後不知道要做什麼則會在 Build 報錯 8. 標示曝露對外端口 (默認只對其他容器曝露) ::: 1. 根據上文所編之 Dockerfile 內容為以下 ::::::spoiler Dockerfile ```dockerfile # 以 debian image 為基底 FROM debian:latest # 更新資料包 -> 安裝庫 -> 刪除資料包 -> 新增使用者 -> 更改使用者密碼 -> 設定使用者群組 -> # 設定 ssh 訪問 -> 設定彩色終端 RUN apt-get update && apt-get install -y \ openssh-server g++ bash-completion telnet nmap iputils-ping net-tools \ man-db zip unzip tree iproute2 rsync htop lsof inetutils-tools sudo \ file nano git vim wget curl python3 python3-pip && \ rm -rf /var/lib/apt/lists/* && \ useradd -m -s /bin/bash pi && \ echo "pi:raspberry" | chpasswd && \ adduser pi sudo && \ mkdir /var/run/sshd && \ echo 'PermitRootLogin no' >> /etc/ssh/sshd_config && \ echo 'PasswordAuthentication yes' >> /etc/ssh/sshd_config && \ ssh-keygen -A && \ echo 'PS1="\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ "' >> /home/pi/.bashrc && \ echo 'alias ls="ls --color=auto"' >> /home/pi/.bashrc && \ echo 'alias grep="grep --color=auto"' >> /home/pi/.bashrc && \ echo 'if [ -f /etc/bash_completion ]; then . /etc/bash_completion; fi' >> /home/pi/.bashrc && \ echo 'if [ -f /usr/share/bash-completion/bash_completion ]; then . /usr/share/bash-completion/bash_completion; fi' >> /home/pi/.bashrc && \ echo 'force_color_prompt=yes' >> /home/pi/.bashrc && \ echo 'export LANG=C.UTF-8' >> /home/pi/.bashrc && \ echo 'if [ -f "$HOME/.bashrc" ]; then . "$HOME/.bashrc"; fi' >> /home/pi/.profile # 複製預設目錄並更改所有者 COPY --chown=pi:pi ./files/ /home/pi/ # 設定容器進入點 CMD ["/usr/sbin/sshd", "-D"] # 設定對外曝露端口 (需在 run 時指定映射本機端口位置,否則默認僅曝露給其他 Container) EXPOSE 22 EXPOSE 80 ``` :::warning 註: 1. 可減少 Docker 命令數量,以減少 Layer 層數影響檔案大小 2. 若有需要使用 Image 內相對路徑,需透過 Docker 命令 WORKDIR 設定工作目錄。例如: `WORKDIR /home/pi` 3. 關於對外曝露端口會在下個步驟詳細說明 ::: :::::: 2. 在 ./files/ 底下建立預設的檔案目錄或檔案,例如 Desktop, Documents, Downloads...  3. Build 成 Image (可使用參數 -f 指定 Dockerfile 位置) `$ docker build -t pi .`  ``` 參數說明 -t {TEXT}: Image 名稱 ``` 4. 可以打包成檔案便於傳輸 `$ docker save -o pi.tar pi` [檔案下載 839.4MB](https://drive.google.com/uc?export=download&id=1QLeI2vEnAJRE1FibTSRl5PoGClelcraR)  5. 導入 Image 檔案 `$ docker load < pi.tar ` 或 `$ docker load -i pi.tar`  ### 透過 Image 建立並執行 Container 1. 自動建立並執行 Container `$ docker run -dit --name n1 -p 2222:22 -p 8080:80 -h raspberrypi pi`  ``` 參數說明 -d : (detach) 在後台運行 -i : (interactive) 互動模式,通常與 -t 成對出現 -t : (tty) 使用 tty 偽輸入終端,通常與 -i 成對出現 --name {TEXT} : 為容器命名。若未定義,則會隨機以英文字組合命名 -p {HOST}:{HOST_PORT}:{CONTAINER_PORT} : (port) 連結特定主機端口與容器端口,可在指令中重複使用 -h {TEXT} : (HOST) 自定義主機名稱 ``` :::warning 註: 1. 若要使用 `-d` 參數,後面建議緊接 `-it` 使用,避免遇到其他[特殊問題](https://stackoverflow.com/questions/41916435/practically-what-is-the-difference-between-docker-run-dit-itd-vs-docker-run) ::: 2. 檢查 Container 狀態 `$ docker ps -a`  ``` 參數說明 -a : (all) 包含已停止的 Container ``` ### 嘗試連線到終端 1. 透過 docker 連線進容器終端 `$ docker exec -it n1 /bin/bash`  2. 透過 ssh 連線進容器終端 `$ ssh pi@localhost -p 2222`  ### 其他實用控制指令 1. 關閉(結束) Container `$ docker stop n1`  2. 開啟(執行)已存在 Container `$ docker start n1`  3. 刪除 Container (可加上 -f 強制刪除執行中的容器) `$ docker rm n1`  4. 刪除 Image (可加上 -f 強制刪除被被容器使用的映像檔,包含已關閉的容器) `$ docker rmi pi` 5. 強制刪除所有 Container `$ docker rm -f $(docker ps -a -q)` 5. 強制刪除所有 Image `$ docker rmi -f $(docker images -q)` 大致上常用的功能與指令都說明了,更細部的用法和很多有趣的參數再自己摸摸看吧~ --- > [name=XinShou] --- ###### tags: `Tutor` `Docker` <style> .markdown-body p { font-size: 18px; } </style>
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up