Accessing links with docker compose
我有一个与Express服务器通信的Angular应用程序。我已将Angular应用程序链接到Express服务器。我可以在角容器中ping链接,但在代码中使用时会显示错误。
Docker撰写文件
1 2 3 4 5 6 7 8 9 10 11 12 | myexpress: build: express-server links: -"mymongodb:mongo" ports: -"8080:3000" angular: build: angular links: -"myexpress:express" ports: -"4200:4200" |
我可以访问http://localhost:4200/上的应用程序。HTTP调用的代码片段是:
1 2 3 | return this.http.post('http://express:3000/signup', body, {headers: headers}) .map((response: Response) => response.json()) .catch((error: Response) => Observable.throw(error.json())); |
控制台显示以下错误:
如何从角度容器访问链接?
容器之间的通信通过其主机名进行。默认情况下,服务名被认为是主机名,因此应该使用
此外,还可以单独指定主机名。更多详细信息。
这是旧的,但我使用的是类似的东西,我意识到我的浏览器运行在主机中,而不是任何服务的容器中。
那么主机就不能访问Express域,因为该域不在主机网络中,而是在Docker网络中。
我为nginx创建了一个配置来处理这个问题,我希望这可以帮助一些人:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | // default environment export const environment = { production: false, apiUrl: 'http://localhost:3000' // this is for development purpose }; // prod environment // used when build is created for the docker image export const environment = { production: true, apiUrl: '' // empty string: for the api redirection @fallback conf }; // angular service urlBase = `${environment.apiUrl}/apiEndpoint`; findById(id){ let headers = new HttpHeaders( { 'Content-Type': 'application/json'}); let request = this.http.get( `${this.urlBase}/${id}`, {headers: headers}); return request.toPromise(); } //nginx.conf server { listen 80; location / { #serve angular built root /usr/share/nginx/html; index index.html index.htm; #try files, if a path fails in angular then the fallback is used try_files $uri $uri/index.html @fallback; } #fallback for express redirect location @fallback{ #set the backend fallback, this will send requests to express container #in the frontend baseUrl should be empty proxy_pass http://express:3000; #set the backend service domain here } } |
另外,这两个服务应该属于同一个网络,您必须将nginx配置装入Web容器中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | version:"3" networks: mean: services: web: build: client image: mean-frontend ports: -"80:80" depends_on: - express networks: - mean volumes: - ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf restart: always express: build: server image: mean-backend ports: -"3000:3000" depends_on: - mongo environment: WAIT_HOSTS: mongo:27017 networks: - mean mongo: image: mongo restart: always volumes: - ./dbData:/data/db networks: - mean |
最后,浏览器将调用Angular应用程序,当Angular中的路径无效时,回退将使用Docker网络将调用重定向到Express服务。
我认为您在撰写文件中缺少容器名称选项。
1 2 3 4 5 6 7 8 9 10 11 12 13 | myexpress: build: express-server container_name: myexpress links: -"mymongodb:mongo" ports: -"8080:3000" angular: build: angular links: -"myexpress:express" ports: -"4200:4200" |