# Docker 第一週 本週課程要點 - 什麼是 Docker - 試玩 Docker Container - Docker 常見指令 - 建立屬於自己的 image ## 什麼是 Docker Docker 與 VM 的差異(來源:https://www.linkedin.com/pulse/docker-vs-virtual-machines-ashish-yadav/)  關於 Docker 服務本身的運作(https://www.linkedin.com/pulse/docker-engine-architecture-sekhar-perathur/)  請在本地端主機輸入:docker version 試試看 ## 試玩 Docker Container ### Nginx Nginx (發音為 "engine-x") 是一個高性能的 HTTP 和反向代理伺服器,也能作為一個 IMAP/POP3 代理伺服器使用。 Alpine 1. **檔案大小**: - **Alpine 版本**:非常小巧,通常只有幾 MB 大小,這使得下載速度更快,佔用的存儲空間更少。例如,一個標準的 Alpine Linux 基礎映像可能小於 5 MB。 - **完整版本**:其他基於 Debian 或 Ubuntu 的映像可能大得多,通常從幾十 MB 到幾百 MB 不等。 2. **安全性和簡潔性**: - **Alpine 版本**:由於 Alpine 使用 musl libc(一個輕量級的 C 標準庫)和 busybox,這有助於保持映像的簡潔和安全,因為它減少了潛在的安全漏洞。 - **完整版本**:可能包括更多的標準 Linux 功能和庫,這雖然提供了更廣泛的兼容性,但也可能增加了安全風險。 操作流程: - docker image pull nginx → 下載 nginx 的 image - docker image pull nginx:alpine → 下載 nginx alpine 的版本 - docker image ls → 查看所有 images - docker container run -p 80:80 nginx:alpine → 運行 nginx:alpine 並在 80 port 上 其他指令: - 在原本的畫面中,按下 ctrl + c 會離開、關閉容器 - docker container ls 可以看到所有運行中的容器 - docker container ls -a 可以看到該容器是關閉的 - docker container inspect CONTAINER 可以檢視容器細節 關於連接容器: - docker container attach CONTAINER → 即可回到該容器,ctrl + c 關閉該容器 - docker system prune -f → 關閉所有沒在用的東西 - docker image rm CONTAINER → 移除特定容器 與容器產生交互: docker container exec -it CONTAINER sh - 開啟一個新的交互式會話或進程 - **`i`**(或 **`-interactive`**):保持容器的標準輸入開放。 - **`t`**(或 **`-tty`**):分配一個虛擬終端(pseudo-TTY)。 ### 容器的常見狀態 1. Created - 指令:`docker container create [OPTIONS] IMAGE [COMMAND] [ARG...]` - 用途:創建一個新的容器但不啟動它。 2. **Running** - 指令:`docker container start CONTAINER` → 啟動一個已經創建的容器。 - 指令:docker run IMAGE → 創建一個容器,並且運行它 3. Paused - 指令:`docker container pause CONTAINER` - 用途:暫停正在運行的容器中的所有進程。 - 反操作:`docker container unpause CONTAINER` 用於恢復被暫停的容器。 4. **Stopped** - 指令:`docker container stop CONTAINER` - 用途:安全停止一個正在運行的容器。 5. **Exited** - 狀態說明:容器在停止或出錯錯誤後自動進入 Exited 狀態,通常不需要特定指令來達到這個狀態。 6. Restarting - 指令:`docker container restart CONTAINER` - 用途:停止並重新啟動容器。 7. Removing - 指令:`docker container rm CONTAINER` - 用途:刪除已停止的容器。 ## Docker Image ### 先說說 Node.js 專案 建立一個 Express 專案,複習一下 Node.js 專案運行會做哪些事 1. 安裝環境、運行 1. npm i 2. npm start 2. 加入環境變數 1. 在專案中加入 .env 的環境變數 2. npm i dotenv ### 建立容器時,做了什麼事? 容器建立的 Image 來源形式([來源](https://medium.com/vantageai/taking-python-beyond-your-local-machine-with-docker-89793982865f)): - Docker Hub - dockerfile → image - tar  ### Dockerfile 建立方式 1. 建立 dockerfile 2. 撰寫 dockerfile 範例:https://docs.docker.com/get-started/02_our_app/ 重要語法說明: - **FROM**(來自) - **`FROM`** 指令用於指定基礎映像。所有 Dockerfile 的建立都必須從一個基礎映像開始,或者從另一個使用 **`FROM`** 指令的映像開始。這決定了應用的運行環境。 - 要點:建議選擇 alpine 的 image - **WORKDIR**(工作目錄) - **`WORKDIR`** 指令用於設定容器內的當前工作目錄。之後的 **`RUN`**、**`CMD`**、**`ENTRYPOINT`**、**`COPY`** 和 **`ADD`** 指令都會在這個目錄下執行。 - 常見的專案目錄為 **`/app`** 或 **`/usr/src/app`** - **COPY**(複製) - **`COPY`** 指令將從 Docker 主機的指定路徑複製文件或目錄到容器內的指定路徑。它僅複製新文件,不會執行任何檔案。 - **ADD**(添加) - **`ADD`** 指令與 **`COPY`** 類似,也是用來從 Docker 主機複製文件到容器。不同之處在於 **`ADD`** 可以**處理 URL 和自動解壓縮壓縮包**到目標目錄。 - **RUN**(執行) - **`RUN`** 指令用於在建立映像時執行命令,這些命令在新層上對映像進行修改,然後將結果保存下來。通常用於安裝軟體包、建立配置文件等。 - **ENV**(環境變數) - **`ENV`** 指令用於設定環境變數。這些變數可在 Dockerfile 中的任何位置使用,並且在容器運行時可用。 - **EXPOSE**(暴露端口) - **`EXPOSE`** 指令用於指定容器在運行時應該監聽的端口。這對於與容器的網絡溝通非常重要。 - 指令告訴 Docker 這個容器在運行時會使用哪些端口。**它本身不會發佈端口**到宿主機,只是一種文檔化的聲明。 - **CMD**(命令) - **`CMD`** 指令提供了容器啟動時應該運行的命令。Dockerfile 中可以有多個 **`CMD`** 指令,但**只有最後一個會生效**。`CMD` 可以被 `docker run` 命令後面的參數覆蓋。 建構指令 - docker image build -t IMAGE-NAME . - docker image build -t ACCOUNT/IMAGE-NAME . 請用以下指令看看這一個 Docker Container - container inspect - container logs - container exec -it CONTAINER sh ## 補充:Docker Hub(將延續第二週內容) https://hub.docker.com/ 登入 Docker Hub 可以上傳自己的 image ### 上傳方式 - 建立 image 名稱為 {account}/{image name} ```docker docker build -t casper723/2024-node-course-express-sample . ``` - 使用 push 指令 ```docker docker image push casper723/2024-node-course-express-sample ``` ### 下載 image - 可以直接使用 run,或者使用 pull ```docker docker image pull casper723/2024-node-course-express-sample ```
×
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