使用Docker Compose v1.6.0+,现在有一个新的/版本 2 文件语法docker-compose.yml。这些更改包括一个名为 的单独顶级密钥volumes。这允许在一个地方“集中”卷定义。
我想要做的是在那里命名卷,并在我的本地主机磁盘上有一个单一的卷引用多个路径。下面是一个例子,抛出一个以 aTraceback结尾的异常
AttributeError: 'list' object has no attribute 'items'
Run Code Online (Sandbox Code Playgroud)
示例docker-compose.yml:
version: '2'
services:
db:
image: postgres
volumes:
- database:/var/lib/postgres/data
php:
image: php-fpm:5.6
volumes:
- phpconf:/etc/php/conf.d
namedvolume:
container_name: namedvolume
build: ./Docker/Testvolume
volumes:
- ./Docker/Testvolume/shareme
volumes:
database:
- ./Docker/Postgres/db:ro
- ./Docker/Postgres/ini
phpconf:
- ./Docker/PHP-FPM/conf
singledir: ./Docker/foo
completemap: ./Docker/bar:/etc/service/conf.d
- namedvolume:/etc/service/conf.d # < this was a separate attempt w/o the other keys
… ?
Run Code Online (Sandbox Code Playgroud)
到目前为止,我通读了所有Docker …
由于强制门户和默认 Docker IP 范围的问题,我试图让 Docker 使用 198.18.0.0 范围,而不是 172.17.0.0,这与我住的火车上使用的强制门户冲突。
按照docs,我创建了/etc/docker/daemon.json,并将以下内容放入其中:
{
"bip":"198.18.0.0/16"
}
Run Code Online (Sandbox Code Playgroud)
这适用于 docker0,但它似乎没有影响任何其他网络,并且使用 docker compose 创建的第一个网络是 172.17.0.0,它重新创建了冲突。
我该怎么做才能更改所有docker 网络的默认子网(最好不必在每个撰写文件中声明我的自定义 IP 范围)?
我正在使用docker-compose.
一些命令喜欢up -d service_name或start service_name正在立即返回,如果您不希望运行的容器依赖于 shell 的状态,这非常有用,就像它们对常规up service_name. 一个用例是从某种连续的集成/交付服务器运行它。
但是这种运行/启动服务的方式并没有提供任何关于服务实际状态的反馈。
命令的Docker Compose CLI 参考up确实提到了相关选项,但是,对于 version 1.7.1,它与-d以下内容互斥:
Run Code Online (Sandbox Code Playgroud)--abort-on-container-exit Stops all containers if any container was stopped. *Incompatible with -d.*
我有 docker compose 文件与 PostgreSQL 和我的应用程序,如下所示:
version: '3'
services:
postgresql:
image: postgres:9.6.6
ports:
- 9932:5432
expose:
- "5432"
environment:
- POSTGRES_PASSWORD=pass
restart: always
volumes:
- /data:/var/lib/postgresql/data
myapp:
image: myapp
links:
- postgresql
depends_on:
- "postgresql"
restart: always
ports:
- "5000:5000"
Run Code Online (Sandbox Code Playgroud)
问题是restart: always当我杀死容器(使用 模拟应用程序崩溃docker kill)并且 docker-compose 不会重新启动我的容器时,策略似乎不起作用,即使退出代码是 137。当我使用restart: on-failure策略时,我观察到相同的行为。版本2和3docker-compose 的行为相同。我的系统是 Ubuntu Server 16.04 x64。
我的问题是:
我已经使用 docker 命令行尝试了一个 docker 镜像,但没有指定卷的名称。现在我发现我想继续使用这个容器/图像,但是通过在 docker compose 中定义容器。
保留匿名/未命名卷中的数据并在 docker compose 创建的新容器中使用它们的最佳实践是什么?
在使用 Nginx 和 PHP-FPM 的 Web 应用程序中,我注意到缓慢和分析日志的时刻,我发现了这条消息,它不时出现:
[19-Nov-2017 19:24:09] WARNING: [pool www] server reached pm.max_children setting (5), consider raising it
Run Code Online (Sandbox Code Playgroud)
经过一番研究,我增加了 php.ini 配置文件中的值,停止并删除了 php 容器并重建它,因为设置为卷上文件的设置有效。
分析容器内的配置文件,它是我设置的新值,但是,关于 pm.max_children (5) 的错误消息继续出现。
Here is my docker-compose.yml
version: '2'
services:
pi_web:
build: ./nginx
ports:
- "80:80"
- "443:443"
volumes:
- ../src:/src
- ./nginx/conf.d:/etc/nginx/conf.d
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
- /etc/letsencrypt:/etc/letsencrypt
pi_php:
build: ./php
volumes:
- ../src:/src
- ./php/config/php.ini:/usr/local/etc/php/php.ini
Run Code Online (Sandbox Code Playgroud)
这是 ./php/config/php.ini 的一个片段:
pm = dynamic
pm.max_children = 40
pm.start_servers = 15
pm.min_spare_servers = 15
pm.max_spare_servers …Run Code Online (Sandbox Code Playgroud) 我正在使用docker-compose创建mysql容器。我得到主机 IP 172.21.0.2。但是当我连接mysql时。我得到错误:
我的docker-compose.yml:
version: '2'
services:
### Mysql container
mysql:
image: mysql:latest
ports:
- "3306:3306"
volumes:
- /var/lib/mysql:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: test_db
MYSQL_USER: test
MYSQL_PASSWORD: test_pass
Run Code Online (Sandbox Code Playgroud)获取我的主机 IP docker inspect db_mysql_1 | grep IPAddress
"IPAddress": "172.21.0.2",
访问 mysql: mysql -h 172.21.0.2 -P 3306 -u root -proot.
ERROR 1130 (HY000): Host '172.21.0.1' is not allowed to connect to this MySQL server
如何连接到mysql容器?
我有以下docker-compose.yml文件:
version: '3'
services:
server:
build:
context: ../../
dockerfile: ./packages/website/Dockerfile
command: node /cutting/index.js
environment:
PORT: 8000
NODE_ENV: production
restart: always
nginx:
build:
context: ./
dockerfile: ./nginx/Dockerfile
command: tail -f /dev/null
depends_on:
- server
ports:
- "8000:8000"
restart: always
Run Code Online (Sandbox Code Playgroud)
以及以下内容nginx.conf:
worker_processes 1;
user nobody nogroup;
pid /tmp/nginx.pid;
error_log /tmp/logs/nginx.error.log;
events {
worker_connections 1024;
accept_mutex off;
}
http {
include mime.types;
default_type application/octet-stream;
access_log /tmp/logs/nginx.access.log combined;
sendfile on;
server {
proxy_http_version 1.1; # this is essential for chunked …Run Code Online (Sandbox Code Playgroud) 当您这样做时docker-compose up,它是基于docker-compose.yml文件的。
这通常会启动一个网络,构建并运行多个服务。如果您使用该标志执行 up 操作-d,docker-compose客户端将分离并让服务器单独操作。
如果执行 a docker-compose down,它会关闭正在运行的容器,并删除相应的网络。
但是...如果之后文件消失了怎么up办.yml?
docker stop您是否必须通过手动查找该项目的服务等等来docker rm手动关闭docker network rm?
或者docker-compose足够智能,可以用标签标记所有东西(容器、网络等),这样你就可以告诉它一些东西,这样docker-compose down project-name它就不会在.yml(现在不在文件系统中)文件中查找,而是检查正在运行的实例和网?
configuration configuration-management shutdown docker docker-compose
我正在使用 Ansible 和 Docker 设置服务器。我目前正在学习这两种技术,所以如果我在这里过于愚蠢,请容忍我。
为了运行运行 Docker 命令,用户必须在 docker 用户组中。所以我这样做:
- name: Ensure group "docker" exists
become: yes
group:
name: docker
state: present
- name: Add ansible user to docker group
become: yes
user:
name: "{{ansible_user}}"
groups: docker
append: yes
Run Code Online (Sandbox Code Playgroud)
在后来的剧本(但相同的剧本)中,我将执行以下操作:
- name: build
command: docker-compose build --pull
args:
chdir: /docker
- name: start services
command: docker-compose -f docker-compose.yml up -d
args:
chdir: /docker
Run Code Online (Sandbox Code Playgroud)
这在第一次运行时永远不起作用。“构建”任务总是失败,抱怨它找不到 docker(这是由于缺少访问权限)。如果我手动登录,因为{{ansible_user}}我可以很好地运行 docker,并且如果我等待足够长的时间(以便 Ansible 将打开一个新的 SSH 会话,我认为)剧本也可以正常工作,这让我相信{{ansible_user}}没有由于 Ansible 将 SSH 会话重新用于剧本中的所有任务,因此选择了新组。
所以我该怎么做?我也试过 …
docker ×10
docker-compose ×10
nginx ×2
ansible ×1
mysql ×1
node.js ×1
permissions ×1
php-fpm ×1
shutdown ×1