Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从另一个容器访问docker容器_Docker - Fatal编程技术网

从另一个容器访问docker容器

从另一个容器访问docker容器,docker,Docker,我基于两个不同的图像创建了两个docker容器。一个是db,另一个是Web服务器。这两个容器都在我的mac osx上运行 我可以从主机访问db容器,也可以从主机访问Web服务器 但是,如何从Web服务器访问db连接 我启动db容器的方式是 docker run --name oracle-db -p 1521:1521 -p 5501:5500 oracle/database:12.1.0.2-ee 我启动wls容器作为 docker run --name oracle-wls -p 7001

我基于两个不同的图像创建了两个docker容器。一个是db,另一个是Web服务器。这两个容器都在我的mac osx上运行

我可以从主机访问db容器,也可以从主机访问Web服务器

但是,如何从Web服务器访问db连接

我启动db容器的方式是

docker run --name oracle-db -p 1521:1521 -p 5501:5500 oracle/database:12.1.0.2-ee
我启动wls容器作为

docker run --name oracle-wls -p 7001:7001 wls-image:latest
我可以通过连接到访问主机上的数据库

sqlplus scott/welcome1@//localhost:1521/ORCLCDB
我可以访问主机上的wls作为

http://localhost:7001/console

您必须通过主机的ip访问db,或者如果您希望通过localhost:1521访问db,则运行webserver,如-

docker run --net=host --name oracle-wls wls-image:latest

最简单的方法是使用--link,然而docker的新版本正在远离这一点,事实上,这个开关很快就会被移除

下面的链接提供了一个连接两个容器的好方法。您可以跳过“附加”部分,因为这只是向图像添加项目的有用方法

您感兴趣的部分是两个容器之间的通信。最简单的方法是从webserver容器中按名称引用DB容器

例如:

docker network create test_network
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
您将db容器命名为
db1
和webserver容器
web0
。这两个容器都应该位于网桥网络上,这意味着web容器应该能够通过引用其名称连接到DB容器

因此,如果您有应用程序的web配置文件,那么对于DB主机,您将使用名称
db1

如果您使用的是旧版本的docker,那么应该使用--link

例如:

docker network create test_network
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
步骤1:
docker运行——名称db1 oracle/数据库:12.1.0.2-ee

然后,当您启动web应用程序时。使用:

第2步:
docker运行——名称web0——链接db1 webapp/webapp:3.0

该web应用程序将链接到数据库。但是,正如我所说,--link开关很快就会被移除

我将使用docker compose,它将为您构建一个网络。然而;您需要为您的系统下载docker compose

示例设置如下所示:

文件名为
base.yml

版本:“2”
服务:
网络服务器:
图片:moodlehq/moodlephpache:7.1
取决于:
-分贝
卷数:
-“/var/www/html:/var/www/html”
-“/home/some_user/web/apache2_faildumps.conf:/etc/apache2/conf enabled/apache2_faildumps.conf”
环境:
MOODLE_DOCKER_DBTYPE:pgsql
MOODLE_DOCKER_DBNAME:MOODLE
MOODLE_DOCKER_DBUSER:MOODLE
MOODLE_DOCKER_DBPASS:“m@0dl3ing"
HTTP_代理:“${HTTP_代理}”
HTTPS\u代理:“${HTTPS\u代理}”
无代理:“${无代理}”
db:
图片:博士后:9
环境:
POSTGRES_用户:moodle
POSTGRES_密码:m@0dl3ing"
博士后:穆德尔
HTTP_代理:“${HTTP_代理}”
HTTPS\u代理:“${HTTPS\u代理}”
无代理:“${无代理}”
这会给网络起一个通用的名字,我记不起这个名字是什么,除非你使用--name开关

IE
docker compose——名称setup1 up base.yml

注意:如果您使用--name开关,则在调用docker compose时需要使用它,因此
docker compose--name setup1 down
这样您就可以拥有多个webserver和db实例,在这种情况下,docker compose知道要针对哪个实例运行命令;而且你可以一次运行多个。如果您在同一台服务器上并行运行测试,则非常适合CI/CD

Docker compose也有与Docker相同的命令,因此
Docker compose--name setup1 exec webserver do_some_command

最好的部分是,如果您想为单元测试更改db或类似的内容,您可以在up命令中添加一个额外的.yml文件,它将覆盖任何具有类似名称的项,我认为这是一个key=>值替换

例如:

docker network create test_network
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
db.yml

版本:“2”
服务:
网络服务器:
环境:
MOODLE_DOCKER_数据库类型:oci
MOODLE_DOCKER_DBNAME:XE
db:
图片:moodlehq/moodle db oracle
然后调用
docker compose--name setup1 up base.yml db.yml

这将覆盖数据库。使用不同的设置。当需要从每个容器连接到这些服务时,可以使用服务下设置的名称,在本例中为webserver和db

我认为在你的情况下,这可能是一个更有用的设置。因为您可以在yml文件中设置所需的所有变量,并在需要时运行docker compose命令。因此,更多的开始它,忘记它的设置

注意:我没有使用
--port
命令,因为container->container通信不需要公开端口。仅当您希望主机从主机外部连接到容器或应用程序时才需要它。如果您公开该端口,则该端口将对主机允许的所有通信开放。因此,在端口80上公开web与在物理主机上启动web服务器相同,如果主机允许,将允许外部连接。此外,如果出于任何原因,您希望一次运行多个web应用程序,那么如果您尝试在该端口上公开,则暴露端口80将阻止您运行其他web应用程序。所以,对于CI/CD,最好根本不公开端口,如果使用docker compose和--name开关,所有容器都将位于自己的网络上,这样它们就不会发生冲突。所以你几乎有一个容器的容器

更新:在进一步使用功能并了解其他人如何为像Jenkins这样的CICD项目做到这一点之后。网络也是一个可行的解决方案

例如:

docker network create test_network
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
上面的命令将创建一个“test_network”,您也可以附加其他容器。使用
--网络
交换机操作器可以轻松实现这一点

例如:

docker network create test_network
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
当然,如果您有代理网络设置,您可以