最近几天,我的Docker容器(SonarQube)在启动后几秒钟就崩溃了。它似乎无法再连接数据库容器。我怎样才能将它们重新连接在一起?
MySQL容器run
命令:
docker run -d --name mysql-sonarqube-container \
-e MYSQL_ROOT_PASSWORD=root \
-p 3307:3306 \
-v /etc/mysql:/etc/mysql/conf.d \
mysql:latest
MySQL用户创建:
use sonar;
CREATE USER 'sonar'@'DOCKER_BRIDGE_IP_ADDRESS' IDENTIFIED BY 'sonar';
GRANT ALL PRIVILEGES ON *.* TO 'sonar'@'DOCKER_BRIDGE_IP_ADDRESS' WITH GRANT OPTION;
SonarQube容器run
命令:
docker run -d --name sonarqube-container \
--link mysql-sonarqube-container:mysql \
-p 9000:9000 -p 9092:9092 \
-e SONARQUBE_JDBC_USERNAME=sonar \
-e SONARQUBE_JDBC_PASSWORD=sonar \
-e SONARQUBE_JDBC_URL="jdbc:mysql://SERVER_IP_ADDRESS:3307/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true" \
-e SONARQUBE_HOST_URL="http://DOCKER_BRIDGE_IP_ADDRESS:9000" \
sonarqube:latest
以下是Docker日志:
15:31:25.022 [main] WARN org.sonar.application.JdbcSettings - JDBC URL is recommended to have the property 'useConfigs=maxPerformance'
2016.12.05 15:31:25 INFO app[][o.s.a.AppFileSystem] Cleaning or creating temp directory /opt/sonarqube/temp
2016.12.05 15:31:25 INFO app[][o.s.p.m.JavaProcessLauncher] Launch process[es]: /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java -Djava.awt.headless=true -Xmx1G -Xms256m -Xss256k -Djna.nosys=true -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:+HeapDumpOnOutOfMemoryError -Djava.io.tmpdir=/opt/sonarqube/temp -javaagent:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/management-agent.jar -cp ./lib/common/*:./lib/search/* org.sonar.search.SearchServer /opt/sonarqube/temp/sq-process7139915507080636494properties
2016.12.05 15:31:25 INFO es[][o.s.p.ProcessEntryPoint] Starting es
2016.12.05 15:31:25 INFO es[][o.s.s.EsSettings] Elasticsearch listening on /127.0.0.1:9001
2016.12.05 15:31:25 INFO es[][o.elasticsearch.node] [sonarqube] version[2.3.3], pid[21], build[218bdf1/2016-05-17T15:40:04Z]
2016.12.05 15:31:25 INFO es[][o.elasticsearch.node] [sonarqube] initializing ...
2016.12.05 15:31:25 INFO es[][o.e.plugins] [sonarqube] modules [], plugins [], sites []
2016.12.05 15:31:25 INFO es[][o.elasticsearch.env] [sonarqube] using [1] data paths, mounts [[/opt/sonarqube/data (/dev/mapper/centos_rns170lv-root)]], net usable_space [22.4gb], net total_space [33.8gb], spins? [possibly], types [xfs]
2016.12.05 15:31:25 INFO es[][o.elasticsearch.env] [sonarqube] heap size [990.7mb], compressed ordinary object pointers [true]
2016.12.05 15:31:27 INFO es[][o.elasticsearch.node] [sonarqube] initialized
2016.12.05 15:31:27 INFO es[][o.elasticsearch.node] [sonarqube] starting ...
2016.12.05 15:31:27 INFO es[][o.e.transport] [sonarqube] publish_address {127.0.0.1:9001}, bound_addresses {127.0.0.1:9001}
2016.12.05 15:31:27 INFO es[][o.e.discovery] [sonarqube] sonarqube/IxxWMoHCRhevseLUIhO9tw
2016.12.05 15:31:30 INFO es[][o.e.cluster.service] [sonarqube] new_master {sonarqube}{IxxWMoHCRhevseLUIhO9tw}{127.0.0.1}{127.0.0.1:9001}{rack_id=sonarqube, master=true}, reason: zen-disco-join(elected_as_master, [0] joins received)
2016.12.05 15:31:30 INFO es[][o.elasticsearch.node] [sonarqube] started
2016.12.05 15:31:30 INFO es[][o.e.gateway] [sonarqube] recovered [0] indices into cluster_state
2016.12.05 15:31:30 INFO app[][o.s.p.m.Monitor] Process[es] is up
2016.12.05 15:31:30 INFO app[][o.s.p.m.JavaProcessLauncher] Launch process[web]: /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djruby.management.enabled=false -Djruby.compile.invokedynamic=false -Xmx512m -Xms128m -XX:+HeapDumpOnOutOfMemoryError -Djava.security.egd=file:/dev/./urandom -Djava.io.tmpdir=/opt/sonarqube/temp -javaagent:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/management-agent.jar -cp ./lib/common/*:./lib/server/*:/opt/sonarqube/lib/jdbc/mysql/mysql-connector-java-5.1.39.jar org.sonar.server.app.WebServer /opt/sonarqube/temp/sq-process614082345862607988properties
2016.12.05 15:31:31 INFO web[][o.s.p.ProcessEntryPoint] Starting web
2016.12.05 15:31:31 INFO web[][o.s.s.a.TomcatContexts] Webapp directory: /opt/sonarqube/web
2016.12.05 15:31:31 INFO web[][o.a.c.h.Http11NioProtocol] Initializing ProtocolHandler ["http-nio-0.0.0.0-9000"]
2016.12.05 15:31:31 INFO web[][o.a.t.u.n.NioSelectorPool] Using a shared selector for servlet write/read
2016.12.05 15:31:31 INFO web[][o.e.plugins] [Obituary] modules [], plugins [], sites []
2016.12.05 15:31:32 INFO web[][o.s.s.e.EsClientProvider] Connected to local Elasticsearch: [127.0.0.1:9001]
2016.12.05 15:31:32 INFO web[][o.s.s.p.LogServerVersion] SonarQube Server / 6.1 / dc148a71a1c184ccad588b66251980c994879dff
2016.12.05 15:31:32 INFO web[][o.sonar.db.Database] Create JDBC data source for jdbc:mysql://SERVER_IP_ADDRESS:3307/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true
2016.12.05 15:31:33 ERROR web[][o.a.c.c.C.[.[.[/]] Exception sending context initialized event to listener instance of class org.sonar.server.platform.web.PlatformServletContextListener
java.lang.IllegalStateException: Can not connect to database. Please check connectivity and settings (see the properties prefixed by 'sonar.jdbc.').
at org.sonar.db.DefaultDatabase.checkConnection(DefaultDatabase.java:104) ~[sonar-db-6.1.jar:na]
...
at java.lang.Thread.run(Thread.java:745) [na:1.8.0_102]
Caused by: org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.)
at org.apache.commons.dbcp.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:1549) ~[commons-dbcp-1.4.jar:1.4]
...
at org.sonar.db.DefaultDatabase.checkConnection(DefaultDatabase.java:102) ~[sonar-db-6.1.jar:na]
...
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_102]
...
at org.apache.commons.dbcp.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:1545) ~[commons-dbcp-1.4.jar:1.4]
...
Caused by: java.net.NoRouteToHostException: No route to host
at java.net.PlainSocketImpl.socketConnect(Native Method) ~[na:1.8.0_102]
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) ~[na:1.8.0_102]
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) ~[na:1.8.0_102]
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) ~[na:1.8.0_102]
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[na:1.8.0_102]
at java.net.Socket.connect(Socket.java:589) ~[na:1.8.0_102]
at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:211) ~[mysql-connector-java-5.1.39.jar:5.1.39]
at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:300) ~[mysql-connector-java-5.1.39.jar:5.1.39]
...
2016.12.05 15:31:33 ERROR web[][o.a.c.c.StandardContext] One or more listeners failed to start. Full details will be found in the appropriate container log file
2016.12.05 15:31:33 ERROR web[][o.a.c.c.StandardContext] Context [] startup failed due to previous errors
2016.12.05 15:31:33 WARN web[][o.a.c.l.WebappClassLoaderBase] The web application [ROOT] appears to have started a thread named [elasticsearch[Obituary][[timer]]] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
java.lang.Thread.sleep(Native Method)
org.elasticsearch.threadpool.ThreadPool$EstimatedTimeThread.run(ThreadPool.java:719)
2016.12.05 15:31:33 WARN web[][o.a.c.l.WebappClassLoaderBase] The web application [ROOT] appears to have started a thread named [elasticsearch[Obituary][scheduler][T#1]] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
sun.misc.Unsafe.park(Native Method)
java.lang.Thread.run(Thread.java:745)
2016.12.05 15:31:33 WARN web[][o.a.c.l.WebappClassLoaderBase] The web application [ROOT] appears to have started a thread named [elasticsearch[Obituary][transport_client_worker][T#1]{New I/O worker #1}] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)
2016.12.05 15:31:33 WARN web[][o.a.c.l.WebappClassLoaderBase] The web application [ROOT] appears to have started a thread named [elasticsearch[Obituary][transport_client_worker][T#2]{New I/O worker #2}] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)
2016.12.05 15:31:33 WARN web[][o.a.c.l.WebappClassLoaderBase] The web application [ROOT] appears to have started a thread named [elasticsearch[Obituary][transport_client_worker][T#3]{New I/O worker #3}] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)
2016.12.05 15:31:33 WARN web[][o.a.c.l.WebappClassLoaderBase] The web application [ROOT] appears to have started a thread named [elasticsearch[Obituary][transport_client_worker][T#4]{New I/O worker #4}] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)
2016.12.05 15:31:33 WARN web[][o.a.c.l.WebappClassLoaderBase] The web application [ROOT] appears to have started a thread named [elasticsearch[Obituary][transport_client_worker][T#5]{New I/O worker #5}] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)
2016.12.05 15:31:33 WARN web[][o.a.c.l.WebappClassLoaderBase] The web application [ROOT] appears to have started a thread named [elasticsearch[Obituary][transport_client_worker][T#6]{New I/O worker #6}] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)
2016.12.05 15:31:33 WARN web[][o.a.c.l.WebappClassLoaderBase] The web application [ROOT] appears to have started a thread named [elasticsearch[Obituary][transport_client_worker][T#7]{New I/O worker #7}] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)
2016.12.05 15:31:33 WARN web[][o.a.c.l.WebappClassLoaderBase] The web application [ROOT] appears to have started a thread named [elasticsearch[Obituary][transport_client_worker][T#8]{New I/O worker #8}] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)
2016.12.05 15:31:33 WARN web[][o.a.c.l.WebappClassLoaderBase] The web application [ROOT] appears to have started a thread named [elasticsearch[Obituary][transport_client_boss][T#1]{New I/O boss #9}] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)
2016.12.05 15:31:33 WARN web[][o.a.c.l.WebappClassLoaderBase] The web application [ROOT] appears to have started a thread named [elasticsearch[Obituary][transport_client_timer][T#1]{Hashed wheel timer #1}] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
java.lang.Thread.sleep(Native Method)
2016.12.05 15:31:33 WARN web[][o.a.c.l.WebappClassLoaderBase] The web application [ROOT] appears to have started a thread named [elasticsearch[Obituary][generic][T#1]] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
sun.misc.Unsafe.park(Native Method)
2016.12.05 15:31:33 WARN web[][o.a.c.l.WebappClassLoaderBase] The web application [ROOT] appears to have started a thread named [Abandoned connection cleanup thread] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
java.lang.Object.wait(Native Method)
com.mysql.jdbc.AbandonedConnectionCleanupThread.run(AbandonedConnectionCleanupThread.java:43)
2016.12.05 15:31:33 WARN web[][o.a.c.l.WebappClassLoaderBase] The web application [ROOT] appears to have started a thread named [Timer-0] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
java.lang.Object.wait(Native Method)
2016.12.05 15:31:33 INFO web[][o.a.c.h.Http11NioProtocol] Starting ProtocolHandler ["http-nio-0.0.0.0-9000"]
2016.12.05 15:31:33 INFO web[][o.s.s.a.TomcatAccessLog] Web server is started
2016.12.05 15:31:33 INFO web[][o.s.s.a.EmbeddedTomcat] HTTP connector enabled on port 9000
2016.12.05 15:31:33 WARN web[][o.s.p.ProcessEntryPoint] Fail to start web
java.lang.IllegalStateException: Webapp did not start
at org.sonar.server.app.EmbeddedTomcat.isUp(EmbeddedTomcat.java:84) ~[sonar-server-6.1.jar:na]
2016.12.05 15:31:33 INFO web[][o.a.c.h.Http11NioProtocol] Pausing ProtocolHandler ["http-nio-0.0.0.0-9000"]
2016.12.05 15:31:34 INFO web[][o.a.c.h.Http11NioProtocol] Stopping ProtocolHandler ["http-nio-0.0.0.0-9000"]
2016.12.05 15:31:34 INFO web[][o.a.c.h.Http11NioProtocol] Destroying ProtocolHandler ["http-nio-0.0.0.0-9000"]
2016.12.05 15:31:34 INFO web[][o.s.s.a.TomcatAccessLog] Web server is stopped
2016.12.05 15:31:35 INFO app[][o.s.p.m.Monitor] Process[es] is stopping
2016.12.05 15:31:35 INFO es[][o.s.p.StopWatcher] Stopping process
2016.12.05 15:31:35 INFO es[][o.elasticsearch.node] [sonarqube] stopping
2016.12.05 15:31:35 INFO es[][o.elasticsearch.node] [sonarqube] stopped
2016.12.05 15:31:35 INFO es[][o.elasticsearch.node] [sonarqube] closing
2016.12.05 15:31:35 INFO es[][o.elasticsearch.node] [sonarqube] closed
2016.12.05 15:31:36 INFO app[][o.s.p.m.Monitor] Process[es] is stopped
即使我从头开始创建全新的容器,SonarQube容器也会崩溃。
我的假设是我的SERVER_IP_ADDRESS和我的BRIDGE_IP_ADDRESSES没有被代理绕过,但是我没有通过修改$ no_proxy环境变量来成功。
答案 0 :(得分:0)
对于env属性SONARQUBE_JDBC_URL,而不是SERVER_IP_ADDRESS,使用链接容器的别名(在您的情况下,它是mysql)。所以,你的命令是
docker run -d --name sonarqube-container \
--link mysql-sonarqube-container:mysql \
-p 9000:9000 -p 9092:9092 \
-e SONARQUBE_JDBC_USERNAME=sonar \
-e SONARQUBE_JDBC_PASSWORD=sonar \
-e SONARQUBE_JDBC_URL="jdbc:mysql://mysql:3307/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true" \
-e SONARQUBE_HOST_URL="http://DOCKER_BRIDGE_IP_ADDRESS:9000" \
sonarqube:latest
答案 1 :(得分:0)
我最终使用了PostgreSQL数据库而不是MySQL数据库,并且它有效。
我使用docker-compose
和yml文件来描述同一网络中的两种服务:数据库和Sonarqube。
对于遇到“无路由到主机”问题的其他容器,我不得不在应用程序设置中使用DOCKER_BRIDGE_IP_ADDRESS而不是SERVER_IP_ADDRESS(无法从容器内部识别)。