Docker 是基于 linux 内核的 cgroup 和 namespace 等实现的进程隔离技术,是操做系统层面的虚拟化技术。因为进程在宿主机上被分割成独立的空间,就像一个独立的容器将这些进程与外界隔离开来,所以被称为容器。linux
Docker 容器与传统的虚拟化技术最大的区别在于,传统的虚拟化技术是在宿主机器上虚拟出一套硬件后,在其上面运行完整的操做系统,而后在该系统上运行用户进程,属于硬件层面的虚拟化技术。而 docker 是操做系统层面的虚拟化技术,不须要虚拟化硬件,同一宿主机器上的全部容器共享宿主机的硬件和操做系统内核,只是在用户态隔离进程的运行环境和存储空间,所以对于上层用户而言一个容器就好像是一台独立的主机。下图是 docker 官网上的一张对比图,左边描述的是 docker 容器技术,右边描述的是传统的虚拟机技术。redis
这个区别使得 docker 相比与传统的虚拟化技术要轻量的多,启动一个虚拟机须要占用几 G 到几十 G 的磁盘空间,须要的时间也是几分钟到十几分钟不等,而启动一个容器只通常只要几十 M 到上百 M,启动的速度更是能够在秒级时间内完成。docker
Docker 中有三个最重要的概念:镜像、容器和仓库。弄懂这三个概念就可使用基本的容器了。首先你能够将容器想象成是一台 linux 主机,在这个主机中会启动须要的进程,好比一个 redis 的容器就会启动一个 redis 的服务器。而启动一个容器须要镜像,相似于安装一个 linux 系统须要安装包,你能够想象镜像就是容器的安装包。最后仓库就是存放镜像的地方,方便的是从这个仓库下载镜像只须要一个命令就能搞定,就像 apt-get 安装软件那样方便。json
有了镜像才能生成容器,所以咱们先来了解镜像。ubuntu
下载镜像使用 docker pull 命令来实现,该命令格式以下:bash
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
复制代码
仓库名/镜像名:标签名
的格式组成,仓库名没有则从默认仓库 library
拉取,也就是官方镜像,镜像名必须有,标签名没有则默认拉取 latest
标签的镜像。同一个镜像名的镜像能够有多个标签,通常每更新一个版本就新增一个标签,latest
标签就是最新的镜像。好比能够这样下载标签为 18.04 的 ubuntu 镜像:服务器
$ docker pull ubuntu:18.04
18.04: Pulling from library/ubuntu
bf5d46315322: Pull complete
9f13e0ac480c: Pull complete
e8988b5b3097: Pull complete
40af181810e7: Pull complete
e6f7c7e5c03e: Pull complete
Digest: sha256:147913621d9cdea08853f6ba9116c2e27a3ceffecf3b492983ae97c3d643fbbe
Status: Downloaded newer image for ubuntu:18.04
复制代码
docker image ls
命令能够列出系统中已经下载了的全部镜像。docker 中不少命令与 linux 的命令类似,所以在使用的时候能够类比,docker 中有诸如 rm、ls、ps等命令。将了解更多的命令一样能够经过 docker image --help
来查看帮助信息。ui
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
zookeeper latest e41846a619f5 17 hours ago 224MB
ubuntu 18.04 cf0f3ca922e0 3 days ago 64.2MB
ubuntu latest cf0f3ca922e0 3 days ago 64.2MB
redis latest f7302e4ab3a8 2 months ago 98.2MB
hello-world latest fce289e99eb9 9 months ago 1.84kB
复制代码
列表分别包含了仓库名
、标签
、镜像ID
、建立时间
、镜像大小
。docker image ls
命令展现的是一个完整镜像的大小,可是因为镜像是分层存储的,不一样的镜像若是使用了相同的层,这个层只会存储一份数据,全部镜像公用,所以镜像实际占用的空间大小要比显示的小。this
docker image rm
命令能够删除镜像,通常配合docker image ls
命令来使用。docker image rm
命令的使用格式是:spa
docker image rm [OPTIONS] IMAGE [IMAGE...]
复制代码
docker image rm --help
能够查看帮助信息好比能够这样删除标签为 latest 的 ubuntu 镜像:
$ docker image rm ubuntu:latest
Untagged: ubuntu:18.04
Untagged: ubuntu@sha256:a7b8b7b33e44b123d7f997bd4d3d0a59fafc63e203d17efedf09ff3f6f516152
Deleted: sha256:cf0f3ca922e08045795f67138b394c7287fbc0f4842ee39244a1a1aaca8c5e1c
Deleted: sha256:c808877c0adcf4ff8dcd2917c5c517dcfc76e9e8a035728fd8f0eae195d11908
Deleted: sha256:cdf75cc6b4d28e72a9931be2a88c6c421ad03cbf984b099916a74f107e6708ff
Deleted: sha256:b9997ded97a1c277d55be0d803cf76ee6e7b2e8235d610de0020a7c84c837b93
Deleted: sha256:a090697502b8d19fbc83afb24d8fb59b01e48bf87763a00ca55cfff42423ad36
复制代码
Untagged 和 Deleted 在执行 docker image rm
时,出现了两种状况,Untagged 和 Deleted。由于同一个镜像(不仅是同名,而是真正意义上的同一个)能够对应多个标签,当执行 rm
命令时先移除这个指定的标签,只有当移除的标签是最后一个标签的时候才会同时删除这个镜像。除此以外,由于镜像是分层存储的,要删除的镜像多是别的镜像的基础层,若是删除了这个镜像也会致使依赖方出现问题。所以,若是有别的镜像依赖这个镜像,那么这是这个镜像也不会被删除。另外,若是有其余容器依赖于这个镜像,那么也不能删除这个镜像,由于删除这个镜像必然会致使容器出现故障。
运行容器有两种方式,一种是新建一个容器并启动,另外一种是启动一个已终止的容器。
docker run
命令用来新建一个容器并启动,该命令的使用格式是:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
复制代码
好比下面这个命令会经过 ubuntu 镜像建立并运行一个容器,而后执行 /bin/bash
命令。
$ docker run -it ubuntu /bin/bash
复制代码
其中常见的命令选项有:
用这个命令启动一个容器后,就能够像操做一台普通的 ubuntu 机器同样,操做这个容器了。能够尝试在这个容器中执行一些 linux 命令。
root@e7cd5bc73508:/# ps
PID TTY TIME CMD
1 pts/0 00:00:00 bash
10 pts/0 00:00:00 ps
root@e7cd5bc73508:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
复制代码
须要注意的是,对于这种以交互模式启动的容器,当终止交互后,容器就退出了。
docker container start
能够启动一个终止的容器,该命令的使用格式是:
docker container start [OPTIONS] CONTAINER [CONTAINER...]
复制代码
要启动一个容器,须要知道容器的ID来做为docker container start
的参数,接下来介绍如何查看容器。
docker container ls
列出全部正在运行的容器
docker container ls -a
列出全部的容器,包括已经终止的容器
列出的容器信息包括:
docker container stop
命令用来终止一个正在运行的容器
终止的容器能够经过 docker container start
命令启动,docker container restart
命令会先终止容器,而后再启动容器。
大多数时候须要容器在后台运行,不须要将输出结果打印到宿主主机上。此时,能够经过 -d 参数来实现。
不使用 -d 选项启动下面这个容器,表现以下:
$ docker run ubuntu /bin/bash -c "while true; do echo hello world; sleep 1; done"
hello world
hello world
hello world
hello world
hello world
复制代码
使用 -d 选项启动这个容器,表现以下:
$ docker run -d ubuntu /bin/bash -c "while true; do echo hello world; sleep 1; done"
574ee145e9ca501639a233601efe9574a356a8d7bdef461d240b2212b6aeaf77
复制代码
在宿主的终端只输出了该容器的 ID。若是须要查看容器的输出可使用 docker container logs
命令。本文在说容器的这些命令时都省略了最后一个参数容器 ID,这个读者在使用的时候须要自行加上,查询容器 ID 的方法前面已经介绍过了。若是想要持续获取容器的输出可使用 docker container logs -f
命令。
使用 -d 参数启动容器后,容器在后台运行,若是须要进入容器可使用 docker attach
命令或 docker exec
命令。建议使用 docker exec
命令,缘由在下面进行说明。
docker attach
$ docker run -it -d ubuntu
2b10efdeaa9f0f24f0060bf636cc8f1bae9598f5e0176b498447a7b63ea10d06
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2b10efdeaa9f ubuntu "/bin/bash" 13 seconds ago Up 11 seconds cocky_golick
$ docker attach 2b10efdeaa9f
root@2b10efdeaa9f:/#
复制代码
使用 attach 命令,若是从这个终端退出后,这个容器也会被终止,这就是不推荐使用 attach
命令的缘由。
docker exec
$ docker run -it -d ubuntu
61299a9b910b029f9a8667131a45aff92fbc35633e4f86c8fcfb72e6362c5115
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
61299a9b910b ubuntu "/bin/bash" 6 seconds ago Up 5 seconds friendly_hawking
$ docker exec -it 61299a9b910b /bin/bash
复制代码
使用 exec 命令,能够生成新的伪终端与容器进行交互,所以退出时不会致使容器退出。
docker container rm
命令能够删除一个容器,若是要删除一个正在运行的容器可使用docker container rm -f
。
若是要清除全部终止的容器可使用 docker container prune
命令。
docker login
登陆到docker hub仓库docker logout
退出登陆docker search <关键词>
搜索镜像docker pull
从仓库下载镜像docker push
将本地仓库推送到远程仓库下面演示一下这些命令的使用:
$ docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one. Username: xxx Password: xxx WARNING! Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded $ docker pull hello-world # 为镜像 hello-world 生成一个新的标签,并且指定仓库为本身仓库的用户名 $ docker tag hello-world:latest oscarwin/hello-world:3.0 # 将镜像推送到远程仓库,那么就能够在 docker hub 里看到本身推送的这个镜像了 $ docker push oscarwin/hello-world 复制代码