本文主要介绍内容如下:
hub.docker.com。Docker 官方提供的 centos 镜像构建系统基础镜像。Nodejs Base (Node.js + NPM + PM2) 镜像。Nodejs Base 镜像,构建并启动 Koa 容器服务。Systemd,实现容器中的 Koa 服务开机启动。使用任意邮箱注册 Docker 账号。点击开始注册

Docker 账号可以关联 Github 账号,进而借助 Github Webhooks 能力,实现镜像自动构建。点击开始关联


Docker Hub 镜像仓库关联 Github 仓库后,可配置监听分支或 Tag 的改变实现 Docker 镜像自动构建。



Docker 官方提供的 centos:7 和 centos:latest 基础容器中都包含 Systemd,但默认情况下它不处于活动状态。为了使用 systemd,将需要包含类似于以下示例 Dockerfile 的配置。该 Dockerfile 删除了若干可能导致问题的文件。
FROM centos:7
ENV container docker
# 删除了若干可能导致问题的文件
RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == \
systemd-tmpfiles-setup.service ] || rm -f $i; done); \
rm -f /lib/systemd/system/multi-user.target.wants/*;\
rm -f /etc/systemd/system/*.wants/*;\
rm -f /lib/systemd/system/local-fs.target.wants/*; \
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*;\
rm -f /lib/systemd/system/anaconda.target.wants/*;
VOLUME [ "/sys/fs/cgroup" ]
# Centos7 版本启动使用 systemd
CMD [ "/usr/sbin/init" ]该系统基础镜像已托管到 Github,点击查看
使用一,使用 Docker Hub描述的方法,构建镜像。点击查看系统基础镜像仓库

$ docker push yorkyucn/docker-centos-base-image:latest使用 Node.js 二进制安装包与 yorkyucn/docker-centos-base-image 构建 Nodejs Base 镜像。
下载 Node.js 二进制安装包,点击进入下载页面,选择需要的版本。

点击下载 node-v12.19.0-linux-x64.tar.xz
项目包含 node-v12.19.0-linux-x64.tar.xz 安装包与 Dockerfile 文件,项目结构如下所示:

点击查看 yorkiyu/docker-nodejs-base-image
yorkyucn/docker-nodejs-base-image 镜像的 Dockerfile 如下
FROM yorkyucn/docker-centos-base-image:latest
LABEL maintainer="yorkyu.cn"
# 配置 Node.js 版本信息
ENV NODE_VERSION="v12.19.0" \
NODE_DISTRO="linux-x64"
# 解压 Node.js
ADD "./lib/node-${NODE_VERSION}-${NODE_DISTRO}.tar.xz" /usr/local/services/
# 配置 Node.js 运行环境变量,使命令行可运行 node/npm 命令
ENV PATH="/usr/local/services/node-${NODE_VERSION}-${NODE_DISTRO}/bin:${PATH}"
# 安装 pm2
RUN npm install pm2 -g使用一,使用 Docker Hub描述的方法,构建镜像。点击查看系统基础镜像仓库

$ docker pull yorkyucn/docker-nodejs-base-image:latest# 启动容器
$ docker run -d yorkyucn/docker-nodejs-base-image:latest
# 进入容器
$ docker exec -it cd10ab4f9c51 /bin/bash
基于 yorkyucn/docker-nodejs-base-image 镜像,构建 koa 应用的镜像 demo。
新建 koa 应用项目。其目录结构如下图:

点击查看 docker-nodejs-base-koa-demo 项目源码
由于 docker-centos-base-image 系统基础镜像已经使用了 1 号进程,所以应用镜像不建议使用 CMD/ENTRYPOINT 运行启动命令。会导致覆盖系统基础镜像已经使用了 1 号进程的 systemd 服务。
可以参考下述 Dockerfile,新建了 systemd 服务 koa-service,并配置开机启动服务。
FROM yorkyucn/docker-nodejs-base-image:latest
# 暴露端口
EXPOSE 8080
WORKDIR /data/release/docker-nodejs-base-koa-demo
# 创建目录
RUN mkdir -p /data/release/docker-nodejs-base-koa-demo
# 复制源码
COPY . /data/release/docker-nodejs-base-koa-demo
# 将服务koa.service,拷贝到 systemd
COPY ./koa.service /etc/systemd/system
# 设置可执行权限
RUN chmod +x /etc/systemd/system/koa.service
# 设置 koa.service 开机启动
RUN ln -s /etc/systemd/system/koa.service /etc/systemd/system/multi-user.target.wants使用 systemd 启动应用,点击查看配置 koa.service
#!/bin/bash
# 服务说明
[Unit]
# 服务描述
Description=pm2 start docker-nodejs-base-koa-demo
# 前置需要启动的服务
After=sysinit.target
# 服务启动行为
[Service]
# 服务类型
Type=simple
# 服务启动
ExecStart=/usr/local/services/node-v12.19.0-linux-x64/bin/pm2-runtime start /data/release/docker-nodejs-base-koa-demo/ecosystem.config.js --only docker-nodejs-base-koa-demo --env production
# 服务重启
ExecReload=
# 服务停止
ExecStop=
# 设置预加载变量
Environment="PATH=/usr/local/services/node-v12.19.0-linux-x64/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
# 执行用户
User=root
# 执行用户组
Group=root
WorkingDirectory=/data/release/docker-nodejs-base-koa-demo
# 服务开机启动安装目标
[Install]
# 表示该服务所在的 Target
WantedBy=multi-user.targe使用 一,使用 Docker Hub 描述的方法,构建镜像。 点击查看 Demo 镜像

# 拉取镜像
$ docker pull yorkyucn/docker-nodejs-base-koa-demo:latest
# 启动容器
$ docker run -d -p 8080:8080 --privileged yorkyucn/docker-nodejs-base-koa-demo:latest
--privileged,使用该参数,container 内的 root 拥有真正的 root 权限。可以看到很多 host 上的设备,并且可以执行 mount。才可以正常启动systemd服务管理
# 查看容器
$ docker ps
# 进入容器
$ docker exec -it 1ad44142b083 /bin/bash

进入容器后,查看 Koa 应用。
# 运行 systemd 命令,查看服务状态
$ systemctl status koa.service
# 运行 pm2 命令,查看启动进程
$ pm2 ls
