Docker 安裝與常用指令
今天這篇文章將介紹如何安裝 Docker 以及使用 Docker
目錄
前言
最近剛好在使用雲端上的一些服務,其中有接觸到 Docker,為了之後能夠更加熟悉 Docker 操作方式,於是想把相關技術記錄下來。(事實上是我的記性不好XD)
關於 Docker
Docker 是一個開放原始碼專案,能讓我們快速地建立、測試和部署應用程式,並將應用程式自動化部署為可攜式且可自足的容器,在雲端或內部部署上執行,簡單來說就是一個「輕量化的虛擬機」。
容器 vs 虛擬機
虛擬機 ( Virtual Machine, VM )
虛擬機是實體電腦的模擬環境,可讓我們在單一實體電腦上建立多個虛擬機,每個虛擬機都有自己的作業系統和應用程式。虛擬機無法與實體電腦直接互動,而是需要藉助一個叫做 Hypervisor 的輕量型軟體層,在虛擬機和底層的實體硬體之間進行協調。Hypervisor 負責將實體運算資源(例如處理器、記憶體及儲存設備)配置給每個虛擬機,它讓虛擬機之間相互分開,這樣就不會互相干擾。因此 VM 除了佔用的空間很大( GB 以上 ),啟動速度也較緩慢。
容器 ( Container )
容器是應用程式的抽象,多個容器可以在同一台主機上運行,並與其他容器共享作業系統的 kernel。容器佔用的空間比 VM 少( 容器映像的大小通常才幾十 MB ),可以處理更多應用程式。
所以 VM 跟 Docker 的底層設計相當不同,以下為 Docker 官網提供的 VM 及 Docker 架構圖:
VM
Docker
為何要使用 Docker
Docker 的構想理念是 “Build, Ship and Run Any App, Anywhere” ,簡單來說就是簡化部署的難度,且只要第一次設定檔寫好,之後可以使用同樣的設定檔,而不需再多做其他繁瑣的設定
Docker 建立、部署、更新或刪除等非常快速及方便
開發人員可以使用映像檔 ( image ) ,快速建立一套開發環境,在開發完成後,寫好設定檔,就可以讓別人來快速部署測試
Docker 基本名詞
- 映像檔 ( Image ): 執行映像檔會產生容器,映像檔是唯讀的,可以把它想成是作業系統的 IMG、ISO 檔。一個 Image 可以產生或執行多個 Containers
- 容器 ( Container ): 參考上面的解釋,Container 就像是 Image 上的一層 Layer
- 倉庫 ( Registry ): 到https://hub.docker.com/search?q=&type=image抓取 Image
Docker 系統流程
- 由 Registry 或 command 抓取 Image 到本地端或雲端
- 啟動 Image 會產生 Container (實體化)
安裝 Docker
個人是使用 Ubuntu 安裝,如果是其他作業系統的話,可以參考網路上的文章
安裝 docker
sudo apt-get install docker.io
檢查 docker 服務
service docker status
如果有正常啟動的話會在前面幾行看到:
Active:active(running)
將使用者帳號加入 docker 群組
sudo usermod -aG docker <username>
會使用這行指令主要是因為權限的關係,如果沒有加這個指令,會導致沒有權限使用 Docker。 Ubuntu 預設使用者帳號為 ubuntu
登出後再重新登入
docker version
可以看到 Docker client 與 server 的訊息,表示安裝成功
Docker 常用指令
以下是我常用的 Docker 指令
Docker 抓取 Image
docker pull ubuntu:20.04
或
docker pull ubuntu:latest # 抓最新版
列出所有 Images
docker images
Docker 搜尋 Image
docker search <IMAGE_NAME>
ex : docker search debian
Docker 刪除 Image
docker rmi <IMAGE_ID>
# 強制刪除 Image
docker rmi -f <IMAGE_ID>
# 刪除所有 Images
docker rmi $(docker images -q)
Dockerfile 產生 Image
docker build -t <myimage>
Container 產生 Image
docker commit <CONTAINER_ID> <myimage>
啟動 Docker 容器
docker start <CONTAINER_ID>
- CONTAINER_ID Docker 容器的 ID
停止 Docker 容器
docker stop <CONTAINER_ID>
如果 Docker 容器當掉,可以改用
docker kill <CONTAINER_ID>
其他指令:
# 重新啟動 Docker 容器
docker restart <CONTAINER_ID>
# 暫停 Docker 容器
docker pause <CONTAINER_ID>
# 恢復 Docker 容器
docker unpause <CONTAINER_ID>
執行 Docker 容器
docker run nginx
##
docker run -it tensorflow/tensorflow bash
##
docker run -d debian:jessie
##
docker run --rm debian:jessie bash
- -it 自動執行 docker pull,啟動並開啟虛擬終端機
- -d 自動執行 docker pull + 啟動並進入背景執行
- –rm Docker 容器停止執行後,會自動移除
刪除 Docker 容器
docker rm <CONTAINER_ID>
# 強制刪除 Container
docker rm -f <CONTAINER_ID>
# 砍掉所有停止的 Containers
docker rm $(docker ps --filter status=exited -q)
# 移除所有 Containers
docker rm $(docker ps -a -q)
複製檔案
將檔案或整個資料夾從實體機器(host)中複製到該容器內,Docker 容器內的預設路徑是根目錄(/)
docker cp <HOST_FILE_PATH> <CONTAINER_ID>:<DOCKER_FILE_PATH>
ex : docker cp /path/to/file1 6d4821c260f3:/path/to/file2
ex : docker cp /path/to/folder1 6d4821c260f3:/another/path/
若要把 Docker 容器內的檔案複製出來,也是使用相同作法
docker cp <CONTAINER_ID>:<DOCKER_FILE_PATH> <HOST_FILE_PATH>
掛載目錄
如果想要將實體機器的目錄直接掛載到 Docker 容器內,可以使用 -v
docker run -it -v /home/test/datas:/datas tensorflow/tensorflow bash
將實體機器的 /home/test/datas 掛載到 Docker 容器內的 /datas,讓實體機器與 Docker 容器可以共享同一個目錄
當我們在 Docker 容器中將資料放進這個目錄時,於實體機器中可以同時看見
網路連接埠
如果要讓 Docker 容器內部的服務可以接收來自外部的網路連線,可以使用 -p
將 Docker 容器內部的連接埠對應到實體機器的連接埠
docker run -it -p 80:8080 tensorflow/tensorflow
或
docker run -p 127.0.0.1:80:8080 ubuntu bash
列出所有 Docker 容器
docker ps (-a)
- -a 執行或停止的 Container 都列出來
查看 Docker 容器的 CPU、記憶體與網路用量
docker stats (-a)
查看 Docker 容器內部的行程
docker top <CONTAINER_ID>
Docker 版本資訊
docker version
或
docker info
Docker 列出 log
docker logs <CONTAINER_ID>
官方文件: Docker commands
結語
其實 Docker 還有非常多的指令可以操作,我這邊只是稍微介紹一些常用的指令,想知道更多指令可以參考官方文件,所有指令都能查到,或是可以使用docker help
來查詢
Reference
- Get Started with Docker
- Docker Documentation
- Docker - 介紹及安裝教學
- Docker 常用指令與容器操作教學
- Docker 初學筆記 - 基本指令操作教學
To know that we know what we know, and to know that we do not know what we do not know, that is true knowledge.
Author: Andy Chung
Article link: https://chiachin2686.github.io/2021/07/docker-installation-and-common-instructions/
License: CC BY-NC 4.0