这篇是关于基于官方的Ubuntu 20.04 Docker镜像构建自己的nginx和php镜像。
首先为什么要构建自己的镜像而不是直接使用官方的nginx和php镜像?
虽然官方的包体积比较小且启动方便,但不是完全可控的,除非你对它的nginx和php配置非常熟悉,不然二次构建是比较麻烦的,比如装个扩展什么的。
所以我们要构建自己的镜像,想怎么用就怎么用,知根知底,改起来也方便。
步骤
1. 选基础镜像
nginx和php多跑在Linux下,而CentOS和Ubuntu又是服务器上用的最多的两个版本,选哪个好呢?
我们知道CentOS8相比7改动不小,而且支持周期只到2021年底,而7的官方的源又不是特别新。相对来说,Ubuntu在包管理上做的更好一些。比如CentOS7默认装的php是5.6,CentOS8是7.2,而Ubuntu20.04装的则是7.4。如果要选一个Linux版本作为桌面环境,我肯定选Ubuntu了,服务器也选它吧。
2. 安装必备的软件包
首先换源,再安装必备的软件包,装完后为减小镜像体积,最好把apt
缓存和没用的文件删了。
3. 配置文件
可以直接把本地的配置文件COPY
或ADD
过去。
4. EXPOSE端口
5. 启动命令/入口
这一步是最关键的,做不好的话,要么容器起不来,要么容器起来了,nginx或php服务没起来。
在Docker下运行Ubuntu容器时,我通常这么写
docker run -it --name ubuntu -d ubuntu:20.04 /bin/bash
但是在Kubernetes上,启动命令直接填/bin/bash
是不行的,况且我们还要启动nginx服务呢。
类似的,启动命令填["/etc/init.d/nginx","start"]
或["/etc/init.d/nginx start"]
也不行。
原因在另一篇提到过,要有一个能让容器一直运行下去的命令。
直接贴nginx的Dockerfile
FROM ubuntu:20.04
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo '$TZ' > /etc/timezone
RUN mv /etc/apt/sources.list /etc/apt/sources.list.bak
COPY sources.list /etc/apt/sources.list
RUN apt update
RUN apt install -y lsof procps vim telnet iputils-ping
RUN apt install -y nginx
RUN apt clean
ADD start.sh /usr/bin
RUN chmod +x /usr/bin/start.sh
EXPOSE 80
ENTRYPOINT ["/usr/bin/start.sh"]
时区设置成了上海,不设置的话构建过程中会让选时区,实际上是选不了的,直接卡那里,所以时区要预先配置,命令就是这两行
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo '$TZ' > /etc/timezone
sources.list
是apt
的国内源,内容如下
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal universe
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates universe
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security universe
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security multiverse
最关键的是最后的入口ENTRYPOINT的脚本,内容如下
#!/bin/bash
# 启动nginx
/etc/init.d/nginx start
# 加上这一条,不然容器会自动退出
tail -f /dev/null
构建镜像
执行以下命令构建镜像
docker build -t my-nginx .
php镜像的构建与之类似,只贴个Dockerfile吧
FROM ubuntu:20.04
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo '$TZ' > /etc/timezone
RUN mv /etc/apt/sources.list /etc/apt/sources.list.bak
COPY sources.list /etc/apt/sources.list
RUN apt update
RUN apt install -y lsof procps vim telnet iputils-ping
RUN apt install -y php php-fpm php-dev
RUN apt install -y php-gd php-redis php-gmp php-opcache php-pdo-mysql
RUN apt clean
ADD start.sh /usr/bin
RUN chmod +x /usr/bin/start.sh
EXPOSE 9000
ENTRYPOINT ["/usr/bin/start.sh"]
使用镜像
构建完成之后,无论是在Docker里直接使用,还是通过Kubernetes部署,就都没有问题了。
写在最后
构建过程其实可以优化下,先打一个自己的Ubuntu 20.04镜像,换源装必备的软件,再在其上分别构建php、nginx、redis等。