Docker (Ubuntu & Mac OS)

EREN
erens-tech-book
Published in
7 min readSep 28, 2017

--

Docker 簡單介紹

容器 vs.虛擬機器

傳統的虛擬機器(Virtual Machine)透過虛擬化技術 vSphere 等,以作業系統為底建立出獨立的執行環境。

以下兩張圖是傳統虛擬機器與 Docker 的比較,虛擬機器(VM)除了包含程式與函式庫之外,還要加上整個 Guest OS。

Virtual Machine Diagram

而 Docker 則使用 Container 技術,將應用程式所需的所有程式碼、函式庫及環境設定檔包裝起來後,建立以應用程式為中心的獨立的執行環境,相對傳統的虛擬機器也輕便(具可攜性且建置快速)許多。

Container Diagram

https://docs.docker.com/get-started/#containers-vs-virtual-machines

Docker 架構

Docker Architecture

Docker 的 Image 是一個可以獨立執行的輕量級套件,其包含所有執行程式所需要的函式庫、環境變數與設定檔等,而 Container 則是一個 Image 的執行實體,就是將 Image 載入至記憶體中執行之後的環境。

預設的情況下,Container 是一個與 host 機器環境分開的獨立執行環境,但其程式卻可以在原生 host 機器的核心中運行,因此 Docker 的執行效能會比傳統虛擬機器更好。

安裝 Docker CE

移除舊版 Docker

$ sudo apt-get remove docker docker-engine docker.io

設定資源庫

$ sudo apt-get update$ sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

驗證指紋是否正確 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88

$ sudo apt-key fingerprint 0EBFCD88

查看你的 Ubuntu 版本

$ lsb_release -a$ lsb_release -cs

按照版本設置穩定的資源庫

  • amd64
$ sudo add-apt-repository \
“deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable”
  • armhf
$ sudo add-apt-repository \
“deb [arch=armhf] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable”
  • s390x
$ sudo add-apt-repository \
“deb [arch=s390x] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable”

更新並安裝 Docker CE

$ sudo apt-get update$ sudo apt-get install docker-ce

安裝特定版本的 Docker CE

$ apt-cache madison docker-ce$ sudo apt-get install docker-ce=<VERSION>

確認 Docker 版本

$ docker version

確認可以執行

$ sudo docker run hello-world

使用非 root 用戶管理 Docker

創建群組並新增用戶至群組

$ sudo groupadd docker$ sudo usermod -aG docker $USER

確認可以不用使用 sudo 執行

$ docker run hello-world

設定開機啟動 Docker

RHEL, CentOS, Fedora, Ubuntu 16.04 及以上:

$ sudo systemctl enable docker
  • 禁用開機啟動
$ sudo systemctl disable docker

Ubuntu 14.10 以下會自動配置在開機時啟動 upstart :

  • 禁用開機啟動
$ echo manual | sudo tee /etc/init/docker.override

chkconfig

$ sudo chkconfig docker on

移除 Docker CE

$ sudo apt-get purge docker-ce

刪除所有 Images、Containers 和 Volumes

$ sudo rm -rf /var/lib/docker

Dockerfile

Docker 容器內的各種系統資源(例如儲存、網路等)都是抽象的,我們需要自行定義內部抽象資源與外部實體資源的對應關係,這些設定都寫在 Dockerfile 的設定檔中。

首先建立一個檔名為 Dockerfile 的文字檔:

# 使用官方的 Python 執行環境作為基本的 Docker 影像
FROM python:2.7-slim

# 設定工作目錄為 /app
WORKDIR /app

# 複製目前目錄下的內容,放進 Docker 容器中的 /app
ADD . /app

# 安裝 requirements.txt 中所列的必要套件
RUN pip install -r requirements.txt

# 讓 80 連接埠可以從 Docker 容器外部存取
EXPOSE 80

# 定義環境變數
ENV NAME World

# 當 Docker 容器啟動時,自動執行 app.py
CMD ["python", "app.py"]

requirements.txt

Flask
Redis

Docker 基本指令

啟動 Docker 虛擬容器環境

docker run

列出所有 Docker 容器

docker ps

停止 Docker 容器

docker stop DOCKER_ID

重新啟動 Docker 容器

docker restart DOCKER_ID

暫停 Docker 容器

docker pause DOCKER_ID

恢復暫停的 Docker 容器

docker unpause DOCKER_ID

參考資料

https://github.com/twtrubiks/docker-tutorial

https://blog.techbridge.cc/2018/03/17/docker-build-nginx-tutorial/

--

--

EREN
erens-tech-book

“I’m quite illiterate, but I read a lot. “ — J.D.Salinger, The Catcher in the Rye