Docker Compose Yaml Ports

今天要來學習如何在 Docker Compose 開放 Port 讓我們可以使用到 container 提供的服務,首先先看一下文檔
用法也跟之前類似,之前的作法是需要先在 Dockerfile 設定要開放的 container port, 之後在 docker run 帶入 -p 參數,指定要和哪個 Host port 進行綁定
在docker compose 中也是要先在 Dockerfile 設定,之後在 docker-compose.yml 中進行設定

mkdir mycompose && cd $_
vi docker-compose.yml 
services:
  nginx:
    image: nginx
    tty: true
    stdin_open: true
    ports:
      - 8081:80

接下來我們使用命令 docker compose up -d 來運行這個設定檔 此設定檔會將 container 的 80 port 與 Host 8081 port 進行綁定 我們可以使用瀏覽器開啟目前的 Host ip 加上 8081 port 就能看到歡迎頁面了

也跟 Volumes 的設定一樣 ports 也支援長寫法

services:
  nginx:
    image: nginx
    tty: true
    stdin_open: true
    ports:
      - target: 80
        published: 8081
        protocol: tcp
        mode: host

還有令一個好處是可以直接綁定一個範圍的 port

services:
  nginx:
    image: nginx
    tty: true
    stdin_open: true
    ports:
      - "9090-9091:8080-8081"
``

我們參考以前的[文章](https://blog.allengaodev.com/posts/dca-expose-port){target="_blank"}來做個綜合練習

``` text
touch Dockerfile
touch 8081.conf
touch custom.html
#8081.conf
server {
    listen       8081;
    listen  [::]:8081;
    server_name  localhost;

    location / {
        root   /usr/share/nginx/html;
        index  custom.html custom.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}
#custom.html
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx! From Custom Port</title>
</head>
<body>
<h1>Welcome to nginx! From Custom Port</h1>
</body>
</html>

我們準備一個客製化的 Nginx image 並且開放 8081 port 顯示我們的客制頁面 準備好之後可以使用 docker compose 另一個方便的特性,就是可以直接讓 docker compose 直接讀取我們的 Dockerfile
並且可以直接幫我們建構出 image 我們可以不用自己手動輸入命令 docker build 這邊多了幾個設定值 buildcontextdockerfile

  • context 指定建構的環境,這邊指定與docker-compose.yml同一個目錄
  • dockerfile 指定 Dockerfile 的位置,可以不用在同一個資料夾
services:
  mynginx:
    build:
      context: .
      dockerfile: ./Dockerfile
    image: mynginx
    tty: true
    stdin_open: true
    ports:
      - 80:80
      - 8081:8081

最後再次輸入命令 docker compose up -d,就可以在 80 port 看到歡迎頁面與 8081 port 看到我們的客制頁面


Summary

今天學習了如何開放 port 讓我們更方便使用 container 內部的服務,使用 docker compose 之後我們可以一次綁定大量的 port
相比之前需要一個一個綁定,新的設定方法方便了許多