iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 5
0
自我挑戰組

自我學習Docker的30天奇幻旅程系列 第 5

Day5 container混戰拉!

昨天學習到了Volumes以及Bind Mounts的用法,要開發測試選擇Bind Mounts,要單純存取數據選擇Volumes,但是今天想要建立自己的MySQL呢?

笨阿! 摻在一起做container阿!

其實沒有這麼簡單唷,Docker推薦的就是一個container就只做一件事,為甚麼呢?

  • 首先,資料庫與服務端分開是蠻常見的做法,除了可以使用多個資料庫Server來減輕存取負擔,一般也會再多一個備用的環境來當作緊急時的調度使用,可以避免服務被迫終止的情況發生,因此分開可說是好處多多呢。
  • 再來就是如果要在一個container中擁有多個進程,就需要有個管理進程的做法,在啟動跟關閉的執行上就變得比較複雜了,事情簡單點大家才能早點下班呢。
  • 最後就是APP版本管理方便等等就不再說明了

Multi-Container Apps

上面說明了這麼多,接下來就來談談,我們該怎麼建立MySQL並與APP交流呢。
仔細想想一般APP怎麼連接MySQL?都是需要進行DB連接對吧!
那兩個不相關的服務為甚麼可以連接呢?就是因為 ── 網路

If two containers are on the same network, they can talk to each other. If they aren't, they can't.

需要連接兩者就代表之間必須在同個網路底下,不然是無法進行溝通的。
接下來就讓我們簡單建立本地的MySQL來玩玩吧

首先先建立網路

docker network create todo-app

接下來就是建立MySQL的container並連接至網路

docker run -d \
    --network todo-app --network-alias mysql \
    -v todo-mysql-data:/var/lib/mysql \
    -e MYSQL_ROOT_PASSWORD=secret \
    -e MYSQL_DATABASE=todos \
    mysql:5.7

-d 就是前幾天提到的detached mode
--network 就是指定剛剛建立的網路
--network-alias 代表幫網路取個小名
-e 代表為Docker建立的環境變量
-v 就是前幾天提到的Volumes

接下來就能使用指令連接資料庫,進行資料庫的操作。

docker exec -it <mysql-container-id> mysql -p

建立好了網路以及資料庫,接下來就是要連接我們的APP與MySQL了,我們知道連接就需要IP位置,但是該怎麼取得呢,其實可以直接進去MySQL container敲敲打打指令就能出來了,但是官方文件推薦我們使用nicolaka/netshoot建立container,除了可以查看IP還有許多強大的功能,這些就之後再研究看看瞜...

執行以下命令使用nicolaka/netshoot建立container

docker run -it --network todo-app nicolaka/netshoot

-it 的意思呢就是--interactive + --tty
-i or --interactive 意思是保持STDIN的開啟
-t or --tty 是分配一個偽tty

執行完就會進入nicolaka/netshoot建立的container的環境,要查詢IP位址則需要使用dig指令

dig mysql

output

; <<>> DiG 9.14.12 <<>> mysql
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 24570
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;mysql.                         IN      A

;; ANSWER SECTION:
mysql.                  600     IN      A       172.18.0.2

;; Query time: 26 msec
;; SERVER: 127.0.0.11#53(127.0.0.11)
;; WHEN: Fri Sep 18 15:09:27 UTC 2020
;; MSG SIZE  rcvd: 44

在ANSWER SECTION底下A之後的位址就是我們要找的MySQL IP

現在有IP之後我們終於可以連接資料庫了!!

將APP連接資料

docker run -dp 3000:3000 \
  -w /app -v "$(pwd):/app" \
  --network todo-app \
  -e MYSQL_HOST=mysql \
  -e MYSQL_USER=root \
  -e MYSQL_PASSWORD=secret \
  -e MYSQL_DB=todos \
  node:12-alpine \
  sh -c "yarn install && yarn run dev"

執行完後便可以觀測container的LOGS直到出現Connected!才代表連接MySQL成功唷

$ nodemon src/index.js

[nodemon] 1.19.2

[nodemon] to restart at any time, enter `rs`

[nodemon] watching dir(s): *.*

[nodemon] starting `node src/index.js`

Waiting for mysql:3306.

Connected!

Connected to mysql db at host mysql

Listening on port 3000

連接成功之後就能增加幾項todo item
再使用連接資料庫的指令來查詢看看剛剛新增的項目

docker exec -ti <mysql-container-id> mysql -p todos
mysql> select * from todo_items;
+--------------------------------------+-----------+-----------+
| id                                   | name      | completed |
+--------------------------------------+-----------+-----------+
| 9b0cbb70-1c2a-4f16-85f3-79784092479b | qweeqeqwe |         0 |
| af930116-e857-4381-9ee3-92229a42b0fc | qqqqq     |         0 |
+--------------------------------------+-----------+-----------+
2 rows in set (0.00 sec)

總結

今天要週末了有點懶散呢,不過還是把目標做到了,學習到了Multi-Container Apps的做法,但是如果container都是散成一團的話確實有點難管理,因此,明天就要來學習甚麼是Docker Compose,並且趁著假日訂定之後的目標吧!!

參考文獻:
Docker官方文件


上一篇
Day4 了解Volumes及Bind Mounts
下一篇
Day6 Docker Compose組在一起比較香
系列文
自我學習Docker的30天奇幻旅程24

尚未有邦友留言

立即登入留言