转移docker运行脚本撰写文件 – postgres不运行?

我以前运行我的Web应用程序的Docker容器如下:

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 

这成为下面的docker撰写脚本:

 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命令没有任何模拟 – 是否应该这样做? 我无法在网上find有关正确的模拟信息。 这里还有其他可能的事情吗? 请告知是否需要进一步的细节。

编辑:dockerps产量:

 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不存在。 在localhost接口上运行的唯一的东西是绑定到8005,而不是postgres。 我最后应该补充说,我能够从web容器上远程login其端口上的memcached,并确认它的操作,但是我不能用postgres做同样的事情,我不知道为什么。

假设数据库和memcached服务专用于Web应用程序(也就是说,他们不需要从其他地方访问),那么可能会从docker-compose.yml文件中删除很多东西。

在服务定义中指定imagebuild是没有意义的,所以我已经对你实际需要做了一些假设。

我会从这样的事情开始:

 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 

您不需要dbmem服务的ports指令,因为您不需要将这些服务公开给主机(或其他地方)。 docker服务器容器可以访问同一networking中另一个容器上的服务,无需任何特殊的指示。

web容器中,可以通过名称访问dbmem容器,因为这是使用非默认networking时Docker的新版本的操作方式:Docker创build一个内部DNS服务并在其中注册容器名称。 所以,例如,从web容器内部我可以使用psql命令行postgresql客户端连接到数据库服务器,如下所示:

 $ 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=# 

您可以将您的Web应用程序configuration为在主机db端口5432上访问数据库服务器。

在此环境启动并运行的情况下,您可以通过http://localhost:8000从您的主机连接到Web服务,或者从您的主机或networking上的其他主机http://<your_hostname_or_ip_here>:8000连接到您的Web服务。