說明
作為一個後端工程師,Docker總是要用到的,所以這邊紀錄一些常用的指令。包含 Docker Compose 使用上實際會需要知道的部分。
TIPS
If else statement in Dockerfile
1
2
3
4
5RUN if [ "$XYZ" = "ABC" ] ; then \
echo do something ; \
else \
echo do something else ; \
fiDocker Compose 的 network 設定
在編輯 docker-compose.yml 時,每個專案都會有預設的 network,但是如果要讓不同的專案可以互相溝通,就需要設定 network,讓不同的 container 之間可以透過 service name 來互相溝通。而預設的 network 會是 <專案名稱>_default,以下是一個自訂 network 的範例:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15# 專案A
version: "3.9"
services:
web:
build: .
ports:
- "5000:5000"
networks:
- my-network
redis:
image: "redis:alpine"
networks:
- my-network
networks:
my-network:也就是說,如果要讓 web container 可以透過 service name 來連接 redis container,就需要將兩個 container 加入同一個 network。同樣的,另一個專案也可以使用同一個 network,這樣就可以讓兩個專案的 container 互相溝通。
另外,external network 會嘗試使用已經存在的 network 不會在 up 的時候建立新的 netwrok,只要在 networks 加上 external: true 即可。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16# 專案B
version: "3.9"
services:
app:
build: .
ports:
- "8000:8000"
networks:
- my-network
db:
image: "postgres"
networks:
- my-network
networks:
my-network:
external: trueP.S. 手動建立 network 的指令為 docker network create
Docker Permission Denied on Ubuntu
當我在 Ubuntu 上執行 docker 時,會出現以下錯誤訊息:1
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.39/containers/json: dial unix /var/run/docker.sock: connect: permission denied
- 這是因為 docker 預設只有 root 可以執行,所以要加上 sudo
- 或是可以將自己加入 docker group
1
2
3$ sudo groupadd docker
$ sudo usermod -aG docker $USER
$ newgrp docker - 有時候需要做更多的權限設定(其中之一)
1
2
3
4
5# Group ownership
$ sudo chown root:docker /var/run/docker.sock
# Group ownership of user's home directory
$ sudo chown "$USER":"$USER" /home/"$USER"/.docker -R
$ sudo chmod g+rwx "$HOME/.docker" -R