2016-06-01 2 views
1

я был ранее запущен контейнер Docker для моего веб-приложения ниже:Перенос сценария запуска Docker для создания файла - postgres не запускается?

echo Starting postgres container... 
docker run -d -p 5432:5432 --name db my_db 
echo Postgres container started 

echo Starting memcached container... 
docker run -d -p 11211:11211 --name mem memcached 
echo Memcached container started 

echo Starting web container... 
docker run -d -p 8000:8080 --name web --link db:postgres --link  mem:memcache my_web_app 
echo Web container started 

echo Waiting for tomcat to initialize... 
sleep 5 

echo curling logon.jsf 
curl http://111.111.11.111:8000/app/logon.jsf #Real URL redacted 
echo Application started 

Который стал ниже докер-сочинять сценарий:

version: '2' 
services: 
    web: 
    image: tomcat:7.0.69-jre8 
    build: ./ci 
    ports: 
     - "8000:8080" 
    depends_on: 
     - db 
     - mem 
    db: 
    image: postgres:9.4.7 
    build: ./db 
    ports: 
     - "5432:5432" 
    environment: 
     POSTGRES_USER: admin 
     POSTGRES_PASSWORD: admin 
    mem: 
    image: memcached 
    ports: 
     - "11211:11211" 

Когда я запускаю контейнер, похоже, Postgres это не (соединение отказано, netstat -al | grep postgres не показывает его), и, таким образом, приложение не работает. Я рассмотрел изменение, которое я сделал, и понял, что docker-compose.yml не имеет аналога для команды tomcat sleep и curl, которую я дал в сценарии запуска - не так ли? Я не мог найти информацию в Интернете относительно правильного аналога. Здесь есть что-то еще? Пожалуйста, сообщите, если требуются какие-либо дополнительные данные.

EDIT: Докер пс выходы:

CONTAINER ID  IMAGE    COMMAND     CREATED    STATUS    PORTS      NAMES 
a942be02fc22  tomcat:7.0.69-jre8 "catalina.sh run"  5 minutes ago  Up About a minute 0.0.0.0:8000->8080/tcp  memcachedocker_web_1 
fd6074cf8ec9  postgres:9.4.7  "/docker-entrypoint.s" 5 minutes ago  Up About a minute 0.0.0.0:5432->5432/tcp  memcachedocker_db_1 
ce18771fee28  memcached   "/entrypoint.sh memca" 5 minutes ago  Up About a minute 0.0.0.0:11211->11211/tcp memcachedocker_mem_1 

и журналы для контейнера:

Success. You can now start the database server using: 

postgres -D /var/lib/postgresql/data 
or 
pg_ctl -D /var/lib/postgresql/data -l logfile start 

waiting for server to start....LOG: database system was shut down at 2016-06-01 13:09:23 UTC 
LOG: MultiXact member wraparound protections are now enabled 
LOG: database system is ready to accept connections 
LOG: autovacuum launcher started 
done 
server started 
CREATE DATABASE 

CREATE ROLE 


/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/init.sql 
CREATE DATABASE 


LOG: received fast shutdown request 
LOG: aborting any active transactions 
LOG: autovacuum launcher shutting down 
LOG: shutting down 
waiting for server to shut down....LOG: database system is shut down 
done 
server stopped 

PostgreSQL init process complete; ready for start up. 

LOG: database system was shut down at 2016-06-01 13:09:25 UTC 
LOG: MultiXact member wraparound protections are now enabled 
LOG: database system is ready to accept connections 
LOG: autovacuum launcher started 

и, таким образом, внутри контейнера:

Proto Recv-Q Send-Q Local Address   Foreign Address   State  
tcp  0  0 127.0.0.11:44095  0.0.0.0:*    LISTEN  
tcp  0  0 172.18.0.4:38868  132.246.2.23:80   TIME_WAIT 
tcp  0  0 172.18.0.4:36424  5.153.231.35:80   TIME_WAIT 
tcp6  0  0 127.0.0.1:8005   :::*     LISTEN  
tcp6  0  0 :::8009     :::*     LISTEN  
tcp6  0  0 :::8080     :::*     LISTEN  
tcp6  0  0 172.18.0.4:47522  172.18.0.2:11211  ESTABLISHED 
tcp6  0  0 172.18.0.4:47518  172.18.0.2:11211  ESTABLISHED 
tcp6  0  0 172.18.0.4:47524  172.18.0.2:11211  ESTABLISHED 
tcp6  0  0 172.18.0.4:47520  172.18.0.2:11211  ESTABLISHED 
tcp6  0  0 172.18.0.4:47516  172.18.0.2:11211  ESTABLISHED 
tcp6  0  0 172.18.0.4:47514  172.18.0.2:11211  ESTABLISHED 
udp  0  0 172.18.0.4:48360  10.0.2.3:53    ESTABLISHED 
udp  0  0 127.0.0.11:40276  0.0.0.0:*       

Мы можем видеть что контейнер memcached запущен и запущен, однако postgres - это bsent. Единственное, что работает на интерфейсе localhost, связано с 8005, и это не postgres. Я должен добавить, наконец, что я могу telnet memcached на своем порту из веб-контейнера и подтвердить его работу, однако я не могу сделать то же самое с postgres, и я не уверен, почему.

+0

«похоже, что постгрес уже не работает» Ну, не так ли? Вот что такое 'docker ps' (или' docker-compose ps'). И если он провалил 'docker logs', может показать вам, почему. Кроме того, что-то ужасно неправильно с отступом документа 'docker-compose.yml', который вы опубликовали; если вы потратите немного времени, чтобы очистить его, вы избегаете ответов в строках «это не может работать». – larsks

+0

Приношу свои извинения, я всегда сталкиваюсь с вводом кода в Stack Overflow - он только идрит первую строку правильно, и я должен сделать все остальное вручную. Да, согласно доккеру ps, контейнер работает, а на правильном порту - я добавил этот ответ, журналы и результат netstat. –

+0

Когда я подключился к контейнеру _db_1, я вижу, что там работает postgres. Как я могу преодолеть разрыв? –

ответ

3

Есть целый ряд вещей, которые могут вероятно быть удалены из вашего docker-compose.yml файла, при условии, что база данных и Memcached услуги предназначены для вашего веб-приложения (то есть, они не должны быть доступны из другого места).

Это не имеет смысла задавать и image и build в определении службы , поэтому я сделал несколько предположений о том, что вы на самом деле хотите .

Я хотел бы начать с чем-то вроде этого:

version: '2' 
services: 
    web: 
    build: ./ci 
    ports: 
     - '8000:8080' 
    depends_on: 
     - db 
     - mem 
    db: 
    image: postgres 
    environment: 
     POSTGRES_USER: admin 
     POSTGRES_PASSWORD: admin 
    mem: 
    image: memcached 

Вам не нужно ports директивы либо на db или mem услуг, потому что вы не должны подвергать эти услуги на хост (или в другом месте). Контейнер докера может получить доступ к услугам на другом контейнере в той же сети без каких-либо специальных директив.

В web контейнере, вы можете получить доступ к любому контейнеру db или mem по имени, потому что это как более новые версии Докера работают при использовании не по умолчанию сети: Docker создает внутреннюю DNS службы и регистрирует там есть имена контейнеров.Так, например, внутри web контейнера можно использовать линию PostGreSQL клиента в psql команду для подключения к серверу базы данных, как это:

$ docker exec -it myservice_web_1 sh 
web_1# psql -h db -U admin 
Password for user admin: 
psql (9.4.6, server 9.5.1) 
WARNING: psql major version 9.4, server major version 9.5. 
     Some psql features might not work. 

admin=# 

Вы бы настроить веб-приложение для доступа к серверу базы данных в принимающий сторона db, port 5432.

С помощью этой среды вы можете подключиться к вашему веб-сервису со своего хоста по адресу http://localhost:8000 или с вашего хоста или другого хоста в сети по адресу http://<your_hostname_or_ip_here>:8000.

+0

«Вы должны настроить ваше веб-приложение для доступа к серверу базы данных на хосте db, порт 5432». GAH! Если бы вы поверили после всего этого, у моего хранилища.xml все еще была ссылка на localhost на одном из URL-адресов подключения, которые вызывали мою головную боль ... Большое спасибо за вашу помощь в очистке/консолидации моего файла компоновки и помогли мне понять докер немного лучше. –

Смежные вопросы