iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 10
1

雖然 docker hub 的 images 應有盡有,但是總會有不符合自我需求的時候,例如:在 nginx container 內希望 nginx 本身具備 logrotate 功能,能自動打包 + 壓縮 nginx log,這時就需要使用到 Dockerfile 對 nginx images 進行加工。

  • Dockerfile:
# 以 nginx 1.12.1 的版本作為基底
FROM nginx:1.12.1 AS builder

# Install logrotate
# RUN 指令可以協助安裝套件或者執行否些指令
RUN apt-get update && apt-get -y install logrotate

# 將logroate規則複製進容器(必須讓檔案為root用戶,才可以執行)
# COPY 指令可以協助將容器外部的檔案,複製到容器內某路徑
COPY ./nginx /etc/logrotate.d/nginx

# CDM 指令指容器啟動後,需要做的行為
# 該範例為啟動 cron 背景服務 + nginx 服務
CMD service cron start && nginx -g 'daemon off;'

以上就是 nginx 加工後的 image ,但是跟如何使用呢? 有以下兩種方式:

  • 直接於 docker-compose.yml 上引用:

    • 專案架構:
    .
    ├── default.conf
    ├── docker-compose.yml
    ├── Dockerfile
    ├── index.html
    └── nginx-logrotate
    
    • default.conf
    server {
        listen       80;
        server_name  localhost;
    
        location / {
            root   /home/project;
            index  index.html index.htm;
        }
    
    }
    
    • index.html
    <h1>1234</h1>
    
    • nginx-logrotate
    # logroate規則
    
    /var/log/nginx/*.log {
            daily
            missingok
            rotate 7
            compress
            dateext
            notifempty
            create
            sharedscripts
            postrotate
                    if [ -f /var/run/nginx.pid ]; then
                            kill -USR1 `cat /var/run/nginx.pid`
                    fi
            endscript
    }
    
    • docker-compose.yml
      完成下方檔案內容後,直接執行docker-compose up -d,即可將服務建置完成
    version: '3'
    
    services:
      web:
        build: 
          context: .                                       # 讀取當前路徑的 Dockerfile
        restart: always                                    # 虛擬機會實體機重起後,容器服務自動帶起
        container_name: nginx                              # 容器名稱
        volumes:
          - ./default.conf:/etc/nginx/conf.d/default.conf  # 掛載 nginx 設定檔,可自由操控nginx設定檔
          - ./index.html:/home/project/index.html          # 掛載專案
        working_dir: /home/project                         # 進入容器後的預設路徑
        ports:                                             # 容器內與容器外 Port
          - 8899:80
        networks:                                          # 指定使用那一條網路
          - web_service
    
    # 表示服務用的網絡是用外部的網路,並且搜尋名稱為 「web_service」 
    # 搜尋成功後會自動與「webs」服務相連
    networks:
      web_service:
        external: true
    

    以上即可完成 nginx 服務建置


  • build 成 image, 在推上 docker hub 或者私有 harbor (私有庫) 保存,日後直接使用
    • 將 Dockerfile build 成 image 並加上 tag

      ## -t 表示替 image 打上 tag 
      ## 因為接下來示範將 images 推至 docker hub 
      ## 故 image tag 直接使用個人的 neil605164/nginx (專案名稱) + 1.12.1 (版本號)
      $ docker build -t neil605164/nginx:1.12.1 .
      
    • 檢查是否 build 成功

      $ docker images | grep "neil605164/nginx"
      
    • 推至公開的 docker hub

      $ docker push neil605164/nginx:1.12.1
      

歡迎讀者可以一起至Docker Hub註冊 + 測試。


上一篇
Day9 該如何將Docker Run 指令,轉換成Docker-compose內容
下一篇
Day11 Harbor 不讓你的 imge 暴露在外
系列文
就是「懶」才更需要重視DevOps30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
alincode
iT邦研究生 5 級 ‧ 2019-09-26 14:40:09

搜尋成成功後會自動 -> 搜尋成功後會自動

我要留言

立即登入留言