Docker容器调试应用程序

Docker容器调试应用程序,第1张

因为Docker技术的火热,因此在工作中我们经常会以容器的方式来运行一个应用。每当容器无法成功运行或者想要对容器中的应用参数、应用配置以及应用启动进行深入研究时,当然希望能够像在宿主机上调试程序一样在容器中调试应用。容器的本质包括应用与应用运行所依赖的环境, 因此首先需要创建一个空壳容器(没有运行应用的应用容器),然后进入容器中调试应用。此处的空壳容器提供了应用运行所需的环境,进而可方便的在其中调试应用。实践环境:Centos72+Docker1126。

比较规范的镜像的Dockerfile中通常会有ENTRYPOINT与CMD的定义(Docker官方推荐这样做)。因此容器的启动命令则为ENTRYPOINT所对应的脚本或可执行程序加上CMD中定义的内容。比如elasticsearch的Dockerfile定义的ENTRYPOINT与CMD分别为:ENTRYPOINT ["/docker-entrypointsh"] CMD ["elasticsearch"],则创建的容器的启动命令为: /docker-entrypointsh elasticsearch ;mysql的Dockerfile:ENTRYPOINT ["docker-entrypointsh"] CMD ["mysqld"],则创建的容器的启动命令为: /docker-entrypointsh mysqld 。所以想要知道一个容器的启动命令需要首先了解其镜像的Dockerfile中ENTRYPOINT与CMD的定义。如何查看一个镜像的ENTRYPONT与CMD的值呢?一般采用如下两种方式:

上述第一种方式适用于比较规范的镜像,这类镜像通常会提供清晰、具体的Dockerfile。第二种方式适用于各种镜像,尽管是不规范的镜像。通过history、inspect两个命令的任一个均可快速、方便的查看镜像的ENTRYPOINT与CMD的值。

若要调试容器中的应用程序,则需额外的设置实现。docker run命令提供的--entrypoint参数能够覆盖Dockerfile中默认定义的ENTRYPOINT;docker run [OPTIONS] IMAGE [COMMAND] [ARG]的COMMAND能够替换Dockerfile中定义的CMD。通过上面的示例可以发现,有的镜像的Dockerfile中ENTRYPOINT值为:/docker-entrypointsh,CMD为应用的可执行程序;有的镜像的Dockerfile中ENTRYPOINT值为应用的可执行程序,CMD为可执行程序的参数。因此针对不同的镜像想要创建空壳容器其方式是不同的。

容器其实是应用与应用运行所依赖的环境,创建空壳容器即提供了应用所需要的环境,进入此环境中可以调试应用,可以验证应用的各个参数,同样更可以像在宿主机中运行程序一样在此环境中运行应用,区别仅是容器与宿主机的两个环境。上面是对如何在容器中调试应用程序做的一些记录,希望与大家一起讨论、交流,一起学习。

点击右上角加'关注',全国产经信息不错过

网络而言,网桥网络是在网段之间转发流量的链路层设备。网桥可以是在主机内核中运行的硬件设备或软件设备。

就Docker而言,网桥网络使用软件网桥,该软件网桥允许连接到同一网桥网络的容器进行通信,同时提供与未连接到该网桥网络的容器的隔离。Docker网桥驱动程序会自动在主机中安装规则,以使不同网桥网络上的容器无法直接相互通信。

桥接网络适用于在同一Docker守护程序主机上运行的容器。为了在不同Docker守护程序主机上运行的容器之间进行通信,您可以在OS级别管理路由,也可以使用 覆盖网络。

启动Docker时,会自动创建一个默认的桥接网络(也称为bridge),并且除非另有说明,否则新启动的容器将连接到它。您还可以创建用户定义的自定义网桥网络。用户定义的网桥网络优于默认bridge 网络。

用户定义的网桥和默认网桥之间的

用户定义的网桥可在容器之间提供自动DNS解析。

缺省桥接网络上的容器只能通过IP地址相互访问,除非您使用被认为是传统的--link选项。在用户定义的网桥网络上,容器可以通过名称或别名相互解析。

想象一个具有Web前端和数据库后端的应用程序。如果调用容器web和db,则db无论应用程序堆栈在哪个Docker主机上运行,Web容器都可以在处连接到db容器。

如果在默认网桥网络上运行相同的应用程序堆栈,则需要在容器之间手动创建链接(使用旧式--link 标志)。这些链接需要双向创建,因此您可以看到,要进行通信的容器要多于两个,这会变得很复杂。或者,您可以 *** 作/etc/hosts容器中的文件,但这会导致难以调试的问题。

用户定义的网桥提供了更好的隔离性。

所有未--network指定的容器都将连接到默认网桥网络。这可能是一种风险,因为不相关的堆栈/服务/容器随后能够进行通信。

使用用户定义的网络可提供作用域网络,其中只有连接到该网络的容器才能通信。

容器可以随时随地从用户定义的网络连接和分离。

在容器的生命周期内,您可以即时将其与用户定义的网络连接或断开连接。要从默认桥接网络中删除容器,您需要停止容器并使用其他网络选项重新创建它。

每个用户定义的网络都会创建一个可配置的网桥。

如果您的容器使用默认的桥接网络,则可以对其进行配置,但是所有容器都使用相同的设置,例如MTU和iptables规则。另外,配置默认桥接网络发生在Docker本身之外,并且需要重新启动Docker。

用户定义的桥接网络是使用创建和配置的 docker network create。如果不同的应用程序组具有不同的网络要求,则可以在创建时分别配置每个用户定义的网桥。

默认网桥网络上的链接容器共享环境变量。

最初,在两个容器之间共享环境变量的唯一方法是使用--linkflag链接它们。用户定义的网络无法进行这种类型的变量共享。但是,存在共享环境变量的高级方法。一些想法:

多个容器可以使用Docker卷挂载包含共享信息的文件或目录。

使用可以一起启动多个容器docker-compose,并且compose文件可以定义共享变量。

您可以使用群体服务来代替独立容器,并利用共享机密和 配置。

连接到同一用户定义网桥网络的容器可以有效地将所有端口彼此公开。为了使容器或不同网络上的非Docker主机可以访问该端口,必须使用或 标志发布该端口。-p--publish

全国产经平台联系电话:010-65367702,邮箱:hz@people-energycomcn,地址:北京市朝阳区金台西路2号人民日报社

我们来了解一下Windows *** 作系统中的Docker以及在其中安装DockerWindows客户端的知识。Docker引擎使用Linux特有的内核特性,因此不能通过Windows内核运行,所以,(在Windows上)Docker引擎创建了一个小的虚拟系统运行Linux并利用它的资源和内核。这样,WindowsDocker客户端就可以用这个虚拟的Docker引擎来构建、运行以及管理Docker容器。有个叫Boot2Docker的团队开发了一个同名的应用程序,它创建了一个虚拟机来运行基于TinyCoreLinux特制的小型Linux,来在Windows上运行Docker容器。它完全运行在内存中,需要大约27M内存并能在5秒(因人而异)内启动。因此,在用于Windows的Docker引擎被开发出来之前,我们在Windows机器里只能运行Linux容器。下面是安装Docker客户端并在上面运行容器的简单步骤。1下载Boot2Docker在我们开始安装之前,我们需要Boot2Docker的可执行文件。可以从它的Github下载最新版本的Boot2Docker。在这篇指南中,我们从网站中下载版本v161。我们从那网页中用我们喜欢的浏览器或者下载管理器下载了名为docker-installexe的文件。2安装Boot2Docker现在我们运行安装文件,它会安装WindowDocker客户端、用于Windows的Git(MSYS-git)、VirtualBox、Boot2DockerLinuxISO以及Boot2Docker管理工具,这些对于开箱即用地运行全功能的Docker引擎都至关重要。3运行Boot2Docker安装完成必要的组件之后,我们从桌面上的“Boot2DockerStart”快捷方式启动Boot2Docker。它会要求你输入以后用于验证的SSH密钥。然后会启动一个配置好的用于管理在虚拟机中运行的Docker的unixshell。检查否确配置运行面dockerversion命令dockerversion4运行Docker由于Boot2DockerStart自启已经确设置环境变量shell我马始使用Docker请注意我要Boot2Docker作远程Docker守护进程要docker命令前加sudo现让我试试hello-world例镜像载hello-world镜像运行并输"HellofromDocker"信息$dockerrunhello-world5使用命令提示符(CMD)运行Docker现想始用命令提示符使用Docker打命令提示符(CMDexe)由于Boot2Docker要求sshexePATH我需要命令提示符输入命令使%PATH%环境变量包括Git安装目录bin文件夹setPATH=%PATH%;"c:\ProgramFiles(x86)\Git\bin"运行面命令我命令提示符运行boot2dockerstart启Boot2Docker虚拟机boot2dockerstart注意:看machinedoesnoexist错误信息运行boot2dockerinit命令复制图控制台标命令cmdexe控制台窗口设置环境变量我像平运行docker容器6使用PowerShell运行Docker能PowerShell运行Docker我需要启PowerShell窗口并添加sshexePATH变量$Env:Path="${Env:Path};c:\ProgramFiles(x86)\Git\bin"运行完面命令我需要运行boot2dockerstart打印用于设置环境变量连接虚拟机内部运行DockerPowerShell命令我需要PowerShell运行些命令平运行docker容器7用PUTTY登录Boot2Docker%USERPROFILE%ssh目录使用用于登录公共私密钥我需要使用文件夹私密钥私密钥需要转换PuTTY格式我通puttygenexe实现我需要打puttygenexe并%USERPROFILE%ssh\id_boot2docker导入("File"->"Load"菜单)私钥点击"SavePrivateKey"用保存文件通PuTTY用docker@127001:2022登录8Boot2Docker选项Boot2Docker管理工具提供些命令所示$boot2dockerUsage:boot2dockerexe[]{help|init|up|ssh|save|down|poweroff|reset|restart|config|status|info|ip|shellinit|delete|download|upgrade|version}[]总结通DockerWindows客户端使用Docker趣Boot2Docker管理工具能使任何Docker容器能像Linux主机平滑运行棒应用程序更仔细发现boot2docker默认用户用户名docker密码tcuser新版本boot2docker设置host-only网络适配器提供访问容器端口般说19216859103通VirtualBoxDHCP实现改变

Docker 是一个开源的 应用容器引擎 ,让 开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化 。容器是完全使用沙箱机制,相互之间不会有任何接口。

由于本地开发好的程序往往都需要部署到服务器上进行运行,这就导致了程序需要运行在不同的环境上,这通常是一个令人头痛的事情。在过去,开发团队需要清楚的告诉运维部署团队,其所使用的全部配置文件+所有软件环境。不过,即便如此,仍然常常发生部署失败的状况。

于是乎, 虚拟化 技术应运而生。开发团队将开发好的程序在虚拟机上运行,这样就能解决运维的问题。但是由于虚拟机技术过重的特性导致了其 资源占用多、冗余步骤多以及启动慢的缺陷 。而这个时候 一种新的虚拟化技术搭配上容器化的思想 的产品便出现了,而它就是Docker。

下图是虚拟机技术和容器化技术架构的对比。我们可以得出以下总结:

[上传失败(image-efadd2-1643314980201)]

]( >

    软件开发最大的麻烦事之一,就是环境配置。举例来说,安装一个 Python 应用,计算机必须有 Python 引擎,还必须有各种依赖,可能还要配置环境变量。而且换一台机器,就要重来一次。Docker可以解决这个问题

    Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。容器是进程级别的,相比虚拟机有很多优势:(1)启动快;(2)资源占用少(3)体积小。

    Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。

本小节介绍如何制作 image 文件,以及 docker 的一些高级用法

主要是编写 Dockerfile 文件,此外用dockerignore文件排除不想打包的文件。Dockerfile 文件它是一个文本文件,用来配置 image。Docker 根据 该文件生成二进制的 image 文件。

然后执行 docker image build -t 容器名称 即可构建一个 image

微服务很适合用 Docker 容器实现,每个容器承载一个服务。一台计算机同时运行多个容器,从而就能很轻松地模拟出复杂的微服务架构。如何管理这多个容器呢,即一行命令同时启动或关闭多个容器。Docker Compose可以做到。你需要定义一个 YAML 格式的配置文件 docker-composeyml ,写好多个容器之间的调用关系。

docker-compose up // 启动

docker-compose stop // 关闭以后,这两个容器文件还是存在的,写在里面的数据不会丢失。下次启动的时候,还可以复用。

docker-compose rm // 把这两个容器文件删除

以下两种玩儿发都需要配置国内镜像代理,否则速度极慢,代理配置参考注 >

Compose是一个用于定义和运行多容器Docker应用程序的工具。使用Compose,您可以使用YAML文件来配置应用程序的服务。然后,只需一个命令,就可以从配置中创建并启动所有服务。

用python构建一个简易网页统计网页点击量,docker-compose进行发布

Step1:创建项目

Step2:创建Dockerfile文件

Step3:在docker-composeyml中定义services

Step4:用Docker compose构建和运行app

Step5:绑定一个数据卷

将当前目录与容器的/code目录绑定,这样可以动态修改代码

Step6:重新构建和运行app

先docker-compose down停止服务,在构建

用YAML文件定义服务,默认文件是docker-composeyml,包含4个顶级key,version、services、networks、volumes

参考compose-spec/specmd at master · compose-spec/compose-spec · GitHub

指定本 yml 依从的 compose版本

定义多个应用服务,包含环境配置、镜像构建等

指定构建镜像的路径

定义服务的block IO配置,参考compose-spec/specmd at master · compose-spec/compose-spec · GitHub

指定自定义容器名称

定义服务间启动或关闭的依赖关系

覆盖容器启动的默认命令

domainname declares a custom domain name to use for the service container

覆盖容器默认的entrypoint

从文件中添加环境变量到容器,可以是一个或多个文件

文件格式:

添加环境变量

暴露端口,但不映射到宿主机,只被连接的服务访问,仅可以指定内部端口

用于检测 docker 服务是否 健康 运行。

指定容器运行的镜像

设置容器标签

连接到另一个容器的网络,简单将就是让容器相互连通

服务的日志记录配置,driver:指定服务容器的日志记录驱动程序,默认值为json-file。有以下三个选项

仅在 json-file 驱动程序下,可以使用以下参数,限制日志得数量和大小。

syslog 驱动程序下,可以使用 syslog-address 指定日志接收地址。

设置网络模式,格式如下:

配置容器连接的网络

指定ip地址

端口映射,映射主机与容器端口,格式:Host:ontainer

容器重启策略

存储敏感数据,比如密码

将主机数据卷挂载到容器

覆盖容器工作目录

docker多个相同类型参数

什么是容器

a)一种虚拟化的方案

b) *** 作系统级别的虚拟化

c)只能运行相同或相似内核的 *** 作系统

d)依赖于Linux内核特性:Namespace和Cgroups(Control Group)

e)docker是有go语言开发的

2、Docker的目标:

a)提供简单轻量的建模方式

b)职责的逻辑分离

c)快速高效的开发生命周期

d)鼓励使用面向服务的架构

3、Docker的使用场景

a)使用docker容器开发,测试,部署服务

b)创建隔离的运行环境

c)搭建测试环境

d)构建多用户的平台服务(PaaS)基础设施

e)提供软件即服务(SaaS)应用程序

f)高性能、超大规模的宿主机部署

4、Docker Image镜像

a)容器的基石

b)层叠的只读文件系统

c)联合加载(union mount)

5、Docker Contrainer容器

a)通过镜像启动

b)启动和执行阶段

c)写时复制

6、Docker Registry仓库

a)公有,私有

b)Docker Hub

7、Namespaces命名空间

a)PID(Process ID) 进程隔离

b)NET(Network) 管理网络接口

c)IPC 管理跨进程通信的访问

d)MNT 管理挂载点

e)UTS 隔离内核和版本标识

8、Control groups控制组

a)资源限制

b)优先级设置

c)资源计量

d)资源控制

9、Docker 容器的能力

a)文件系统隔离:每个容器都有自己的root文件系统

b)进程隔离:每个容器都运行在自己的进程环境中

c)网络隔离:容器间的虚拟网络接口和IP地址都是分开的

d)资源隔离和分组:使用cgroups将CPU和内存之类的资源独立分配给每个Docker

10、容器的基本 *** 作

101、启动容器:

1、docker run IMAGE [COMMAND] [ARG]

run 在新容器中执行

2、启动交互式容器

docker run -i -t IMAGE /bin/bash

-i --interactive=true|false 默认是false # 为容器始终打开标准输入

-t --tty=true|false 默认是false # 为容器分配伪tty终端

以上就是关于Docker容器调试应用程序全部的内容,包括:Docker容器调试应用程序、云计算核心技术Docker教程:Docker使用网桥网络、如何在docker下运行windows程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10628381.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-10
下一篇 2023-05-10

发表评论

登录后才能评论

评论列表(0条)

保存