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
主要有三種
- docker run -v host_path:container_path,寫出兩邊的路徑
- docker run -v container_path,只寫 container path,docker 會在某個地方自動創一個資料夾 volume (anonymous volume)
- docker run -v volume_name:container_path 最常用的,named volume。先創造 volume 再直接給名字