在这篇文章中,我们将为您详细介绍docker-composevolumes指令路径映射问题的内容,并且讨论关于docker映射目录的相关问题。此外,我们还会涉及一些关于10.docker学习笔记之入门
在这篇文章中,我们将为您详细介绍docker-compose volumes 指令路径映射问题的内容,并且讨论关于docker映射目录的相关问题。此外,我们还会涉及一些关于10.docker学习笔记之入门,docker-compose端口映射可能会导致的问题、7 Dockerfile指令详解 && VOLUME 指令、Docker - 03 编排容器 Docker Compose 指令速查表、Docker Compose 版本过高(Docker 版本不匹配),降低 docker-compose 版本的知识,以帮助您更全面地了解这个主题。
本文目录一览:- docker-compose volumes 指令路径映射问题(docker映射目录)
- 10.docker学习笔记之入门,docker-compose端口映射可能会导致的问题
- 7 Dockerfile指令详解 && VOLUME 指令
- Docker - 03 编排容器 Docker Compose 指令速查表
- Docker Compose 版本过高(Docker 版本不匹配),降低 docker-compose 版本
docker-compose volumes 指令路径映射问题(docker映射目录)
背景:最近在自学 docker 容器知识,在跟着《Docker - 从入门到实践》进行 docker-compose 搭建 django/postgreSQL 实例。在搭建过程中由于自己操作失误以及理解不到位导致在出现错误的时加大了排错难度。为了防止以后忘记因此记录在此。
如下直接贴出 docker-compose 项目环境:
# uname -r
3.10.0-957.el7.x86_64
# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
项目目录结构:
compose_django_postgresql: docker-compose.yml 文件存放路径
django:原本 django 服务容器需挂载的路径
postgresql:原本 postgresql 服务容器需挂载的路径
Dockerfile:构建 django 镜像的文件
requirements:django 服务容器需安装的 python 扩展包
Dockerfile 文件内容如下:
FROM python:2.7
ENV PYTHONUNBFFERED 1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install -r requirements.txt
ADD . /code/
docker-compose.yml 文件内容如下:
postgresql:
image: postgres
django:
build: ./django
volumes:
- django:/code
ports:
- "8000:8000"
links:
- postgresql
command: python manage.py runserver 0.0.0.0:8000
一直到这一步都很顺利,哼哼,然后开始跟着教材执行 docker-compose 命令
[root@TestDocker compose_django_postgresql]# docker-compose run django django-admin.py startproject mytest_dockerdjango
Pulling postgresql (postgres:)...
latest: Pulling from library/postgres
...........
...........
Removing intermediate container 840872e8a932
Successfully built 1dd4f62b514e
Successfully tagged compose_django_postgresql_django:latest
WARNING: Image for service django was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
启动无报错~~~
由于之前测试 docker-compose up 启动项目之后在 web 上访问出现 ip 允许问题
我就想这既然把 django 目录挂载到了服务容器到 /code 目录,那我直接去 django 目录下修改是否是一样的,于是乎。。。。
what~~~, 刚创建的 django 项目目录呢?为了解决这个疑问查询了资料也没搞清楚问题在哪儿(原谅初学小白,哈哈!),我还在服务器上使用 docker-compose 建立了一个 wordpress 项目,完全无问题~~~,后来在一次重新运行 docker-compose run django 中出现了如下错误:
# docker-compose run django django-admin startproject mytest_dockerdjango
Starting compose_django_postgresql_postgresql_1 ... done
CommandError: ''/code/mytest_dockerdjango'' already exists
我注意到了‘''/code/mytest_dockerdjango'' already exists’,因此我想我在 docker-compose.yml volumes 指定可能有问题, django 目录可能不是相对于我所在当前目录,使用 find 命令搜索之后证实了这一点
于是我开始修改了 docker-compose.yml 文件、停掉清理之前挂载的卷重新创建镜像并且运行 docker-compose run django django-admin startproject XXX
# cat docker-compose.yml
postgresql:
image: postgres
django:
build: ./django
volumes:
- ./django:/code
ports:
- "8000:8000"
links:
- postgresql
command: python manage.py runserver 0.0.0.0:8000
# docker-compose stop
# docker-compose down --volumes
# docker-compose build --no-cache
# docker-compose run django django-admin startproject mytest_dockerdjango
然后再查看 django 目录有 django 项目文件了
参考文件:《Docker - 从入门到实践》
10.docker学习笔记之入门,docker-compose端口映射可能会导致的问题
docker run的时候如果用上了-p或者docker-compose up -d 的时候用了ports:,那么就存在端口映射,在配置主从的时候,监听公网的其他端口如:
这个时候需要配置从节点真实公网映射的地址和端口
# slave-announce-ip 5.5.5.5 # slave-announce-port 1234
哨兵真实公网映射地址和端口
# sentinel announce-ip <ip> # sentinel announce-port <port>
集群真实公网映射地址和端口
# cluster-announce-ip <ip> #地址 # cluster-announce-port <port> #数据端口 # cluster-announce-bus-port <port> #节点通信端口
可以配合sh脚本和docker-compose 来达到动态修改的效果
docker-compose.yaml
version: "3.6" #设置网络环境 networks: #引用外部预先定义好的网段 redis-network: external: name: redis-network services: sentinel-1: image: redis container_name: sentinel-1 ports: - "26386:26379" networks: redis-network: ipv4_address: 192.168.1.14 volumes: - "/usr/docker/08/sentinel-1:/usr/src/redis" environment: #环境变量 - REALIP=XXX.XXX.XXX.XXX - REALPORT=26386 command: ["redis-sentinel","/usr/src/redis/conf/sentinel.conf"] entrypoint: #执行 - /bin/sh - /usr/src/sh/redis.sh privileged: true #特殊权限 working_dir: /usr/src/redis #工作目录 stdin_open: true #打开标准输入 tty: true #模拟伪终端
redis.sh
echo " slave-announce-ip $REALIP
slave-announce-port $REALPORT " >> /usr/src/redis/conf/redis.conf
redis-server /usr/src/redis/conf/redis.conf
生成redis docker的Dockerfile
FROM alpine
RUN sed -i ''s/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g'' /etc/apk/repositories \
&& apk add gcc g++ libc-dev wget vim openssl-dev make linux-headers \
&& rm -rf /var/cache/apk/*
#通过选择更小的镜像,删除不必要文件清理不必要的安装缓存,从而瘦身镜像
#创建相关目录能够看到日志信息跟数据跟配置文件
RUN mkdir -p /usr/src/redis \
&& mkdir -p /usr/src/redis/data \
&& mkdir -p /usr/src/redis/conf \
&& mkdir -p /usr/src/sh \
&& mkdir -p /usr/src/redis/log \
&& mkdir -p /var/log/redis
RUN wget -O /usr/src/redis/redis-4.0.11.tar.gz "http://download.redis.io/releases/redis-4.0.11.tar.gz" \
&& tar -xzf /usr/src/redis/redis-4.0.11.tar.gz -C /usr/src/redis \
&& rm -rf /usr/src/redis/redis-4.0.11.tar.tgz
RUN cd /usr/src/redis/redis-4.0.11 && make && make PREFIX=/usr/local/redis install \
&& ln -s /usr/local/redis/bin/* /usr/local/bin/ && rm -rf /usr/src/redis/redis-4.0.11
COPY ./redis/sh/redis.sh /usr/src/sh
RUN chmod +x /usr/src/sh/redis.sh
7 Dockerfile指令详解 && VOLUME 指令
格式为:
VOLUME ["<路径1>", "<路径2>"...]
VOLUME <路径>
之前我们说过,容器运行时应该尽量保持容器存储层不发生写操作,对于数据库类需要保存动态数据的应用,其数据库文件应该保存于卷(volume)中,后面的章节我们会进一步介绍 Docker 卷的概念。
为了防止运行时用户忘记将动态文件所保存目录挂载为卷,在 Dockerfile 中,我们可以事先指定某些目录挂载为匿名卷,这样在运行时如果用户不指定挂载,其应用也可以正常运行,不会向容器存储层写入大量数据。
VOLUME /data
这里的 /data 目录就会在运行时自动挂载为匿名卷,任何向 /data 中写入的信息都不会记录进容器存储层,从而保证了容器存储层的无状态化。当然,运行时可以覆盖这个挂载设置。比如:
docker run -d -v mydata:/data xxxx
在这行命令中,就使用了 mydata 这个命名卷挂载到了 /data 这个位置,替代了 Dockerfile 中定义的匿名卷的挂载配置。
Docker - 03 编排容器 Docker Compose 指令速查表
目录
- 01 Docker 常用指令、参数配置速查表
- 02 Dockerfile 指令速查表
- 03 Docker Compose 指令速查表
Docker - 03 编排容器 Docker Compose 指令速查表
1 docker-compose CLI 命令
1.1 主要
命令 | 说明 | 使用 |
---|---|---|
up | 创建并运行作为服务的容器 | ![]() |
down | 停止服务容器并清除 | ![]() |
1.2 其它
命令 | 说明 | 使用 |
---|---|---|
bind | build需要的镜像 | build [options] [--build-arg key=val...] [SERVICE...] |
config | 验证脚本 | config [options] |
create | 创建镜像不启动 | create [options] [SERVICE...] |
events | 监听容器事件 | events [options] [SERVICE...] |
exec | 执行指定容器执行程序 | exec [options] [-e KEY=VAL...] SERVICE COMMAND [ARGS...] |
run | 运行容器一次性的程序 | run [options] [-v VOLUME...] [-p PORT...] [-e KEY=VAL...] [-l KEY=VALUE...] SERVICE [COMMAND] [ARGS...] |
kill | 强行停止服务 | kill [options] [SERVICE...] |
pause | 暂停服务 | pause [SERVICE...] |
unpause | 恢复被暂停的服务 | unpause [SERVICE...] |
stop | 停止运行一个服务的所有容器 | stop [options] [SERVICE...] |
start | 启动运行某个服务的所有容器 | start [SERVICE...] |
restart | 重启某个服务的所有容器 | restart [options] [SERVICE...] |
rm | 删除停止的服务(容器) | rm [options] [SERVICE...] |
logs | 展示service的日志 | logs [options] [SERVICE...] |
top | 容器资源占用 | top [SERVICE...] |
ps | 容器列表 | ps [options] [SERVICE...] |
port | 查看服务中的端口被映射到了宿主机的哪个端口上 | port [options] SERVICE PRIVATE_PORT |
pull | 拉取服务依赖的镜像 | pull [options] [SERVICE...] |
push | 提交镜像 | push [options] [SERVICE...] |
bundle | 打包 DAB 文件 | bundle [options] |
scale | 指定某一个服务启动的容器的个数 | scale [SERVICE=NUM...] |
2 docker-compose 指令速查表
按字母排列
命令 | 说明 | 用法 |
---|---|---|
build | 编译Dockerfile生成镜像 | ![]() |
command | 覆盖容器启动后默认执行的命令 | ![]() |
container_name | 容器的名字 | ![]() |
cap_add,cap_drop | 加入或者去掉容器能力 | ![]() |
depends_on | 容器的依赖 | ![]() |
configs | 导入配置 | ![]() |
dns | 设置DNS | ![]() |
dns_search | 自定义DNS搜索范围 | ![]() |
devices | 设备映射列表 | ![]() |
driver_opts | 给驱动传值 | ![]() |
entrypoint | 指定接入点 | ![]() |
env_file | 导入环境变量文件 | ![]() |
environment | 设置环境变量 | ![]() |
expose | 暴露的端口 | ![]() |
external_links | 连接单独启动的容器 | ![]() |
extra_hosts | 修改 /etc/hosts | ![]() |
healthcheck | 检查状态 | ![]() |
image | 镜像 | ![]() |
labels | 向容器添加元数据 | ![]() |
links | 连接容器 | ![]() |
logging | 配置日志服务 |
![]() ![]() |
network_mode | 网络模式 | ![]() |
networks | 加入指定网络 | ![]() |
pid | 跟主机系统共享进程命名空间 | ![]() |
ports | 映射端口 |
![]() ![]() |
restart | 出错重启方式 | ![]() |
stop_signal | 设置另一个信号来停止容器 | ![]() |
tmpfs | 挂载临时目录到容器内部 | ![]() |
volumes | 挂载一个目录 | ![]() |
3 例子 - 运行容器服务 WordPress
- 编写
docker-compose.yml
version: ''3.3''
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
volumes:
db_data:
- 运行
docker-compose up
参考
- docker-compose CLI
- Docker Compose
- Get started with WordPress
- Compose file version 3 reference
© 会煮咖啡的猫咪
Docker Compose 版本过高(Docker 版本不匹配),降低 docker-compose 版本
通过 docker-compose 启动容器,报错:
ERROR: The Docker Engine version is less than the minimum required by Compose. Your current project requires a Docker Engine of version 1.10.0 or greater.
升级 Docker 过于麻烦,只能降 docker-compose 的版本。
先看一下我们已经安装的 Docker 版本:
[root@Redmine-186 docker-compose]# docker -v
Docker version 1.7.1, build 786b29d/1.7.1
经查 Docker Compose Github Docs,发现 docker-compose 1.5.2 版本是兼容 Docker 1.7.1 的:Note that Compose 1.5.2 requires Docker 1.7.1 or later.
。
好了,开始降级 docker-compose,先卸载:
# pip uninstall docker-compose
再安装指定版本:
# pip install docker-compose==1.5.2
至此,docker-compose 降版本成功!
docker-compose.yml 版本问题
解决完 docker-compse 版本问题适配之后,对着已有的 docker-compose.yml 执行 “,会提示不能正常识别 docker-compose.yml 文件中的内容。究其原因,是因为我们的 docker-compose 1.5.2 只支持 V1 版本的 docker-compose.yml ,那么好,把现在 V2 版本的 docker-compose.yml 改成 V1 版本的格式。
V1 版本的 docker-compose.yml 只被支持到 docker-compose 1.6.x。再往后的 docker-compose 版本就不再支持 V1 版本的 docker-compose.yml。
先看文档:Compose file versions and upgrading。
V1 版本的 docker-compose.yml 文件格式主要区别就是:
- 没有开头的 version 声明
- 没有 services 声明
- 不支持 depends_on
- 不支持命名的 volumes, networks, build arguments 声明
- 其他我没用到的所以没细究的区别
附录
- How To Install Docker on CentOS 6
- Docker and docker-compose in CentOS 6
- 关于 pip 安装时提示 pkg_resources.DistributionNotFound 错误问题
- CentOS 升级 Python2.7
- ERROR: The Docker Engine version is less than the minimum required by Compose
- Docker Compose Github Docs
- Compose file versions and upgrading
今天关于docker-compose volumes 指令路径映射问题和docker映射目录的讲解已经结束,谢谢您的阅读,如果想了解更多关于10.docker学习笔记之入门,docker-compose端口映射可能会导致的问题、7 Dockerfile指令详解 && VOLUME 指令、Docker - 03 编排容器 Docker Compose 指令速查表、Docker Compose 版本过高(Docker 版本不匹配),降低 docker-compose 版本的相关知识,请在本站搜索。
本文标签: