Docker 数据挂载与 Compose 集成
[TOC]
Docker 数据挂载与 Compose 集成
数据挂载
数据管理的两种方式
- 数据卷(Volumes)
- 挂载主机目录(Bind mounts)
数据卷
一个可供一个或者多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性
其对数据卷的修改会立即生效,不会影响镜像,默认会一直存在
注:数据卷的使用,类似于 Linux 下对目录或文件进行 mount,镜像中的被指定为挂载点的目录中的文件会被隐藏掉,能显示看的是挂载的数据卷。
两种挂载方式,-v 和 -mount,推荐使用 -mount 参数
创建一个数据卷
docker volume create my-volume
查看指定数据卷的信息
docker volume inspect my-volume
docker volume ls #查看所有数据卷
启动一个挂载数据卷的容器
docker run --name session-web -d -p 8888:8080 \
#-v my-volume:/webapp \
--mount source=my-volume,target=/webapp session-web:latest
创建一个名为 session-web 的容器,并加载一个数据卷到容器的 /webapp 目录
在用 docker run 命令的时候,使用 –mount 标记来将数据卷挂载到容器里。在一次 docker run 中可以挂载多个书卷
删除数据卷
docker volume rm my-volume
如果需要在删除容器的同时移除数据卷,可以在删除容器的时候使用 docker rm -v 这个命令
清理无主的数据卷
docker volume prune
挂载主机目录
使用 –mount 标记可以指定挂在一个本地主机的目录到容器中去
docker run --name session-web -d -p 8888:8080 \
# -v my-volume:/webapp \
--mount type=bind,source=/src/webapp,target=/opt/webapp \
session-web:latest
加载主机的 /src/webapp 目录到 /opt/webapp 目录。测试的时候可以放置一些程序到本地目录中,来查看容器是否正常工作
挂载主机目录的默认权限是读写,可以通过增加 readonly 指定为只读
–mount 标记也可以从主机挂载单个文件到容器中
docker run --rm -it \
# -v $HOME/.bash_history:/root/.bash_history \
--mount type=bind,source=$HOME/.bash_history,target=/root/.bash_history \
ubuntu:17.10 \
bash
这样就可以在容器中显示输入过的命令了
Compose 集成式应用组合
compose 项目负责实现对 Docker 容器集群的快速编排。
可以实现多个容器配合,如加载 Web 服务容器、数据库服务容器、负载均衡服务容器
允许用户通过一个单独的 docker-compose.yml 模板文件来定义一组关联到应用容器为一个项目(project)
有两个重要的概念
- 服务(service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例
- 项目(projcet):由一组关联的应用容器组成的一个完整的业务单元
compose 默认管理对象是项目。compose 项目由 Python 编写,实际上调用了 Docker 服务厅的 API 来对容器进行管理
Linux 安装 docker-compose
二进制包
sudo curl -L https://github.com/docker/compose/releases/download/1.17.1/docker-compose-'uname -s'-'uname -m' > /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose #赋予可执行权限
PIP 安装
计算机架构为 ARM ,建议使用 pip 安装
sudo pip install -U docker-compose
使用
一个项目可以由多个服务(容器)关联而成,compose 面向项目进行管理
以 compose 构建 dubbo-admin 服务 为例:
获取 dubbo-admin
在 github 上获取 dubbo-admin 的 master 分支源码,修改配置文件,使用 maven 进行打包编译
mvn clean package -Dmaven.test.skip=true
dockerfile
在 dubbo-admin 目录下编写 Dockerfile 文件
FROM openjdk:8-jdk-alpine #使用 jdk1.8 作为基础镜像
MAINTAINER kandigx<kandigx.com>
VOLUME /temp
ADD ./target/dubbo-admin-0.0.1-SNAPSHOT.jar app.jar #拷贝文件并重命名
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/.urandom", "-jar", "/app.jar"]
使用 docker build -t dubbo-admin:1.0
命令进行构建
docker-compose.yml
在项目根目录下编写 docker-compose.yml 文件
version: '3.4'
service:
zk_server:
image: zookeeper:3.4
post:
- 2181:2181
dubbo-admin:
image: dubbo-admin:1.0
links:
- zk_server:zookeeper
ports:
- 7001:7001
运行 compose 项目
在 docker-compose.yml 文件所在目录执行
docker-compose up
在浏览器中访问 http://服务器ip:7001 进行验证
compose 命令说明
docker-compose [COMMAND] --help #查看某个具体命令的使用格式,或者
docker-compose help [COMMAND]
命令基本使用格式
docker-compose [-f=<args>...] [options] [COMMAND] [ARGS...]
模板文件是使用 compose 的核心,默认名称是 docker-compose.yml,其中常见的指令有
-
build
指定 Dockerfile 所在文件件的路径,compose 将会利用它自动构建这个镜像然后使用
version:'3' services: webapp: build: context:./dir #路径 dockerfile:Dockerfile-alternate #dockerfile名称 args: buildno:1
- command
- container_name
- configs
- deploy
- devices
- depends_on
- dns
- environment
- expose
- extra_hosts
- healthcheck
- image
- labels
- links
- network_mode
- networks
- ports
- volumes
- ulimits