我试图了解如何使用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服务。