本文主要介绍内容如下:
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