第三章 docker 入门

3.1 确保docker已经就绪

首先查看docker程序是否存在,功能是否正常

[#3#cloudsoar@cloudsoar-virtual-machine ~]$sudo docker info

[sudo] password for cloudsoar:

Containers: 11

Images: 16

Server Version: 1.9.1

Storage Driver: aufs

Root Dir: /var/lib/docker/aufs

Backing Filesystem: extfs

Dirs: 38

3.2 运行我们的第一个容器

docker run 命令提供了Docker容器的创建到启动的功能

书上使用此命令创建第一个容器

[#4#cloudsoar@cloudsoar-virtual-machine ~]$sudo docker run -i -t ubuntu /bin/bash

Unable to find image 'ubuntu:latest' locally

latest: Pulling from library/ubuntu

073de23ee32b: Downloading 48.09 MB/65.69 MB

...

可以看到有大概66MB,等待慢慢下载完成。其实Ubuntu镜像也是一个基础镜像。

sudo docker run -i -t ubuntu /bin/bash

这句命令我的理解就是,sudo 临时切换管理员权限,使用 docker run 命令,启动镜像

ubuntu 中的 bash。docker run 会检查本地是否有ubuntu这个基础镜像,如果没有,

则去docker hub registry 去检测并下载此镜像,下载完毕再执行。

由于容器有自己的ip,自己的shell,是独立的。因此加上 -i 参数来打开容器的标准输入

STDIN,使用 -t 给容器配一个交互式终端。当新容器下载完毕后,会自动以root用户登

录到新的容器中。界面显示的是:root@容器ID 。容器的主机名就是容器的ID。

假设说我们想要给这个容器安装一个curl,或者是 ping,可以通过如下命令

sudo docker run ubuntu apt-get install -y curl

docker run 容器名 命令

等了半个小时,还没下载完毕,由于这个基础镜像下载实在太慢,我换了一个镜像

我之前pull了一个名为paulcos11/docker-tutorial的镜像,容器有11个

如果你想下载其他的镜像,可以使用 docker search tutorial 首先查看可用镜像。然后使用

docker pull 把它拉下来。

root@cloudsoar-virtual-machine:/home/cloudsoar# docker search tutorial

NAME                                 DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED

georgeyord/reactjs-tutorial          This is the backend of the React comment b...   2                    [OK]

mhausenblas/kairosdb-tutorial        GitHub fetcher for KairosDB tutorial            1                    [OK]

odk211/spree-tutorial                                                                1                    [OK]

paulcos11/docker-tutorial            docker tutorial

root@cloudsoar-virtual-machine:/home/cloudsoar# docker pull paulcos11/docker-tutorial

Using default tag: latest

latest: Pulling from paulcos11/docker-tutorial

044ffdf80f70: Pull complete

...

Digest: sha256:8effcf1f4eac7096ba4eaf4a90261580657605d159946372c12ae28b7e5e74f1

Status: Downloaded newer image for paulcos11/docker-tutorial:latest

到这里,我成功下载了容器镜像paulcos11/docker-tutorial

继续流程,进入我们的容器

root@cloudsoar-virtual-machine:~# docker run -i -t paulcos11/docker-tutorial /bin/bash

root@537739299f24:/#

执行完毕可以看到进入了容器的bash,用户是root,容器ID是537739299f24,

3.3 使用容器

可以使用 hostname 查看容器的主机名

root@537739299f24:/# hostname

537739299f24

可以看到容器的ID就是容器的主机名。
下一步看看 /etc/hosts 文件

root@537739299f24:/# cat /etc/hosts

172.17.0.2 537739299f24

127.0.0.1 localhost

::1 localhost ip6-localhost ip6-loopback

fe00::0 ip6-localnet

ff00::0 ip6-mcastprefix

ff02::1 ip6-allnodes

ff02::2 ip6-allrouters

可以看到docker 已经在host文件中为该容器的ijp增加了一条主机配置项

再看看IP

root@537739299f24:/# ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default

link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

inet 127.0.0.1/8 scope host lo

valid_lft forever preferred_lft forever

inet6 ::1/128 scope host

valid_lft forever preferred_lft forever

30: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default

link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff

inet 172.17.0.2/16 scope global eth0

valid_lft forever preferred_lft forever

inet6 fe80::42:acff:fe11:2/64 scope link

valid_lft forever preferred_lft forever

可以看到这里有lo的回环接口。还有ip是172.17.0.2的标准eth0接口,和宿主机完全一样。

查看容器 中的进程

root@537739299f24:/# ps -aux

USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND

root          1  0.2  0.1  21944  3528 ?        Ss   03:03   0:01 /bin/bash

root         12  0.0  0.0  19188  2336 ?        R+   03:14   0:00 ps -aux

接下来,我想给容器安装一个vim

这里我先更新下容器的源再安装。

root@537739299f24:/# apt-get update && apt-get install vim

安装完毕使用 exit,即可退出到宿主机系统。这时容器也会停止,因为一旦退出容器,

容器也随之停止了运行。但是容器仍然存在,可以用 docker ps -a 查看容器列表。

root@537739299f24:/# exit

exit

docker ps 可以查看运行中的容器,加上 -a 参数可以查看所有的容器

3.4 容器命名

可以使用如下命令为容器指定一个合法有意义的名字。

root@cloudsoar-virtual-machine:~# docker run --name wzy_the_container -i -t paulcos11/docker-tutorial /bin/bash

root@0a09dfd688ea:/# exit

exit

3.5 重新启动已经停止的容器

此时,wzy_the_container 已经停止了。可以使用如下命令重启一个已经停止的容器。

root@cloudsoar-virtual-machine:~# docker start wzy_the_container

wzy_the_container

也可以使用容器ID替换容器名。

3.6 附着到容器上
容器启动的时候会按照docker run指定的参数来运行。因此这个容器启动后会启动一个交互

的shell。我可以使用 docker attach 直接附着到此容器。

root@cloudsoar-virtual-machine:~# docker attach wzy_the_container

root@0a09dfd688ea:/#

可以看到重新会到了容器的Bash提示符界面。

如果退出容器的shell,容器也会随之停止运行。

3.7 创建守护式容器

除了交互式运行的容器,我们也可以创建守护容器。可以长期的运行应用程序或者服务。

大多时候需要创建守护式容器。

[#10#cloudsoar@cloudsoar-virtual-machine ~]$sudo docker run --name daemon_dave -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"

cf5636f0499fa0105b845b5dfa61913ff7d5fccfb1b19c16b09ed2752233794d

由于此时第 3.2 步我下载的 Ubuntu 基础镜像Downloading 48.09 MB/65.69 MB 刚好下载

完毕,所以此时我开始使用ubuntu容器镜像操作了。

docker run 的参数 -d 是放到后台执行。此时我们并没有像上一个容器直接附着到新容器的

shell会话上,而是返回了一个容器ID而已。此时使用 docker ps 可以看到正在运行的容器。

ubuntu就是我刚刚下载完毕的基础镜像。 paulcos11/docker-tutorial 是我自己下载的其他的镜像。

3.8 容器内部再搞什么

使用 docker logs 获取容器日志

[#16#cloudsoar@cloudsoar-virtual-machine ~]$sudo docker logs daemon_dave

hello world

hello world

hello world

hello world

hello world

hello world

或者可以加上-f 实时监控容器日志。

sudo docker logs -f daemon_dave

也可以追踪日志某一片段,只需要tail命令加入 -f --lines标志即可。

例如: docker logs --tail 10 daemon_dave 获取最后10行日志即可。

docker logs --tail 0 -f daemon_dave 获取最新日志。

如果要查看日志的时间,可以加上时间戳。

[#18#cloudsoar@cloudsoar-virtual-machine ~]$sudo docker logs -ft daemon_dave

2016-03-15T03:45:28.457991514Z hello world

2016-03-15T03:45:29.472422582Z hello world

2016-03-15T03:45:30.475130491Z hello world

3.9 查看容器进程

查看容器内的进程可以使用 docker top 命令。

[#20#cloudsoar@cloudsoar-virtual-machine ~]$sudo docker top daemon_dave

UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD

root                25381               22325               0                   11:45               ?                   00:00:00            /bin/sh -c while true; do echo hello world; sleep 1; done

3.10 在容器内部运行进程

我们可以使用docker exec 命令在容器内部额外启动新进程,可以运行的进程有两种类型,

交互式任务和后台任务。首先我们使用 touch 命令创建一个空文件。

$sudo docker exec -d daemon_dave touch /etc/new_config_file

-d 表示是后台进程。

或者打开一个shell

$sudo docker exec -t -i daemon_dave /bin/bash

root@cf5636f0499f:/#

3.11 停止守护式容器

$sudo docker stop daemon_dave

daemon_dave

3.12 自动重启容器

如果由于某种错误导致容器停止,可以通过 --restart 标志让docker自动重新启动容器。

$sudo docker run --restart=on-failure:5 --name daemon_dave -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"

Error response from daemon: Conflict. The name "daemon_dave" is already in use by container cf5636f0499f. You have to remove (or rename) that container to be able to reuse that name.

这里我的运行不起来,因为 -- restart 标示是docker 2.0 引入的。我的是docker 1.9版本。

3.13 深入容器

除了使用docker ps 查看容器信息,还可以使用 docker inspect 查看更多信息

$sudo docker inspect daemon_dave

[sudo] password for cloudsoar:

[

{

"Id": "cf5636f0499fa0105b845b5dfa61913ff7d5fccfb1b19c16b09ed2752233794d",

"Created": "2016-03-15T03:45:28.124542139Z",

"Path": "/bin/sh",

"Args": [

"-c",

"while true; do echo hello world; sleep 1; done"

],

"State": {

"Status": "exited",

"Running": false,

"Paused": false,

"Restarting": false,

"OOMKilled": false,

"Dead": false,

"Pid": 0,

"ExitCode": 137,

"Error": "",

"StartedAt": "2016-03-15T03:45:28.455126857Z",

"FinishedAt": "2016-03-15T04:05:11.945521026Z"

},

...

也可使用 -f 或者 --format 标志来选定查看结果。

$sudo docker inspect --format='{{ .State.Running}}' daemon_dave

false

以及查看其他信息

$sudo docker start daemon_dave

daemon_dave

$sudo docker inspect --format '{{ .NetworkSettings.IPAddress }}' daemon_dave

172.17.0.3

3.14 删除容器

如果容器不在使用,可以使用 docker rm 命令删除。

这里假设我要删除 daemon_dave 这个容器,他的容器ID是 cf5636f0499f

$sudo docker rm cf5636f0499f

Error response from daemon: Conflict, You cannot remove a running container. Stop the container before attempting removal or use -f

Error: failed to remove containers: [cf5636f0499f]

$sudo docker stop cf5636f0499f

cf5636f0499f

$sudo docker rm cf5636f0499f

cf5636f0499f

由于不能删除正在运行的容器,所以需要先停止。

3.15 小结

下一章学习如何构建自己的Docker镜像,以及如何使用Docker 仓库和 Docker Registry.

第三章 Docker 入门的更多相关文章

  1. (入门篇 NettyNIO开发指南)第三章-Netty入门应用

    作为Netty的第一个应用程序,我们依然以第2章的时间服务器为例进行开发,通过Netty版本的时间服务报的开发,让初学者尽快学到如何搭建Netty开发环境和!运行Netty应用程序. 如果你已经熟悉N ...

  2. 第三章 Docker的镜像

    3.1.获取镜像 获取镜像 docker pull name[:TAG] #默认是从网络下载镜像,不指定tag会人下载latest标签下的镜像. 1 2 docker search ubuntu do ...

  3. 《Docker 实战》第三章 Docker Hub 寻宝游戏

    # 秘密仓库和密码 docker run --rm -it --name password dockerinaction/ch3_ex2_huntanswer

  4. 《第一本Docker书》学习笔记——第3章 Docker入门

    3.1 确保Docker已经就绪 查看docker是否正常工作: sudo docker info 3.2 运行我们的第一个容器 现在,让我们尝试启动第一个Docker容器.我们可以使用docker ...

  5. Docker(三):Docker入门教程-CentOS Docker 安装

    CentOS Docker 安装 Docker支持以下的CentOS版本: CentOS 7 (64-bit) CentOS 6.5 (64-bit) 或更高的版本 前提条件 目前,CentOS 仅发 ...

  6. Android深度探索HAL与驱动开发 第三章 Git入门

    Git功能十分复杂,简单来说它使你的开发更为快捷和可控,尤其是在开源项目上展现的友好的交互和回馈. 熟悉一些git指令操作对开发者的帮助可以避免开发者受到一些外在因素打断开发进度,甚至延误项目的che ...

  7. 第三章 Netty入门应用

    3.1 Netty开发环境的搭建 3.1.1 下载Netty的软件包 3.1.2 搭建Netty应用工程 3.2 Netty服务端开发 3.3 Netty客户端开发 3.4 运行和调试 3.4.1 服 ...

  8. 第三章·Logstash入门-部署与测试

    1.Logstash环境准备与安装 Logstash环境准备 关闭防火墙 #CentOS6 关闭防火墙 [root@elkstack01 ~]# /etc/init.d/iptables stop # ...

  9. Docker入门教程(三)Dockerfile

    Docker入门教程(三)Dockerfile [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第三篇,介绍了Dockerfile的语法,DockerOn ...

随机推荐

  1. string.Join()的用法

    List<string> list = new List<string>(); list.Add("I"); list.Add("Love&quo ...

  2. {POJ}{3903}{Stock Exchange}{nlogn 最长上升子序列}

    题意:求最长上升子序列,n=100000 思路:O(N^2)铁定超时啊....利用贪心的思想去找答案.利用栈,每次输入数据检查栈,二分查找替换掉最小比他大的数据,这样得到的栈就是更优的.这个题目确实不 ...

  3. Lucene 工作原理 之倒排索引

      1.简介 倒排索引源于实际应用中需要根据属性的值来查找记录.这种索引表中的每一项都包括一个属性值和具有该属性值的各记录的地址.由于不是由记录来确定属性值,而是由属性值来确定记录的位置,因而称为倒排 ...

  4. nginx performance monitor

    nginx performance monitor Nginx中的stub_status模块主要用于查看Nginx的一些状态信息 示例 Active connections: 2 server acc ...

  5. select 多表查询

    连接查询实际上是通过各个表之间共同列的关联性来查询数据的,它是关系数据库查询最主要的特征. select 表1.字段名1,表2.字段名2,... from 表1,表2 where 连接条件 连接查询分 ...

  6. Java入门记(二):向上转型与向下转型

    在对Java学习的过程中,对于转型这种操作比较迷茫,特总结出了此文.例子参考了<Java编程思想>. 目录 几个同义词 向上转型与向下转型 例一:向上转型,调用指定的父类方法 例二:向上转 ...

  7. c++面试题

    转自http://blog.csdn.net/jingxuewang110/article/details/6789557/ 1.new.delete.malloc.free关系 delete会调用对 ...

  8. pip 安装 MySQL-python 失败

    今天在安装 MySQL-python 提示 EnvironmentError: mysql_config not found 得知 mysql_config 是属于MySQL开发用的文件,而使用apt ...

  9. MFC CEdit改变字体大小的方法

    方法很多,这里讲解两种比较简单的方法,也是从google上搜索来的. 方法一: CWnd* pEdit; pEdit = GetDlgItem(IDC_EDIT_ONE); ASSERT(pEdit ...

  10. centos7.2下编译安装&&使用-git代码库

    centos7.2下编译安装git Git简介 Git是一个分布式版本控制系统 Git vs SVN SVN是典型的集中式版本控制起,版本库集中存放在服务器,当我们用自己的电脑干活儿的时候,需要先从中 ...