我在Docker/Fig环境中看到一个奇怪的问题.我的假设是,这是因为容器的装载量有所延迟,但我不确定如何确认.
我有一个包含以下内容的容器:
FROM busybox
MAINTAINER Dan Rumney <email>
ADD loadsnapshot.sh /loadsnapshot.sh
RUN ["chmod", "u+x", "/loadsnapshot.sh"]
VOLUME ["/snapshot"]
ENTRYPOINT ["/loadsnapshot.sh"]
Run Code Online (Sandbox Code Playgroud)
#!/bin/sh
if [ "$( ls -A /snapshot)" ]; then
echo "Loading snapshot..."
# Do stuff
else
echo "No snapshot to load"
fi
Run Code Online (Sandbox Code Playgroud)
在我的fig.yml文件中,我有:
pdsvol:
image: busybox
volumes:
- "/opt/alfresco/alf_data"
- "/data"
- "/mysqlbackup"
- "/ldapbackup"
loader:
image: "docker.myregistry.com/snapshot.loader:3.5.0"
volumes_from:
- pdsvol
volumes:
- "/opt/snapshots/my-data/:/snapshot/"
Run Code Online (Sandbox Code Playgroud)
这里的目标(可能很明显)是启动数据容器(pdsvol),然后使用我的机器上运行的一些数据填充它.pdsvol然后由一堆其他容器共享.
我这样做就是打电话
fig up pdsvol
Run Code Online (Sandbox Code Playgroud)
然后
fig run --rm loader
Run Code Online (Sandbox Code Playgroud)
我期待看到的是 …
我正在尝试fig up使用最小的节点应用程序运行.
(编辑:从fig.yml删除卷)
fig.yml:
example:
build: .
command: node server.js
ports:
- "4000:4000"
links:
- postgres
postgres:
image: postgres
Run Code Online (Sandbox Code Playgroud)
Dockerfile:
FROM node
ADD . /src
WORKDIR /src
RUN npm install
Run Code Online (Sandbox Code Playgroud)
server.coffee:
express = require 'express'
app = express()
app.get "/", (req, res) ->
res.send "Hello World"
server = app.listen 4000, () ->
console.log 'Listening on port %d', server.address().port
Run Code Online (Sandbox Code Playgroud)
fig build按预期进行.fig up失败了:
example_1 | module.js:340
example_1 | throw err;
example_1 | ^
example_1 | Error: Cannot …Run Code Online (Sandbox Code Playgroud) 我正在使用Docker和fig来构建NodeJS dev-env.
当我使用nodemon来监视server.js时,更改server.js将不会重新启动服务器.
CMD ["nodemon", "/nodeapp/server.js"]
Run Code Online (Sandbox Code Playgroud)
但是当我从nodemon变为主管时,它就起作用了!
CMD ["supervisor", "/nodeapp/server.js"]
Run Code Online (Sandbox Code Playgroud)
有谁知道问题在哪里?
更多信息如下:
我的图文件夹结构:
app/server.js
package.json
node_modules/
fig.yml
Dockerfile
Run Code Online (Sandbox Code Playgroud)
fig.yml:
nodejs:
build: .
ports:
- "8080:8080"
Run Code Online (Sandbox Code Playgroud)
Dockerfile:
RUN apt-get update --fix-missing
RUN rm /bin/sh && ln -s /bin/bash /bin/sh
# NVM
RUN curl -sL https://deb.nodesource.com/setup | sudo bash - && \
apt-get install -y nodejs
VOLUME ./app:/nodeapp
WORKDIR /nodeapp
RUN rm /bin/sh && ln -s /bin/bash /bin/sh && \
npm install -g nodemon mocha supervisor
CMD ["nodemon", "/nodeapp/server.js"]
Run Code Online (Sandbox Code Playgroud)
Server.js :(来自NodeJS网站的示例代码)
var …Run Code Online (Sandbox Code Playgroud) 对于我的一个家庭项目,我决定使用docker容器和fig进行编排(第一次使用这些工具).
这是我的fig.yaml:
rabbitmq:
image: dockerfile/rabbitmq:latest
mongodb:
image: mongo
app:
build: .
command: python /code/app/main.py
links:
- rabbitmq
- mongodb
volumes:
- .:/code
Run Code Online (Sandbox Code Playgroud)
Rabbitmq的启动时间比我的应用程序的加载时间慢得多.即使rabbitmq容器首先开始加载(因为它在应用程序链接中),当我的应用程序尝试连接到rabbitmq服务器时它还没有可用(它肯定会加载计时问题,因为如果我只是在连接到rabbitmq之前插入睡眠5秒 - 一切正常).有没有一些标准的方法来解决加载时间同步问题?
谢谢.
我正在尝试配置nodejs容器以连接到mysql数据库.
我的代码看起来像这样:
var pool = mysql.createPool({
host : 'mysql',
port : '3306',
user : 'root',
password : '...',
database : 'general',
connectionLimit : 50,
queueLimit : 5000
});
Run Code Online (Sandbox Code Playgroud)
我正在使用标准的mysql容器.
我用无花果启动容器.fig.yml看起来像:
node:
build: node
ports:
- "9000:9000"
- "9001:9001"
links:
- mysql:mysql
command: node server/Main.js
mysql:
image: mysql
volumes:
- /data/test:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: ...
Run Code Online (Sandbox Code Playgroud)
每次我尝试连接时都会收到以下错误:
failed to connect to database: Error: ER_HOST_NOT_PRIVILEGED: Host '172.17.0.142' is not allowed to connect to this MySQL server
Run Code Online (Sandbox Code Playgroud)
知道我做错了什么吗?我玩过wordpress,似乎连接到同一个mysql db没有任何问题.
谢谢!
编辑 所以,我最终找到了答案.这个问题确实是一个特权问题.我运行了以下命令:
GRANT …Run Code Online (Sandbox Code Playgroud) 我一直在研究Mesos,Marathon和Chronos组合来托管大量网站.在我的脑海中,我应该可以在我的笔记本电脑中键入一些命令,并等待大约30分钟来构建和部署.
我唯一的问题是,我的资源分散在多个数据中心,众多云帐户和大约6个内部场所.我没有理由不能通过我的笔记本电脑控制它们 - (当涉及到我的硬件时,我有严重的电源和控制问题!)
我认为我最好的方法是在云中建立大脑,(动物园饲养员和至少一个主人),然后添加单独的数据中心,但我还没有看到任何分布式集群的例子,其中并非所有节点都可以相互通信.
任何人都可以推荐一种方法吗?
我有一个fig.yml文件,我用它来设置我的docker容器.我通过输入./fig up运行它然后输出以下内容:
Recreating docker_memcache_1...
Recreating docker_sphinx_1...
Recreating docker_percona_1...
Recreating docker_php_1...
Recreating docker_sa_1...
Attaching to docker_memcache_1, docker_percona_1, docker_php_1
Run Code Online (Sandbox Code Playgroud)
所以一旦完成,一切都会启动并运行.我的问题是,由于某种原因,它没有附加到我设置的nginx容器.docker ps命令输出以下内容:
9bb0c647338e php:latest "/usr/sbin/php-fpm - 2 minutes ago Up 2 minutes 9000/tcp docker_php_1
9f74789bdb15 percona:latest "mysqld" 3 minutes ago Up 3 minutes docker_percona_1
b848d3442bdf memcached:latest "/bin/sh -c memcache 3 minutes ago Up 3 minutes 11211/tcp docker_memcache_1
Run Code Online (Sandbox Code Playgroud)
所以memcache图像,php图像和percona图像都很好,但是没有像应该存在的nginx docker图像.
下面是我如何设置我的fig.yml文件,这基本上是启动所有内容的文件.有没有人对可能发生的事情有任何想法?只是要注意我确实将守护进程设置为关闭,因此它不应该自动退出.
fig.yml文件在这里:
sa:
image: nginx
links:
- php:php-fpm
volumes:
- ./svn (path here)
- ./cert:/(path here)
ports:
- "8080:80"
memcache:
image: memcached
hostname: memcached.docker …Run Code Online (Sandbox Code Playgroud) 我们现在使用docker容器进行开发和deplyoment一段时间,它就像一个魅力.直到现在两个配置都是相同的,并且使用顶部无花果,开发人员的生活也变得更加容易.
当我们在节点开发中越来越多地使用它时,我们现在需要在开发(检查器,配置文件等)时使用一些额外的工具,这些工具在生产容器中显然是不需要的.再次捕获node-inspector:它需要公开一个端口以连接到浏览器,以便自己查看该工具.
这里是brieffly我们的fig.yml文件:
indexer:
build: .
volumes:
- .:/src
links:
- db
- amqp
- search
amqp:
ports:
- "5672:5672"
- "15672:15672"
image: mikaelhg/docker-rabbitmq
db:
ports:
- "3306:3306"
image: tutum/mysql:5.6
search:
ports:
- "9002:9002"
- "9300:9300"
image: dockerfile/elasticsearch
Run Code Online (Sandbox Code Playgroud)
"Indexer"是我们的app容器,可以多次推出,将其配置更改为:
indexer:
ports:
- "8080:8080"
build: .
volumes:
- .:/src
links:
- db
- amqp
- search
Run Code Online (Sandbox Code Playgroud)
掩盖了一个小问题:当我们发射其中许多时,映射的端口显然成为问题,并且实际上没有检查员可用.
我的第一个getto解决方案就是创建一个新的"indexer-dev"容器来启动它只是为了调试目的,但它不足以因为我们fig up在shell上运行方便只是为了把所有东西都搞定,然后另一个fig run indexer dev bash在另一个用于我们的调试目的.所以我现在正在做的只是fig up随后手动启动带有neede转发端口的容器:docker run -i -t -p 8080:8080 indexer:latest
以更自动的方式进行此操作的最佳方式是什么?比如开发人员可以通过无花果继续发布容器并选择可能或可能没有导出端口的实例?
谢谢你的任何建议.
欢呼卢西奥
我想玩docker所以我创建了自己的2容器,nginx和php.两个容器都已成功构建并在docker hub上发布.之后我在我的项目文件夹中创建了一个fig.yml.如果我fig up -d在我的终端中运行,那么我收到以下错误:
Recreating playground_php_1...
Cannot start container e087111c...: [8] System error: no such file or directory
Run Code Online (Sandbox Code Playgroud)
我有什么想法可以解决这个问题吗?
这是我的fig.yml:
web:
image: mc388/docker-nginx:latest
ports:
- "80:80"
- "443:443"
links:
- php
volumes:
- ./logs/nginx:/var/log/nginx
volumes_from:
- php
php:
image: mc388/docker-php:latest
volumes:
- .:/var/www/
Run Code Online (Sandbox Code Playgroud)
以下是两个docker容器配置的链接:
我注意到,当我尝试使用泊坞窗(图为主)安装新的PIP封装,它实际上并没有维持系统.我必须从requirements.txt重建并安装pip包
我试图运行fig run web pip install django,我看到包安装,但我每次运行它重新安装,而不会提示要升级的命令时(所以我知道软件包安装不沾)
这只是Docker的继承设计吗?我很困惑为什么总是需要建筑