如何允许访问 EC2 实例上的 docker 容器
How do I allow access to the docker container on an EC2 instance
我的构建过程如下所示:
1。代码推送到 BitBucket,由 BitBucker 管道接收
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 管道从存储库中的 Docker 文件构建 Docker 图像并将其推送到 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"
}],
},
},
})
问题
到目前为止 - 一切正常!我的 docker 容器是 ec2 实例上的 运行。不起作用的是我无法接收任何连接。即使从 ssh 进入 ec2 实例,curl http://localhost:5000
也不起作用。通过 public ip 或 public 主机从浏览器访问 ec2 实例也不起作用。
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
Docker 最后一行输出中的节点服务器
Server running at: http://localhost:5000
检查您用于创建图像的 Dockerfile 运行 是一个在 0.0.0.0 而不是在本地主机中公开服务器的脚本。
您应该在本地主机中打开 0.0.0.0:5000->5000 而不是 运行!!
希望对您有所帮助。
我的构建过程如下所示:
1。代码推送到 BitBucket,由 BitBucker 管道接收
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 管道从存储库中的 Docker 文件构建 Docker 图像并将其推送到 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"
}],
},
},
})
问题
到目前为止 - 一切正常!我的 docker 容器是 ec2 实例上的 运行。不起作用的是我无法接收任何连接。即使从 ssh 进入 ec2 实例,curl http://localhost:5000
也不起作用。通过 public ip 或 public 主机从浏览器访问 ec2 实例也不起作用。
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
Docker 最后一行输出中的节点服务器
Server running at: http://localhost:5000
检查您用于创建图像的 Dockerfile 运行 是一个在 0.0.0.0 而不是在本地主机中公开服务器的脚本。
您应该在本地主机中打开 0.0.0.0:5000->5000 而不是 运行!!
希望对您有所帮助。