Docker-Machine,我们无法连接到docker_machine_ip的服务器



我一直跟随这本书使用Docker, Flask和React的微服务形成testdriven.io。

在用flask, Postgres创建和配置容器并运行以下命令docker-compose -f docker-compose-dev.yml up -d --build之后,一切看起来都很好,但是我无法从host访问web服务器。

输出为

docker-compose -f docker-compose-dev.yml up -d
[+] Running 2/2
 ⠿ Container testdriven-app-users-db-1  Running  0.0s                                                       
 ⠿ Container testdriven-app-users-1     Started  1.1s                                                       
  • 当我去到URL: http://docker_machine_ip:5001/users/ping这是我应该得到的:
{
    "message": "pong!",
    "status": "success"
}

但不能访问web服务器,仍然不明白的方式?

  • Dockerfile-dev
# base image
FROM python:3.9.12-alpine
# new
# install dependencies
RUN apk update && 
    apk add --virtual build-deps gcc python3-dev musl-dev && 
    apk add postgresql-dev && 
    apk add netcat-openbsd
# set working directory
WORKDIR /usr/src/app
# add and install requirements
COPY ./requirements.txt /usr/src/app/requirements.txt
RUN pip install -r requirements.txt
# new
# add entrypoint.sh
COPY ./entrypoint.sh /usr/src/app/entrypoint.sh
RUN chmod +x /usr/src/app/entrypoint.sh
# add app
COPY . /usr/src/app
# run server
CMD ["/usr/src/app/entrypoint.sh"]
  • docker-compose-dev.yml
version: '3.6'
services:
  users:
    build:
      context: ./services/users
      dockerfile: Dockerfile-dev
    volumes:
      - './services/users:/usr/src/app'
    ports:
      - 5001:5000
    environment:
      - FLASK_APP=project/__init__.py
      - FLASK_ENV=development
      - APP_SETTINGS=project.config.DevelopmentConfig
      - DATABASE_URL=postgres://postgres:postgres@users-db:5432/users_dev
      - DATABASE_TEST_URL=postgres://postgres:postgres@users-db:5432/users_test
    depends_on:
      - users-db
  users-db:
    build:
      context: ./services/users/project/db
      dockerfile: Dockerfile
    ports:
      - 5435:5432
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres

您需要创建一个网络

networks:
  user_network:

然后使用

连接这两个网络
networks:
  - user_network

那么您将需要一个DATABASE_HOST="users-db"(容器db的名称)

你可以在flask中使用这个HOST,比如
app = Flask(__name__)
app.config['HOST'] = os.getenv('DATABASE_HOST', 'users-db')
app.config['USER'] = <you know what it is>
app.config['PASSWORD'] = <you know what it is>
app.config['DB'] = <you know what it is>

你现在可以使用上面的信息连接了。

加在一起看起来就像下面

version: '3.6'
services:
  users:
    build:
      context: ./services/users
      dockerfile: Dockerfile-dev
    volumes:
      - './services/users:/usr/src/app'
    ports:
      - 5001:5000
    environment:
      - FLASK_APP=project/__init__.py
      - FLASK_ENV=development
      - APP_SETTINGS=project.config.DevelopmentConfig
      - DATABASE_HOST='users-db'
      - DATABASE_URL=postgres://postgres:postgres@users-db:5432/users_dev
      - DATABASE_TEST_URL=postgres://postgres:postgres@users-db:5432/users_test
    networks:
      - user_network
    depends_on:
      - users-db
  users-db:
    build:
      context: ./services/users/project/db
      dockerfile: Dockerfile
    ports:
      - 5435:5432
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
    networks:
      - user_network
networks:
  user_network:

最新更新