为什么 docker-compose 在本地工作,而不在 Amazon ecs 中工作?



我试图了解如何使用aws ecs服务,无法理解docker-compose在本地按预期工作但在使用docker上下文ecs创建期间失败的原因?图片来源为ecr。所有的信用都设置好了,例如,如果创建包含单个默认nginx映像的ecs任务,ecs也会按预期工作。我试过启动类型Fargate和EC2。

我的命令设置为运行docker-compose。

docker context create ecs temp
docker context use temp
docker compose -p "temp" up

docker-compose.yml

version: '3'
services:
reverseproxy:
image: XXXXX.dkr.ecr.us-east-1.amazonaws.com/nginx:latest
ports:
- 80:80
- 8081:8081
- 8082:8082
restart: always

apache:
depends_on:
- reverseproxy
# networks:
#     - bridge-network
image: XXXXX.dkr.ecr.us-east-1.amazonaws.com/apache:latest
restart: always
blue:
depends_on:
- reverseproxy
# networks:
#     - bridge-network
image: XXXXX.dkr.ecr.us-east-1.amazonaws.com/blue:latest
restart: always

Dockerfilesnginx

worker_processes 1;

events { worker_connections 1024; }

http {  

sendfile on;

upstream docker-apache {
server apache:80;
}
upstream docker-nginx-balancing {
server test:80;
}
proxy_set_header   Host $host;
proxy_set_header   X-Real-IP $remote_addr;
proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header   X-Forwarded-Host $server_name;

server {
listen 8081;
server_name XXX.sytes.net;

location / {
proxy_pass         http://docker-apache;
proxy_redirect     off;
}
}
server {
listen 8082;
server_name XXX.sytes.net;

location / {
proxy_pass         http://docker-nginx-balancing;
proxy_redirect     off;
}
}

server {
root /var/www/html;
index index.html;
server_name XXX.sytes.net;

location = /youtube {
return 301 https://www.youtube.com;           
}
}
}

测试:

events {
worker_connections 1024;
}
http {
server {
root /var/www/html;
index index.html;
server_name XXX.sytes.net;
location / {
try_files $uri $uri/ =404;
}
}
}
Dockerfile for nginx:
FROM nginx:alpine
COPY nginx.conf /etc/nginx/nginx.conf
EXPOSE 80/tcp
STOPSIGNAL SIGQUIT
CMD ["/usr/sbin/nginx", "-g", "daemon off;"]

apache

FROM 8ct8pus/apache-php-fpm-alpine:1.4.3
CMD ["apachectl", "-D", "FOREGROUND"]

测试
FROM nginx:alpine
COPY nginx.conf /etc/nginx/nginx.conf
CMD ["/usr/sbin/nginx", "-g", "daemon off;"]

即使您在您的机器或Linux机器上创建了docker context,它也不会像您期望的那样在ECS上工作。

你可以自己在本地测试你的docker compose应用如您所知,您可以将应用程序部署在ECS和docker-compose.yml上。

但是,您在这里遗漏了一件重要的事情,您需要在ecs-params.yml文件中指定参数,该参数创建任务定义,以便运行ECS服务。

参见ECS -cli README.md中的ECS参数选项。

这个README文件告诉你如何用下面的例子来编写ecs-params.yml:

version: 1
task_definition:
ecs_network_mode: host
task_role_arn: myCustomRole
services:
logging:
essential: false
wordpress:
cpu_shares: 100
mem_limit: 500m
mysql:
cpu_shares: 105
mem_limit: 500m
mem_reservation: 450m
docker_volumes:
- name: database_volume
scope: shared
autoprovision: true
driver: local

我使用ecs-cli命令部署我的应用程序与docker撰写,它给你相同的命令,你可以使用作为组成自己的docker撰写文件。

例如,简单的项目目录看起来像

.
├── Jenkinsfile
├── my-app-front     # Contains Dockerfile
├── my-app-backend   # Contains Dockerfile
├── docker-compose.yml
├── ecs-params.yml
└── package-lock.json

然后你可以使用ecs-cli命令按以下顺序部署你的应用程序:

你可以在GitHub README中找到ecs-cli命令的详细信息。md文件

  • cli configure
  • ecs-cli configure profile
  • docker compose -f docker-compose.yml build --no-cache
  • ecs-cli push {your-ECR-repo-url}
  • ecs-cli up
  • ecs-cli compose service up

另外:我在Jenkinsfile步骤中指定了所有命令,所以一旦你推送你的代码,Git钩子将触发我的Jenkins作业,这样它就可以顺利地部署到ECR以及提供ECS服务。

最新更新