Docker简明基础教程
Docker是基于 Google 公司推出的 Go 语言实现。
首先,Docker 容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多。 其次,Docker 对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器。
Docker的基本概念
Docker 包括三个基本概念
- 镜像(Image)
- 容器(Container)
- 仓库(Repository)
1. Docker镜像
Docker 镜像(Image)就是一个只读的模板。镜像可以用来创建 Docker 容器,镜像与容器的关系就是程序与进程的关系。
2. Docker容器
容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。
可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
镜像是只读的,容器在启动的时候创建一层可写层作为最上层。
Docker仓库
仓库(Repository)是集中存放镜像文件的场所。
Docker 目前只能安装在 64 位平台上,并且要求内核版本不低于 3.10,实际上内核越新越好,过低的内核版本容易造成功能的不稳定。
通过命令$ uname -a
或者cat /proc/version
查看内核版本。
为非 root 用户授权:
# 如果没有就建立一个 Docker 组
$ sudo groupadd docker
# 增加一个用户(用真实的名字替换下面的 ${USER})到 Docker 组,需重登陆来生效
$ sudo gpasswd -a ${USER} docker
# 重启 Docker 服务
$ sudo service docker restart
获取镜像
可以使用 docker pull
命令来从仓库获取所需要的镜像。
下面的例子将从 Docker Hub 仓库下载一个 Ubuntu 12.04 操作系统的镜像。
sudo docker pull ubuntu:12.04
这条命令实际上相当于:
$ sudo docker pull registry.hub.docker.com/ubuntu:12.04
即从注册服务器 registry.hub.docker.com 中的 ubuntu 仓库来下载标记为 12.04 的镜像。
完成后,即可随时使用该镜像了,例如创建一个容器,让其中运行 bash 应用。
$ sudo docker run -t -i ubuntu:12.04 /bin/bash
root@fe7fc4bd8fc9:/#
使用 docker images
显示本地已有的镜像。
创建镜像
使用下载的镜像启动容器:
$ sudo docker run -t -i training/sinatra /bin/bash
root@0b2616b0e5a8:/#
对容器做一些改变,当结束后,我们使用 exit 来退出,使用 docker commit 命令来提交更新后的副本。
$ sudo docker commit -m "Added json gem" -a "Docker Newbee" 0b2616b0e5a8 ouruser/sinatra:v2
4f177bd27a9ff0f6dc2a830403925b5360bfe0b93d476f7fc3231110e7f71b1c
-m 来指定提交的说明信息,跟我们使用的版本控制工具一样;-a 可以指定更新的用户信息;之后是用来创建镜像的容器的 ID;最后指定目标镜像的仓库名和 tag 信息。创建成功后会返回这个镜像的 ID 信息。其中-a就是author的意思。
再次docker images
就可以看到新的镜像了。
利用 Dockerfile 来创建镜像,Dockerfile 中每一条指令都创建镜像的一层,例如:
# This is a comment
FROM ubuntu:14.04
MAINTAINER Docker Newbee <newbee@docker.com>
RUN apt-get -qq update
RUN apt-get -qqy install ruby ruby-dev
RUN gem install sinatra
编写完成 Dockerfile 后可以使用 docker build 来生成镜像。
$ sudo docker build -t="ouruser/sinatra:v2" .
其中 -t 标记来添加 tag,指定新的镜像的用户信息。 “.” 是 Dockerfile 所在的路径(当前目录),也可以替换为一个具体的 Dockerfile 的路径。
此外,还可以利用 ADD 命令复制本地文件到镜像;用 EXPOSE 命令来向外部开放端口;用 CMD 命令来描述容器启动后运行的程序等。例如:
# put my local web site in myApp folder to /var/www
ADD myApp /var/www
# expose httpd port
EXPOSE 80
# the command to run
CMD ["/usr/sbin/apachectl", "-D", "FOREGROUND"]
可以用 docker tag 命令来修改镜像的标签。
sudo docker tag 5db5f8471261 ouruser/sinatra:devel
其中5db5f8471261
是docker的commit ID。
从本地文件系统导入,下载了一个 ubuntu-14.04 的镜像,之后使用以下命令导入:
sudo cat ubuntu-14.04-x86_64-minimal.tar.gz |docker import - ubuntu:14.04
保存和加载镜像
如果要保存镜像到本地文件,可以使用 docker save 命令:
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu 14.04 c4ff7513909d 5 weeks ago 225.4 MB
...
$sudo docker save -o ubuntu_14.04.tar ubuntu:14.04
可以使用 docker load 从导出的本地文件中再加载到本地镜像库,例如
$ sudo docker load --input ubuntu_14.04.tar
或者:
$ sudo docker load < ubuntu_14.04.tar
sava到本地的镜像比export的要大,因为save到本地的镜像有历史信息。
移除本地镜像
如果要移除本地的镜像,可以使用 docker rmi 命令。注意 docker rm 命令是移除容器。
$ sudo docker rmi training/sinatra
Untagged: training/sinatra:latest
Deleted: 5bc342fa0b91cabf65246837015197eecfa24b2213ed6a51a8974ae250fedd8d
Deleted: ed0fffdcdae5eb2c3a55549857a8be7fc8bc4241fb19ad714364cbfd7a56b22f
Deleted: 5c58979d73ae448df5af1d8142436d81116187a7633082650549c52c3a2418f0
在删除镜像之前要先用 docker rm 删掉依赖于这个镜像的所有容器。
清理所有未打过标签的本地镜像:
docker images 可以列出本地所有的镜像,其中很可能会包含有很多中间状态的未打过标签的镜像,大量占据着磁盘空间。
使用下面的命令可以清理所有未打过标签的本地镜像
$ sudo docker rmi $(docker images -q -f "dangling=true")
Docker 容器
简单的说,容器是独立运行的一个或一组应用,以及它们的运行态环境。
启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态(stopped)的容器重新启动。
新建并启动:
所需要的命令主要为 docker run。
启动已终止容器:
可以利用 docker start 命令,直接将一个已经终止的容器启动运行。
后台(background)运行
对比容器后台和前台运行的差别:
$ sudo docker run ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
hello world
hello world
hello world
hello world
容器会把输出的结果(STDOUT)打印到宿主机上面
如果使用了 -d 参数运行容器。
$ sudo docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
77b2dc01fe0f3f1265df143181e7b9af5e05279a884f4776ee75350ea9d8017a
此时容器会在后台运行并不会把输出的结果(STDOUT)打印到宿主机上面(输出结果可以用docker logs 查看)。
容器是否会长久运行,是和docker run指定的运行命令有关,和 -d 参数无关
终止容器
可以使用 docker stop 来终止一个运行中的容器。
处于终止状态的容器,可以通过 docker start 命令来重新启动。
docker restart 命令会将一个运行态的容器终止,然后再重新启动它。
进入容器
在使用 -d 参数时,容器启动后会进入后台。 某些时候需要进入容器进行操作,有很多种方法,包括使用 docker attach 命令或 nsenter 工具等。
$ sudo docker run -idt ubuntu
243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
243c32535da7 ubuntu:latest "/bin/bash" 18 seconds ago Up 17 seconds nostalgic_hypatia
$sudo docker attach nostalgic_hypatia
root@243c32535da7:/#
导入导出容器
使用docker export 和docker import 命令。
用户既可以使用 docker load 来导入镜像存储文件到本地镜像库,也可以使用 docker import 来导入一个容器快照到本地镜像库。这两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也要大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。
删除容器
可以使用 docker rm 来删除一个处于终止状态的容器。 例如
$sudo docker rm trusting_newton
trusting_newton
如果要删除一个运行中的容器,可以添加 -f 参数。Docker 会发送 SIGKILL 信号给容器。
注意:docker images列表的是镜像;docker ps -a列表的是容器。