正在传输 Docker 运行 脚本来编写文件 - postgres 不会 运行?
Transferring Docker run script to compose file - postgres doesn't run?
我之前运行为我的 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-compose脚本:
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 似乎不再 运行ning(连接被拒绝,netstat -al | grep postgres 没有显示),因此,应用程序无法运行.我回顾了我所做的更改,并意识到 docker-compose.yml 没有模拟我在 运行 脚本中给出的 tomcat sleep 和 curl 命令 - 应该它?我在网上找不到任何关于合适模拟的信息。这里可能还有其他事情吗?如果需要任何进一步的详细信息,请告知。
编辑: docker ps 产量:
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 容器已启动并且 运行ning,但是 postgres 不存在。 localhost 接口上唯一的 运行ning 绑定到 8005,它不是 postgres。最后我要补充一点,我能够从 Web 容器在其端口上远程登录 memcached 并确认其操作,但是我不能对 postgres 做同样的事情,我不确定为什么。
有很多东西可以可能从您的
docker-compose.yml
文件,假设数据库和memcached
服务专用于您的 Web 应用程序(也就是说,它们不
需要从其他任何地方访问)。
在服务中同时指定 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
db
或 mem
不需要 ports
指令
服务,因为您不需要将这些服务暴露给您的主机
(或其他地方)。 docker 容器可以访问另一个容器上的服务
同一网络上的容器,没有任何特殊指令。
在 web
容器中,您可以访问 db
或 mem
按名称命名的容器,因为这是 Docker 的较新版本
使用非默认网络时操作:Docker 创建一个内部
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 应用程序以访问数据库服务器
在主机 db
、端口 5432
.
在此环境和 运行 下,您可以从位于 http://localhost:8000
的主机或从位于 http://<your_hostname_or_ip_here>:8000
的网络上的主机或其他主机连接到 Web 服务.
我之前运行为我的 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-compose脚本:
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 似乎不再 运行ning(连接被拒绝,netstat -al | grep postgres 没有显示),因此,应用程序无法运行.我回顾了我所做的更改,并意识到 docker-compose.yml 没有模拟我在 运行 脚本中给出的 tomcat sleep 和 curl 命令 - 应该它?我在网上找不到任何关于合适模拟的信息。这里可能还有其他事情吗?如果需要任何进一步的详细信息,请告知。
编辑: docker ps 产量:
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 容器已启动并且 运行ning,但是 postgres 不存在。 localhost 接口上唯一的 运行ning 绑定到 8005,它不是 postgres。最后我要补充一点,我能够从 Web 容器在其端口上远程登录 memcached 并确认其操作,但是我不能对 postgres 做同样的事情,我不确定为什么。
有很多东西可以可能从您的
docker-compose.yml
文件,假设数据库和memcached
服务专用于您的 Web 应用程序(也就是说,它们不
需要从其他任何地方访问)。
在服务中同时指定 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
db
或 mem
不需要 ports
指令
服务,因为您不需要将这些服务暴露给您的主机
(或其他地方)。 docker 容器可以访问另一个容器上的服务
同一网络上的容器,没有任何特殊指令。
在 web
容器中,您可以访问 db
或 mem
按名称命名的容器,因为这是 Docker 的较新版本
使用非默认网络时操作:Docker 创建一个内部
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 应用程序以访问数据库服务器
在主机 db
、端口 5432
.
在此环境和 运行 下,您可以从位于 http://localhost:8000
的主机或从位于 http://<your_hostname_or_ip_here>:8000
的网络上的主机或其他主机连接到 Web 服务.