前言

什麼是 Docker?

Docker 可以幫助你快速部屬應用程式,不需要設定系統環境,減少開發人員與使用者部屬時間。

下圖是 Docker 在作業系統中的架構,圖來自 Docker 官網

Docker containerized appliction blue border 2

從上圖得知,作業系統上安裝 Docker 平台,透過它可以執行數個應用程式,且應用程式之間是獨立運行的。

Docker 基礎名詞解釋

Image

Image(映像檔),開發人員撰寫程式並把需要依賴的套件環境整個打包在一起,要部屬應用程式要有 image 才能進行。

Container

Container(容器),透過 Image 部屬出來的應用,一個 Image 可以部屬數個 Container,且這些 Container 之間互不影響,也不會影響 image 本體。

Docker Compose

Docker Compose 是將很多 Docker 服務和啟動參數打包在一個文件 docker compose.yml 中,可以在其他環境下使用。我自己是用 Docker Compose 來使用 Docker 的服務。

有些應用它會需要依賴許多套件,例如資料庫 MySQL、PostgreSQL。

一般使用 Docker 服務流程:

Pull Docker Image(下載 Image)–> 透過指令 docker rundocker compose up -d –> Docker Container 部屬成功

安裝 Docker 和 Docker Compose

安裝 Docker

使用指令 curl 從官網下載。

curl -fsSL https://get.docker.com/ | sh

提高使用者執行權限。

sudo gpasswd -a username docker #username 自行換成使用者帳號
newgrp docker

啟動 Docker 服務。

sudo service docker start

安裝 Docker Compose

使用指令 curlGithub Release 下載。

sudo curl -SL https://github.com/docker/compose/releases/download/v2.29.2/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose

確認 Docker Compose 是否安裝成功。

docker compose version

部屬 Docker 服務

我們以 Hello World 來示範:

Docker Run 方式部屬

首先下載 Hello World Image:

$ docker pull hello-world
Using default tag: latest
latest: Pulling from library/hello-world
c1ec31eb5944: Pull complete
Digest: sha256:91fb4b041da273d5a3273b6d587d62d518300a6ad268b28628f74997b93171b2
Status: Downloaded newer image for hello-world:latest
docker.io/library/hello-world:latest

接著使用 docker run hello-world 跑 Hello World。

$ docker run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

若有輸出內容代表 Hello World 已成功啟動。

Docker Compose 方式部屬

若使用 Docker Compose 建議先建立資料夾存放 docker-compose.yml 文件,因為有些專案會需要實際位置存放資料。

mkdir hello-world
cd hello-world
nano docker-compose.yml 

將下列參數貼上至 docker-compose.yml,「CTRL + X」儲存。

services:
  hello_world:
    image: hello-world

參數說明

services:使用的程式套件,依照想要的功能可以掛上其他套件,例如資料庫。

services:
server:
 image: server
database:
 image: database
test:
 image: test

輸入 docker compose up 啟動。

$ docker compose up
[+] Running 2/1
 ✔ Network hello-world_default          C...                               0.1s
 ✔ Container hello-world-hello_world-1  Created                            0.0s
Attaching to hello_world-1
hello_world-1  |
hello_world-1  | Hello from Docker!
hello_world-1  | This message shows that your installation appears to be working correctly.
hello_world-1  |
hello_world-1  | To generate this message, Docker took the following steps:
hello_world-1  |  1. The Docker client contacted the Docker daemon.
hello_world-1  |  2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
hello_world-1  |     (amd64)
hello_world-1  |  3. The Docker daemon created a new container from that image which runs the
hello_world-1  |     executable that produces the output you are currently reading.
hello_world-1  |  4. The Docker daemon streamed that output to the Docker client, which sent it
hello_world-1  |     to your terminal.
hello_world-1  |
hello_world-1  | To try something more ambitious, you can run an Ubuntu container with:
hello_world-1  |  $ docker run -it ubuntu bash
hello_world-1  |
hello_world-1  | Share images, automate workflows, and more with a free Docker ID:
hello_world-1  |  https://hub.docker.com/
hello_world-1  |
hello_world-1  | For more examples and ideas, visit:
hello_world-1  |  https://docs.docker.com/get-started/
hello_world-1  |
hello_world-1 exited with code 0

若有輸出內容代表 Hello World 已成功啟動。

以上是基本使用 Docker 的流程,關於 Docker compose 需要補充的地方,未來會更新一篇文章細部講解。

附錄

Docker 常用指令

docker compose up -d #背景啟動容器
docker compose down #停止容器
docker compose pull #更新 image(先 docker compose down 容器)
docker images #查看已下載的映像檔
docker image prune -a #刪除無用的映像檔
docker system prune -a #刪除無用的映像檔與已經停止的容器

參考連結

Docker 官網

Docker Compose

Hello World Image