使用Dockerfile從0開始制作自己的docker鏡像-阿里云DDNS

本猿家里開了公網(wǎng),在DockerHub找了幾個(gè)阿里云ddns的工具,試了一下,不太符合自己的使用環(huán)境,遂決定自己動(dòng)手構(gòu)建一個(gè)鏡像

本文項(xiàng)目文件均已在Github,DockerHub發(fā)布

本鏡像使用方法以及docker-compos.yml、DDNS配置文件均在以下倉庫中提供

Github https://github.com/youdmeng/aliddns

DockerHub https://hub.docker.com/repository/docker/youdmeng/aliddns

為什么選擇docker

docker這個(gè)東西,簡直不要太好用了,尤其是用了docker-compose,一個(gè)配置文件,不同環(huán)境下,一個(gè)命令就部署好了,走到哪用到哪,簡直不要太舒服。

如果你還沒有嘗試過docker,建議你馬上動(dòng)起手來。

構(gòu)建阿里云DDNS服務(wù)Docker鏡像

構(gòu)建docker鏡像,要本著在保證功能的前提下,鏡像越小越好

所以我選擇了只有5MB的底層鏡像 Alpine

使用Dockerfile來構(gòu)建鏡像

Dockerfile 是一個(gè)用來構(gòu)建鏡像的文本文件,文本內(nèi)容包含了一條條構(gòu)建鏡像所需的指令和說明

Dockerfile 常用指令

屬性 用法 描述
FROM FROM <image>:<tag> 指定使用的基礎(chǔ)鏡像
RUN RUN <命令行命令>/RUN ["可執(zhí)行文件", "參數(shù)1", "參數(shù)2"] 執(zhí)行指定指令
COPY COPY <源路徑> <目標(biāo)路徑> 復(fù)制文件
ADD ADD <源路徑> <目標(biāo)路徑> 更高級的復(fù)制文件(可下載URL)
CMD CMD ["executable","param1","param2"] / CMD ["param1","param2"] / CMD command param1 param2 RUN 構(gòu)建時(shí)運(yùn)行指令,CMD容器運(yùn)行時(shí)執(zhí)行
ENTRYPOINT ENTRYPOINT ["executable", "param1", "param2"] / ENTRYPOINT command param1 param2 給容器配置一個(gè)可執(zhí)行程序
ENV ENV <key> <value> 設(shè)置環(huán)境變量
ARG ARG <name>[=<default value>] 用于指定傳遞給構(gòu)建運(yùn)行時(shí)的變量
VOLUME VOLUME ["/data"] 用于創(chuàng)建掛載點(diǎn)
EXPOSE EXPOSE <port> [<port>] 為構(gòu)建的鏡像設(shè)置監(jiān)聽端口
WORKDIR WORKDIR /opt 設(shè)置 RUN、CMD、ENTRYPOINT、ADD、COPY 等命令的工作路徑
USER USER daemon 指定運(yùn)行鏡像所使用的用戶

使用Dockerfile構(gòu)建阿里云DDNS鏡像

我制作的鏡像以github大佬的DDNS腳本為基礎(chǔ)。

腳本地址: https://github.com/risfeng/aliyun-ddns-shell

阿里云DDNS鏡像Dockerfile

以下是整個(gè)dockerfile文件,后面我將逐行解釋它是怎么運(yùn)行的,起到什么作用

FROM docker.io/alpine

RUN echo "#aliyun" > /etc/apk/repositories
RUN echo "https://mirrors.aliyun.com/alpine/v3.6/main/" >> /etc/apk/repositories
RUN echo "https://mirrors.aliyun.com/alpine/v3.6/community/" >> /etc/apk/repositories
RUN apk update
RUN apk upgrade
RUN apk add bash
RUN apk add curl
RUN apk add openssl
RUN apk add util-linux
RUN apk add --update --no-cache bind-tools
RUN curl -O https://raw.githubusercontent.com/risfeng/aliyun-ddns-shell/master/src/aliyun/aliyun-ddns.sh
RUN chmod 777 ./aliyun-ddns.sh
RUN mv /aliyun-ddns.sh /opt/aliyun-ddns.sh
RUN sed -i 's#LOG_FILE_PATH=""#LOG_FILE_PATH="/etc/logs/ddns.log"#g' /opt/aliyun-ddns.sh
RUN echo "*/15    *       *       *       *       /opt/aliyun-ddns.sh -run" >> /var/spool/cron/crontabs/root 
引入官方的基鏡像

FROM docker.io/alpine

因?yàn)槲覀兪褂霉俜降幕R像,所以引入alpine

如何知道在alpine中我能執(zhí)行那些命令呢?

當(dāng)然是自己試試看,運(yùn)行alpine

運(yùn)行:docker run -it docker.io/alpine /bin/ash

命令行中一步步配置自己的服務(wù),你的每一步操作,就是dockerfile中的一條指令

逐行解釋每一行代碼的運(yùn)行和作用

RUN echo "#aliyun" > /etc/apk/repositories

RUN echo "https://mirrors.aliyun.com/alpine/v3.6/main/" >> /etc/apk/repositories

RUN echo "https://mirrors.aliyun.com/alpine/v3.6/community/" >> /etc/apk/repositories

此處是配置alpine鏡像中的APT源為阿里源,提高國內(nèi)組件下載速度

RUN命令用來執(zhí)行指定指令,這里使用的是shell方式 (RUN <命令行命令>),這里相當(dāng)于運(yùn)行并進(jìn)入alpine,在命令行執(zhí)行 echo "#aliyun"

使用echo命令來修改文件內(nèi)容

Shell 的 echo 指令與 PHP 的 echo 指令類似,都是用于字符串的輸出

  • echo string 直接輸出string到控制臺
  • echo "$name" 讀取變量name的值
  • echo "#aliyun" > /etc/apk/repositories 追加內(nèi)容到文件末尾,該指令,是把阿里云的鏡像倉庫地址追加到repositories中 【重要】
  • echo date 執(zhí)行某命令,并輸出結(jié)果到控制臺

RUN apk update

RUN apk upgrade

這里是對alpine進(jìn)行更新

RUN apk add bash

RUN apk add curl

RUN apk add openssl

RUN apk add util-linux

RUN apk add --update --no-cache bind-tools

這里是安裝DDNS腳本所以依賴的環(huán)境

RUN curl -O https://raw.githubusercontent.com/risfeng/aliyun-ddns-shell/master/src/aliyun/aliyun-ddns.sh

RUN chmod 777 ./aliyun-ddns.sh

RUN mv /aliyun-ddns.sh /opt/aliyun-ddns.sh

下載DDNS腳本,移動(dòng)并賦權(quán)

用sed命令來替換指定文件指定字符

Linux sed 命令是利用腳本來處理文本文件。

RUN sed -i 's#LOG_FILE_PATH=""#LOG_FILE_PATH="/etc/logs/ddns.log"#g' /opt/aliyun-ddns.sh

本操作是將我們下載的腳本的日志路徑做修改

sed命令解釋:

  • a :新增, a 的后面可以接字串,而這些字串會(huì)在新的一行出現(xiàn)(目前的下一行)~
  • c :取代, c 的后面可以接字串,這些字串可以取代 n1,n2 之間的行!
  • d :刪除,因?yàn)槭莿h除啊,所以 d 后面通常不接任何咚咚;
  • i :插入, i 的后面可以接字串,而這些字串會(huì)在新的一行出現(xiàn)(目前的上一行);
  • p :打印,亦即將某個(gè)選擇的數(shù)據(jù)印出。通常 p 會(huì)與參數(shù) sed -n 一起運(yùn)行~
  • s :取代,可以直接進(jìn)行取代的工作哩!通常這個(gè) s 的動(dòng)作可以搭配正規(guī)表示法!例如 1,20s/old/new/g 就是啦!

上面指令的意思是 -i 插入文件 /opt/aliyun-ddns.sh,用字符串LOG_FILE_PATH="/etc/logs/ddns.log" ,s取代LOG_FILE_PATH=""

用人話說,就是在文件/opt/aliyun-ddns.sh中使用 LOG_FILE_PATH="/etc/logs/ddns.log" 替換 LOG_FILE_PATH=""

最后一步

RUN echo "*/15 * * * * /opt/aliyun-ddns.sh -run" >> /var/spool/cron/crontabs/root

同理,這里是修改alpine的定時(shí)器配置文件,讓它每隔15分鐘,運(yùn)行 /opt/aliyun-ddns.sh -run 指令

運(yùn)行構(gòu)件命令

docker build -t ddns:1.0

當(dāng)然,使用vscode來操作docker也是很方便的,可以試試看。

大功告成

使用 Docker run 命令來啟動(dòng)鏡像,或者使用 docker-compose來編排啟動(dòng),你就擁有了屬于自己的阿里云DDNS Docker服務(wù)

本文項(xiàng)目文件均已在Github,DockerHub發(fā)布

本鏡像使用方法以及docker-compos.yml、DDNS配置文件均在以下倉庫中提供

Github https://github.com/youdmeng/aliddns

DockerHub https://hub.docker.com/repository/docker/youdmeng/aliddns

歡迎STAR





更多好玩好看的內(nèi)容,歡迎到我的博客交流,共同進(jìn)步????????WaterMin


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容