提问者:小点点

Aws ec2实例在使用docker和gitlab配置项cd时不断崩溃


我有一个aws ec2微实例(ubuntu服务器),我用它托管了几个web应用程序和一个api服务器。 我使用docker和gitlab ci cd来部署在Node中编写的api服务器。 每当我试图运行构建作业时,它就会崩溃,所有托管的应用程序都无法访问。

Dockerfile是

FROM node:12.3.1
LABEL maintainer Venkatesh A <av1998av@gmail.com>
WORKDIR /www/techdoc-api
ARG db_username
ARG db_password
ARG port
ARG jwt_secret
ARG jwt_expiry
ARG link_text
ARG app_link_text
ARG NODE_ENV
ARG redis_host
ARG redis_port
ARG razorpay_id
ARG razorpay_key
RUN npm install pm2 -g
RUN npm install babel-cli -g
RUN apt-get update && apt-get install -y \
  vim
ADD package.json /www/techdoc-api
RUN npm install --production
ADD . /www/techdoc-api
COPY docker-entrypoint.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/docker-entrypoint.sh
RUN cd /www/techdoc-api
RUN rm -f .env
RUN touch .env
RUN echo "port=$port \n\
redis_port=$redis_port \n\
redis_host=$redis_host \n\
razorpay_id=$razorpay_id \n\
razorpay_key=$razorpay_key \n\
db_username=$db_username \n\
db_password=$db_password \n\
link_text=$link_text \n\
app_link_text=$app_link_text \n\
jwt_secret=$jwt_secret \n\
jwt_expiry=$jwt_expiry \n\
NODE_ENV=$NODE_ENV" >> ./.env
EXPOSE 3000
ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"]

docker compose文件如下所示:

version: '2.2'
services:
    mysql:
        build: ./config/docker_db_config
        environment:
            - MYSQL_ALLOW_EMPTY_PASSWORD=yes
        healthcheck:
            test: "exit 0"
        restart: always
    redis:
        image: 'redis'
        ports: 
            - "6379:6379"
    api:
        build: .
        depends_on:
            mysql:
                condition: service_healthy
        entrypoint:
            - /usr/local/bin/docker-entrypoint.sh
        restart: always
        ports:
            - "3000:3000"

gitlab-ci.yml如下所示。。。

image: docker:stable

services:
  - docker:dind

stages:
  - build
  - deploy

cache:
  paths:
    - node_modules/

build_app:
  stage: build
  script:
    - docker-compose build mysql
    - docker-compose build redis
    - docker-compose build --build-arg db_username="${db_username}" --build-arg db_password="${db_password}" --build-arg  jwt_secret="${jwt_secret}" --build-arg  NODE_ENV="${NODE_ENV}" --build-arg port="${port}" --build-arg redis_port="${redis_port}" --build-arg redis_host="${redis_host}" --build-arg jwt_expiry="${jwt_expiry}" --build-arg razorpay_key="${razorpay_key}" --build-arg razorpay_id="${razorpay_id}" --build-arg link_text="${link_text}" --build-arg app_link_text="${app_link_text}" api
    - echo "Build successful."
    - docker-compose up -d
    - echo "Deployed!!"  
  only: 
    - master
    

是否应在运行新作业之前删除旧容器? 我是否应该在某个地方缓存节点模块? 在运行作业之前,我是否应该确保有足够的空间?

对上述设计中的建议和更改持开放态度。

(注意:我所说的“崩溃”是指我无法ssh进入服务器,除非我重新启动它,并且托管的web应用程序无法访问。)


共2个答案

匿名用户

(注意:我所说的“崩溃”是指我无法ssh进入服务器,除非我重新启动它,并且托管的web应用程序无法访问。)

在运行下面,这三个服务足以使您的微实例崩溃。

  • Redis
  • MySQL
  • 节点
t2.micro
RAM 1GB 
VCPU 1

因此您可能需要一个更大或更好的实例来在实例之外构建应用程序。

您只需在部署期间使用以下命令进行检查,就可以查看这三个服务消耗的内存docker stats

CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS
f2ebb9370858        node                0.00%               9.078MiB / 15.54GiB   0.06%               6.6kB / 0B          29.1MB / 0B         11
7f5b2daf3a22        redis               0.19%               18.62MiB / 15.54GiB   0.12%               9.94kB / 0B         13MB / 0B           5
378dcc2af8a9        mysql               0.87%               364MiB / 15.54GiB     2.29%               23.8kB / 0B         471kB / 328MB       37

这些服务都在空闲状态下运行,什么也不做,但内存消耗仍然在500mb左右。

因此可能会出现一个容器占用整个内存的情况,您可以在部署期间使用docker stats对此进行调试。

在运行作业之前,我是否应该确保有足够的空间?

更好的做法是清理所有进程并停止所有容器,这样就会为部署创造一些空间。 与构建相比,节点模块的安装并不是那么繁重的过程。

匿名用户

(Note: By 'crashing' I mean that im not able to ssh into the server unless i reboot it and the hosted web apps are unreachable)

看你这里的句子。。。。。 我想你的cpu或内存有问题

我们需要实时排除服务器故障

  1. 保持登录到服务器
  2. 运行管道
  3. 监视ec2资源。。。。 使用top/htop和磁盘也

我认为您的实例太小,无法处理您的作业请求。