容器间共享文件

Docker 的容器和外部环境是相对隔离的,并且容器是一次性的,运行结束后并不会有任何的持久化的文件或者数据。所以当我们需要做应用数据的持久化,或者保留应用的日志文件时,我们需要用到 Docker 提供的一些方法来把外部系统的目录映射到容器的目录,从而达到把我们需要的持久化数据存放在特定位置的目的。

对于 docker run 命令,我们可以使用 docker run -v [host-src]:[container-dest][:<options>] 来指定目录的映射。其中,host-src 是系统目录,container-dest 是要映射到的容器里的目录,options 是可选的配置选项,通常是权限配置,例如 ro 只读,或者 rw 可读可写等。

假设我们要把 /var/tmp 映射到容器中的 /var/tmp,我们可以这么做:

docker run -v /var/tmp:/var/tmp:rw -it ubuntu bash

更多的相关内容可以参考:mount volume

所以,你可以通过把一个系统目录映射到多个容器中去,通过这种方式在系统和多个容器中共享文件和目录。

更加有趣的时,Docker 可以运行一个容器,然后使用 --link 来连接到现有运行的一个容器中,去获取某些需要的数据或者文件,例如 reliable-master 中用到数据导出脚本:mongo-dump.sh

创建一个自己的镜像

创建一个目录,然后新建一个 Dockerfile 文件,Docker 在创建镜像时要基于这个文件的配置,我们看下这个文件应该有哪些内容:

FROM: docker/whalesay:latest

RUN apt-get -y update && apt-get install -y fortune

CMD /usr/games/fortune -a | cowsay

FROM 表示即将创建的镜像基于哪一个镜像来创建,假设你要创建一个 node 应用的镜像,那么你可能是 FROM: node:latest

RUN 表示在创建镜像时,运行后边的命令来更新镜像的相关内容,很多情况下是用于安装你应用相关的依赖,所以 apt-get 用得很多。

CMD,表示容器运行镜像时默认执行的命令,当我们上边这个镜像创建后,使用 run 时,会在镜像加载好了之后在容器环境中运行 /user/games/fortune -a | cowsay。一个镜像只能有一个 CMD 配置,如果有多个,默认是使用最后一个。

写好 Dockerfile 文件之后,在该目录下运行 docker build -t docker-whale .

-t 用于指定镜像的名称,通常我们会使用 <组织名>/<应用名> 来作为镜像名称,可以参考 Docker Hub 上现有的镜像。

接下来就可以看到 Docker 开始创建镜像,结束之后,如果没报错信息,那么你可以使用 docker images 查看到你刚才创建的镜像。

现在很多的项目都会带上 Dockerfile 文件,例如 docker-node 等,所以你可以尝试去了解这些项目的 Dockerfile 文件,看看是如何构建镜像的。

关于 Dockerfile 详细的说明可以参考官网文档:Dockerfile reference

由于 Docker 特殊的文件分层以及容器创建的步骤,良好地编写 Dockerfile 可以让容器运行地更加高效,推荐这一篇文章 How to optimize your dockerfile

使用 Docker Compose

Docker Compose 的安装这里不赘述了,根据官网文档很容易便可以安装好:https://docs.docker.com/compose/install/

由于 Docker Compose 是一个很有用,并且相对常用的东西,所以在这简单提及一下,Docker Compose 是可以把多个容器连接到一起统一管理的工具,我们先来看下是怎么使用的。

可以看下官网提供的 Demo ,了解一下 Docker Compose 使用起来是怎么样的。

首先,我们需要创建一个 docker-compose.yml 文件,例如官网给出的 wordpress 例子

version: '2'
services:
web:
build: .
command: php -S 0.0.0.0:8000 -t /code/wordpress/
ports:
- "8000:8000"
depends_on:
- db
volumes:
- .:/code
db:
image: orchardup/mysql
environment:
MYSQL_DATABASE: wordpress

一个 docker-compose.yml 大致的内容如上,一个主要的服务名称,然后便是这个这个服务对应的容器相关的配置,例如容器名称,构建的目录,端口映射,容器连接,对外的环境变量,目录映射,运行命令等。整个配置文件相对清晰易懂。

在这个文件中,可以编写多个服务的配置,然后在该目录下运行 docker-compose up 便可以运行这个文件配置的相关服务,而无须手动地一个个去启动需要的容器,同时,这个配置文件管理各个容器之间的关系也相对容易。更多详细内容请参考官方文档 compose file

官方提供了很多例子来说明如何使用 Docker Compose 来构建需要多个容器配合的应用,例如 wordpressdjango 等,通常我们要创建一个 Web 应用,是离不开数据库,缓存,web 系统本身等多个服务支撑,Docker Compose 可以帮助我们更好地使用多个容器来创建和管理复杂的系统。

Docker进阶使用1的更多相关文章

  1. 【云计算】Docker云平台—Docker进阶

    Docker云平台系列共三讲,此为第二讲:Docker进阶 参考资料: 五个Docker监控工具的对比:http://www.open-open.com/lib/view/open1433897177 ...

  2. Docker进阶

    Docker进阶 Docker容器命名与重命名 命名 docker run -it -p 80:80 --name containerName img:tag /bin/bash 重命名 docker ...

  3. Docker:四、Docker进阶 Windows Docker IIS 部署

    前面的三篇docker 文档大家看的肯定不过瘾,自己可能也已经上手一试了...不知道有没有发现问题... 哈哈... 我来说说我遇到的问题哦 一.windows docker 镜像越来越大 默认的do ...

  4. Ubuntu Server下docker实战 02: docker进阶配置

    在上一篇文章里<Ubuntu Server下docker实战 01: 安装docker>,我们已经把docker安装起来了,并运行了一个hello-world 这一篇,我们继续讲进阶配置. ...

  5. docker进阶之路-基础篇 | 一:环境搭建

    转载请注明作者及出处: 作者:银河架构师 原文链接:https://www.cnblogs.com/luas/p/12061747.html 一.准备工作 查看内核 Docker 要求 CentOS ...

  6. docker进阶之路-基础篇 | 二:portainer安装与基本使用

    转载请注明作者及出处: 作者:银河架构师 原文链接:https://www.cnblogs.com/luas/p/12061755.html ​简介 Portainer 是轻量级,跨平台,开源的管理D ...

  7. 斌哥的 Docker 进阶指南—监控方案的实现

    过去的一年中,关于 Docker 的话题从未断过,而如今,从尝试 Docker 到最终决定使用 Docker 的转化率依然在逐步升高,关于 Docker 的讨论更是有增无减.另一方面,大家的注意力也渐 ...

  8. 斌哥的 Docker 进阶指南

    过去的一年中,关于 Docker 的话题从未断过,而如今,从尝试 Docker 到最终决定使用 Docker 的转化率依然在逐步升高,关于 Docker 的讨论更是有增无减.另一方面,大家的注意力也渐 ...

  9. docker进阶-搭建私有企业级镜像仓库Harbor

    为什么要搭建私有镜像仓库   对于一个刚刚接触Docker的人来说,官方的Docker hub是用于管理公共镜像.既然官方提供了镜像仓库我们为什么还要去自己搭建私有仓库呢?虽然也可以托管私有镜像.我们 ...

随机推荐

  1. shared_ptr注意点

    1.原始指针不能直接使用赋值运算符对shared_ptr进行赋值运算 std::shared_ptr<int> p; p= ); //error p.reset(); //success ...

  2. 简单两步快速学会使用Mybatis-Generator自动生成entity实体、dao接口和简单mapper映射(用mysql和oracle举例)

    前言: mybatis-generator是根据配置文件中我们配置的数据库连接参数自动连接到数据库并根据对应的数据库表自动的生成与之对应mapper映射(比如增删改查,选择性增删改查等等简单语句)文件 ...

  3. javaCV开发详解之4:转流器实现(也可作为本地收流器、推流器,新增添加图片及文字水印,视频图像帧保存),实现rtsp/rtmp/本地文件转发到rtmp流媒体服务器(基于javaCV-FFMPEG)

    javaCV系列文章: javacv开发详解之1:调用本机摄像头视频 javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG.j ...

  4. maven无法加载本地jar包以及maven项目打包后本地jar包没有打进项目的问题解决办法

    1.首先设置依赖项,这样maven就会把该路径下的jar包导入项目引用 <dependency> <groupId>DPSDK-Manager</groupId> ...

  5. 用GAN生成二维样本的小例子

    同步自我的知乎专栏:https://zhuanlan.zhihu.com/p/27343585 本文完整代码地址:Generative Adversarial Networks (GANs) with ...

  6. discuz用户登录不响应,提示nginx gateway timeout解决方法

    在使用nginx+php-cgi搭建discuz论坛过程中,出现论坛登录不响应,一直提示nginx gateway timeout504网关超时,单单采用php方式登录无问题.但因需要使用nginx把 ...

  7. 优化tomcat配置(从内存、并发、缓存4个方面)优化

    Tomcat内存优化 Tomcat内存优化主要是对 tomcat 启动参数优化,我们可以在 tomcat 的启动脚本 catalina.sh 中设置 java_OPTS 参数. JAVA_OPTS参数 ...

  8. Maven转化为Dynamic Web Module

    如今Maven仍然是最常用的项目管理工具,若要将Java Web项目使用Maven进行管理,则首先需要新建Maven项目,然后将其转化为web项目. 在项目右键选择properties,然后点击左侧P ...

  9. linux环境下创建和删除软链接

    ln -s /home/zhenwx/htccode-v1/ /home/zhenwx/htccode 建立/home/zhenwx/htccode-v1 的软连接 linux下的软链接类似于wind ...

  10. ListView 介绍

    1. 通过继承Activity实现ListView 1.1 在XML布局文件中实现一个ListView <ListView android:layout_width="wrap_con ...