Терминал с докером

Я хотел бы связать три сервиса вместе (db, nginx и веб-сервис) в мостовой сети и иметь возможность подключаться к различным сервисам с моего локального хоста или из контейнера, а также иметь интерактивный терминал для веб-сервиса. Как мне этого добиться?

Моя конфигурация docker-compose следующая:

version: '2'
services:
  web:
    build:
      context: .
      dockerfile: Dockerfile-alpine
    command: /bin/bash
    ports:
      - "5000:5000"
    volumes:
      - $REPO_DIR:/repository
    links:
      - db
      - nginx
  nginx:
    image: nginx:stable-alpine
    ports:
      - "8080:8080"
    volumes:
      - $NGINX_STATIC_DIR:/var/www/static
      - $NGINX_CONFIG_FILE:/etc/nginx/nginx.conf
  db:
    image: mysql/mysql-server
    ports:
      - "3307:3306"
    environment:
      MYSQL_USER: $MYSQL_USER
      MYSQL_PASSWORD: $MYSQL_PASSWORD
      MYSQL_DATABASE: $MYSQL_DATABASE
      MYSQL_ROOT_PASSWORD: $MYSQL_ROOT_PASSWORD
    volumes:
      - $DB_DATA_DIR:/var/lib/mysql
      - $DB_LOG_DIR:/var/log/mysql

где веб-сервис использует mhart/alpine-node:6.7.0 в качестве базы и далее добавляет некоторые утилиты плюс Python3.5 и Flask.

Если я сделаю docker-compose run webЯ получаю доступ к интерактивному терминалу, но службы db и nginx не загружаются / не связаны должным образом. Я получаю следующий вывод:

Starting courseadmin_nginx_1
Starting courseadmin_db_1
bash-4.3#

И тогда обнаруживается, что изнутри контейнера появляется еще одна криминалистическая экспертиза, что ни nginx, ни db отсутствуют. Я могу также поддержать это требование, так как с помощью docker-compose up фактически создал конфликт портов для службы db, учитывая, что на моей хост-системе установлен mysql, о чем он никогда не сообщал docker-compose run,

С другой стороны, если я попытаюсь docker-compose upЯ получаю гораздо более активную трассировку, но без интерактивного терминала:

Starting courseadmin_nginx_1
Recreating courseadmin_db_1
Recreating courseadmin_web_1
Attaching to courseadmin_nginx_1, courseadmin_db_1, courseadmin_web_1
db_1     | Initializing database
courseadmin_web_1 exited with code 0
db_1     | Database initialized
db_1     | MySQL init process in progress...
db_1     | Warning: Unable to load '/usr/share/zoneinfo/iso3166.tab' as time zone. Skipping it.
db_1     | Warning: Unable to load '/usr/share/zoneinfo/zone.tab' as time zone. Skipping it.
db_1     | mysql: [Warning] Using a password on the command line interface can be insecure.
db_1     | mysql: [Warning] Using a password on the command line interface can be insecure.
db_1     | mysql: [Warning] Using a password on the command line interface can be insecure.
db_1     | mysql: [Warning] Using a password on the command line interface can be insecure.
db_1     | 
db_1     | /entrypoint.sh: ignoring /docker-entrypoint-initdb.d/*
db_1     | 
db_1     | 
db_1     | MySQL init process done. Ready for start up.
db_1     | 

Что я могу сделать, чтобы создать интерактивный терминал и правильно связать мои три контейнера?

1 ответ

Решение

Я не совсем уверен, что полностью понял ваш вопрос, поэтому я постараюсь ответить на ту часть, которую могу:

На первый взгляд, ваш docker-compose.yml файл выглядит нормально, и правильное выполнение docker-compose up Команда, кажется, подтверждает это. Однако вы указываете version: '2', От docker-compose Документы, начиная с версии 2, связывание выполняется неявно docker-compose сам (я добавлю ссылки в комментариях, так как мне не хватает репутации). Это означает, что вы можете удалить links: часть (если вы не хотите явно указать эти псевдонимы, в этом случае вы можете игнорировать эту часть). Я думал, что большой ресурс, объясняющий разницу между V1 и V2, заключался в следующем (он охватывает links в шаге 2 поста), но вы также можете проверить docker-compose docs,

В остальном мои предложения:

  • docker-compose up -d будет запускать все в отдельном режиме. Docker compose позаботится о неявном связывании, если оно правильно настроено. Для получения дополнительной информации о межконтейнерной сети с docker-compose это был большой ресурс для меня. Реальные вещи на docker-compose начинается в разделе 3.3 этой страницы.
  • Как только все заработало, docker ps -a покажет вам активные контейнеры
  • Чтобы запустить "интерактивный терминал", просто сделайте docker exec -it $container_id bash если я правильно помню. Это запустит терминал в этом контейнере. exec выполняет команду в указанном контейнере, в то время как i флаг запускает "интерактивный" терминал, t флаг определяет уровень TTY, и bash тип оболочки.

Если бы я мог добавить дополнительную рекомендацию, добавьте depends_on: класс в вашем web конфигурации. Это заставит ваш веб-контейнер ожидать полного запуска SQL и Nginx. Вот так:

services:
  web:
    [...]
    depends_on:
      - nginx
      - db
Другие вопросы по тегам