使用Dockerfile从0开始制作自己的docker镜像-阿里云DDNS

使用Dockerfile从0开始制作自己的docker镜像-阿里云DDNS

技术杂谈小彩虹2021-07-17 14:28:32200A+A-

本猿家里开了公网,在DockerHub找了几个阿里云ddns的工具,试了一下,不太符合自己的使用环境,遂决定自己动手构建一个镜像
本文项目文件均已在Github,DockerHub发布
本镜像使用方法以及docker-compos.yml、DDNS配置文件均在以下仓库中提供
Github github.com/youdmeng/al…
DockerHub hub.docker.com/repository/…

为什么选择docker

docker这个东西,简直不要太好用了,尤其是用了docker-compose,一个配置文件,不同环境下,一个命令就部署好了,走到哪用到哪,简直不要太舒服。

如果你还没有尝试过docker,建议你马上动起手来。

构建阿里云DDNS服务Docker镜像

构建docker镜像,要本着在保证功能的前提下,镜像越小越好

所以我选择了只有5MB的底层镜像 Alpine

使用Dockerfile来构建镜像

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明

Dockerfile 常用指令

属性 用法 描述
FROM FROM <image>:<tag> 指定使用的基础镜像
RUN RUN <命令行命令>/RUN ["可执行文件", "参数1", "参数2"] 执行指定指令
COPY COPY <源路径> <目标路径> 复制文件
ADD ADD <源路径> <目标路径> 更高级的复制文件(可下载URL)
CMD CMD ["executable","param1","param2"] / CMD ["param1","param2"] / CMD command param1 param2 RUN 构建时运行指令,CMD容器运行时执行
ENTRYPOINT ENTRYPOINT ["executable", "param1", "param2"] / ENTRYPOINT command param1 param2 给容器配置一个可执行程序
ENV ENV <key> <value> 设置环境变量
ARG ARG <name>[=<default value>] 用于指定传递给构建运行时的变量
VOLUME VOLUME ["/data"] 用于创建挂载点
EXPOSE EXPOSE <port> [<port>] 为构建的镜像设置监听端口
WORKDIR WORKDIR /opt 设置 RUN、CMD、ENTRYPOINT、ADD、COPY 等命令的工作路径
USER USER daemon 指定运行镜像所使用的用户

使用Dockerfile构建阿里云DDNS镜像

我制作的镜像以github大佬的DDNS脚本为基础。
脚本地址: github.com/risfeng/ali…

阿里云DDNS镜像Dockerfile

以下是整个dockerfile文件,后面我将逐行解释它是怎么运行的,起到什么作用

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

因为我们使用官方的基镜像,所以引入alpine

如何知道在alpine中我能执行那些命令呢?

当然是自己试试看,运行alpine

运行:docker run -it docker.io/alpine /bin/ash

命令行中一步步配置自己的服务,你的每一步操作,就是dockerfile中的一条指令

逐行解释每一行代码的运行和作用

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源为阿里源,提高国内组件下载速度

RUN命令用来执行指定指令,这里使用的是shell方式 (RUN <命令行命令>),这里相当于运行并进入alpine,在命令行执行 echo "#aliyun"

使用echo命令来修改文件内容

Shell 的 echo 指令与 PHP 的 echo 指令类似,都是用于字符串的输出

  • echo string 直接输出string到控制台
  • echo "$name" 读取变量name的值
  • echo "#aliyun" > /etc/apk/repositories 追加内容到文件末尾,该指令,是把阿里云的镜像仓库地址追加到repositories中 【重要】
  • echo date 执行某命令,并输出结果到控制台

RUN apk update
RUN apk upgrade

这里是对alpine进行更新

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脚本所以依赖的环境

RUN curl -O raw.githubusercontent.com/risfeng/ali…
RUN chmod 777 ./aliyun-ddns.sh
RUN mv /aliyun-ddns.sh /opt/aliyun-ddns.sh

下载DDNS脚本,移动并赋权

用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 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
  • c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
  • d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
  • i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
  • p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
  • s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 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的定时器配置文件,让它每隔15分钟,运行 /opt/aliyun-ddns.sh -run 指令

运行构件命令

docker build -t ddns:1.0

当然,使用vscode来操作docker也是很方便的,可以试试看。

大功告成

使用 Docker run 命令来启动镜像,或者使用 docker-compose来编排启动,你就拥有了属于自己的阿里云DDNS Docker服务

本文项目文件均已在Github,DockerHub发布

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

Github github.com/youdmeng/al…

DockerHub hub.docker.com/repository/…

欢迎STAR




更多好玩好看的内容,欢迎到我的博客交流,共同进步        WaterMin

点击这里复制本文地址 以上内容由权冠洲的博客整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!

支持Ctrl+Enter提交

联系我们| 本站介绍| 留言建议 | 交换友链 | 域名展示
本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除

权冠洲的博客 © All Rights Reserved.  Copyright quanguanzhou.top All Rights Reserved
苏公网安备 32030302000848号   苏ICP备20033101号-1

联系我们