访问与docker组成的链接

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()));

控制台显示以下错误:enter image description here

如何从角度容器访问链接?


容器之间的通信通过其主机名进行。默认情况下,服务名被认为是主机名,因此应该使用http://myexpress:3000连接到myexpress

此外,还可以单独指定主机名。更多详细信息。


这是旧的,但我使用的是类似的东西,我意识到我的浏览器运行在主机中,而不是任何服务的容器中。

那么主机就不能访问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"