Docker修炼之旅(一)—— Docker一些基本命令


title: Docker修炼之旅(一)
date: 2019-06-25 16:48:48
tags:
- Docker
categories:
- Study
- Docker


Docker学习过程的一些记录


前言

之前对Docker只停留在用的层面上,只会用docker-compose一键部署,偶尔也会对Dockerfile进行一些修改,但每次改都要查半天搜索引擎才会。所以决定系统学习下Docker,补充下自己的知识。
主要参考的是:《第一本Docker书》,当做学习笔记来写吧。


Docker容器概念

Docker容器(Container)类似于一个轻量级的沙箱子(因为Docker是基于Linux内核的虚拟技术,所以消耗资源十分少),Docker利用容器来运行和隔离应用。

容器是从镜像创建的应用运行实例,可以将其启动、开始、停止、删除,而这些容器都是相互隔离、互不可见的。

可以吧每个容器看作一个简易版的Linux系统环境(包括了root用户权限、进程空间、用户空间和网络空间),以及与运行在其中的应用程序打包而成的应用盒子。

镜像自身是只读的。容器从镜像启动的时候,Docker会在镜像的最上层创建一个可写层,镜像本身将保持不变。就像用ISO装系统之后,ISO并没有什么变化一样。

容器就相当于镜像的实例化,我们可以认为,镜像是Docker生命周期的构建或打包阶段,而容器则是启动或执行阶段,具体关系如下图


image

创建第一个容器

安装启动好docker后,先可以通过docker info命令查看docker的一些配置信息,如所有容器和镜像的数量等

image

然后通过docker run命令创建容器,docker run命令提供了Docker容器的创建到启动过程。我们使用docker run -i -t ubuntu /bin/bash命令我们的第一个容器,这句命令的解释如下

首先告诉Docker执行docker run命令,并且指定了 -i -t两个参数。
-i保证容器中的STDIN是开启的,尽管我们没有附着(docker attach命令)到容器中。持久的标准输入是交互式shell的”半边天",这里说下自己的理解,这个-i参数意思应该就是把STDIN开起来,然后我们就可以通过可以与容器交互,输入命令执行。
-t参数告诉Docker为要创建的容器分配一个伪tty终端,这样,新创建的容器才能提供一个交互式shell。
若要在命令行下创建一个我们能与之进行交互的容器,这两个参数算是最基本的参数了。
接下来,我们告诉Docker基于什么镜像来创建容器,这里使用的是ubuntu,这是一个基础镜像,保存在Docker Hub Registry上,这里指定镜像后,Docker会先检查本地有没有该镜像,没有的话就连接到官方维护的Docker Hub Registry上查找,找到后下载至本地。然后Docker在文件系统内部用这个镜像创建一个新容器,该容器有自己的网络、IP地址,以及一个用来和宿主机进行通信的桥接案例接口
最后的/bin/bash告诉Docker在新容器中要运行什么命令,这里的/bin/bash命令是启动了一个Bash shell

image

使用容器

上一步,我们利用ubuntu镜像创建并打开了一个容器,我们可以在里面执行命令,使用下我们的容器。

image

不仅能执行本地命令,需要网络连接的命令也能执行。我们可以使用apt-get命令,安装下vim apt-get update && apt-get install vim
image


给容器命名

我们可以通过键入exit来退出当前容器,然后用docker ps命令查看本地的容器。

docker ps列出正在运行的容器
docker ps -a列出所有的容器
docker ps -l列出最后一次运行的容器,包括正在运行的或已经的停止的。
docker ps -n x x是数字,表示列出最新几次运行的容器

这里我们用docker ps -l命令列出刚刚退出的容器,如下图

image

从上面图片可以看到,容器的名称是一个随机的名称,这是由于我们之前创建容器的时候没有指定名称,所以Docker给容器自动生成一个随机名称。按理说名称指不指定不怎么重要,因为可以通过容器ID进行指定。不过实际使用中,肯定是用名称比较方便。所以我们这里介绍下怎么在创建的时候指定名称。我们可以在docker run命令中用--name标志指定
docker run --name Docker_study -i -t ubuntu /bin/bash

image


重新启动停止的容器

上一步中,为了查看docker ps -l命令,我们退出了容器,那么该怎么重新启动该容器呢。
我们使用docker start命令,docker start <容器名称> docker start <容器ID>都可以开启容器。
如我这里容器名称是Docker_study,于是用docker start Docker_study启动停止的容器。

image


附着到容器上

我们可以看到上一步的截图,使用docker start重新启动了容器后,容器成功运行,但是我们并没有进入到之前的交互式shell中。这时候我们就可以利用docker attach命令附着进入容器,这里我们的命令是docker attach Docker_study

image

创建守护式容器

上面创建的都是交互式容器,我们也可以创建长期运行的容器,名叫守护式容器,没有交互式会话,非常适合运行应用程序和服务,大多数时候我们都需要以守护式模式运行我们的容器,如之前我搭的CTF题目,都是基于守护式模式。下面我们就创建一个守护式容器。使用下面命令:
docker run --name daemon_dave -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"

-d参数表示将容器放在后台运行
-c参数表示容器要执行的命令
这里执行的命令是每隔一秒循环输出hello world

执行完后,通过docker ps查看是否运行,可以看到运行成功

image


查看容器内部都在干什么——日志

我们上面创建了一个守护式容器,根据创建时的命令,容器会循环输出hello world,但我们怎么查看它是否执行呢。这时候就用到了docker logs命令
可以使用docker logs <容器名称或ID>查看容器日志,会返回最后几条日志。

image

我们还可以通过使用 -f 参数实施监控Docker日志,与tail -f命令类似
image

还可以加别的参数,使日志输出更加规范

--tail 10 获取日志最后10行
--tail 0 -f跟踪容器最新日志
-t 为每条日志加上时间戳,便于分析


查看容器的进程

使用docker top命令,可以查看到容器内部运行的进程。

image


在容器内部运行进程

在Docker 1.3之后,可以通过docker exec命令在容器内部额外启动新进程。可以通过追加-d或-t -i参数指定启动的进程类型是后台任务还是交互式任务。
如我们用docker exec -d daemon_save touch miracle778.txt,新建一个文件
然后用docker exec -i -t daemon_save /bin/bash打开一个交互式shell

image

可以看到, 在新打开的shell里面输入ls命令,找到了新建的miracle778.txt文件


容器的停止、重启

可以使用docker start|stop|restart <容器名或ID>启动|停止|重启容器。
另外,可以在创建容器的时候指定 --restart标志,使容器在因为错误情况退出的情况下,根据--restart标志指定的行为和容器错误代码判断是否重启容器。--restart标志取值说明如下

--restart=always 表示无论容器退出代码是什么,都自动重启容器
--restart=on-failure 这样的话,只有容器的退出代码非0时才会自动重启
此外on-failure还接受一个可选的重启次数
--restart=on-failure:7 表示,在容器的退出代码为非0时,自动重启容器,最多重启7次
--restart标志是docker1.2.0后引入的选项


深入容器

除了用docker ps获取容器的信息外,我们还可以使用docker inspect来获取容器的更多信息

image

docker inspect命令会对容器进行详细的检查,然后返回其配置信息,包括名称、命令、网络配置以及很多有用的数据。同时也可以指定-f或--format标志选定查看结果
这个命令我目前并没有怎么用到,不过还是记一下。


删除容器

当容器不用的时候,可以通过docker rm删除已经停止的容器。
另外提一下,现在没有办法一次删除所有容器,不过可以用另一种小技巧达到目的

docker rm `docekr ps -a -q`
这里把docker ps -a -q的结果传给docker rm命令
docker ps -a -q命令是列出所有容器的ID

总结

这一篇主要是对Docker容器的一些操作,用了一些docker的命令

docker run  | docker stop  | docker start  | docker restart | docker exec 
docker top  | docker logs  | docker attach | docker inspect | docker rm

其他的一些命令可以参考:简书:Docker命令
或者直接找官方文档:Docker官方文档

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