
我可以从主机访问数据库容器,同样可以从主机访问网络服务器.
但是,我如何从网络服务器访问数据库连接?
我启动db容器的方式是
docker run --name oracle-db -p 1521:1521 -p 5501:5500 oracle/database:12.1.0.2-ee
我开始使用容器作为
docker run --name oracle-wls -p 7001:7001 wls-image:latest
我可以通过连接访问主机上的数据库
sqlplus scott/welcome1@//localhost:1521/ORCLCDB
我可以在主机上访问wls
http://localhost:7001/console
在连接两个容器时,下面的链接提供了一个很好的.您可以跳过附加部分,因为这对于向图像添加项目非常有用.
https://deis.com/blog/2016/connecting-docker-containers-1/
您感兴趣的部分是两个容器之间的通信.最简单的方法是从Web服务器容器中按名称引用数据库容器.
例:
您将db容器DB1和Web服务器容器WEB0命名为.容器应该都在桥接网络上,这意味着Web容器应该能够通过引用它的名称连接到DB容器.
因此,如果您的应用程序有Web配置文件,那么对于DB主机,您将使用名称DB1.
如果您使用的是旧版本的docker,那么您应该使用–link.
例:
第1步:docker run –name db1 oracle / database:12.1.0.2-ee
然后当你启动网络应用程序.采用:
第2步:docker run –name web0 –link db1 webapp / webapp:3.0
并且Web应用程序将链接到DB.但是,正如我所说–link开关将很快被删除.
我会使用docker compose,它将为你构建一个网络.然而;你需要为你的系统下载docker compose. https://docs.docker.com/compose/install/#prerequisites
一个示例设置是这样的:
文件名是base.yml
version: "2"
services:
webserver:
image: "moodlehq/moodle-php-apache:7.1
depends_on:
- db
volumes:
- "/var/www/html:/var/www/html"
- "/home/some_user/web/apache2_faildumps.conf:/etc/apache2/conf-enabled/apache2_faildumps.conf"
environment:
MOODLE_DOCKER_DBTYPE: pgsql
MOODLE_DOCKER_DBNAME: moodle
MOODLE_DOCKER_DBUSER: moodle
MOODLE_DOCKER_DBPASS: "m@0dl3ing"
HTTP_PROXY: "${HTTP_PROXY}"
HTTPS_PROXY: "${HTTPS_PROXY}"
NO_PROXY: "${NO_PROXY}"
db:
image: postgres:9
environment:
POSTGRES_USER: moodle
POSTGRES_PASSWORD: "m@0dl3ing"
POSTGRES_DB: moodle
HTTP_PROXY: "${HTTP_PROXY}"
HTTPS_PROXY: "${HTTPS_PROXY}"
NO_PROXY: "${NO_PROXY}"
这会将网络命名为通用名称,我不记得我的名字是什么,除非你使用–name开关.
IE docker-compose –name setup1 up base.yml
注意:如果你使用–name开关,你将需要在调用docker compose时使用它,所以docker-compose –name setup1 down这样你就可以拥有多个webserver和db的实例,并在此case,所以docker compose知道你想要运行命令的实例;而且你也可以一次运行多个.如果您在同一台服务器上并行运行测试,则非常适合CI / CD.
Docker compose也有与docker相同的命令,所以docker-compose –name setup1 exec webserver do_some_command
最好的部分是,如果你想更改db或类似的单元测试,你可以在up命令中包含一个额外的.yml文件,它将覆盖任何具有相似名称的项目,我认为它是一个键=>值替代.
例:
db.yml
version: "2"
services:
webserver:
environment:
MOODLE_DOCKER_DBTYPE: oci
MOODLE_DOCKER_DBNAME: XE
db:
image: moodlehq/moodle-db-oracle
然后调用docker-compose –name setup1 up base.yml db.yml
这将覆盖db.使用不同的设置.当需要从每个容器连接到这些服务时,您使用service下的名称set,在本例中为webserver和db.
我认为这可能实际上是一个更有用的设置.因为您可以在yml文件中设置所需的所有变量,并在需要启动时运行docker compose命令.所以更多的启动它并忘记它的设置.
注意:我没有使用–port命令,因为容器 – >容器通信不需要暴露端口.仅当您希望主机连接到容器或来自主机外部的应用程序时才需要它.如果公开端口,则端口对主机允许的所有通信开放.因此,在端口80上公开Web与在物理主机上启动Web服务器相同,并且如果主机允许,则允许外部连接.此外,如果您想要同时运行多个Web应用程序,无论出于何种原因,如果您尝试在该端口上进行公开,那么暴露端口80将阻止您运行其他Web应用程序.因此,对于CI / CD,最好不要公开端口,如果使用docker compose和–name开关,所有容器都将在他们自己的网络上,因此它们不会发生冲突.所以你几乎有一个容器容器.
更新:进一步使用功能后,看看其他人如何为像jenkins这样的CICD程序做过.网络也是一个可行的解决方案.
例:
docker network create test_network
上面的命令将创建一个“test_network”,您也可以附加其他容器.使用–network switch运算符可以轻松完成.
例:
docker run \
--detach \
--name DB1 \
--network test_network \
-e MYSQL_ROOT_PASSWORD="${DBPASS}" \
-e MYSQL_DATABASE="${DBNAME}" \
-e MYSQL_USER="${DBUSER}" \
-e MYSQL_PASSWORD="${DBPASS}" \
--tmpfs /var/lib/mysql:rw \
mysql:5
当然,如果您有代理网络设置,您仍应使用“-e”或“–env-file”开关语句将这些设置传递到容器中.因此容器可以与互联网通信. Docker说代理设置应该被较新版本的docker中的容器吸收;但是,我仍然把它们作为一种习惯传递给我们.这是“–link”开关的替代品,它正在消失.将容器连接到您创建的网络后,您仍然可以使用容器的“名称”从其他容器中引用这些容器.根据上面的例子,它将是DB1.您只需确保所有容器都连接到同一网络,您就可以开始使用了.
有关在cicd管道中使用网络的详细示例,您可以参考以下链接:
https://git.in.moodle.com/integration/nightlyscripts/blob/master/runner/master/run.sh
哪个是在Jenkins中运行的脚本,用于Moodle的大型集成测试,但这个想法/示例可以在任何地方使用.我希望这有助于其他人.
转载注明原文:从另一个容器访问docker容器 - 乐贴网