我的docker compose文件有三个容器,web,nginx和postgres.Postgres看起来像这样:
postgres:
container_name: postgres
restart: always
image: postgres:latest
volumes:
- ./database:/var/lib/postgresql
ports:
- "5432:5432
Run Code Online (Sandbox Code Playgroud)
我的目标是安装一个./database与postgres容器内调用的本地文件夹相对应的卷/var/lib/postgres.当我启动这些容器并将数据插入postgres时,我验证/var/lib/postgres/data/base/了我正在添加的数据(在postgres容器中),但是在我的本地系统中,./database只获取了一个data文件夹,即./database/data创建了它,但它是空的.为什么?
笔记:
根据尼克的建议,我做了一个docker inspect并发现:
"Mounts": [
{
"Source": "/Users/alex/Documents/MyApp/database",
"Destination": "/var/lib/postgresql",
"Mode": "rw",
"RW": true,
"Propagation": "rprivate"
},
{
"Name": "e5bf22471215db058127109053e72e0a423d97b05a2afb4824b411322efd2c35",
"Source": "/var/lib/docker/volumes/e5bf22471215db058127109053e72e0a423d97b05a2afb4824b411322efd2c35/_data",
"Destination": "/var/lib/postgresql/data",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
Run Code Online (Sandbox Code Playgroud)
这似乎是数据被另一个我自己编码的卷偷走了.不知道为什么会这样.postgres图像是否为我创建了该卷?如果是这样,当我重新启动时,是否有某种方法可以使用该卷而不是我正在安装的卷?否则,是否有一种很好的方法可以禁用其他卷并使用我自己的卷./database?
我找到了解决方案,感谢尼克!(和另一位朋友)以下答案.
我在为/var/lib/dockerMac安装docker之后在Mac上寻找文件夹.
随着docker info 我得到
Containers: 5
...
Server Version: 1.12.0-rc4
Storage Driver: aufs
Root Dir: /var/lib/docker/aufs
Backing Filesystem: extfs
Dirs: 339
Dirperm1 Supported: true
...
Name: moby
ID: LUOU:5UHI:JFNI:OQFT:BLKR:YJIC:HHE5:W4LP:YHVP:TT3V:4CB2:6TUS
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
....
Run Code Online (Sandbox Code Playgroud)
但/var/lib/docker我的主机上没有目录.
我已经检查/Users/myuser/Library/Containers/com.docker.docker/但在那里找不到任何东西.知道它在哪里吗?
我在配置持久数据方面遇到了麻烦Mariadb.我正在使用docker-compose,将每个服务放在一个容器中(Nginx,PHP-FPM和Mariadb).除了Mariadb不存储数据外,一切正常.每次重新启动容器时,都会丢失所有数据.然后我发现我可以使用另一个容器来保存数据,甚至不必运行.
所以我在Mariadb容器volume_from内容容器中使用.但是当我这样做时,当我尝试映射卷时/var/lib/mysql,Container MariaDb无法启动.
错误
2015-12-29 12:16:40 7f2f02e4a780
InnoDB:文件操作中的操作系统错误号13.
InnoDB:错误意味着mysqld没有对
InnoDB 的访问权限:目录.
该错误是指有关卷权限的问题,但我尝试Dockerfile在两个容器中设置权限,问题仍然存在.我有点迷茫.我正在使用OSX,所以我认为这是一个OSX问题.谁可以帮我这个事?
这是我的代码:
我的Docker撰写
content:
build: containers/content
container_name: content
hostname: content
volumes:
- /var/lib/mysql
mariadb:
build: containers/mariadb
container_name: mariadb
hostname: mariadb
ports:
- "3306:3306"
volumes_from:
- content
environment:
- MYSQL_ROOT_PASSWORD=mariadb
- TERM=xterm
- PORT=3306
MariaDB Dockerfile
FROM debian:jessie RUN apt-get update && apt-get install -y mariadb-server EXPOSE 3306
内容Dockerfile …
我最近从 Wamp(wampserver)搬到了 Docker(Windows 主机)。使用 wamp 时,我能够拥有多个项目,例如以下文件结构
- wamp64
- www/
- project1/
- project2/
- ....
Run Code Online (Sandbox Code Playgroud)
在 wamp 的 Apache 上,我定义了几个虚拟主机,所有项目都使用 wamp 的数据库,每个都有自己的架构。
因此,在必要时通过访问类似 url或相应的虚拟主机来切换上下文从project1、project2到project3等是很常见的http://localhost/projectX。
正如我目前所见,这在 Docker 上似乎并不那么简单。我的第一个方法是在每个项目上设置一个不同的 Docker
- www/
- project1/
- dockerfile & docker-compose
- project2/
- dockerfile & docker-compose
- projectX/
- dockerfile & docker-compose
- data // this is where mysql data lie
Run Code Online (Sandbox Code Playgroud)
我认为,与我习惯使用 wamp 的相比,这似乎不太有效,因为每次我想更改上下文时,我都必须使用docker-compose stop我当前正在工作docker-compose up的项目和我想切换到的项目,反之亦然.
我尝试了另一种方法,在单个 apache-php 容器(整个 www 文件夹)中运行所有项目 …
我在docker容器中设置了一个django项目,并且每个东西都按预期工作,除了我在mysql映像中找不到项目数据库.
Dockerfile
FROM python:3
RUN mkdir /django-website
WORKDIR /django-website
COPY . /django-website
RUN pip install -r requirements.txt
Run Code Online (Sandbox Code Playgroud)
泊坞窗,compose.yml
version: '3'
services:
db:
image: mysql:5.7
restart: always
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=mywebsite
- MYSQL_USER=root
- MYSQL_PASSWORD=root
ports:
- '33060:3306'
volumes:
- /var/lib/mysql
web:
build: .
command: python manage.py runserver 0.0.0.0:8000
volumes:
- .:/django-website
ports:
- '8000:8000'
links:
- db
Run Code Online (Sandbox Code Playgroud)
settings.py
DATABASES = {
'default': {
'ENGINE': "django.db.backends.mysql",
'NAME': "mywebsite",
'USER': "root",
'PASSWORD': "root",
'HOST': 'db',
'PORT': '3306',
}
}
Run Code Online (Sandbox Code Playgroud)
我运行迁移,它工作:
docker-compose …Run Code Online (Sandbox Code Playgroud) Om Mac 我在本地网络上使用 docker,我想使用 MySQL-workbench 访问 mysql,但是在安装 MySQL-workbench 并尝试连接到数据库后,我收到此错误消息
\n\nCan\'t connect to MySQL server on \'127.0.0.1\' (61)\nRun Code Online (Sandbox Code Playgroud)\n\n
我尝试为 docker 寻找解决方案,但没有找到任何解决方案。
\n\ndocker 检查 pkbook_mysql_1
\n\n"NetworkSettings": {\n "Bridge": "",\n "SandboxID": "cb984bedd303958298621c1571482c7c06a2a326df021902c15a7955b8c26b2c",\n "HairpinMode": false,\n "LinkLocalIPv6Address": "",\n "LinkLocalIPv6PrefixLen": 0,\n "Ports": {\n "3306/tcp": null\n },\n "SandboxKey": "/var/run/docker/netns/cb984bedd303",\n "SecondaryIPAddresses": null,\n "SecondaryIPv6Addresses": null,\n "EndpointID": "",\n "Gateway": "",\n "GlobalIPv6Address": "",\n "GlobalIPv6PrefixLen": 0,\n "IPAddress": "",\n "IPPrefixLen": 0,\n "IPv6Gateway": "",\n "MacAddress": "",\n "Networks": {\n "publiquip_default": {\n "IPAMConfig": null,\n "Links": null,\n "Aliases": [\n "mysql",\n "ee6b2dd46fb8"\n ],\n …Run Code Online (Sandbox Code Playgroud) 为了更新一些图像,我使用了“docker-compose pull”。然后我构建:'docker-compose build'。
我只想更新应用程序容器,所以我删除了它并重新启动:“docker-compose rm app”和“docker-compose up -d app”。
但是发生了一些不希望的事情。数据容器也被重新创建。旧数据丢失。
用于数据容器的 Dockerfile:
FROM gitlab/gitlab-ce:latest
VOLUME ["/etc/gitlab", "/var/log/gitlab", "/var/opt/gitlab"]
ENTRYPOINT ["hostname"]
Run Code Online (Sandbox Code Playgroud)
docker-compose.yml:
version: '2'
services:
gitlab:
image: 'gitlab/gitlab-ce:latest'
domainname: example.com
hostname: gitlab
networks:
- devenv
restart: always
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://gitlab.example.com'
gitlab_rails['gitlab_shell_ssh_port'] = 2224
ports:
- '80:80'
- '2224:22'
volumes_from:
- gitlabdata
gitlabdata:
build: gitlab-data
Run Code Online (Sandbox Code Playgroud)
下次我怎样才能避免这种情况?