《第一本Docker书》 学习笔记(一).

Home

http://book.douban.com/subject/26285268/

s27967469

Docker 是一个能够把开发的应用程序自动部署到容器的开源引擎。

Docker 核心组件有这些:

  •    Docker 客户端和服务器;
  •    Docker 镜像;
  •    registry ;
  •    Docker 容器;

Docker 的安装

  •    Docker 安装要求
  1.       CPU 64位 ( x86_64或者amd64 );
  2.       运行 Linux3.8 或更高内核;
  3.       内核必须支持一种适合的存储驱动 ( storage driver ) ,例如,Device Manager 、AUFS、vfs、btrfs,默认存储驱动通常是 Device                     Mapper;
  •    安装方法略。

Docker 的基础命令

安装完成后,先查看 Docker 程序是否存在、正常。使用命令:

2

该命令返回所有容器和镜像的数量、 Docker 使用的执行驱动和存储驱动。

运行第一个容器

docker run -i -t ubuntu /bin/bash

docker run 命令加上参数 -t -i -i 标志保证容器中的 STDIN 是开启的,尽管还没有附着到容器中。持久的标准输入是交互式 shell的“半边天”,

-t 标志则是另外半边天,它告诉 Docker 为要创建的容器分配一个伪 tty 终端。这样,新创建的容器才能提供一个交互式 shell 。若要在命令行下创建一个我们能与之进行交互的容器,而不是一个运行后台服务的容器,这2个参数是最基本的。( docker helo runman docker-run 可以查看全部 docker run 的标志 )

ubuntu 是指定用什么镜像来创建容器。这里是用的基础 ubuntu 镜像。在此命令执行后, Docker 首先会在本地搜寻是否存在 ubuntu 镜像,如果本地没有该镜像,那么 Docker 就会连接到官方的 Docker Hub Regisrty 查看 Docker Hub 中是否存在该镜象,一旦找到就下载到本地,所以第一次运行会比较花多一些时间。

随后 Docker 在文件系统内部用这个镜像创建了一个新容器。该容器拥有自己的网络、IP 地址,以及一个用来和宿主机进行通信的桥接网络接口。最后的 /bin/bash 是告诉 Docker 要在这个新容器中运行什么命令,这里我们启动一个 Bash shell 。

 

执行了 docker run -t -i  ubuntu /bin/bash 后,我们就进到容器内了,并且执行一些命令:

3

exit 命令,退出并结束容器,回到宿主机 shell 下。

执行 docker  ps -a  查看当前系统中的容器列表和状态。

默认情况 docker  ps 不加 -a 参数只能看到当前正在运行的容器。 -a 可以列出所有容器。 -l 列出最后一次运行的容器,包括正在运行的和已经停止了的。

容器可以经由3种方式指代,短 UUID 、长 UUID 、还有名称 ( docker  ps -a 里面的names列 ) ;

 

容器命名

Docker 会为我们创建的容器自动随机命名。如果要手动指定一个名称可以使用 –name:

docker    run   –name    my_first_container    -i    -t    ubuntu   /bin/bash

容器名只能包含大小写字母、数字、下划线、圆点、横线。 [a-zA-Z0-9_.-]

给容器命名是一个好习惯,相较于 UUID ,命名后的容器更易分辨。

容器名必须是唯一的,无法创建2个相同名字的容器。如果有命名冲突可以使用 docker  rm  CONTAINERNAME 来删除容器。

 

重新启动已经停止的容器

docker    start     CONTAINERNAME

docker    start      UUID

也可以用 docker    restart    CONTAINERNAME 重启一个容器。

附着到容器上

当我们想要附着到一个已经运行的容器上,而又没有在 run 的时候打开交互 shell 的时候,可以使用

docker   attach    CONTAINERNAME/UUID

 

创建守护式容器

除了上面的交互式的容器,还有一种守护式容器,非常适合运行应用程序和服务。大多数时候我们运行容器都是守护式的。

docker    run    –name    haha    -d    ubuntu    /bin/bash -c   “until false;  do  echo  hello  world;  sleep 1 ;  done”

此处加上了  -d  参数,因此Docker会将该容器  ( haha ) 放到后台运行。

此时在宿主机执行 docker  ps  就可以看到该容器正在运行。

那此时容器内部在干什么呢?

我们在创建容器的时候添加了 /bin/bash  -c  “until  false; do  echo hello world; sleep 1 ; done ” 这个until循环,那么容器内部就会一直执行该循环,直到容器停止。

此时使用

 

docker   logs   CONTAINERNAME  可以获取当前容器的日志。但只返回最后几条,想要持续获取返回日志:

docker   logs  -f   CONTAINERNAME

还可以使用 docker   logs   –tail  10  CONTAINERNAME 显示最后10行日志。

docker   logs    –tail  0  -f   CONTAINERNAME 来跟踪容器的最新日志而不用读取整个日志文件。

docker   logs   -ft  为每条日志加上时间戳。

 

查看容器内的进程

docker  top   CONTAINERNAME

在容器内部运行进程

在 Docker 1.3 之后,我们可以通过 docker   exec 在容器内部额外启动新进程。容器内可以运行两种进程:后台任务和交互式任务。

运行一个不用交互的后台任务:

docker    exec  -d   CONTAINERNAME   touch   /etc/file1

这里同样加上 -d 表明这是一个后台进程。

要查看新 touch 的这个文件就需要容器内部shell打印一个显示了,那么需要一个交互命令:

docker   exec   -t  -i   CONTAINERNAME    /bin/ls   /etc/file1

或者直接打开一个 bash shell

docker   exec   -i  -t  CONTAINERNAME   /bin/bash

然后就进入到容器内部,打开新的bash会话了。(感觉这个比直接在外面执行 docker  attach  CONTAINERNAME好)

停止守护式容器

docker    stop    CONTAINERNAME 这样停止其实比较慢,也可以使用:

docker    kill    CONTAINERNAME 直接向容器进程直接发送SIGKILL信号。

自动重启容器

如果由于某种错误导致容器停止运行,我们可以通过 –restart 让 Docker 自动重启。 –restart 会检查容器的退出代码,并据此决定是否需要重启容器。

dockerrun  –restart=always  –name  xixi  -d  ubuntu  /bin/bash  -c  “while  true;  do  echo  hello  world ; sleep  1 ; done”

在上面这个例子中, –restart 被设置为 always ,无论容器的退出代码是什么, Docker 都会自动重启该容器。除了 always ,也可以把值设置为 on-failure ,这样只有当容器的退出代码为非 0 的时候才会自动重启,另外 on-failure 还可以接受一个可选的重启次数参数:

docker    run  –restart=on-failure:5  –name  huhu -d  ubuntu  /bin/bash  -c  “while  true;  do  echo  hello  world ; sleep  1 ; done”

 

深入容器

除了通过 docker  ps 获取容器信息,还可以使用 docker  inspect 来获取更多容器信息。

docker  inspect 会对容器进行详细的检查,然后返回其配置信息,包括名称、命令、网络配置以及很多有用的数据。 docker  inspect 还可以加上 -f 或者 –format 来查看选定结果:

docker   inspect   –format='{{  .State.Running  }}’   haha

docker   inspect   –format='{{  .NetworkSettings.IPAddress  }}’ haha

27

-f 或者 –format 其实支持完整的 Go 语言模板。

除了查看容器,还可以通过浏览 /var/lib/docker 目录来深入了解 Docker 的工作原理。该目录存放着 Docker 镜像、容器、以及容器配置。所有的容器都保存在 /var/lib/docker/containers 目录下。

 

删除容器

docker   rm   CONTAINERNAME

运行中的容器无法删除,需要先停止(stop或者kill)

批量删除多个容器:

docker   rm   `docker   ps   -a   -q`

 

Proudly powered by WordPress | Theme: Code Blog by Crimson Themes.