Docker 实用技巧总结_docker

我有机会建立一个以Docker为基础的微服务架构在我现在的工作中,很多人都会分享他们使用Docker的心得,我想我也不会例外。因此我总结了一些,可能你会在日常使用Docker的时候会用到。

1. 一台主机部署多个Docker实例

如果你想运行多个Docker 容器在一台主机上,如果要设置不同的TLS设置,网络设置,日志设置和存储驱动程序特定的容器,这是特别有用的。例如,我们目前正在运行一个标准设立两个Docker守护进程。一运行consul提供DNS解析,并作为群集存储为其他Docker 容器。

For example:

# start a docker daemon and bind to a specific port
docker daemon -H tcp://$IP:5000 --storage-opt dm.fs=xfs \
      -p "/var/run/docker1.pid" \
      -g "/var/lib/docker1" \
      --exec-root="/var/run/docker1
# and start another daemon
docker daemon -H tcp://$IP:5001 --storage-opt dm.fs=xfs \
    -s devicemapper \
    --storage-opt dm.thinpooldev=/dev/mapper/docker--vg-docker--pool \
    -p "/var/run/docker2.pid" \
    -g "/var/lib/docker2" --exec-root="/var/run/docker2"
    --cluster-store=consul://$IP:8500 \
    --cluster-advertise=$IP:2376

# start a docker daemon and bind to a specific port
dockerdaemon -H tcp://$IP:5000 --storage-opt dm.fs=xfs \
      -p "/var/run/docker1.pid" \
      -g "/var/lib/docker1" \
      --exec-root="/var/run/docker1
# and start another daemon
docker daemon -H tcp://$IP:5001 --storage-opt dm.fs=xfs \
    -s devicemapper \
    --storage-opt dm.thinpooldev=/dev/mapper/docker--vg-docker--pool \
    -p "/var/run/docker2.pid" \
    -g "/var/lib/docker2" --exec-root="/var/run/docker2"
    --cluster-store=consul://$IP:8500 \
    --cluster-advertise=$IP:2376

2. Docker Exec的使用

Docker Exec是一个很重要很多人都会用到的工具,也许你使用Docker不只是为你的升级,生产和测试环境,同时也对本地机器上运行的数据库,服务器密钥库等,这是能够直接运行的容器的上下文中运行的命令,非常方便。

我们做了大量的Cassandra,并检查表是否包含正确的数据。如果你只是想执行一个快速CQL查询,Docker exec 就很赞:

$ docker ps --format "table {{.ID}}\t {{.Names}}\t {{.Status}}"
CONTAINER ID    NAMES        STATUS
682f47f97fce     cassandra      Up 2 minutes
4c45aea49180     consul       Up 2 minutes
$ docker exec -ti 682f47f97fce cqlsh --color
Connected to Test Cluster at 127.0.0.1:9042.
[cqlsh 5.0.1 | Cassandra 2.2.3 | CQL spec 3.3.1 | Native protocol v4]
Use HELP for help.
cqlsh>
$ dockerps --format "table {{.ID}}\t {{.Names}}\t {{.Status}}"
CONTAINERID    NAMES       STATUS
682f47f97fce    cassandra     Up 2 minutes
4c45aea49180    consul       Up 2 minutes
$ dockerexec -ti 682f47f97fce cqlsh --color
Connectedto TestClusterat 127.0.0.1:9042.
[cqlsh 5.0.1 | Cassandra 2.2.3 | CQLspec 3.3.1 | Native protocolv4]
Use HELPfor help.
cqlsh>

或者只是访问nodetool或镜像中可用的任何其他工具:

$ docker exec -ti 682f47f97fce nodetool status
Datacenter: datacenter1
=======================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
-- Address     Load    Tokens    Owns  Host ID                Rack
UN 192.168.99.100 443.34 KB 256     ?    8f9f4a9c-5c4d-4453-b64b-7e01676361ff rack1
Note: Non-system keyspaces don't have the same replication settings, effective ownership information

$ dockerexec -ti 682f47f97fce nodetoolstatus
Datacenter: datacenter1
=======================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
-- Address    Load   Tokens   Owns  HostID               Rack
UN 192.168.99.100 443.34 KB 256     ?   8f9f4a9c-5c4d-4453-b64b-7e01676361ff rack1
Note: Non-systemkeyspacesdon't havethesamereplicationsettings, effectiveownershipinformation

这当然可以被应用到任何(Client)的工具捆绑在一起的镜像中。我个人觉得这样会比所有客户端和本地更新更简单。

3. Docker 的检查 和JQ

与其说这是一个Docker技巧,不如说是一个JQ技巧。如果你没有听过JQ,它是一个在命令行解析JSON的伟大工具。因为我们可以不需要使用format specifier而能够查看容器里面发生的一切。

# Get network information:
$ docker inspect 4c45aea49180 | jq '.[].NetworkSettings.Networks'
{
 "bridge": {
  "EndpointID": "ba1b6efba16de99f260e0fa8892fd4685dbe2f79cba37ac0114195e9fad66075",
  "Gateway": "172.17.0.1",
  "IPAddress": "172.17.0.2",
  "IPPrefixLen": 16,
  "IPv6Gateway": "",
  "GlobalIPv6Address": "",
  "GlobalIPv6PrefixLen": 0,
  "MacAddress": "02:42:ac:11:00:02"
 }
}
# Get the arguments with which the container was started
$ docker inspect 4c45aea49180 | jq '.[].Args'
[
 "-server",
 "-advertise",
 "192.168.99.100",
 "-bootstrap-expect",
 "1"
]
# Get all the mounted volumes
11:22 $ docker inspect 4c45aea49180 | jq '.[].Mounts'
[
 {
  "Name": "a8125ffdf6c4be1db4464345ba36b0417a18aaa3a025267596e292249ca4391f",
  "Source": "/mnt/sda1/var/lib/docker/volumes/a8125ffdf6c4be1db4464345ba36b0417a18aaa3a025267596e292249ca4391f/_data",
  "Destination": "/data",
  "Driver": "local",
  "Mode": "",
  "RW": true
 }
]

# Get network information:
$ dockerinspect 4c45aea49180 | jq '.[].NetworkSettings.Networks'
{
 "bridge": {
  "EndpointID": "ba1b6efba16de99f260e0fa8892fd4685dbe2f79cba37ac0114195e9fad66075",
  "Gateway": "172.17.0.1",
  "IPAddress": "172.17.0.2",
  "IPPrefixLen": 16,
  "IPv6Gateway": "",
  "GlobalIPv6Address": "",
  "GlobalIPv6PrefixLen": 0,
  "MacAddress": "02:42:ac:11:00:02"
 }
}
# Get the arguments with which the container was started
$ dockerinspect 4c45aea49180 | jq '.[].Args'
[
 "-server",
 "-advertise",
 "192.168.99.100",
 "-bootstrap-expect",
 "1"
]
# Get all the mounted volumes
11:22 $ dockerinspect 4c45aea49180 | jq '.[].Mounts'
[
 {
  "Name": "a8125ffdf6c4be1db4464345ba36b0417a18aaa3a025267596e292249ca4391f",
  "Source": "/mnt/sda1/var/lib/docker/volumes/a8125ffdf6c4be1db4464345ba36b0417a18aaa3a025267596e292249ca4391f/_data",
  "Destination": "/data",
  "Driver": "local",
  "Mode": "",
  "RW": true
 }
]

当然,它也能很好的完成查询其他类型的(Docker-esque) API生成的JSON(e.g Marathon, Mesos, Consul etc.)JQ提供了一个非常广泛的API,用于访问和处理JSON.更多信息可以在这里找到: https://stedolan.github.io/jq/

4. 扩展现有容器和在本地注册

在Docker hub中有大量可以使用的的不同使用场景的镜像。我们注意到,虽然有很多可用的镜像,但是很多时候我们不得对他们做一些修改。比如更好的健康检查consul,通过系统变量或命令行参数的其他配置,为更好地设置或增加我们的集群,这是不容易做到的。如果我们碰到这个是刚刚创建自己的Docker的镜像和把它推到我们的本地注册表。我们通常是这么做的。

比如,我们希望有JQ可在我们的consul 镜像中这样我们就可以很方便的检查我们的服务是否正常。

FROM progrium/consul
USER root
ADD bin/jq /bin/jq
ADD scripts/health-check.sh /bin/health-check.sh
FROMprogrium/consul
USERroot
ADDbin/jq /bin/jq
ADDscripts/health-check.sh /bin/health-check.sh

我们有了health check scripts and JQ我们就可以从我们自己的consul image做health check了。我们也有一个本地注册表运行镜像在创建后,我们只是标记生成的镜像,并将其推到我们的本地注册表

$ docker build .
...
$ docker tag a3157e9edc18 <local-registry>/consul-local:some-tag
$ docker push <local-registry>/consul-local:some-tag
$ dockerbuild .
...
$ dockertaga3157e9edc18 <local-registry>/consul-local:some-tag
$ dockerpush <local-registry>/consul-local:some-tag

现在,它可以提供给我们的开发者了。并且也可在我们的不同的测试环境中使用。

5. 访问远程主机的Docker

Docker的CLI是一个非常酷的工具,其中一个很大的特点是,你可以用它来轻松地访问多Docker守护进程,即使它们在不同的主机。你需要做的就是设置DOCKER_HOST环境变量指向Docker daemon的监听地址。如果该端口是可以的访问,你可以直接在远程主机上的Docker,这和你运行一个Docker daemon ,并设置为通过docker-machine几乎相同的原理。

$ docker-machine env demo
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="/Users/jos/.docker/machine/machines/demo"
export DOCKER_MACHINE_NAME="demo"
 $ docker-machineenvdemo
exportDOCKER_TLS_VERIFY="1"
exportDOCKER_HOST="tcp://192.168.99.100:2376"
exportDOCKER_CERT_PATH="/Users/jos/.docker/machine/machines/demo"
exportDOCKER_MACHINE_NAME="demo"

但你不必限制自己Docker daemons 程通过docker-machine启动。如果你有你的后台程序运行的控制,以及安全的网络,你可以很容易地从一台机器控制所有的。

6. 简单的主机目录挂载

当你正在使用你的容器,你有时需要得到容器里面的一些数据。您可以复制它,或者通过使用ssh命令。但多数情况下是最容易的是将一个主机目录添加容器中。可以很容易地通过执行下面的命令完成操作:

$ mkdir /Users/jos/temp/samplevolume/
$ ls /Users/jos/temp/samplevolume/
$ docker run -v /Users/jos/temp/samplevolume/:/samplevolume -it --rm busybox
$ docker run -v /Users/jos/temp/samplevolume/:/samplevolume -it --rm busybox
/ # ls samplevolume/
/ # touch samplevolume/hello
/ # ls samplevolume/
hello
/ # exit
$ ls /Users/jos/temp/samplevolume/
hello
$ mkdir /Users/jos/temp/samplevolume/
$ ls /Users/jos/temp/samplevolume/
$ dockerrun -v /Users/jos/temp/samplevolume/:/samplevolume -it --rmbusybox
$ dockerrun -v /Users/jos/temp/samplevolume/:/samplevolume -it --rmbusybox
/ # ls samplevolume/
/ # touch samplevolume/hello
/ # ls samplevolume/
hello
/ # exit
$ ls /Users/jos/temp/samplevolume/
hello

你可以看到我们指定的目录安装在容器内,而且我们把所有的文件都在主机上,并在容器内可见。我们也可以使用inspect查看,看看有什么安装在哪里。

$ docker inspect 76465cee5d49 | jq '.[].Mounts'
[
 {
  "Source": "/Users/jos/temp/samplevolume",
  "Destination": "/samplevolume",
  "Mode": "",
  "RW": true
 }
]

$ dockerinspect 76465cee5d49 | jq '.[].Mounts'
[
 {
  "Source": "/Users/jos/temp/samplevolume",
  "Destination": "/samplevolume",
  "Mode": "",
  "RW": true
 }
]

我们可以在Docker官网看到更多的特性和使用方 法: https://docs.docker.com/engine/userguide/dockervolumes/

7.添加DNS解析到你的容器

我之前提到过,我们可以通过consul来管理容器。Consul是一个支持多数据中心分布式高可用的服务发现和配置共享的服务软件,可以为容器提供服务发现和健康检查。对于服务发现Consul提供无论是REST API或传统DNS,他的伟大的之处是,当你运行一个具体的镜像,你可以指定你的容器DNS服务器。
当你有Consul运行(或者其它 DNS server)你可以把它添加到您的Docker daemon就像这样:

docker run -d --dns $IP_CONSUL --dns-search service.consul <rest of confguration>

dockerrun -d --dns $IP_CONSUL --dns-searchservice.consul <restofconfguration>

现在,我们可以解决与Consul的名字注册的所有容器的IP地址,比如在我们的环境我们有了一个cassandra 集群。每个cassandra将自己注册名称为“cassandra”我们的Consul 集群。最酷的是,我们现在只是解决卡cassandra的地址基于主机名(而不必使用Docker链接)

$ docker exec -ti 00c22e9e7c4e bash
daemon@00c22e9e7c4e:/opt/docker$ ping cassandra
PING cassandra.service.consul (192.168.99.100): 56 data bytes
64 bytes from 192.168.99.100: icmp_seq=0 ttl=64 time=0.053 ms
64 bytes from 192.168.99.100: icmp_seq=1 ttl=64 time=0.077 ms
^C--- cassandra.service.consul ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.053/0.065/0.077/0.000 ms
daemon@00c22e9e7c4e:/opt/docker$
$ dockerexec -ti 00c22e9e7c4e bash
daemon@00c22e9e7c4e:/opt/docker$ pingcassandra
PINGcassandra.service.consul (192.168.99.100): 56 databytes
64 bytesfrom 192.168.99.100: icmp_seq=0 ttl=64 time=0.053 ms
64 bytesfrom 192.168.99.100: icmp_seq=1 ttl=64 time=0.077 ms
^C--- cassandra.service.consulpingstatistics ---
2 packetstransmitted, 2 packetsreceived, 0% packetloss
round-tripmin/avg/max/stddev = 0.053/0.065/0.077/0.000 ms
daemon@00c22e9e7c4e:/opt/docker$

8. Docker-UI是一个很棒来查看和获取洞察你容器的方式

使用Docker CLI来查看Docker容器所发生的一切并不难。很多时候,虽然你并不需要的Docker CLI的全部功能,但只是想快速浏览其中的容器运行,看看发生了什么。Docker UI ( https://github.com/crosbymichael/dockerui )就是一个这样伟大的项目,并且他是开源的。

有了这个工具,你可以看到一个特定的Docker deamon的容器和镜像的最重要的东西。

9. Container 不能启动? Overwrite the Entry Point你只需要从bash启动。

有时候一个容器只是没有做你想要它做的事情,你已经重新创建了Docker 镜像,你在启动时运行了几次,但不知何故,该应用程序没有反应,然后日志显示也没什么有用的信息。最简单的调试方法是overwrite the entry point ,看看在容器内部发生的一切,查看文件权限是否正确。拷贝进入镜像的文件是否正确,或者任何其它可能出现的错误。幸运的是,Docker有这样做的一个简单的解决方案。你可以从一个选择的入口点启动你的容器:

$ docker run -ti --entrypoint=bash cassandra
root@896757f0bfd4:/# ls
bin  dev  etc  lib mediaopt  root sbin sys usr
boot docker-entrypoint.sh home lib64 mntproc run  srv  tmp var
root@896757f0bfd4:/#
$ dockerrun -ti --entrypoint=bashcassandra
root@896757f0bfd4:/# ls
bin dev  etc libmediaopt root sbin sys usr
boot docker-entrypoint.sh home lib64 mntproc run srv tmp var

root@896757f0bfd4:/#

10. 监听一个容器的事件:

当你编写自己的脚本,或者只是想了解发生了什么,你可以Docker event command运行你的镜像,为此编写脚本很容易。

这是我们没有使用Docker Compose 和Swarm yet和Docker 1.9网络层 特性的情况,Docker一个很酷的工具,有一套伟大的工具。在未来希望Docker越来越好,我也会给大家展示一些Docker更酷的东西。

 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索docker
, 技巧
, 实用技巧
实用技巧整理
docker 实用、docker 技巧、docker 总结、docker 使用总结、倒车入库实用技巧,以便于您获取更多的相关知识。

时间: 2024-11-02 14:57:15

Docker 实用技巧总结_docker的相关文章

Docker 容器虚拟化的实用技巧总结_docker

服务器虚拟化指的是在操作系统与硬件之间加一层,叫做hypervisor层,对下控制硬件,对上承载操作系统,操作系统os以文件形式封装运行,称为虚拟机,主要解决的问题是硬件利用率和灵活性的问题,常见的方案为vmware vsphere,xen,kvm,hyper-v..容器虚拟化指的是在os上将应用打包以进程的形式运行,应用和应用间非完全隔离,但是更轻量,效率高,lxc和docker都可以称为容器级虚拟化,区别在于docker可以理解为经过精美封装过更加好用的lxc,有更好的接口和更完善的配套.

谷歌浏览器你不知道的5个实用技巧

对于一款浏览器软件来说,能够快速.安全.稳定的浏览网页自然是最重要的,正如Chrome浏览器在介绍中所描述的一般.不过,如果这样你就满足了,那就太没追求了,别看Chrome浏览器的界面非常简洁,它可以实现的功能可远不止那么简单. 连邦免费下载 谷歌浏览器你不知道的五个实用技巧 Chrome浏览器自动更新 使用最新版的Chrome浏览器可以获得最稳定的浏览体验,所以及时升级就显得格外重要.由于Chrome浏览器的版本更新较快,人送外号"版本帝",所以很多用户都觉得用Chrome要经常下载

2345好压解压文件的几个实用技巧

  相信很多网友都非常熟悉2345好压的文件压缩跟压缩包解压功能,那您知道可以使用2345好压在文件压缩的过程中的一些使用技巧吗?比如说:一个大的压缩包内有很多文件,只需要解压其中的几个文件夹的时候,该怎么操作呢?一起来看看今天小编为大家整理的2345好压解压文件的几个实用技巧! 一:如何设置所有的压缩包都解压到指定目录: 电脑上的压缩包多如牛毛,每个压缩包解压后都会产生一个文件夹,何不让将这些压缩包都统一解压到一个目录下呢?其实这很容易,只要你打开好压主程序--工具--设置--"压缩标签栏&q

CSS实用技巧及常见问题

个人总结的一些css实用技巧及必须得注意的事项: 1.注释须知:html中注释不能这样写: 复制内容到剪贴板 代码: <div></div><!--------这是错误写法-------><div></div><!--=======这是正确写法========-->这种写法,FF中会忽略其下面的内容详见:http://www.bluebirdsky.cn/article.asp?id=153.2.CSS注释切记在/*之后及*/之前空一

实用技巧:PHP中调用Java类的两种方法

Java语言功能强大,因此在许多情况下在php中来调用Java的功能将十分有用.在php中调用Java语言有两种方法,一种是使用php中的Java扩展模块,另一种是使用minij2ee应用服务器提供的SJOP协议实现.下面我们来比较一下这两种方法各自的特点. 1.php的Java模块 php发布版中包含一个Java扩展模块,可以用来调用Java对象,例如: <?php$system=new Java("java.lang.System");print "Java ver

百度百科帐号升级三个实用技巧

百度百科对网站优化的好处不必多说,相信大家都知道.但是在百科里添加链接的难度,大家更是深有体会,太难了! 怎样有效的在百科里添加网站的链接?一个高等级的百科帐号,是你加链接通过率大幅提升的根本.下面介绍自己升级百度百科帐号的三个实用技巧,用这三个技巧,就能很快的升到百科四级帐号,并可加入核心用户,轻松的给自己网站加链接啦. 技巧一.巧做任务 百度百科任务有成长任务.活动任务.我们把帐号申请下来,马上就去接成长任务.三级以前,你基本只围绕完成任务来做就行啦.完成任务后,有丰厚的经验值奖励哦. 任务

Asp.net实用技巧(2)

asp.net|技巧   1. 在Asp.net实用技巧(1) 中提到了如何刷新父页面,那么如果要刷新父页面的父页面的父页面了?那就是刷新祖先页面RefreshAncestorPage. RefreshAncestorPage#region RefreshAncestorPage        /**//// <summary>        /// 刷新指定的祖先页面,注意是"祖先页面"            /// </summary>           

Windows XP的23招实用技巧

往往我们经常使用碎片整理使windows运行的更快.但现在市场上出售的7200转硬盘,在寻道和传输两方面做了改进,有很多型号还附带有一个8m缓存,而且winxp使用的ntfs文件系统比fat系统更有效率.因此,碎片整理对提升电脑性能的作用已经非常有限.下面给出能够大幅提升电脑性能,让winxp运行更快捷 .更可靠的23招实用技巧,希望对您有所帮助 : 1)在系统中安装ultra-133硬盘加速扩充卡或带有8m缓存的ata硬盘,可以有效减少系统的启动时间. 2)把内存增加到512m以上. 3)确定

Firefox和IE通用的三则网站重构实用技巧

Firefox和IE通用的三则网站重构实用技巧-CSS教程 使用zoom.overflow解决IE6.IE7.FF下嵌套容器清除浮动问题 我们经常碰到一个容器外面套一个边框,边框高度随容器高度变化,但是当边框内容器设置了浮动属性后,外框就不跟随变化,这时就需要清除浮动.给外边框容器加上overflow:auto的属性,可以解决IE7和FF下的清除浮动问题,但是IE6下不生效,我们需要使用IE的一个私有属性zoom使IE5.5 的浏览器达到外框跟随变化的效果. 需要注重的几个细节问题,例如我们建立