Docker一般用于以下场景:html
关于容器、镜像、仓库等基本概念见Docker gitbook--基本概念mysql
容器是镜像的运行实例。Docker镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。 镜像不包含任何动态数据,其内容在构建以后也不会被改变。---- http://dockone.io/article/6051git
Docker 镜像是怎么实现增量的修改和维护的?web
每一个镜像都由不少层次构成,Docker 使用 Union FS 将这些不一样的层结合到一个镜像中去。sql
一般 Union FS 有两个用途, 一方面能够实现不借助 LVM、RAID 将多个 disk 挂到同一个目录下,另外一个更经常使用的就是将一个只读的分支和一个可写的分支联合在一块儿,Live CD 正是基于此方法能够容许在镜像不变的基础上容许用户在其上进行一些写操做。docker
Docker 在 AUFS 上构建的容器也是利用了相似的原理。关于联合文件系统UFS可见http://www.dockerinfo.net/175...数据库
Docker设计时,就充分利用Union FS的技术,将其设计为分层存储的架构。 镜像实际是由多层文件系统联合组成。ubuntu
镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在本身这一层。好比,删除前一层文件的操做,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,可是实际上该文件会一直跟随镜像。所以,在构建镜像的时候,须要额外当心,每一层尽可能只包含该层须要添加的东西,任何额外的东西应该在该层构建结束前清理掉。segmentfault
docker search mysql
docker pull image_name:tag // 如 docker pull mysql:5.7
docker rmi image_name:tag docker rmi image_id
docker image prune // or : docker rmi $(docker images -aq -f dangling=true)
有时候咱们须要将本身构造的镜像分享给别人,但又不想放在仓库上,那么就能够将镜像导出为文件,而后copy给别人,再由其导入便可分享给他人使用。安全
docker save image_name -o /home/xxx/tar_name.tar docker load -i /home/xxx/tar_name.tar
docker run [options] image [command] options: -i: 让容器的标准输入保持打开 -t: 让docker 分配一个伪终端pseudo-tty -d: 后台运行并返回一个惟一的id。要获取容器的输出信息,能够经过 docker [container] logs [container ID or NAMES] 命令。
当利用 docker run 来建立容器时,Docker 在后台运行的标准操做包括:
启动已经终止的容器
docker start container
容器的核心为所执行的应用程序,所须要的资源都是应用程序运行所必需的。除此以外,并无其它的资源。能够在伪终端中利用 ps 或 top 来查看进程信息
docke r [container] stop contain_id_or_name // 中止全部的容器 // docker ps -a 的做用是列出全部的容器,-q 的做用是取出容器的id docker stop $(docker ps -aq)
删除容器
docker [container] rm container_id
删除终止的容器
docker rm $(docker ps -aq)
在使用 -d 参数时,容器启动后会进入后台模式运行。
某些时候须要进入容器进行操做,包括使用 docker attach 命令或 docker exec 命令,推荐你们使用 docker exec 命令,缘由会在下面说明。
docker attach container_id
注意: 若是从这个 stdin 中 exit,会致使容器的中止。
docker exec [options] container_id command options: -i: 输出 -t: 终端 如: docker exec -it 69d1 bash
stdin 中 exit,不会致使容器的中止。这就是为何推荐你们使用 docker exec 的缘由。
更多参数说明请使用 docker exec --help 查看。
有时候咱们会须要将本身机器的容器按期保存下来或者分享给其余人,那么就可使用导入/导出的功能
docker export container_id > your_container_file example: docker export fe3 > ubuntu
这样将导出容器快照到本地文件。
cat you_container_file > docker import - yourlibrary/your_image:tag
可使用 docker import 从容器快照文件中再导入为镜像。
此外,也能够经过指定 URL 或者某个目录来导入,例如
docker import http://example.com/exampleimage.tgz example/imagerepo
用户既可使用 docker load 来导入镜像存储文件到本地镜像库,也可使用 docker import 来导入一个容器快照到本地镜像库。这二者的区别在于容器快照文件将丢弃全部的历史记录和元数据信息( 即仅保存容器当时的快照状态) ,而镜像存储文件将保存完整记录,体积也要大。此外,从容器快照文件导入时能够从新指定标签等元数据信息
数据卷 是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,能够提供不少有用的特性:
注意: 数据卷 的使用,相似于 Linux 下对目录或文件进行 mount,镜像中的被指定为挂载点的目录中的文件会隐藏掉,能显示看的是挂载的 数据卷 。所以你的容器目录dir有一个文件为temp.data,若是你在dir挂载了一个数据卷,那么你就不再能读取temp.data,除非你移除该数据卷。
docker volume create volume_name
docker volume ls // 列出数据卷列表 docker volume inspect volume_name //查看指定的数据卷信息 -------------------------------------------------------------- 输出: [ { "Driver": "local", "Labels": {}, "Mountpoint": "/var/lib/docker/volumes/my-vol/_data", "Name": "my-vol", "Options": {}, "Scope": "local" } ]
docker run [options] --name container_name --mount source=volume_name,targe=path_in_container image_name_or_id [command]
查看挂载信息,在输出的信息的Mount字段包含了挂载信息
docker inspect container_name result: "Mounts": [ { "Type": "volume", "Name": "my-vol", "Source": "/var/lib/docker/volumes/my-vol/_data", "Destination": "/app", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" } ]
docker volume rm volume_name
删除无主数据卷:即没有被容器使用的数据卷
docker volume prune
docker run [option] [--name container_name] -- mount type=bind,source=host_path,target=container_path image_name [command]
上面的命令加载主机的 /src/webapp 目录到容器的 /opt/webapp 目录。这个功能在进行测试的时候十分方便,好比用户能够放置一些程序到本地目录中,来查看容器是否正常工做。本地目录的路径必须是绝对路径,之前使用 -v 参数时若是本地目录不存在 Docker 会自动为你建立一个文件夹,如今使用 --mount 参数时若是本地目录不存在,Docker 会报错。
也能够为docker数据卷指定读写权限
-- mount type=bind,source=host_path,target=container_path,readonly
这样你就不能在容器中写container_path的目录了
也能够挂载文件
-- mount type=bind,source=host_path,target=container_path