Build a Service with Docker

Ubuntu: 18.04

Docker: 18.09

Getting Started with Docker 瞭解了 Docker 的運作之後,接著就可以根據自己的需求透過 Docker 建置自己的服務了。

Download Ubuntu Image

在開始操作之前,可以先到 Docker Hub 抓取現成的 Image 下來使用。

下載 Image 可以使用 docker pull 指令。

; docker pull [OPTIONS] NAME[:TAG|@DIGEST]
; 下載 Ubuntu 19.04 的 image
docker pull ubuntu:19.04

; 完成以後可以查看 images 清單
docker images

; 不需要的 image 也可以透過 docker rmi 指令刪除
docker rmi ubuntu:latest

Build Container

Image 準備好之後,就可以用 Image 當 base 來建立 Container

建立 Container 有兩種指令,一種是 docker create,另一種則是 docker run

兩者的差別是 docker create 在建立 Container 後但 不會啟動,必須再手動啟動,比較會常用來 build 一些服務類型的 Container;而 docker run 則是建立 Container 後並 啟動,較常用來執行一些一次性的操作,例如透過 docker 運算資料等等,算完就可以關閉。

docker create 範例

; docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
; 建立 Container(建立但未啟動)
docker create -it --name MyService ubuntu:19.04

加入 -it 的用意是讓 Container 支援從外部傳入指令。

Option Description
-i 讓 Container 的 STDIN 保持打開
-t 讓 Docker 分配一個虛擬終端(pseudo-tty)並綁定到 Container 的 STDIN 上

建立完成以後,就可以操作 Container

Container 基本操作

; 查看所有 Container 清單(包含未啟動)
docker ps -a

; 啟動 Container
docker start MyService

; 查看運作中的 Container 清單
docker ps

; 進入 Container 中(docker attach)
; 可以使用 Ctrl + P and Q 離開 Container(Container 持續在背景執行)
docker attach MyService

; 進入 Container 中(docker exec)
; 可以直接使用 exit 指令離開 Container(Container 持續在背景執行)
docker exec -it MyService bash

; 刪除 Container
; docker rm [OPTIONS] CONTAINER [CONTAINER...]
docker rm MyService

docker run 範例

; docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
; 建立 Container 並啟動,在結束指令後會關閉
docker run --rm ubuntu:19.04 /bin/echo 'Hello World'

; 同時建立啟動並進入 Container
; 可以使用 Ctrl + P and Q 離開 Container(Container 持續在背景執行)
docker run -it --name MyService ubuntu:19.04 /bin/bash

; 使用 -d(Detached) 讓 docker 在背景執行
docker run -d --name echo_hello_world ubuntu:19.04 /bin/bash -c "while true; do echo hello world; sleep 1; done"

docker run 參數

Option Description
--rm 當 Container 結束時,刪除 Container
-i 讓 Container 的 STDIN 保持打開
-t 讓 Docker 分配一個虛擬終端(pseudo-tty)並綁定到 Container 的 STDIN 上

Container Logs

Container 在背景執行時,可以透過 docker logs 查看 Container 輸出的訊息。

查看 Docker 內輸出的資訊

; docker logs [OPTIONS] CONTAINER
docker logs -ft echo_hello_world
參數資訊:
Option
Description
-f 持續輸出 output 訊息
-t 顯示 timestamps

Build a Service

這裡就用 Docker 建立一個 Apache httd Service 來當範例。

; 下載 httpd image
docker pull httpd:2.4.41

; 執行 httpd image
; 將本機的 8080 port 綁定到 Container 的 80 port
docker run -d --name apache -p 8080:80 httpd:2.4.41

Notice: Docker 網路設定的部份可以參考 Container networking

成功以後,只要是連線到 URL:8080 的話,Request 就會進到 Container 中。

Create new Image

如果你在你的 Container 中又加入一些東西,可以透過 docker commit 將修改後的 Container 再 create 出一個新的 Image

建立一個 Ubuntu Container,並進入 Container

docker create -it --name MyService ubuntu:19.04
docker start MyService
docker exec -it MyService bash

安裝 vim

apt install vim
exit

建立新的 Image

docker commit -m "install vim" -a "JohnsonLu" MyService ubuntu:test
參數資訊:
Option
Description
-a 作者資訊
-m Commit 訊息
Categories: Docker