This page looks best with JavaScript enabled

Docker

 ·  ☕ 3 min read

Docker

https://www.youtube.com/watch?v=3c-iBn73dDE
前幾天看了一個簡單介紹 docker 的影片還滿完整的,紀錄一下大概講了什麼,沒有太深入的東西不過應該滿夠用的

他裡面有做了一個簡單的範例,之後要用應該滿好參考的
https://gitlab.com/nanuchi/techworld-js-docker-demo-app

為什麼要 Container

可以把一個 application 和他所需要的所有東西(依賴的 lib 或是 自己寫的 config 之類的)包在一起,所以這個 container 不需要依靠其他東西來運作
因為需要的東西都包在一起了,所以不管拿到哪台機器上都不會因為機器的環境差異造成行為不同
讓開發到部署都非常方便

例如:
開發期間,不同的開發者,要把環境設定到一樣是很困難的,不同機器上說不定會行為不同,造成開發困難
甚至也可能在一台電腦上需要不同版本的某個應用程式,要一直切換
或是部署時,開發人員把一堆程式的安裝以及環境設定的步驟交給 operation team 去設定 server,但時常這些複雜的步驟是無法所有細節都交代清楚的
而且要保持開發和部署環境一直一致也是很困難,以上都很容易出事

這些事情有容器幫忙就可以方便很多

Docker vs Virtual Machine

作業系統有兩層,kernel 層和 application 層
不同版本的 Linux 例如 debian, ubuntu,就是用同一種 kernel,但上面是不同的 application

Docker 只虛擬化 application layer,使用 host 的 kernel
VM 則是兩層都有(虛擬化整個os)

所以 docker 小、快

但如此一來某些 docker image 就會不適用在某 host 上 因為 os kernel 與 image 不相容,像是舊版的 windows 與某些舊版的 mac

要用 docker toolbox 處理

Container, Image ??

image 就是一個模板,敘述了這個 container 作業環境裡面所有的東西

執行起來之後就是一個 container

Container Repository(Registry)

存放 image 的地方,公司常有私有的 repo 放內部自己 build 出來的 image
公有的像是 Dockerhub,大家會上傳很多好用的 image 上去

Image

Image 是一個層層疊疊的概念

例如這個 redis 的 image
https://github.com/docker-library/redis/blob/1511c433cdb80391d897b5d2a04c67c261bf5f4b/6.2/Dockerfile
就是由一個 base image (debian:buster-slim) 之上,設定一堆環境變數,把 redis 裝上去,而形成這個 image

要製作自己的 redis image 時,也可以根據自己的需求,把 config 等等的資訊疊在這個通用的 redis image 之上,形成自己的 image

Note: 通常最底下那層都是 Linux based image (要小,alpine 之類的)

常用 cmd

docker pull xxx

docker run xxx

docker run -d xxx = 不卡在 terminal

docker ps -a 列出所有 container 包括沒在跑的

docker rm $(docker ps -a -q) 刪掉所有

docker stop start

port

需要綁定 host port to container port 否則一個 container 跑在那邊也是 unreachable

docker run -p6000:6379 redis

執行這指令可以綁 host port 6000

Debug

docker logs (name or id)
docker run –name xxx 可以指定名稱

進入terminal
docker exec -it 4839d8c690c8 /bin/bash (sh)
it = interactive terminal

Docker network

container 們會跑在一個隔離的 network 裡面
要讓不同的 container 方便的溝通就要把他們放在同一個 docker network 內

可用 docker network ls 看有哪些

Docker compose

就是把一堆 run docker 的指令結構化寫在一個檔案內

service 下面會有一堆 container name (對應到 docker run –name)

而且會自動架 docker network

docker-compose -f docker-compose.yaml up(down) -d

Note: docker-compose 是讓一堆 container 跑在同一個 host 的東西,要一次操作一堆 host 上的 container 需要用 docker swarm 或是 k8s 之類的
https://stackoverflow.com/questions/47536536/whats-the-difference-between-docker-compose-and-kubernetes

Dockerfile

用來 build docker image 的藍圖,就是一堆敘述說要用哪個 base image,要裝什麼套件等等等的

-t 給名字和 tag
docker build -t my-app:1.0 .

Docker volumes

Data persistency
換一個 container 時資料就會不見 (docker-compose down up)
把 host 上的資料和 container 內的資料綁在一起
資料就不會掉

docker volume ls

主要有三種

  1. docker run -v host_path:container_path,寫出兩邊的路徑
  2. docker run -v container_path,只寫 container path,docker 會在某個地方自動創一個資料夾 volume (anonymous volume)
  3. docker run -v volume_name:container_path 最常用的,named volume。先創造 volume 再直接給名字
Share on

Marko Peng
WRITTEN BY
Marko Peng
Good man