0

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

Моя конфигурация докер-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 и фляжки.

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

Starting courseadmin_nginx_1 
Starting courseadmin_db_1 
bash-4.3# 

, а затем дополнительно сети судебно-медицинской экспертизы из внутри контейнера поворачивает вверх, что ни Nginx или дб присутствуют. Я также могу поддержать эту заявку, так как с помощью 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  | 

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

ответ

2

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

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

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

  • docker-compose up -d будет работать все в отдельном режиме. Docker compose позаботится о неявной привязке, если у вас есть правильные настройки. Для получения дополнительной информации о межконтейнерной сети с docker-compose, this был отличным ресурсом для меня. Реальные вещи на 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 
+0

The 'докеров-compose' документы я продолжаю говорить о том, можно найти здесь, а именно часть о' links': https://docs.docker.com/compose/networking/#/links – d00bsm3n

+0

Отличный пост! Это определенно помогает мне продвигаться вперед. Однако я не могу выполнить docker exec -ti $ container_id, потому что мой веб-контейнер продолжает умирать, поскольку/bin/bash не имеет ничего общего. Есть ли способ сохранить его живым, не пропуская ни одной точки входа? –

+1

На всякий случай вы не знаете, почему ** ваш контейнер 'web' умирает, см. [Здесь] (http://stackoverflow.com/a/28214133/6942595). В остальном, можете ли вы подробнее описать в своем OP то, что вы пытаетесь достичь, с помощью своей «веб-службы»? Для меня кажется, что вы можете просто сделать «image: alpine», и он настроит контейнер, в который вы можете запустить оболочку с помощью 'exec'? – d00bsm3n