Skip to main content

基本介紹

Docker 基本三個觀念

  • 映像檔(Image)
    Docker 映像檔就是一個唯讀的模板。
    映像檔可以用來建立 Docker 容器。

  • 容器(Container)
    容器是從映像檔建立的執行實例。
    Docker 利用容器來執行應用。
    可以被啟動、開始、停止、刪除。
    每個容器都是相互隔離的、保證安全的平台。

  • 倉庫(Repository)
    倉庫是集中存放映像檔檔案的場所。
    每個倉庫中又包含了多個映像檔。
    每個映像檔有不同的標籤(tag)。
    倉庫分為公開倉庫(Public)和私有倉庫(Private)兩種形式。

Step By Step

將 Web App 打包成 (Dockerize) Docker Image 並執行成 Container。

  • 安裝Docker
  • 準備打包的目標程式
  • 撰寫Dockerfile
  • 打包程式(Dockerize - built image)
  • 執行成Container(run container)
  1. 安裝Docker 安裝網址:https://docs.docker.com/docker-for-mac/install/

  2. 準備目標程式 git clone https://github.com/HcwXd/docker-tutorial.git cd docker-tutorial/docker-demo-app 資料夾有五個檔案

.dockerignore
Dockerfile
docker.html
index.js
package.json
  1. 撰寫Dockerfile

Dockerfile 透過撰寫命令行告訴 Docker 應該要如何打包我的程式。

FROM node:10.15.3-alpine

這行會載入 Node.js 需要的執行環境,每個不同的程式需要的環境可能不同,這裏下載的是 node:10.15.3-alpine,其他版本可以在 Dockerhub 上看到

WORKDIR /app

在這個 Docker 的環境之中建立一個工作目錄 /app

ADD . /app

把跟 Dockerfile 同個資料夾的程式加到剛建立的工作目錄 /app 中

RUN npm install

運行 npm install,讓 npm 透過讀取 package.json 下載相依的 package

EXPOSE 3000

指定 container 對外開放的 port

CMD node index.js

我們透過 node index.js 來執行我們的 Server

  1. 打包程式(Dockerize)

終於把所有預備檔案準備好後,我們可以在資料夾內透過指令 docker build

docker image build -t docker-demo-app .

去建立 Docker Image 並為這個 Image 加上 tag docker-demo-app。然後我們可以再透過指令

docker images

列出我們全部的 Docker Image 如下

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker-demo-app latest 55c4ff55fd72 37 seconds ago 74.2MB
node 10.15.3-alpine 56bc3a1ed035 4 months ago 71MB
  1. 執行成Container

生成 Docker Image 後,下一步就可以來實際執行 Container 。透過上面的 docker images 指令,找到我們建立 Image 的 ID,在這邊是 733776b1db0a。輸入指令

docker run -d -p 4000:3000 --name {{container_name}}  {{docker_image}}

(參數-p: 本地主機port 4000 mapping to 容器 port 3000, 參數 -d 背景執行) 透過 docker run,我們實際把 Image 執行成 Container 了!這時我們看到 terminal 顯示 listening on port 3000 後,用瀏覽器打開 localhost:4000,就可以迎接一隻 Docker 鯨魚。

停止Container

ctrl+c 無法關閉運行的 Container,新開啟一個終端介面,先輸入docker ps查看運行中的containerID,再輸入 docker stop containerID

查看docker運行狀態

docker ps -a

查看docker image 列表

docker image ls docker images

Create docker image

docker image build [dockerfile path]

如果沒有所需要的 image ,也可以自己建立一個 image。而建立 image 所需要的參數設定,是使用 YAML 格式所撰寫的 Dockerfile。

cd 進項目資料夾創建image docker build -t username/node-web-app .

運行image

docker run -p 49160:8080 -d username/node-web-app

Enter the container

docker exec -it container_id /bin/bash

退出 docker

exit

從remote repository (docker hub) 下載 image

docker pull hello-world

移除 image

docker image rm hello-world

移除Docker Image

docker rmi imageID or tag

啟動Docker

docker run -d -p 8080:80 --restart=always --name nginx nginx

參數說明: -d: 把 container 執行在背景裡 -p: 做 port 的mapping,container裡的port 80 mapping 到 host 的8080 port --restart=always:如果 container 遇到例外的情況被 stop 掉,例如是重新開機,docker 會試著重新啟動此 container --name=registry:設定 container 的 name 為 nginx 最後一個參數 nginx 是 docker image 的 Name

停止Docker和移除docker image

docker stop webserver docker rm webserver

移除container

docker container rm container-id