Docker简单入门

Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。
在本文中,将分享容器的整个生命周期,从创建、管理到停止,直到最终删除。

0x01 Docker安装

在Centos7中可以直接使用yum命令安装docker

$ yum install -y docker #安装docker
$ systemctl start docker # 启动 docker
$ systemctl enable docker # 加入开机自启动 
$ docker info # 检查docker程序是否正常工作

Docker是基于客户端-服务器构架的。它有一个docker程序,既能作为客户端,也可以作为服务器端。作为客户端时,docker程序向Docker守护进程发送请求(如请求返回守护进程自身的信息),然后再对返回来的请求结果进行处理。

0x02 运行第一个容器

  1. 查询镜像
$ docker search centos # 搜索所有centos的docker 镜像
  1. 获取镜像
$ docker pull centos # 获取 centos 镜像
  1. 创建容器
$ docker run -it centos /bin/bash

-i 标志保证容器中STDIN是开启的;
-t 标志则是告诉Docker为要创建的容器分配一个伪tty终端。这样,新创建的容器才能提供一个交互式shell;
接下来,我们告诉Docker基于什么镜像来创建容器,示例中使用的是centos镜像;
最后,我们告诉Docker在新容器中要运行什么命令,在本例中我们在容器中运行/bin/bash命令启动了一个Bash shell

0x03 使用第一个容器

现在,我们已经以root用户登录到了新容器中,容器的ID 0a280c092d66,看起来有些令人迷惑的字符串。这是一个完整的centos系统,你可以用它来做任何事情。

  1. 我们可以获取该容器的主机名
[root@0a280c092d66 /]# hostname 
0a280c092d66

可以看到,容器的主机名就是该容器的ID。

  1. 检查容器的/etc/hosts文件
[root@0a280c092d66 /]# cat /etc/hosts
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 
172.17.0.3 0a280c092d66

Docker在hosts文件中为该容器的IP地址添加了一条主机配置项。

  1. 查看容器IP
[root@0a280c092d66 /]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
 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
24: eth0@if25: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP 
 link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
 inet 172.17.0.3/16 scope global eth0
 valid_lft forever preferred_lft forever
 inet6 fe80::42:acff:fe11:3/64 scope link 
 valid_lft forever preferred_lft forever

我们可以看到,这里有lo的环回接口,还有IP为172.17.0.3的标准eth0网络接口,和普通宿主机是完全一样的

  1. 检查容器的进程
[root@0a280c092d66 /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 15:36 ? 00:00:00 /bin/bash
root 131 1 0 16:33 ? 00:00:00 ps -ef

你可以继续在容器中做任何自己想做的事情。当所有工作都结束时,输入exit,就可以返回到centos宿主机了,但此时容器的停止状态;如果想退出后容器继续运行,则可以先按ctrl+p再按ctrl+q。

0x04 容器命名

Docker会为我们创建的每一个容器自动生成一个随机的名称。如果想为容器指定一个名称,而不是使用自动生成的名称,则可以用--name标志来实现

$ docker run --name yangfannie -it centos /bin/bash  # 运行容器并指定名称为yangfannie

一个合法的容器名称只能包含以下字符:小写字母az、大写字母AZ、数字0~9、下划线、圆点、横线(如果用正则表达式来表示这些符号,就是[a-zA-Z0-9_.-])

在很多Docker命令中,我们都可以用容器的名称来替代容器ID,后面我们将会看到。容器名称有助于分辨容器,当构建容器和应用程序之间的逻辑连接时,容器的名称也有助于从逻辑上理解连接关系。具体的名称(如web、db)比容器ID和随机容器名好记多了。我推荐大家都使用容器名称,以更加方便地管理容器。

容器的命名必须是唯一的。如果我们试图创建两个名称相同的容器,则命令将会失败。如果要使用的容器名称已经存在,可以先用docker rm命令删除已有的同名容器后,再来创建新的容器。

0x05 重新启动停止的容器

$ docker start yangfannie    # 通过容器名称来启动 
$ docker start  0a280c092d66   # 通过容器ID来启动 
$ docker ps -a     #查看所有的容器

0x06 附着到容器上

Docker容器重新启动的时候,会沿用docker run命令时指定的参数来运行,因此我们容器重新启动后会运行一个交互式会话shell。此外,我们也可以用docker attach命令,重新附着到该容器的会话上

$ docker attach yangfannie  #通过容器名称附着 
$ docker attach  0a280c092d66   # 通过容器ID附着

0x07 创建守护式容器

除了这些交互式运行的容器(interactive container),我们也可以创建长期运行的容器。守护式容器(daemonized container)没有交互式会话,非常适合运行应用程序和服务。大多数时候我们都需要以守护式来运行我们的容器

$ docker run --name yangfannie -d centos /bin/bash  -c "while true; do echo hello world; sleep 1; done"

在上面的docker run命令使用了-d参数,因此Docker会将容器放到后台运行。另外还在容器要运行的命令里使用了一个while循环,该循环会一直打印hello world,直到容器或其进程停止运行。

通过组合使用上面的这些参数,你可以发现docker run命令并没有像上一个容器一样将主机的控制台附着到新的shell会话上,而是仅仅返回了一个容器ID而已,我们还是在主机的命令行之中。如果我们执行docker ps命令,可以看到一个正在运行的容器。

0x08 容器内部都在干些什么

现在我们已经有了一个在后台运行while循环的守护型容器。为了探究该容器内部都在干些什么,我们可以用docker logs命令来获取容器的日志

$ docker logs yangfannie
hello world
hello world
hello world
hello world
hello world
hello world
hello world
. . .

我们可以看到while循环正在向日志里打印hello world。Docker会输出最后几条日志项并返回。我们也可以在命令后使用-f参数来监控Docker的日志,这与tail -f命令非常相似,通过Ctrl+C退出日志跟踪。

我们也可以跟踪容器日志的某一片段,和之前类似,只需要在tail命令后加入-f --lines标志即可。

$ docker logs --tail 10 yangfannie  # 获取日志的最后10行内容 
$ docker logs --tail 0 -f yangfannie  # 跟踪某个容器的最新日志而不必读取整个日志文件
$ docker logs -ft yangfannie  # -t为每条日志项加上时间戳

0x09 查看容器内的进程

除了容器的日志,我们也可以查看容器内部运行的进程

$ docker top yangfannie 
PID USER COMMAND 
897 root /bin/sh -c while true; do echo hello world; sleep 1; done 
1323 root sleep 1

0x10 在容器内部运行进程

在容器内运行的进程有两种类型:后台任务和交互式任务。后台任务在容器内运行且没有交互需求,而交互式任务则保持在前台运行。对于需要在容器内部打开shell的任务,交互式任务是很实用的。

  1. 在容器中运行后台任务
$ docker exec -d yangfannie touch /tmp/new_file

这里的-d标志表明需要运行一个后台进程,-d标志之后,指定的是要在内部执行这个命令的容器的名字以及要执行的命令。上面例子中的命令会在yangfannie容器内创建了一个空文件,文件名为/tmp/new_file。通过docker exec后台命令,我们可以在正在运行的容器中进行维护、监控及管理任务。

  1. 在容器内运行交互命令
$ docker exec -t -i yangfannie /bin/bash

和运行交互容器时一样,这里的-t和-i标志为我们执行的进程创建了TTY并捕捉STDIN。接着我们指定了要在内部执行这个命令的容器的名字以及要执行的命令。在上面的例子中,这条命令会在yangfannie容器内创建一个新的bash会话,有了这个会话,我们就可以在该容器中运行其他命令了。

0x11 自动重启容器

如果由于某种错误而导致容器停止运行,我们还可以通过--restart标志,让Docker自动重新启动该容器。--restart标志会检查容器的退出代码,并据此来决定是否要重启容器。默认的行为是Docker不会重启容器。

$ docker run --restart=always --name yangfannie -d centos /
bin/sh -c "while true; do echo hello world; sleep 1; done"

--restart标志被设置为always。无论容器的退出代码是什么,Docker都会自动重启该容器。除了always,我们还可以将这个标志设为on-failure,这样,只有当容器的退出代码为非0值的时候,才会自动重启。

--restart=on-failure:5   # 当容器退出代码为非0时,Docker会尝试自动重启该容器,最多重启5次。

0x12 深入容器

除了通过docker ps命令获取容器的信息,我们还可以使用docker inspect``来获得更多的容器信息

$ docker inspect yangfannie
[{
"ID": "0a280c092d669c5d2c8cc60c0e43086933862578f244e352b704c850f66b0c44",
"Created": "2017-02-14T07:36:37.708334146Z",
"Path": "/bin/sh",
"Args": [
"-c",
"while true; do echo hello world; sleep 1; done"
],
"Config": {
"Hostname": "0a280c092d66",
. . .

docker inspect命令会对容器进行详细的检查,然后返回其配置信息,包括名称、命令、网络配置以及很多有用的数据。

我们也可以用-f或者--format标志来选定查看结果

  1. 返回容器的运行状态
$ docker inspect --format='{{ .State.Running }}' yangfannie
false
  1. 查看容器的IP地址
$ docker inspect --format '{{ .NetworkSettings.IPAddress }}'  yangfannie 
172.17.0.3
  1. 查看多个容器
$ docker inspect --format '{{.Name}} {{.State.Running}}' yangfannie bob_container 
/yangfannie false 
/bob_container false

0x13 删除容器

如果容器已经不再使用,可以使用docker rm命令来删除它们

$ docker rm  yangfannie

需要注意的是,运行中的Docker容器是无法删除的。你必须先通过docker stop或docker kill命令停止容器,才能将其删除。
如何一次性删除所有容器?

$ docker rm `docker ps -a -q`

上面的docker ps命令会列出现有的全部容器,-a标志代表列出所有容器,而-q标志则表示只需要返回容器的ID而不会返回容器的其他信息。这样我们就得到了容器ID的列表,并传给了docker rm命令,从而达到删除所有容器的目的。不过前提是这些容器都要是停止状态。


博客地址:http://yangfannie.com

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,919评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,567评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,316评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,294评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,318评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,245评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,120评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,964评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,376评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,592评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,764评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,460评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,070评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,697评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,846评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,819评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,665评论 2 354

推荐阅读更多精彩内容