昨天學習到了Volumes以及Bind Mounts的用法,要開發測試選擇Bind Mounts,要單純存取數據選擇Volumes,但是今天想要建立自己的MySQL呢?
笨阿! 摻在一起做container阿!
其實沒有這麼簡單唷,Docker推薦的就是一個container就只做一件事,為甚麼呢?
上面說明了這麼多,接下來就來談談,我們該怎麼建立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官方文件