在容器化环境中管理端口至关重要,因为多个容器使用相同的底层硬件资源。如果没有适当的管理,端口冲突可能会导致应用程序或服务的停机或不稳定。
端口是什么?
结论
服务器端口容器化在管理容器环境中的端口方面至关重要。通过了解端口是什么、容器化中的端口以及服务器端口容量,您可以采取措施防止端口冲突并确保应用程序和服务的稳定性。
通过遵循上述最佳实践,您可以有效地管理端口,优化容器化环境的性能和可靠性。
Docker:容器管理(启动参数,查看容器和日志,进入和修改容器)
摘要: Docker
容器是一个精简版的操作系统,一般一个容器只运行一个应用,容器通过镜像创建,使用docker run 命令创建,容器起到了 隔离 作用,容器和容器之间独享空间和网络等
容器的基本操作包括创建(启动),停止,重启,查看,检查等,容器通过镜像创建,使用 docker run 命令创建,需要指定run参数,镜像名,容器执行命令,语句格式如下
在实际使用中启动一个镜像,例如
-e 设置环境变量,格式是 -e k1=v1 -e k2=v2 ,使得在docker镜像中的程序能够直接访问到环境变量,同时可以作为配置参数放在docker run启动镜像的时候设置,而不是写死在dockerfile在build的过程中,-e和dockerfile中的 ENV 变量作用相同,当变量重名时-e替换ENV,下面测试一些-e参数,在Dockerfile指定环境变量
直接构建成容器
开启一个终端启动容器内部,打印指定的环境变量a
此时在run指令中增加-e设置环境变量,可见-e替换了Dockerfile中指定的环境变量
因为一个镜像可以启动多个容器,所以可以通过设置不同-e达到设置不同配置参数的目的,比如下一个例子在Dockerfile中设置和将环境变量写入yaml文件再供Python调用,执行的内容为打印yaml配置文件的参数内容,比如下面这个例子先看下目录结构
其中是一个空配置文件,在中先使用echo写入追加配置参数到在执行Python脚本
Dockerfile中启动脚本作为容器执行命令
在启动容器时,使用-e指定环境变量,在中echo将环境变量拿到和写入配置文件,测试多次以不同的配置参数启动容器如下
-v 设置挂载运行,将宿主机当前目录下的文件挂载到容器中/home目录下,例如
如果挂载的目录和Dockerfile中的COPY的目录不一致, -v会替代COPY或者ADD ,例如现在Docker中COPY一个文件到容器/home目录下
同目录下内容是打印1
构建镜像结束后,指定-v启动,起始挂载另外一个目录,目录下内容是打印2
docker run参数中最后的COMMAND会覆盖Dockerfile中指定的 CMD ,例如执行echo 2替换原始Dockerfile中的CMD echo 1,输出结果是2且执行完毕后退出
对于Dockerfile中的 ENTRYPOINT 指定的启动命令docker run的COMMAND不会覆盖,如果要覆盖Docker中的ENTRYPOINT需要指定docker run中的 –entrypoint 参数,格式是
测试一个Dockerfile输出1
在docker run中使用–entrypoint覆盖Dockerfile中的ENTRYPOINT
容器启动后通过 docker ps 或者 docker container ls 查看容器,可以增加额外参数比如 -a 显示所有容器,默认只显示运行的容器,可以增加 –no-trunc 参数使得显示结果不截断,例如
显示结果分别显示了容器的ID,镜像,执行命令,创建时间,状态,端口映射(宿主机->容器)和容器名称。对于已经运行的容器可以使用 docker stop 停止,如果在docker run时增加–rm参数则停止的容器保留不会自动删除,例如
除了docker stop命令还有一种停止容器的命令 docker kill ,相比于docker stop,docker kill是 强制立即停止 ,而docker stop是先给了容器10秒(默认)的时间,使得容器有一定的时间处理、保存程序执行现场, 优雅的退出程序 ,例如
在容器停止之后可以使用 docker start 再启动一个停止的容器,例如
除此之外可以使用 docker restart ,此时容器可以使停止的也可以是在运行中的,例如
查看容器详情使用 docker inspect ,比如
在以上截取的内容中展示了容器详情,包括容器id,创建时间,执行命令和参数,执行状态,容器pid,落脚点,环境变量,网络设置,端口映射等,也可以使用Go语言风格输出指定的详情,比如分别只看容器的pid和容器的执行命令
容器是一个操作系统,可以进入这个操作系统查看容器的运行情况,有多种方式进入容器,其中主要是使用 docker exec 进入容器,在一个运行中的容器中执行一个命令,使用 -it 并带有 /bin/bash 命令就可以进入容器,比如
除了/bin/bash也可以是其他命令挂载exec后面则可以直接对一个运行中的容器执行命令,比如查看容器的进入落脚点路径,容器中的内存情况
当容器以后台 -d 运行时,日志运行在容器内部,可以进入容器内部查看日志,也可以使用 docker logs 查看日志,以一个flask api接口的容器为例,日志写入文件,同时也会输出在flask的控制台
创建Dockerfile以及构建镜像,启动容器
启动一个脚本不断请求api接口
进入容器内部查看日志
另一种方式是直接使用 docker logs 命令,比如使用 -f 追踪输出,并且从最后的第1行开始输出
此时宿主机的logs目录下为空,容器中的logs目录下存在文件,如果使用 -v 将宿主机目录挂载到容器作为容器写入的目录,则容器中数据的变动会同步到本地,这样可以直接在本地查看日志,修改容器启动为 -v 挂载的形式
此时本地logs目录下开始产生日志,且这个日志和容器内的logs目录下一致
如果容器内的内容改变了,此时删除容器从镜像重新启动容器则改动的内容将不会存在,如果相对修改过的容器保留下来则可以从容器生成新的镜像,先测试以下容器内修改在删除的容器后将不再生效,在已有容器中使用pip安装Python包
此时退出容器,并且删除容器,最后从镜像重新生成容器
此时进入容器检查,并不存在pymongo包
如果要容器变化保存下来需要以这个新容器生成一个镜像,使用 docker commit ,语法如下
以新安装pymongo的容器为例,对新容器使用docker commmit
新生成的镜像叫做xiaogp/my_image_test:v2
从新镜像启动容器并进入容器查看存在新安装的pymongo
【Docker基础系列】Docker 中的各类端口功能示例详解
在Docker中,理解端口的功能对于有效管理容器化应用程序至关重要。
端口是容器内部与外部进行网络通信的桥梁。
根据用途和功能,Docker中的端口可以分为几种类型。
首先是容器端口(Container Ports),即运行在Docker容器内部的应用程序所使用的端口。
创建容器时,开发者可以指定容器内部应用程序监听的端口,使得外部网络能够通过容器的网络接口与容器内的应用程序进行通信。
宿主机端口(Host Ports)则是指宿主机上可用于与容器通信的端口。
当运行容器时,通过Docker的-p或–publish参数可以将容器端口映射到宿主机的端口上,这样外部网络可以通过访问宿主机的端口间接访问到容器内部的端口。
随机端口(Random Ports)是Docker为容器自动分配的,用于在宿主机上没有指定具体端口映射时的情况。
这样,在不知道具体端口号的情况下,通过查询Docker命令或工具仍能获得映射端口,实现容器访问。
网络端口(Network Ports)涉及Docker网络接口上使用的端口。
Docker支持多种网络模式,如桥接模式、主机模式、容器模式和自定义网络模式。
在自定义网络模式下,容器之间可通过网络端口进行通信。
暴露端口(Exposed Ports)是指在Docker容器内部指定的端口,但不与宿主机端口进行映射。
这些端口仅在容器内部或Docker网络内部可见,外部网络无法直接访问,通常用于容器之间的通信或容器内部服务的监听。
服务端口(Service Ports)在容器编排工具如Docker Compose或Kubernetes中定义,它们在服务层面表示对外暴露的端口,可以通过服务名称和端口号访问对应的容器。
以下是一些Docker端口映射的示例,帮助理解如何在实际应用中使用端口:单个端口映射:假设你有一个运行在容器内部端口80的Web应用,可以将80端口映射到宿主机的8080端口,通过访问宿主机的8080端口即可访问容器内部的Web应用。
随机端口映射:如果你不希望指定具体的宿主机端口,可以让Docker为你选择一个随机的高端口进行映射,通过-P参数实现。
多个端口映射:如果应用程序需要监听多个端口,可以使用-p参数指定多个端口映射,实现容器内部多个端口与宿主机对应端口的通信。
环境变量中的端口映射:在Docker Compose文件中,可以指定服务的端口映射到宿主机的相应端口。
容器间通信端口:通过创建自定义Docker网络并连接容器,实现容器间的通信,暴露端口使得一个服务可以通过容器名和端口号访问另一个服务。
如何查看一个docker容器使用了多少服务器资源
你好,操作命令如下:Docker会在隔离的容器中运行进程。
当运行dockerrun命令时,Docker会启动一个进程,并为这个进程分配其独占的文件系统、网络资源和以此进程为根进程的进程组。
在容器启动时,镜像可能已经定义了要运行的二进制文件、暴露的网络端口等,但是用户可以通过dockerrun命令重新定义(译者注:dockerrun可以控制一个容器运行时的行为,它可以覆盖dockerbuild在构建镜像时的一些默认配置),这也是为什么run命令相比于其它命令有如此多的参数的原因。
命令格式最基本的dockerrun命令的格式如下:$sudodockerrun[OPTIONS]IMAGE[:TAG][COMMAND][ARG]如果需要查看[OPTIONS]的详细使用说明,请参考Docker关于OPTIONS的章节。
这里仅简要介绍Run所使用到的参数。
OPTIONS总起来说可以分为两类:设置运行方式:决定容器的运行方式,前台执行还是后台执行;设置containerID;设置网络参数;设置容器的CPU和内存参数;-设置权限和LXC参数;设置镜像的默认资源,也就是说用户可以使用该命令来覆盖在镜像构建时的一些默认配置。
dockerrun[OPTIONS]可以让用户完全控制容器的生命周期,并允许用户覆盖执行dockerbuild时所设定的参数,甚至也可以修改本身由Docker所控制的内核级参数。
Operatorexclusiveoptions当执行dockerrun时可以设置以下参数:DetachedvsForegroundDetached(-d)-ForegroundContainerIdentificationName(–name)-PIDEquivalentIPCSettingNetworkSettingsCleanUp(–rm)RuntimeConstraintsonCPUandMemoryRuntimePrivilege,LinuxCapabilities,andLXCConfiguration接下来我们依次进行介绍。
Detachedvsforeground当我们启动一个容器时,首先需要确定这个容器是运行在前台还是运行在后台。
-d=false:Detachedmode:Runcontainerinthebackground,printnewcontaineridDetached(-d)如果在dockerrun后面追加-d=true或者-d,那么容器将会运行在后台模式。
此时所有I/O数据只能通过网络资源或者共享卷组来进行交互。
因为容器不再监听你执行dockerrun的这个终端命令行窗口。
但你可以通过执行dockerattach来重新附着到该容器的回话中。
需要注意的是,容器运行在后台模式下,是不能使用–rm选项的。

