GVKun编程网logo

docker-compose volumes 指令路径映射问题(docker映射目录)

31

在这篇文章中,我们将为您详细介绍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映射目录)

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端口映射可能会导致的问题

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 指令

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 指令速查表

Docker - 03 编排容器 Docker Compose 指令速查表

docker

目录

  • 01 Docker 常用指令、参数配置速查表
  • 02 Dockerfile 指令速查表
  • 03 Docker Compose 指令速查表

Docker - 03 编排容器 Docker Compose 指令速查表

1 docker-compose CLI 命令

1.1 主要

 命令 说明 使用
up 创建并运行作为服务的容器 ducafecat_2018-08-16-11-42-05
down 停止服务容器并清除 ducafecat_2018-08-16-11-42-33

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生成镜像 ducafecat_2018-08-16-10-59-07
command 覆盖容器启动后默认执行的命令 ducafecat_2018-08-16-10-59-36
container_name 容器的名字 ducafecat_2018-08-16-10-59-52
cap_add,cap_drop 加入或者去掉容器能力 ducafecat_2018-08-15-18-18-29
depends_on 容器的依赖 ducafecat_2018-08-16-11-00-51
configs 导入配置 ducafecat_2018-08-16-11-01-17
dns 设置DNS ducafecat_2018-08-16-11-02-46
dns_search 自定义DNS搜索范围 ducafecat_2018-08-16-11-04-10
devices 设备映射列表 ducafecat_2018-08-16-11-04-29
driver_opts 给驱动传值 ducafecat_2018-08-16-11-05-25
entrypoint 指定接入点 ducafecat_2018-08-16-11-08-49
env_file 导入环境变量文件 ducafecat_2018-08-16-11-09-15
environment 设置环境变量 ducafecat_2018-08-16-11-09-34
expose 暴露的端口 ducafecat_2018-08-16-11-09-50
external_links 连接单独启动的容器 ducafecat_2018-08-16-11-10-07
extra_hosts 修改 /etc/hosts ducafecat_2018-08-16-11-10-25
healthcheck 检查状态 ducafecat_2018-08-16-11-10-57
image 镜像 ducafecat_2018-08-16-11-13-55
labels 向容器添加元数据 ducafecat_2018-08-16-11-14-20
links 连接容器 ducafecat_2018-08-16-11-15-38
logging 配置日志服务 ducafecat_2018-08-16-11-16-42ducafecat_2018-08-16-11-16-53
network_mode 网络模式 ducafecat_2018-08-16-11-17-10
networks 加入指定网络 ducafecat_2018-08-16-11-17-24
pid 跟主机系统共享进程命名空间 ducafecat_2018-08-16-11-33-03
ports 映射端口 ducafecat_2018-08-16-11-18-48ducafecat_2018-08-16-11-19-01
restart 出错重启方式 ducafecat_2018-08-16-11-18-04
stop_signal 设置另一个信号来停止容器 ducafecat_2018-08-16-11-30-54
tmpfs 挂载临时目录到容器内部 ducafecat_2018-08-16-11-31-11
volumes 挂载一个目录 ducafecat_2018-08-16-11-31-43

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 版本过高(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 版本的相关知识,请在本站搜索。

本文标签: