如何在Docker中运行多个容器并暴露端口

69次阅读
没有评论

问题描述

在Docker中使用了两个镜像,一个是Jenkins,一个是Artifactory。他想要同时运行这两个容器,分别在8080端口和8081端口上,但发现一次只能打开一个应用程序。具体表现为:当他在URL 192.168.99.100:8080打开Jenkins后,再尝试在URL 192.168.99.100:8081打开Artifactory时,会显示“jFrog Artifactory正在准备工作…”,然后与Artifactory的连接会丢失。只有当停止Jenkins容器后,他才能正常运行Artifactory应用程序。

他已经尝试了使用docker-compose来运行多个容器,但不确定是否能解决他的问题。他还提到了尝试使用Nginx作为反向代理,但只成功配置了Jenkins,而Artifactory无法正常工作。他还问到是否可以在不配置SSL的情况下通过Nginx运行Artifactory。

他还附带了他的docker ps输出以及一些备注信息。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

使用Docker Compose运行多个容器

可以使用Docker Compose来管理和运行多个容器,并且可以解决容器之间的依赖关系。以下是使用Docker Compose来运行Jenkins和Artifactory容器的步骤:

  1. 创建一个docker-compose.yml文件,其中包含两个服务(容器)的配置。
  2. 在该文件中指定每个服务(容器)的镜像、端口映射等配置信息。
  3. 启动Docker Compose来运行这些服务。

下面是一个示例的docker-compose.yml文件,用于运行Jenkins和Artifactory容器:

version: '3'
services:
  jenkins:
    image: jenkins/jenkins
    ports:
      - "8080:8080"
    # 可以添加其他Jenkins配置

  artifactory:
    image: your_artifactory_image:latest
    ports:
      - "8081:8081"
    # 可以添加其他Artifactory配置

在上面的示例中,我们定义了两个服务:jenkinsartifactory。分别使用了Jenkins官方镜像和你的Artifactory镜像。通过ports配置将宿主机的8080端口映射到Jenkins容器的8080端口,以及将宿主机的8081端口映射到Artifactory容器的8081端口。

要运行这些服务,可以执行以下命令:

docker-compose up -d

这将后台运行这两个容器。现在你可以在URL 192.168.99.100:8080访问Jenkins,以及在URL 192.168.99.100:8081访问Artifactory。

防止容器因资源不足而崩溃

用户在回复中提到,他的问题可能是由于docker-machine的内存不足导致的。如果容器因资源不足而崩溃,可以尝试调整docker-machine的配置来分配更多的内存给虚拟机。以下是一些调整docker-machine内存的步骤(根据用户提供的回复):

  1. 停止docker-machine:
docker-machine stop
  1. 修改虚拟机的CPU核数和内存大小(例如,设置2个CPU核心和4096MB内存):
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" modifyvm default --cpus 2
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" modifyvm default --memory 4096

请注意,上述命令中的路径可能因你的系统配置而有所不同。如果将VBoxManage.exe添加到环境变量中,可以省略路径部分。

  1. 启动docker-machine:
docker-machine start

这样,docker-machine将分配更多的资源给虚拟机,从而有更多的资源来运行多个容器。

使用Nginx作为反向代理

用户提到了尝试使用Nginx作为反向代理来访问Jenkins和Artifactory。如果你想继续使用Nginx作为反向代理来统一管理这两个应用程序,你需要确保正确配置Nginx。以下是一个简单的示例配置,用于将两个应用程序分别代理到不同的端口:

server {
    listen 80;

    server_name 192.168.99.100;

    location /jenkins/ {
        proxy_pass http://127.0.0.1:8080/;
    }

    location /artifactory/ {
        proxy_pass http://127.0.0.1:8081/;
    }

    # 可以添加其他Nginx配置
}

在上面的示例中,我们将Jenkins代理到8080端口,Artifactory代理到8081端口。这样,你可以通过Nginx来访问这两个应用程序,分别使用URL 192.168.99.100/jenkins和192.168.99.100/artifactory。

请注意,Nginx的配置还涉及其他方面,例如SSL配置。你可以根据你的需求进一步调整Nginx的配置。

以上是针对用户问题的解决方案,希望对你有帮助。如果有任何问题或需要进一步的指导,请随时提问。

正文完