Dcard 實習生活日記:小鯨魚(Docker)介紹

Dcard Tech
Dcard Tech Blog
Published in
5 min readJul 31, 2017

前言

Hi,這是 Web Team Intern 說好的第一則技術文章
這邊是 YC ,讓我來向各位介紹這隻好用的小鯨魚 Docker (Moby)
這篇文章將會以開發的角度切入,帶各位了解 Docker 是如何讓我們的開發更加便利。

介紹

為什麼使用 Docker?

不知道各位有沒有過這種經驗?在開發一套系統的時候,有著各式各樣的伺服器需求,例如同時需要

  1. Redis 做 Cache
  2. MongoDB 做資料庫
  3. RabbitMQ 做 RPC
  4. MariaDB 做統計
  5. Nginx 做 Proxy 以及 HTTP Basic Auth

當今天我們遇到這麼多的需求,全部從 Mirror 安裝真的好嗎?
假設同時維護了多個專案的時候,設定檔是否顯得混亂?
當套件不需要被使用時,如果忘了清除是否讓整個開發環境顯得髒亂?

在這樣的需求下 Docker 對於開發來說是個非常好用的工具

Docker 究竟是什麼東西呢?

Docker 是一套 Container 的工具,利用 cgroup、chroot、name space 等功能,將執行環境從系統獨立出來,由於直接共用系統的核心資源,讓 Docker 與傳統的 VM 相比,少了虛擬硬體以及客體系統的資源負擔,有著更輕量化、更快的啟動速度、更多的執行個體等特性,讓我們的開發能夠更加的便利。

https://www.docker.com/what-container

Container 與 Image

Docker 的每個 Container 建立來自於所謂的 Image,我們會將所需要用到的 Service 一個一個產生 Image,再利用 Image 去產生所謂的 Container,接著只要執行了 Container,Service 就可以被使用啦!

手把手教學 — 建構開發環境

上面我們有提到,可以利用 Docker 來維護我們的開發環境
這邊就帶著各位來操作、建立一個有 redis、mongoDB、rabbitMQ 的開發環境吧!

1. 首先撰寫 docker-compose

Docker-compose 能讓我們快速而方便的管理很多 Container 只需要一個檔案,我們就可以設定所有的 Container

vim docker-compose.yml

在裡面編輯

version: '3' # dockerfile 版本  
services:
redis:
container_name: exmple-redis # Container 名稱
image: redis # 使用的 Image
ports:
- "127.0.0.1:6379:6379" # 將 container 的 port 映射到127.0.0.1
mongo:
container_name: example-mongo
image: mongo
ports:
- "127.0.0.1:27017:27017"
rabbit:
container_name: example-rabbit
image: rabbitmq:3-management
ports:
- "127.0.0.1:8080:8080"
- "127.0.0.1:5672:5672"

2. 啟動它

docker-compose up -d

兩步驟完成了 redis、mongoDB、rabbitMQ 的開發環境是不是很方便呢?

手把手教學 — 產生 Image

在這個章節我會帶著大家將 Koa2 的小程式打包成一個 Image 並且建立 Container 啟動它。

1. 首先是我們的程式

這部分就先以 Koa-generator 產生一個小的程式來做示範吧

npm install -g koa-generator 
koa2 example
cd example && npm install

2. 撰寫 Dockerfile

我們可以利用 Dockerfile 產生我們的 Image

vim Dockerfile

編輯內容

FROM node:lastest # 基於 Dockerhub 上的 node Image  WORKDIR /app  COPY package.json . # 複製套件相依性  
RUN npm install # 安裝套件
COPY . . # 複製整個原始資料夾
EXPOSE 3000 CMD [ "npm", "run", "start" ] # 啟動時執行 npm run start

接下來執行

docker build -t example-image .

我們的 Image 就完成囉

3. 啟動 Container

接下來我們就可以用個簡單的指令

docker run -p 3000:3000 -d --name example-container example-image

這樣子 Container 就會執行囉,我們也可以很輕鬆將 Image 放到其他主機上面去,也就可以直接執行了!

總結

一般來說我們在使用 Docker 的時候會有這樣的流程

  1. 撰寫 Dockerfile 產生 Image / 上 Dockerhub 找我們要用的 Image
  2. 撰寫 Docker-compose 建立及管理 Container
  3. 啟動

簡單的幾個步驟,就做到了以前相當麻煩的各個內容,當然 Docker 的好處也不只這些,在部署上還有各式各樣的地方都可以利用 Docker 達到更便利的效果,如果說你對 Docker 有興趣,可以上 Docker 官網 好好的了解它,網路上也有很多的學習資源,希望這篇文章能夠讓你感受到 Docker 的便利、也希望這樣的便利能為你的開發帶來正面的影響。

--

--