Docker进阶使用1
容器间共享文件
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 来构建需要多个容器配合的应用,例如 wordpress,django 等,通常我们要创建一个 Web 应用,是离不开数据库,缓存,web 系统本身等多个服务支撑,Docker Compose 可以帮助我们更好地使用多个容器来创建和管理复杂的系统。