Как разрешить доступ к контейнеру докеров на экземпляре EC2

У меня есть процесс сборки, который выглядит так:

1. Код, отправленный в BitBucket, который принимается BitBucker Pipelines

image: node:8.2.1
pipelines:
  default:
    - step:
        name: Push Server to AWS Repository
        script:
          - docker login -u AWS -p $AWS_ECR_LOGIN https://$AWS_ECR_URL
          - docker build -t dev .
          - docker tag dev:latest $AWS_ECR_URL/dev:latest
          - docker push $AWS_ECR_URL/dev:latest

options:
  docker: true

2. BitBucket Pipelines создает образ Docker из файла Dockerfile в репозитории и отправляет его в Amazon ECR.

# BUILD DEV IMAGE and TEST
FROM node:8.2.1 as builder
COPY ./ /user/src/app
WORKDIR /user/src/app
RUN npm install -g grunt-cli --quiet
RUN npm install --quiet
RUN grunt build
# RUN npm test:build

# BUILD APP IMAGE
FROM node:8.2.1
COPY --from=builder /user/src/app/dist /user/src/app/
WORKDIR /user/src/app
RUN npm install -g mongodb-migrations --quiet
RUN npm install --only=prod --quiet
EXPOSE 5000
CMD npm start

3. Задание Jenkins отслеживает новые образы в ECR и удаленно запускает экземпляр EC2 для получения и перезапуска образа Docker.

let dockerApi = new Docker({
    host: DockerIpAddress,
    port: process.env.DOCKER_PORT || 2375,
    version: 'v1.32' // required when Docker >= v1.13, https://docs.docker.com/engine/api/version-history/
});

dockerApi.createContainer({
    Image: IMAGE_NAME,
    AttachStdout: true,
    AttachStderr: true,
    Tty: true,
    Env: [`NODE_ENV=${ENV}`],
    ExposedPorts: {
        "5000/tcp": {},
    },
    HostConfig:{
        PortBindings: {
            "5000/tcp": [{
                "HostPort": "5000"
            }],
        },
    },
})

Проблема

До этого момента - все работает! Мой док-контейнер работает на экземпляре ec2. Что не работает, так это то, что я не могу получать какие-либо соединения. Даже из ssh'd в экземпляр ec2 curl http://localhost:5000 не сработает. Доступ к экземпляру ec2 из браузера через общедоступный IP-адрес или общедоступный хост также не работает.

IP-таблицы

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy DROP)
target     prot opt source               destination
DOCKER-ISOLATION  all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
DOCKER     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain DOCKER (1 references)
target     prot opt source               destination
ACCEPT     tcp  --  anywhere             ip-172-17-0-2.ec2.internal  tcp dpt:5000

Chain DOCKER-ISOLATION (1 references)
target     prot opt source               destination
RETURN     all  --  anywhere             anywhere

Sysctl

$ sysctl net.ipv4.conf.all.forwarding
net.ipv4.conf.all.forwarding = 1

Node Server в Docker Последняя строка вывода

Server running at: http://localhost:5000

person Bradley    schedule 09.11.2017    source источник


Ответы (1)


Убедитесь, что файл Dockerfile, который вы используете для создания образа, запускает скрипт, который предоставляет сервер в 0.0.0.0, а не в localhost.

Вы должны открывать 0.0.0.0:5000->5000 и не запускать на локальном хосте!!

Надеюсь это поможет.

person MarBVI    schedule 14.11.2017