基于Ubuntu20.04构建自己的nginx和php Docker镜像

这篇是关于基于官方的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. 配置文件

可以直接把本地的配置文件COPYADD过去。

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.listapt的国内源,内容如下

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等。

Leave a Comment

豫ICP备19001387号-1