开源书籍:Docker从入门到实践
操作容器
启动
- 新建并启动
docker run name
sudo docker run -t -i ubuntu:14.04 /bin/bash # 启动一个 bash 终端,允许用户进行交互
-t 选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上, -i 则让容器的标准输入保持打开
启动已终止容器
docker start 命令,直接将一个已经终止的容器启动运行
容器的核心为所执行的应用程序,所需要的资源都是应用程序运行所必需的。除此之外,并没有其它的资源。可以在伪终端中利用 ps 或 top 来查看进程信息。
守护态运行
更多的时候,需要让 Docker在后台运行而不是直接把执行命令的结果输出在当前宿主机下。此时,可以通过添加 -d 参数来实现。
docker run -d ubuntu:14.04
此时容器会在后台运行并不会把输出的结果(STDOUT)打印到宿主机上面(输出结果可以用docker logs 查看)
可以通过 docker ps 命令来查看容器信息
终止
可以使用 docker stop 来终止一个运行中的容器。
此外,当Docker容器中指定的应用终结时,容器也自动终止。
终止状态的容器可以用 docker ps -a 命令看到
处于终止状态的容器,可以通过 docker start 命令来重新启动。
此外,docker restart 命令会将一个运行态的容器终止,然后再重新启动它。
进入容器
在使用 -d 参数时,容器启动后会进入后台。
某些时候需要进入容器进行操作,有很多种方法,包括使用 docker attach 命令或 nsenter 工具等
- Attach 命令
docker run -idt ubuntu
docker attach nostalgic_hypatia
但是使用 attach 命令有时候并不方便。当多个窗口同时 attach 到同一个容器的时候,所有窗口都会同步显示。当某个窗口因命令阻塞时,其他窗口也无法执行操作了
- Nsenter 命令
nsenter 启动一个新的shell进程(默认是/bin/bash), 同时会把这个新进程切换到和目标(target)进程相同的命名空间,这样就相当于进入了容器内部
….
导出和导入
- 导出容器
docker export 7691a814370e > ubuntu.tar #将导出容器快照到本地文件
- 导入容器快照
cat ubuntu.tar | sudo docker import - test/ubuntu:v1.0 # 使用 docker import 从容器快照文件中再导入为镜像
此外,也可以通过指定 URL 或者某个目录来导入
docker import http://example.com/exampleimage.tgz example/imagerepo
删除
- 可以使用 docker rm 来删除一个处于终止状态的容器。
docker rm trusting_newton
如果要删除一个运行中的容器,可以添加 -f 参数。Docker 会发送 SIGKILL 信号给容器
- 清理所有处于终止状态的容器
docker rm $(docker ps -a -q)
访问仓库
仓库(Repository)是集中存放镜像的地方。
目前 Docker 官方维护了一个公共仓库 Docker Hub,其中已经包括了超过 15,000 的镜像。大部分需求,都可以通过在 Docker Hub 中直接下载镜像来实现
登录
可以通过执行 docker login 命令来输入用户名、密码和邮箱来完成注册和登录。
注册成功后,本地用户目录的 .dockercfg 中将保存用户的认证信息。
基本操作
用户无需登录即可通过 docker search 命令来查找官方仓库中的镜像,并利用 docker pull 命令来将它下载到本地。
自动创建
…
私有仓库
有时候使用 Docker Hub 这样的公共仓库可能不方便,用户可以创建一个本地仓库供私人使用。
docker-registry 是官方提供的工具,可以用于构建私有的镜像仓库。
….
仓库配置文件
Docker 的 Registry 利用配置文件提供了一些仓库的模板(flavor),用户可以直接使用它们来进行开发或生产部署。
模板
在 config_sample.yml 文件中,可以看到一些现成的模板段:
* common:基础配置
* local:存储数据到本地文件系统
* s3:存储数据到 AWS S3 中
* dev:使用 local 模板的基本配置
* test:单元测试使用
* prod:生产环境配置(基本上跟s3配置类似)
* gcs:存储数据到 Google 的云存储
* swift:存储数据到 OpenStack Swift 服务
* glance:存储数据到 OpenStack Glance 服务,本地文件系统为后备
* glance-swift:存储数据到 OpenStack Glance 服务,Swift 为后备
* elliptics:存储数据到 Elliptics key/value 存储
用户也可以添加自定义的模版段。
默认情况下使用的模板是 dev,要使用某个模板作为默认值,可以添加 SETTINGS_FLAVOR 到环境变量中,例如
export SETTINGS_FLAVOR=dev
另外,配置文件中支持从环境变量中加载值,语法格式为 _env:VARIABLENAME[:DEFAULT]。
Docker 数据管理
这一章介绍如何在 Docker 内部以及容器之间管理数据,在容器中管理数据主要有两种方式:
- 数据卷(Data volumes)
- 数据卷容器(Data volume containers)
数据卷
数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:
- 数据卷可以在容器之间共享和重用
- 对数据卷的修改会立马生效
- 对数据卷的更新,不会影响镜像
- 数据卷默认会一直存在,即使容器被删除
创建一个数据卷
使用 -v 标记来创建一个数据卷并挂载到容器里
docker run -d -P --name web -v /webapp training/webapp python app.py
删除数据卷
挂载一个主机目录作为数据卷
使用 -v 标记也可以指定挂载一个本地主机的目录到容器中去。
docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py
查看数据卷的具体信息
docker inspect web
挂载一个本地主机文件作为数据卷
-v 标记也可以从主机挂载单个文件到容器中
docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash
数据卷容器
数据卷容器,其实就是一个正常的容器,专门用来提供数据卷供其它容器挂载的。
首先,创建一个名为 dbdata 的数据卷容器:
docker run -d -v /dbdata --name dbdata training/postgres echo Data-only container for postgres
然后,在其他容器中使用 –volumes-from 来挂载 dbdata 容器中的数据卷
docker run -d --volumes-from dbdata --name db1 training/postgres
docker run -d --volumes-from dbdata --name db2 training/postgres
可以使用超过一个的 –volumes-from 参数来指定从多个容器挂载不同的数据卷。
也可以从其他已经挂载了数据卷的容器来级联挂载数据卷。
备份&恢复
–volumes-from