Docker 入门
Docker 的安装
Docker 是一个开源的商业产品,有两个版本:社区版(Community Edition,缩写为 CE)和企业版(Enterprise Edition,缩写为 EE)。企业版包含了一些收费服务,个人开发者一般用不到。下面的介绍都针对社区版。
Docker CE 的安装请参考官方文档。
安装完成后,运行下面的命令,验证是否安装成功。
$ docker version
# 或者
$ docker info
Docker 需要用户具有 sudo 权限,为了避免每次命令都输入sudo,可以把用户加入 Docker 用户组 ( 官方文档 )
$ sudo usermod -aG docker $USER
Docker 是服务器----客户端架构。命令行运行docker命令的时候,需要本机有 Docker 服务。如果这项服务没有启动,可以用下面的命令启动(官方文档)
# service 命令的用法
$ sudo service docker start
# systemctl 命令的用法
$ sudo systemctl start docker
Docker三大核心概念
- 镜像 (Image) :
- 容器 (Container) :
- 仓库 (Repository) :
镜像 (Image)
镜像相当于是一个特殊的文件系统,是只读的,包含需要运行的文件(提供容器运行时所需的程序、库、资源、配置等文件,还包含了一些为运行时准备的一些配置参数)。镜像用来创建容器,一个镜像可以运行多个容器。镜像可以通过Dockerfile创建,也可以从Docker hub/registry上下载。
Image 文件是通用的,一台机器的 Image 文件拷贝到另一台机器,照样可以使用。一般来说,为了节省时间,我们应该尽量使用别人制作好的 Image 文件,而不是自己制作。即使要定制,也应该基于别人的 Image 文件进行加工,而不是从零开始制作。
为了方便共享, Image 文件制作完成后,可以上传到网上的仓库。Docker 的官方仓库 Docker Hub 是最重要、最常用的 Image 仓库。此外,出售自己制作的 Image 文件也是可以的。
容器(Container)
容器是基于镜像启动起来的,容器可以运行一个或多个进程,镜像是Docker生命周期中的构建或者打包阶段,容器则是启动或执行阶段。
镜像和容器的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止和删除等。
仓库(Repository)
仓库是集中存放镜像的地方,每个服务器上可以有多个仓库,而每个仓库下面有多个镜像。从这方面来说,仓库可以被认为是一个具体的项目或目录。
仓库分为两种,公有参考,和私有仓库,最大的公开仓库是docker Hub,存放了数量庞大的镜像供用户下周,国内的docker pool,这里仓库的概念与Git类似,registry可以理解为github这样的托管服务。
Hello World 示例
首先,运行下面的命令,将 image 文件从官方镜像仓库抓取到本地。
$ docker image pull library/hello-world
上面代码中,docker image pull
是抓取 image 文件的命令。library/hello-world 是 image 文件在仓库里面的位置,其中library是 image 文件所在的组,hello-world 是 image 文件的名字。
由于 Docker 官方提供的 image 文件,都放在library组里面,所以它的是默认组,可以省略。因此,上面的命令可以写成下面这样。
$ docker image pull hello-world
抓取成功以后,就可以在本机看到这个 image 文件了。
$ docker image ls
现在,运行这个 image 文件。
$ docker container run hello-world
docker container run
命令会从 image 文件,生成一个正在运行的容器实例。
注意,
docker container run
命令具有自动抓取 image 文件的功能。如果发现本地没有指定的 image 文件,就会从仓库自动抓取。因此,前面的docker image pull
命令并不是必需的步骤。
如果运行成功,你会在屏幕上看到如下输出:
$ docker container run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
...
输出这段提示以后,hello world就会停止运行,容器自动终止。
容器文件
image 文件生成的容器实例,本身也是一个文件,称为容器文件。也就是说,一旦容器生成,就会同时存在两个文件: image 文件和容器文件。而且关闭容器并不会删除容器文件,只是容器停止运行而已。
# 列出本机正在运行的容器
$ docker container ls
# 列出本机所有容器,包括终止运行的容器
$ docker container ls -a
终止运行的容器文件,依然会占据硬盘空间,可以使用 docker container rm
命令删除。
$ docker container rm [containerID]
运行上面的命令之后,再使用 docker container ls -a
命令,就会发现被删除的容器文件已经消失了。
Docker常用命令
镜像相关命令
docker images #查看本地镜像。包含多个options:
-a #列出本地所有的镜像(镜像分层,含中间映像层)。
-q #只显示镜像id(-qa组合options)。
–digests #现实摘要信息。
– no-trunc #显示完整的镜像信息(–digests --no-trunc组合options)。
docker search #镜像名,options:
–no-trunc #显示完整的镜像描述。
-s #列出收藏数不小于指定值的镜像。
–automated #只列出automated build类型的镜像。
docker pull #镜像名(镜像名可以:版本号,不指定版本号默认latest)
docker rmi #镜像名id,删除镜像。options:
-f #删除单个镜像id。
#空格分割,删除多个镜像。
-f $(docker images -q) #删除全部镜像。
docker commit
docker push
容器相关命令
docker run 镜像id #新建并启动容器。options:
–name #为容器指定名字。
-d #后台运行容器 #并返回容器id #即启动守护式容器。
-i #以交互模式运行容器 #通常与-t同时使用。
-t #为容器重新分配一个伪输入终端。
-P #随机端口映射。
-p #指定端口映射 #有以下四种格式:
ip:hostPort:containerPort
ip::containerPort
hostPort:containerPort
containerPort
docker ps #列出当前所有正在运行的容器。options:
-a #列出所有正在运行的容器+历史上运行过的。
-l #显示最近创建的容器。
-n #显示最近n个创建的容器。
-q #静默模式 #只显示容器编号(-lq可组合使用)。
–no-trunc #不截断输出。
exit #容器停止退出。
ctrl+P+Q #容器不停止退出。
docker start 容器id或容器名 #启动容器。
docker restart 容器id #重启容器。
docker stop 容器id或容器名 #停止容器。
docker kill 容器id或容器名 #强制停止容器。
docker rm 容器id #删除已经停止的容器。options:
-f $(docker ps -a -q) #删除全部。
docker ps -a -q | xargs docker rm #直接全部删除
docker image prune -a -f #删除所有不用的镜像
参考来源:
阮一峰的网络日志 http://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html