访问与docker组成的链接

时间:2017-08-17 07:27:55

标签: docker docker-compose dockerfile

我有一个与快速服务器通信的角度应用程序。我已将角度应用程序链接到快速服务器。我可以ping角度容器内的链接,但在代码中使用时会显示错误。

Docker撰写文件

myexpress: 
    build: express-server 
    links:
      - "mymongodb:mongo"
    ports:
      - "8080:3000" 
  angular: 
    build: angular 
    links:
      - "myexpress:express"
    ports:
      - "4200:4200" 

我可以在http://localhost:4200/访问该应用程序。 http调用的代码片段是:

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

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

3 个答案:

答案 0 :(得分:1)

容器之间的通信通过其主机名进行。默认情况下,服务名称被视为主机名,因此您应使用extends连接到{'active_menu': 'index'}

此外,您可以单独指定主机名。更多详情here

答案 1 :(得分:0)

我认为你错过了撰写文件中的 container_name 选项。

myexpress: 
    build: express-server 
    container_name: myexpress
    links:
      - "mymongodb:mongo"
    ports:
      - "8080:3000" 
angular: 
    build: angular 
    links:
        - "myexpress:express"
    ports:
        - "4200:4200" 

答案 2 :(得分:0)

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

然后主机无权访问快速域,因为该域位于Docker网络中而不是主机网络中

我为nginx创建了一个配置来处理此问题,希望这可以对某人有所帮助:

// 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容器中

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网络将调用重定向到快递服务