初探 Docker: 從 Dockerfile、Docker Compose 說起

by Benmr
Docker

前言

最近在研究公司的 dockerfile、docker-compose和相關 config 檔
順手筆記一下,希望在加深印象之餘
也可以讓有同樣初學者有一個大概的藍圖

關係圖

file
從上圖可以看到
Dockerfile 會生成 Docker Image
所謂的 Image,就是生產 Container 的模版
Container 則是透過 Image 產生隔離的執行環境
是一組利用 Linux 核心提供的技術來達到把程式或軟體「包裹」在一個可隔離且獨立執行環境的工具
(以下也會把 Container 提供的服務描述為 service)
而 Docker 就是用來管理這些 Container 的工具

Docker-compose

可以想像是一個腳本
作用在於當我們的 project 想要一次運作多個 service 的時候
我們就得一個一個啟動 container
這麼曠日費時的工作 當然要外包出去啊

所以就有 Docker-compose
就像上面所說的,可以把它想像成是一個腳本
原來設定我們的 project 所需的環境,以及它會用到的 service 們

比如說 docker-compose.yml (YAML 檔案格式,使用空格來縮排,附檔名為 .yml)

version: '3' # 目前使用的版本,可以參考官網:
services: # services 關鍵字後面列出 web, redis 兩項專案中的服務
  web:
    build: . # Build 在同一資料夾的 Dockerfile(描述 Image 要組成的 yaml 檔案)成 container
    ports:
      - "5000:5000" # 外部露出開放的 port 對應到 docker container 的 port
    volumes:
      - .:/code # 要從本地資料夾 mount 掛載進去的資料
    links:
      - redis # 連結到 redis,讓兩個 container 可以互通網路
  redis:
    image: redis # 從 redis image build 出 container

Dockerfile

Docker-compose 裡有寫到 Dockerfile
我們可以說
Docker-compose 提供了環境的設定
Dockerfile 就是在完成環境設定後,執行的 "指令"

一個簡單的 Dockerfile 如下

FROM centos:7 # FROM: 使用到的 Docker Image 名稱,今天使用 CentOS

RUN yum install -y wget # RUN 指令後面放 Linux 指令,用來執行安裝和設定這個 Image 需要的東西

RUN cd /

ADD jdk-8u152-linux-x64.tar.gz / # ADD: 把 Local 的檔案複製到 Image 裡,如果是 tar.gz 檔複製進去 Image 時會順便自動解壓縮。

RUN wget http://apache.stu.edu.tw/tomcat/tomcat-7/v7.0.82/bin/apache-tomcat-7.0.82.tar.gz
RUN tar zxvf apache-tomcat-7.0.82.tar.gz

ENV JAVA_HOME=/jdk1.8.0_152 # ENV: 用來設定環境變數
ENV PATH=$PATH:/jdk1.8.0_152/bin
CMD ["/apache-tomcat-7.0.82/bin/catalina.sh", "run"] # CMD: 在指行 docker run 的指令時會直接呼叫開啟 Tomcat Service

參考資料

https://philipzheng.gitbook.io/docker_practice/dockerfile/basic_structure
https://hackmd.io/@titangene/docker-lamp
https://blog.techbridge.cc/2018/09/07/docker-compose-tutorial-intro/

You may also like

Leave a Comment