如何优雅使用Docker?请收下这15个小技巧

640?wx_fmt=jpeg

图片来源:Unsplash


作者介绍

ElNinoT


文章来源

 Java架构沉思录


原文链接

 www.cnblogs.com/elnino/p/3899136.html


如需转载,请联系原作者授权


1

获取最近运行容器的id 这是我们经常会用到的一个操作,按照官方示例,你可以这样做(环境ubuntu):

$ ID=$(docker run ubuntu echo hello world) hello world $ docker commit $ID helloworld fd08a884dc79

这种方式在编写脚本的时候很有用,比如你想在脚本中批量获取id,然后进一步操作。但是这种方式要求你必须给ID赋值,如果是直接敲命令,这样做就不太方便了。 这时,你可以换一种方式:

$ alias dl=’docker ps -l -q’
$ docker run ubuntu echo hello world
hello world
$ dl
1904cf045887
$ docker commit `dl` helloworld
fd08a884dc79

docker ps -l -q命令将返回最近运行的容器的id,通过设置别名(alias),dl命令就是获取最近容器的id。这样,就无需再输入冗长的docker ps -l -q命令了。通过两个斜引号“,可以获取dl命令的值,也就是最近运行的容器的id。


2

尽量在Dockerfile中指定要安装的软件,而不用Docker容器的shell直接安装软件。 说实话,我有时候也喜欢在shell中安装软件,也许你也一样,喜欢在shell中把所有软件安装都搞定。但是,搞来搞去,最后还是发现,你还是需要在Doockerfile中指定安装文件。在shell中安装软件,你要这样做:

$ docker run -i -t ubuntu bash #登陆到docker容器
root@db0c3967abf8:/#

然后输入下面的命令来安装文件:

apt-get install postgresql

然后再调用exit:

root@db0c3978abf8:/# exit

退出docker容器,再给docker commit命令传递一个复杂的JSON字符串来提交新的镜像:

$ docker commit -run=”{“Cmd”:[“postgres”,”-too -many -opts”] }” `dl` postgres

太麻烦了,不是吗?还是在Dockerfile中指定安装文件吧,只要两个步骤:

1.在一个小巧的Dockerfile中,指定当前操作的镜像为FROM命令的参数
2.然后在Dockerfile中指定一些docker的命令,如CMD, ENTERPOINT, VOLUME等等来指定安装的软件


3

超-超-超级用户

你可能需要一直用超级用户来操作docker,就像早期示例里一直提示的:

# 添加docker用户组
$ sudo groupadd docker
# 把自己加到docker用户组中
$ sudo gpasswd -a myusername docker
# 重启docker后台服务
$ sudo service docker restart
# 注销,然后再登陆
$ exit

Wow!连续三个sudo!三次化身“超级用户”,真可谓是“超-超-超级用户”啊!别担心,设置完毕,以后你就再也不用打那么多sudo了!


4

清理垃圾

如果你想删除所有停止运行的容器,用这个命令:

$ docker rm $(docker ps -a -q)

顺便说一句,docker ps命令很慢,不知道为啥这么慢,按理说Go语言是很快的啊。docker ps -a -q命令列出所有容器的id,然后根据id删除容器。docker rm命令遇到正在运行的容器就会失效,所以这个命令完美的删除了所有没在运行的容器。


5

docker inspect输出结果的解析利器:jq 要对docker inspect的输出结果进行过滤,一般情况下,用grep命令,你需要这样操作:

$docker inspect `dl` | grep IPAddress | cut -d '"' -f 4 

哦!看上去很复杂,用jq吧,专业解析docker inspect输出结果,具有更强的可读性,方便易用:

$docker inspect `dl` | jq -r '.[0].NetworkSettings.IPAddress'

其中第一个’.’代表所有的结果。’[0]’代表数组的第一个元素。就像JavaScript访问一个JSON对象一样,简单方便。


6

镜像有哪些环境变量? 有时候,你需要知道自己创建的镜像有哪些环境变量。简单!只要这样:

$ docker run ubuntu env

输出结果如下:

HOME=/
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
container=lxc
HOSTNAME=5e1560b7f757

调用env查看环境变量,对于后面要讲到的“链接”(-link)很有用,在连接两个容器时候需要用到这些环境变量,具体请看最后一个要点“链接”。


7

RUN命令 vs CMD命令

Docker的新手用户比较容易混淆RUN和CMD这两个命令。 RUN命令在构建(Build)Docker时执行,这时CMD命令不执行。CMD命令在RUN命令执行时才执行。我们来理清关系,假设Dockerfile内容如下:

FROM thelanddownunder
MAINTAINER crocdundee

我们要向系统中安装一些软件,那么:

# docker build将会执行下面的命令:
RUN apt-get update
RUN apt-get install softwares
# dokcer run默认执行下面的命令:
CMD [“softwares”]

Build时执行RUN,RUN时执行CMD,也就是说,CMD才是镜像最终执行的命令。


8

CMD命令 vs ENTRYPOINT命令

又是两条容易混淆的命令!具体细节我们就不说了,举个例子,假设一个容器的Dockerfile指定CMD命令,如下:

FROM ubuntu
CMD [“echo”]

另一个容器的Dockerfile指定ENTRYPOINT命令,如下:

FROM ubuntu
ENTRYPOINT [“echo”]

运行第一个容器:

docker run image1 echo hello

得到的结果:

hello

运行第二个容器:

docker run image2 echo hello

得到的结果:

echo hello

看到不同了吧?实际上,CMD命令是可覆盖的,docker run后面输入的命令与CMD指定的命令匹配时,会把CMD指定的命令替换成docker run中带的命令。而ENTRYPOINT指定的命令只是一个“入口”,docker run后面的内容会全部传给这个“入口”,而不是进行命令的替换,所以得到的结果就是“echo hello”。


9

Docker容器有自己的IP地址吗? 

刚接触Docker的人或许会有这样的疑问:Docker容器有自己的IP地址吗?Docker容器是一个进程?还是一个虚拟机?嗯…也许两者兼具?哈哈,其实,Docker容器确实有自己的IP,就像一个具有IP的进程。只要分别在主机和Docker容器中执行查看ip的命令就知道了。

查看主机的ip:

$ ip -4 -o addr show eth0

得到结果:

2: eth0 inet 162.243.139.222/24

查看Docker容器的ip:

$ docker run ubuntu ip -r -o addr show eth0

得到结果:

149: eth0   inet 172.17.0.43/16

两者并不相同,说明Docker容器有自己的ip。


10

基于命令行的瘦客户端,使用UNIX Socket和Docker后台服务的REST接口进行通信。Docker默认是用UNIX socket通信的,一直到大概0.5、0.6的版本还是用端口来通信,但现在则改成UNIX socket,所以从外部无法控制Docker容器的内部细节。下面我们来搞点有趣的事情,从主机链接到docker的UNIX socket:

# 像HTTP客户端一样连接到UNIX socket
$ nc -U / /var/run/docker.sock

连接成功后,输入:

GET /images/json HTTP/1.1

输入后连敲两个回车,第二个回车表示输入结束。然后,得到的结果应该是:

HTTP/1.1 200 OK
Content-Type: application/json
Date: Tue, 05 Nov 2013 23:18:09 GMT
Transfer-Encoding: chunked
16aa
[{“Repository”:”postgres”,”Tag”:”......

有一天,我不小心把提交的名称打错了,名字开头打成”-xxx”(我把命令和选项的顺序搞混了),所以当我删除的时候出了问题,docker rm -xxx,会把-xxx当成参数而不是镜像的名称。所以我只得通过socket直接连到容器来调用REST Server把错误的东西删掉。


11

把镜像的依赖关系绘制成图

docker images命令有一个很拉风的选项:-viz,可以把镜像的依赖关系绘制成图并通过管道符号保存到图片文件:

# 生成一个依赖关系的图表
$ docker images -viz | dot -T png -o docker.png

这样,主机的当前路径下就生成了一张png图,然后,用python开启一个微型的HTTP服务器:

python -m SimpleHTTPServer

然后在别的机器上用浏览器打开:

http://machinename:8000/docker.png

OK,依赖关系一目了然!

(译者注:要使用dot命令,主机要安装graphviz包。另外,如果主机ip没有绑定域名,machinename换成主机的ip即可。)


12

Docker把东西都存到哪里去了? Docker实际上把所有东西都放到/var/lib/docker路径下了。切换成super用户,到/var/lib/docker下看看,你能学到很多有趣的东西。执行下面的命令:

$ sudo su
# cd /var/lib/docker
# ls -F
containers/ graph/ repositories volumes/

可以看到不少目录,containers目录当然就是存放容器(container)了,graph目录存放镜像,文件层(file system layer)存放在graph/imageid/layer路径下,这样你就可以看看文件层里到底有哪些东西,利用这种层级结构可以清楚的看到文件层是如 何一层一层叠加起来的。


13

Docker源代码:Go, Go, Go, Golang! Docker的源代码全部是用Go语言写的。Go是一门非常酷的语言。其实,不只是Docker,很多优秀的软件都是用Go写的。对我来说,Docker源文件中,有4个是我非常喜欢阅读的:

commands.go docker的命令行接口,是对REST API的一个轻量级封装。Docker团队不希望在命令中出现逻辑,因此commands.go只是向REST API发送指令,确保其较小的颗粒性。

api.go REST API的路由(接受commands.go中的请求,转发到server.go)

server.go 大部分REST API的实现

buildfile.go Dockerfile的解析器

有的伙计惊叹”Wow!Docker是怎么实现的?!我无法理解!”没关系,Docker是开源软件,去看它的源代码就可以了。如果你不太清楚Dockerfile中的命令是怎么回事,直接去看buildfile.go就明白了。


14

运行几个Docker后台程序,再退出容器,会发生什么? OK,倒数第二个要点。如果在Docker中运行几个后台程序,再退出Docker容器,会发生什么?答案是:不要这么做!因为这样做后台程序就全丢了。

Dockerfile中用RUN命令去开启一个后台程序,如:

RUN pg_ctl start

这样的话,RUN命令开启的后台程序就会丢失。调用容器的bash连到容器的shell:

$ docker run -i -t postgresimage bash

然后调用 ps aux查看进程,你会发现postgres的进程并没有跑起来。 RUN命令会影响文件系统。因此,不要再Dockerfile中用启动后台程序,要把后台程序启动成前台进程。或者,像一些高手提议的那样,写一个启动脚 本,在脚本中启动这些后台程序或进程。


15

容器之间进行友好沟通:链接 

这是最拉风的功能!我把它留到最后压轴!这是0.6.5中最重要的新功能,我们前面已经提过两次了。运行一个容器,给它一个名称,在下面的例子中,我们通过-name参数给容器指定名称”loldb”:

$ docker run -d -name loldb loldbimage

再运行另一个容器,加上-link参数来连接到第一个容器(别名为loldb),并给第二个容器也指定一个别名(这里用的是cheez):

$ docker run -link /loldb:cheez otherimage env

顺便得到cheez的环境变量:

CHEEZ_PORT=tcp://172.17.0.8:6379
CHEEZ_PORT_1337_TCP=tcp://172.17.0.8.6379
CHEEZ_PORT_1337_TCP_ADDR=tcp://172.17.0.12
CHEEZ_PORT_1337_TCP_PORT=6379
CHEEZ_PORT_1337_TCP_PROTO=tcp

这样,我们就在两个容器间建立起一个网络通道(bridge),基于此,我们可以建立一个类似rails的程序:一个容器可以访问数据库容器而不对外暴露其他接口。非常酷!数据库容器只需要知道第一个容器的别名(在本例中为cheez)和要打开的端口号。所以数据库容器也可以env命令来查看这个端口是否打开。



投稿啦!!!



精彩继续


CSDN作为国内专业的云计算服务平台,目前提供云计算、大数据、虚拟化、数据中心、OpenStack、CloudStack、机器学习、智能算法等相关云计算观点、技术、平台、实践、云产业咨询等服务。CSDN 公众号也一直坚持「与千万技术人共成长」的理念,深度解读行业内热门技术与场景应用,致力于让所有开发者保持敏锐的技术嗅觉、对行业趋势与技术获得更广阔的认知。


文章题材


  • 首先你需要关注我们的公众号“CSDN云计算”,这样你会更准确了解我们需要的文章风格;

  • 侧重于云计算领域相关的文章,可以是技术、运维、趋势等方面的务实内容;

  • 原创,要求文章有鲜明观点和看法。


投稿须知


  •  稿费:根据原创性、实用性和时效性等方面进行审核,通过的文章会发布在本微信平台。一经采用,我们将支付作者酬劳。酬劳可能不多,这代表的是一个心意,更多是因为爱好,是有识之士抒发胸怀的一种方式;

  • 字数要求:稿件字数以2K-8K为宜,少于2K或多于8K都会一定程度降低阅读愉悦感;

  • 投稿邮箱:lijy@csdn.net。或者添加微信表明来意,微信号:tangguoyemeng。请备注投稿+姓名+公司职位


如果咱们的合作稳定又愉快,还可以签订合同长期合作哦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/525589.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

supervisor监控php进程程序,详解Supervisor进程守护监控(转)

Supervisor的配置2.0 创建目录,初始化配置文件mkdir /usr/supervisorecho_supervisord_conf > /usr/supervisor/supervisord.conf12mkdir/usr/supervisorecho_supervisord_conf>/usr/supervisor/supervisord.confecho_supervisord_conf详解:echo_s…

H264/ACC数据使用librtmp推流到服务器

这是本人第一次发表这个,首先声明本人也是个菜鸟!都说使用librtmp很简单,但是在网上找了很久,还是被各种大神坑了。 其实我也还是有很多东西不懂,如果下面有什么问题的地方,还请各位大神指点纠正。 1.视频数…

从容器到微服务,技术架构、网络和生态详解

图片来源:Unsplash作者晗狄文章来源架构师技术联盟如需转载,请联系原作者授权谈起容器技术,不得不提Docker技术。Docker 是 PaaS 提供商 DotCloud 开源的一个高级容器引擎,源代码托管在 Github 上,基于Go语言并遵从Apa…

彻底搞懂 python 中文乱码问题

前言 曾几何时 Python 中文乱码的问题困扰了我很多很多年,每次出现中文乱码都要去网上搜索答案,虽然解决了当时遇到的问题但下次出现乱码的时候又会懵逼,究其原因还是知其然不知其所以然。现在有的小伙伴为了躲避中文乱码的问题甚至代码中不使…

如何让Kubernetes集群生产可用?

图片来源:veer本文作者Steven Wong (VMware)Michael Gasch (VMware)文章翻译Karen Lee文章来源K8S技术社区原文链接https://kubernetes.io/blog/2018/08/03/out-of-the-clouds-onto-the-ground-how-to-make-kubernetes-production-grade-anywhere如需转载&#xff0…

北京房租到底有多高? | 爬取北京海淀区一居室租房信息

图片来源:花瓣网文章来源人工智能与大数据生活如需转载,请联系原作者授权最近北京房租成了热门话题,到底北京的房租有多高?本次实战是爬取北京海淀区一居室的租房信息,共爬取了300套房源信息,看一下北京的房…

租房有深坑?手把手教你如何用R速读评论+科学选房

图片来源:网络编译Hope、臻臻、CoolBoy文章来源大数据文摘出品如有转载,请联系原作者。最近,租房这事儿成了北漂族的一大bug,要想租到称心如意的房子,不仅要眼明手快,还得看清各类“前辈”的评价避开大坑。…

快速搭建Python+Selenium+Sublime 自动化测试环境方法

随着业内越来越多的公司对自动化测试的大力推行,对测试人员能够使用自动化工具的要求也随之增多。为了能让更多的同事在学习selenium的初期,能够顺利的迈出第一步,即可以通过代码操作selenium driver 调用浏览器打开目标网址,笔者…

刚刚,百度总裁张亚勤说……

作者奋笔疾书的小编原创文章,如有转载,请联系本公众号。9月4日, ABC SUMMIT百度云智峰会在上海举行。百度总裁张亚勤首先发表《云计算的新浪潮》主题演讲,他表示,我们已经全面进入物理世界数字化、AI as a Service、新…

pycharm 提示:this license **** has been cancelled(2)

目录 一.找到hosts文件 二.修改hosts文件 三.检查hosts文件是否修改成功 pycharm安装激活过程中,提示 this license **** has been cancelled 。这个问题并不是你的激活码不对,而是需要修改系统的hosts文件,下面详细讲解下如何修改hosts文…

嘿,运维!你与VXLAN有场约会……

图片来源:网络作者Bert如有转载,请联系本公众号。VXLAN概述 ▍顾名思义,VXLAN(Virtual eXtensible Local Area Network)提供了类似VLAN的二层网络服务,并且比VLAN更具备扩展性和灵活性,该技术将…

如何判断一个点在任意四边形内

通过面积法,判断点P是否在四边形(A,B,C,D)内。如果在四边形内,则四边形的面积面积(P,A,B)面积(P,B,C)面积(P,C,D)面积(P,D,A),反之不在四边形内。 此处我将判断方法定义成了静态方法,方便其他类访问,代码如下: public class IsInQuadrangle {public IsInQuadrangle…

网格变形动画MeshTransform

原文:Mesh Transforms 作者:Bartosz Ciechanowski 译者:kmyhy 我是 transform 属性的超级粉丝。让 UIView 或者 CALayer 的形体发生改变的最简单方法就是联合使用旋转、平移和缩放。在易于适用的同时,常规变换所能实现的效果也同…

cloud一分钟 | 腾讯云联手斗鱼、虎牙两大头部游戏直播平台开启 定制道具的创新互动...

Hello,everyone:9月7日早,星期五,祝大家工作愉快!一分钟新闻时间:完01微 信 群 添加小编微信:tangguoyemeng,备注“进群”即可,加入【云计算学习交流群】,和…

Linux服务器硬盘更换,[ Linux ] 服务器更换硬盘

服务器型号:ThinkServer RD650操作系统:Red Hat 6.7业务用途:生产环境监控机接到机房邮件通知,告知某台服务器硬盘告警,并提供了设备SN号和机柜位置。根据提供想相关信息找到对应的设备IP并确定该设备的业务用途。登录…

【BAT面试现场】如何判断一个数是否在40亿个整数中?

作者channingbreeze如需转载,请联系原作者授权。小史是一个应届生,虽然学的是电子专业,但是自己业余时间看了很多互联网与编程方面的书,一心想进BAT。今天他就去BAT中的一家面试了。简单的自我介绍后,面试官给了小史一…

彩色BMP转换成灰度图的原理

图像处理中,大部分的处理方法都需要事先把彩色图转换成灰度图才能进行相关的计算、识别。 彩色图转换灰度图的原理如下: 我们知道彩色位图是由R/G/B三个分量组成,其文件存储格式为 BITMAPFILEHEADERBITMAPINFOHEADER,紧跟后面的可…

Linux java 生效不了,linux jdk 不生效怎么办

【摘要】操作系统(Operating System,简称OS)是管理计算机硬件与软件资源的计算机程序。操作系统需要处理如管理与配置内存、决定系统资源供需的优先次序、控制输入设备与输出设备、操作网络与管理文件系统等基本事务。下面是linux jdk 不生效怎么办,让我…

程序猿 - 超实用的工具、素材、学习网站分享

文章目录------------------------------学习教程篇-------------------------------bilibili哔哩哔哩网易云课堂siki学院:泰课在线:可汗学院:线性代数的本质 - bilibili计算机科学速成课 - bilibiliLearnOpenGL:The Book of Shad…

面趣 | 马云在面试中出的一道题,据说只有一个人答对……

大神,求解!据说,马云给新员工出了一道题然鹅,只有一个人答对了!!!!智商不足的小编居然打开了这道题求解!!!我手里有50元钱花去剩余买衣服 20元30…