用Docker布署eggjs 和 react 的前后端项目

一. 在服务器上安装docker 环境,文档地址:https://docs.docker.com/engine/install/centos/

1.移除老的Docker环境,如果有的话。

sudo yum remove docker \
                 docker-client \
                 docker-client-latest \
                 docker-common \
                 docker-latest \
                 docker-latest-logrotate \
                 docker-logrotate \
                 docker-engine

2.设置源

 1.sudo yum install -y yum-utils
 2.
 sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
下面这个是淘宝的

sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

在设置源的过程中发现一错误提示,粘上

Solved:Could not resolve host: mirrors.iuscommunity.org

Search this topic…
1 post • Page 1 of 1
henk
Posts: 488
Joined: 14 Dec 2015 22:16
Location: Netherlands
Contact: Contact henk
Solved:Could not resolve host: mirrors.iuscommunity.org
Post by henk » 29 Jan 2020 13:02

Yum update had an issue with the IUS mirror list. ( eFa4 kickstart on Centos7 minimal version installed some time ago)

Could not retrieve mirrorlist https://mirrors.iuscommunity.org/mirror ... tocol=http error was
14: curl#6 - "Could not resolve host: mirrors.iuscommunity.org; Unknown error"

See "https://github.com/iusrepo/infrastructure/issues/14
Steps:
1. Delete ius-release
CODE: SELECT ALL

yum erase ius-release
rm /etc/yum.repos.d/ius*.repo*
2. and reinstalled it https://ius.io/setup
CODE: SELECT ALL

yum install \
https://repo.ius.io/ius-release-el7.rpm \
https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

 

安装docker

sudo yum install docker-ce docker-ce-cli containerd.io

启动docker

sudo systemctl enable docker
sudo systemctl start docker

查看版本

docker -v

部署NODEJS

1.eggjs 的package.json 得改改,将start 的 –daemon去掉,因为在docker里需要前台运行

在项目上的根目录 新建 Dockerfile,输入下面的内容

# 设置基础镜像,如果本地没有该镜像,会从Docker.io服务器pull镜像
FROM node:12-alpine

# 设置时区
RUN apk --update add tzdata \
    && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
    && echo "Asia/Shanghai" > /etc/timezone \
    && apk del tzdata

# 创建app目录
RUN mkdir -p /usr/src/node-app/egg-server

# 设置工作目录
WORKDIR /usr/src/node-app/egg-server

# 拷贝package.json文件到工作目录
# !!重要:package.json需要单独添加。
# Docker在构建镜像的时候,是一层一层构建的,仅当这一层有变化时,重新构建对应的层。
# 如果package.json和源代码一起添加到镜像,则每次修改源码都需要重新安装npm模块。
# 所以,正确的顺序是: 添加package.json;安装npm模块;添加源代码。
COPY package.json /usr/src/node-app/egg-server/package.json

# 安装npm依赖(使用淘宝的镜像源)
# 如果使用的境外服务器,无需使用淘宝的镜像源,即改为`RUN npm i`。
RUN npm i --registry=https://registry.npm.taobao.org

# 拷贝所有源代码到工作目录
COPY . /usr/src/node-app/egg-server

# 暴露容器端口
EXPOSE 7101

# 启动node应用
CMD npm start
# 拉取要创建的新镜像的 base image(基础镜像),类似于面向对象里边的基础类
FROM node:8.11.3-alpine

# 设置时区
ENV TIME_ZONE=Asia/Shanghai

# 在容器内运行命令
RUN \
  mkdir -p /usr/src/app \
  && apk add --no-cache tzdata \
  && echo "${TIME_ZONE}" > /etc/timezone \ 
  && ln -sf /usr/share/zoneinfo/${TIME_ZONE} /etc/localtime 

# 创建 docker 工作目录
WORKDIR /usr/src/app

# 拷贝,把本机当前目录下的 package.json 拷贝到 Image 的 /usr/src/app/ 文件夹下
COPY package.json /usr/src/app/

# 使用 npm 安装 app 所需要的所有依赖
RUN npm i

RUN npm i --registry=https://registry.npm.taobao.org

# 拷贝本地的所有文件到路径中去
COPY . /usr/src/app

# 暴露端口。如果程序是一个服务器,会监听一个或多个端口,可以用 EXPOSE 来表示这个端口
EXPOSE 7001

# 给容器指定一个执行入口
CMD npm run start

 

将项目传到应用服务器,进入项目目录,安装docker 镜像 ,-t 后面的标识符可以改成自己 的

sudo docker build -t node/elder-egg-server .

建好镜后,启动一个容器

sudo docker run -d --name egg-server -p 7101:7101 node/egg-server


-d 为后台运行,启动后看一下是否启动成功

docker ps

docker ps

也可以通过curl命令或者到浏览器里输入应用的访问地址,来查看能否访问应用,如果可以则安装成功。

docker logs containerId
查看日志
docker logs --tail 50 --follow --timestamps containerId

1. 通过查看容器列表,找到需要停止的容器ID;

docker ps

2. 停止容器;

sudo docker stop containerId

3. 删除容器;

sudo docker rm containerId

4. 删除镜像;

# 正常情况可以删除
sudo docker rmi imageId
# 提示无法删除情况下,强制删除
sudo docker rmi -f imageId

 相关命令

镜像相关:

查看镜像构建工程

sudo docker history node/koa-server

比如上面我们构建node/koa-server这个镜像后,可以通过这个命令来查看该镜像的构建过程,来发现问题。

查看所有镜像列表

docker images

删除镜像

sudo docker rmi imageId
sudo docker rmi -f imageId

先查看镜像列表,找到要删除的镜像ID,然后使用该命令删除。-f为强制删除。

容器相关:

查看所有容器列表

docker ps
查看某个容器的信息 docker logs containerId

 

先查看容器列表,找到要查看容器的ID,然后使用该命令查看。

拷贝主机的文件到容器的目录下

docker cp src/. container:/target

src为要拷贝的目录名,container为容器的id,target为目标目录名。

进入某个容器的环境

sudo docker exec -it containerId /bin/sh

先查看容器列表,找到要查看容器的ID,然后使用该命令查看。/bin/sh可在执行docker ps后看到。退出容器可以执行exit;

 

  • 在 egg 项目的 package.json 文件中,在 start 启动项中,--daemon 是后台启动。如果使用 docker 容器,需要去除 --daemon .
  • 进入项目根目录,执行镜像打包命令: docker build -t image_name ./
  • 打包完成以后执行容器启动命令: docker run -itd --net=host --name container_name -p 8000:8000 image_name
  • -t 这个参数很重要,它代表不会进入到容器内部去执行命令,如果去掉它,会在容器内部执行启动 Dockerfile CMD 中的命令。
  • 执行完毕后,可以通过 docker ps 命令去查看,会显示正在运行的容器,如果发现容器没有正常启动,可以执行 docker logs -f containerID 命令,查看容器内的执行日志。

相关问题

  1. 容器无法正常启动:出现这种情况,首先检查你的容器打包命令是否正确,docker ps -a 命令查看你打包的所有容器. 容器打包命令中的 -itd 中的 -d 相当于在容器内部执行了 Dockerfile 文件中的 CMD 命令,我们知道在 nodejs 中执行命令后控制台会有日志输出,可以通过 docker logs -f containerID 检查日志输出。
  2. 容器正常启动,但是容器中的程序无法正常连接本地宿主机中的数据库等本地服务,首先要搞清楚服务端口号,在容器运行命令中加上对应的端口映射,比如 docker run -itd --net=host --name container_name -p 8000:8000 -p 9999:9999 image_name . --net=host 参数非常重要,这告诉容器和宿主机共享网络。这个时候,在容器内部可以通过你映射的端口号去正常访问本地服务。

Related Posts