Docker Memos

說明

作為一個後端工程師,Docker總是要用到的,所以這邊紀錄一些常用的指令。包含 Docker Compose 使用上實際會需要知道的部分。

TIPS

  1. If else statement in Dockerfile

    1
    2
    3
    4
    5
    RUN if [ "$XYZ" = "ABC" ] ; then \
    echo do something ; \
    else \
    echo do something else ; \
    fi
  2. Docker 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: true

    P.S. 手動建立 network 的指令為 docker network create

  3. 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
    1. 這是因為 docker 預設只有 root 可以執行,所以要加上 sudo
    2. 或是可以將自己加入 docker group
      1
      2
      3
      $ sudo groupadd docker
      $ sudo usermod -aG docker $USER
      $ newgrp docker
    3. 有時候需要做更多的權限設定(其中之一)
      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

參考資料