今天這篇文章將介紹如何安裝 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 系統流程

  1. 由 Registry 或 command 抓取 Image 到本地端或雲端
  2. 啟動 Image 會產生 Container (實體化)

安裝 Docker

個人是使用 Ubuntu 安裝,如果是其他作業系統的話,可以參考網路上的文章

  1. 安裝 docker

    sudo apt-get install docker.io
  2. 檢查 docker 服務

    service docker status

    如果有正常啟動的話會在前面幾行看到: Active:active(running)

  3. 將使用者帳號加入 docker 群組

    sudo usermod -aG docker <username>

    會使用這行指令主要是因為權限的關係,如果沒有加這個指令,會導致沒有權限使用 Docker。 Ubuntu 預設使用者帳號為 ubuntu

  4. 登出後再重新登入

    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

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.

Nicolaus Copernicus

Author: Andy Chung
Article link: https://chiachin2686.github.io/2021/07/docker-installation-and-common-instructions/
License: CC BY-NC 4.0