docker - 如何配置docker容器在浏览器中运行?

标签 docker meteor docker-compose containers

如何正确配置和构建可在Web浏览器上运行的docker容器/镜像?

我有一个 meteor Web应用程序,并且使用了现有的基本镜像之一: jshimko / meteor-launchpad ,由官方 meteor 指南Depolyment & Monitoring推荐,该教程位于meteor-launchpad-github上。我已经能够基于网络应用程序构建图像,但是它从未分配端口,因此无法在浏览器中运行它。

在我的Web应用程序的根目录中添加了Dockerfile,并添加了以下内容

FROM debian:jessie

要构建图像,然后在终端中运行以下命令
docker build -t sirbt/myapp .

哪个发出:
Sending build context to Docker daemon  2.331MB
Step 1/1 : FROM debian:jessie
 ---> b6e9658de383
Successfully built b6e9658de383
Successfully tagged sirbt/myapp:latest

然后,我开始将以下内容保存在.dockerignore文件中,并将其保存在应用程序目录的根目录中
.git
.meteor/local
node_modules

然后运行以下代码以在容器中运行 myapp
docker run -d \
  -e ROOT_URL=http://example.com \
  -e MONGO_URL=mongodb://url \
  -e MONGO_OPLOG_URL=mongodb://oplog_url \
  -e MAIL_URL=smtp://mail_url.com \
  -p 70:3000 \
  sirbt/myapp

代码如下:
4e616999e521014fcb19d33869b45c79d93d6774d2d02e2f413343b72294f88b

我遵循以下命令:
docker ps

哪个:
CONTAINER ID  IMAGE COMMAND CREATED STATUS PORTS   NAMES

然而
docker ps -a等级:
CONTAINER ID        IMAGE               COMMAND                 CREATED             STATUS PORTS                                      NAMES
4e616999e521        sirbt/myapp         "bash"                   3 minutes ago       Exited (0) 2 minutes ago                           compassionate_greider

如您所知,没有为容器分配端口,以使我能够在浏览器上运行它。本教程建议此时,我应该能够在localhost的端口80 (在我的情况下为端口70)上运行它。我在这里想念什么?如何配置Docker容器以便为其分配端口,从而使我能够在浏览器中运行它?

在下面找到我的docker-compose.yml的内容
# docker-compose.yml

app:
  image: yourname/app
  ports:
    - "70:3000"
  links:
    - mongo
  environment:
    - ROOT_URL=http://example.com
    - MONGO_URL=mongodb://mongo:27017/meteor

mongo:
  image: mongo:latest
  command: mongod --storageEngine=wiredTiger

更新以反射(reflect)为什么我在我的dockerfile中不使用 FROM jshimko/meteor-launchpad:latest
当我按照教程中的建议使用FROM jshimko/meteor-launchpad:latest更新Dockerfile时。我收到以下错误消息:
`Get:6 http://deb.debian.org jessie/main amd64 Packages [9098 kB]
Fetched 10.1 MB in 8s (1154 kB/s)
W: Failed to fetch http://deb.debian.org/debian/dists/jessie-updates/InRelease  Unable to find expected entry 'main/binary-amd64/Packages' in Release file (Wrong sources.list entry or malformed file)

E: Some index files failed to download. They have been ignored, or old ones used instead.
The command '/bin/sh -c cd $APP_SOURCE_DIR &&   $BUILD_SCRIPTS_DIR/install-deps.sh &&   $BUILD_SCRIPTS_DIR/install-node.sh &&   $BUILD_SCRIPTS_DIR/install-phantom.sh &&   $BUILD_SCRIPTS_DIR/install-graphicsmagick.sh &&   $BUILD_SCRIPTS_DIR/install-mongo.sh &&   $BUILD_SCRIPTS_DIR/install-meteor.sh &&   $BUILD_SCRIPTS_DIR/build-meteor.sh &&   $BUILD_SCRIPTS_DIR/post-build-cleanup.sh' returned a non-zero code: 100`

最佳答案

请确保仔细阅读 meteor 发射板教程,因为您似乎错过了几点。

我注意到您说您的Dockerfile是:

FROM debian:jessie

那是你的主要问题。它应该是:
FROM jshimko/meteor-launchpad:latest

(或FROM jshimko/meteor-launchpad:some-specific-version)。

通过更改FROM,您使本教程的其余部分无关紧要。现在,您只是构建并运行一个不执行任何操作的基本Debian容器。

不幸的是,看来meteor-launchpad图像已损坏。它在大约2年内没有更新,它是基于Debian的旧版本构建的,该版本的源已被存档-这是导致构建错误的原因(请参阅https://github.com/debuerreotype/docker-debian-artifacts/issues/66)。

如果您真的想使用meteor-launchpad,建议您克隆它的repo并自己构建镜像。
git clone https://github.com/jshimko/meteor-launchpad.git
cd meteor-launchpad
docker build -t jshimko/meteor-launchpad:latest .

完成之后,您可以按照本教程进行操作。但是,您可能需要在 meteor 发射的Dockerfile中更改FROM debian:jessie才能使用更新的Debian版本。这不是一个有值(value)的解决方案,但是我建议您这样做,因为听起来您只是在尝试启动一个学习项目并使其运行。

我建议您阅读Docker概念,因为meteor-launchpad文档似乎假设您对它们非常熟悉。您可以从Docker's own tutorial docs开始。

另外,您的docker-compose.yml文件没有被使用。 Docker Compose是直接发布docker run命令的替代方法。要使用它,请从YML文件所在的目录中运行命令docker-compose up [-d]。仅使用您发布的docker run命令将从您构建的镜像启动一个容器,但不会启动mongo容器。您将不得不单独开始。

关于docker - 如何配置docker容器在浏览器中运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56131003/

相关文章:

docker - 从 Dockerfile 定义一个 crontab,利用主机的 crontab 每小时运行一个容器化的 Go 程序

linux - AWS ElasticBeanstalk 上的 Docker : "host.docker.internal: host-gateway": Connection refused. Iptables 问题?

Docker 基础镜像文件系统

amazon-web-services - Aws Ecs 中微服务之间的通信

Docker compose : failing to start container,,因为它无法找到本地存在的文件

docker - 为了在其他容器中使用它们,我是否需要做更多的事情而不是在docker-compose文件中添加env变量?

Docker,更新图像还是仅使用绑定(bind)安装来获取网站代码?

javascript - 如何通过变量引用父对象?

node.js - 如何在 Cordova 应用程序中缓存客户端上最后加载的数据?

meteor - 在 Meteor 应用程序中插入 addthis 共享按钮?