我有机会建立一个以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安装应用(CentOS 6.5_x64) http://www.linuxidc.com/Linux/2014-07/104595.htm
Ubuntu 14.04安装Docker http://www.linuxidc.com/linux/2014-08/105656.htm
Ubuntu使用VNC运行基于Docker的桌面系统 http://www.linuxidc.com/Linux/2015-08/121170.htm
阿里云CentOS 6.5 模板上安装 Docker http://www.linuxidc.com/Linux/2014-11/109107.htm
Ubuntu 15.04下安装Docker http://www.linuxidc.com/Linux/2015-07/120444.htm
在Ubuntu Trusty 14.04 (LTS) (64-bit)安装Docker http://www.linuxidc.com/Linux/2014-10/108184.htm
在 Ubuntu 15.04 上如何安装Docker及基本用法 http://www.linuxidc.com/Linux/2015-09/122885.htm
相关推荐
基于纯verilogFPGA的双线性差值视频缩放 功能:利用双线性差值算法,pc端HDMI输入视频缩小或放大,然后再通过HDMI输出显示,可以任意缩放。 缩放模块仅含有ddr ip,手写了 ram,fifo 代码,可以较为轻松地移植到其他平台。 硬件平台:易灵思 ti60f225 EDA平台:efinity
zip里包含源码+论文+PPT,有java环境就可以运行起来 ,功能说明: 文档开篇阐述了随着计算机技术、通信技术和网络技术的快速发展,智慧社区门户网站的建设成为了可能,并被视为21世纪信息产业的主要发展方向之一 强调了网络信息管理技术、数字化处理技术和数字式信息资源建设在国际竞争中的重要性。 指出了智慧社区门户网站系统的编程语言为Java,数据库为MYSQL,并实现了新闻资讯、社区共享、在线影院等功能。 系统设计与功能: 文档详细描述了系统的后台管理功能,包括系统管理模块、新闻资讯管理模块、公告管理模块、社区影院管理模块、会员上传下载管理模块以及留言管理模块。 系统管理模块:允许管理员重新设置密码,记录登录日志,确保系统安全。 新闻资讯管理模块:实现新闻资讯的添加、删除、修改,确保主页新闻部分始终显示最新的文章。 公告管理模块:类似于新闻资讯管理,但专注于主页公告的后台管理。 社区影院管理模块:管理所有视频的添加、删除、修改,包括影片名、导演、主演、片长等信息。 会员上传下载管理模块:审核与删除会员上传的文件。 留言管理模块:回复与删除所有留言,确保系统内的留言得到及时处理。
基于51单片机的一个智能密码锁设计.7z
《基于STM32的舵机控制系统设计》毕业设计项目 1.STM32单片机+2x180_SG90+2x360_SG90+OLED屏幕 2.OLED屏幕显示舵机的方向、速度、角度各项数据 3.按键1:控制180度舵机正向转动角度 4.按键2:控制180度舵机反向转动角度 5.按键3:控制360度舵机正向转动并且控制舵机速度 6.按键4:控制360度舵机反向转动并且控制舵机速度 7.代码里面含有注释 8.硬件实物接上线就能直接运行
Pyside6+Qml+QtCreator做的桌面app
【资源说明】 基于深度堆叠卷积神经网络的图像融合详细文档+全部资料+优秀项目+源码.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
【资源说明】 基于卷积神经网络的语音识别声学模型的研究详细文档+全部资料+优秀项目+源码.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
IndexOutOfBoundsException(解决方案)
Mini-Imagenet数据集文件
时间转换工具(BD时、GPS时、UTC时、北京时间相互转换,可计算日期)
【资源说明】 基于CNN神经网络实现的正方教务系统的验证码识别资料齐全+高分项目+文档+源码.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
西北工业大学 人工智能程序设计 Python NOJ程序源代码.zip
车辆、飞机、船检测12-YOLO(v5至v11)、COCO、CreateML、TFRecord、VOC数据集合集.rar对象检测分配-V2 2024-03-10 7:04 pm ============================= *与您的团队在计算机视觉项目上合作 *收集和组织图像 *了解和搜索非结构化图像数据 *注释,创建数据集 *导出,训练和部署计算机视觉模型 *使用主动学习随着时间的推移改善数据集 对于最先进的计算机视觉培训笔记本,您可以与此数据集一起使用 该数据集包括2992张图像。 以可可格式注释船舶飞机。 将以下预处理应用于每个图像: *像素数据的自动取向(带有Exif-Arientation剥离) *调整大小为640x640(拉伸) 没有应用图像增强技术。
SmartAdmin以「高质量代码」为核心,「简洁、高效、安全」的快速开发平台;基于SpringBoot2/3+Sa-Token+Mybatis-Plus和Vue3 +Ant Design Vue+UniApp (提供JavaScript和TypeScript双版本、Java8和java17双版本);满足三级等保、网络安全、数据安全等功能要求。并重磅开源千余家企业在使用的《高质量代码规范》等
欢迎下载
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于计算机科学与技术等相关专业,更为适合;
【资源说明】 基于常规波束形成的时间窗方法以及基于卷积神经网络的时间窗方法水下目标方位估计算法详细文档+全部资料+优秀项目+源码.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
预览地址:https://blog.csdn.net/qq_42431718/article/details/144633992 html+css网页设计 美食 蛋糕美食7个页面
Python高分毕设——Python&Opencv手势识别系统(完整源码&自定义UI操作界面&视频教程) Python高分毕设——Python&Opencv手势识别系统(完整源码&自定义UI操作界面&视频教程) 使用了OpenCV的视频采集, 图像色域转换, 颜色通道分割, 高斯滤波, OSTU自动阈值, 凸点检测, 边缘检测, 余弦定理计算手势等功能. 准备工作 安装 Python-OpenCV 库 pip install opencv-python -i https://mirrors.ustc.edu.cn/pypi/web/simple 利用 -i 为pip指令镜像源, 这里使用电子科技大学的源, 速度比官方源更快. 安装 Numpy 科学计算库 pip install numpy -i https://mirrors.ustc.edu.cn/pypi/web/simple 安装 PyAutogui 库 pip install pyautogui -i https://mirrors.ustc.edu.cn/pypi/web/simple 代码实现 import nu
Friday night funkin