首页 > 自考资讯 > 高考百科

终于有人把 Docker 讲清楚了,万字详解 docker?

小条 2024-06-27

Java架构师日记

%20

一、简介

1、了解Docker的前生LXC

%20LXC是Linux容器的缩写。轻量级虚拟化可以提供进程和资源隔离,而无需提供完全虚拟化的指令解释机制和其他复杂性。相当于C++中的命名空间。容器有效地将单个操作系统管理的资源划分为隔离的组,并提高隔离组之间竞争资源使用需求的平衡。

与传统虚拟化技术相比,它具有以下优势:

(1)采用与主机相同的核心,因此性能损失较小。

(2)不需要指令级仿真。

(3)%20不需要即时编译。

(4)容器可以在CPU核心上本地执行指令,而不需要特殊的解释机制。

(5)避免了半虚拟化和系统调用替换的复杂性。

(6)%20除了隔离之外,轻量级隔离还提供了共享机制,实现容器和主机之间的资源共享。

简介:%20Linux%20%20容器是一种轻量级虚拟化方法。

Linux容器提供了一种机制来支持在单个可控主机节点上同时执行多个隔离的服务器容器。%20Linux容器与chroot类似,提供具有自己的进程和网络空间的虚拟环境,但LXC与虚拟机不同,因为它是操作系统级别的资源虚拟化。

2、LXC与docker什么关系?

%20docker%20%20不是LXC%20%20的替代品。%20docker底层是使用LXC实现的,它可以让Linux进程之间隔离,并控制每个进程的资源分配。

docker在LXC的基础上,提供了一组更强大的功能。

3、什么是docker

%20docker是一个基于go语言开发、兼容apache2.0协议的开源应用容器引擎。

Docker%20%20允许开发人员将应用程序和依赖项打包到轻量级、可移植的容器中,并将它们暴露给常见的Linux%20%20服务器,这些服务器也可以虚拟化。

容器使用完全沙盒机制,彼此之间没有接口(如iPhone%20%20上的应用程序),并且开销非常低。

4、docker官方文档

%20https://docs.docker.com/

5、为什么docker越来越受欢迎

%20官方声明:

由于以下原因,容器变得越来越受欢迎:

灵活性:即使是最复杂的应用程序也可以容器化。轻量级:容器利用并共享主机内核。可替换:可以立即部署更新和升级。便携式:本地构建、部署到云并在任何地方运行。可扩展:容器副本可以扩展并自动分发。可堆叠:服务可以即时垂直堆叠。

图像和容器(容器)

通过镜像启动容器镜像是一个可执行包,其中包含运行应用程序所需的所有内容,包括代码、运行时、库、环境变量和配置文件。

容器是镜像的运行实例,在运行时显示镜像状态和用户进程。这些可以使用docker%20%20ps%20%20查看。

容器和虚拟机

容器在Linux上原生运行,与其他容器共享主机的内核,运行独立的进程,并且不占用其他可执行文件的内存。

虚拟机运行完整的操作系统,并通过虚拟机管理程序提供对主机资源的虚拟访问,这需要更多的资源。

%20

%20

6、docker版本

%20Docker%20%20社区版(CE)%20社区版

企业版(EE)商业版

7、docker和openstack的几项对比

%20

8、容器在内核中支持2种重要技术

%20Docker%20%20本质上通过命名空间实现资源隔离,通过cgroup%20%20实现资源限制,并通过配额等写时复制技术实现高效的文件操作。%20500g实际上并没有占用500g的物理磁盘)

1)%20命名空间命名空间

%20

%20

%202)%20对照组对照组

cgroup的特点如下:

cgroup%20%20API%20%20被实现为伪文件系统,允许用户程序通过文件系统管理cgroup%20%20组件。它还允许用户在线程级别管理组件。创建和销毁cgroup%20%20提供资源负载分配。所有资源管理功能和复用在接口创建时与其父任务属于同一个cgroup控制组。

四大主要特点:

资源限制:您可以限制任务使用的总资源。%20优先级分配:通过分配的CPU时间片数量和磁盘IO带宽,实际上和控制任务的执行优先级是一样的。您可以统计资源使用情况。任务控制,例如CPU持续时间和内存使用情况:cgroup可以执行挂起和恢复任务等操作。

9、了解docker三个重要概念

%201)%20图像镜

例如,Docker%20%20镜像是一个只读模板,可以包含仅安装Apache%20%20或其他用户应用程序的完整centos。另外,docker%20%20提供了一个非常简单的机制。您可以创建镜像、更新现有镜像,甚至从其他用户那里下载现成的镜像并直接使用它们。

2)集装箱集装箱

Docker%20%20使用容器来运行应用程序。容器可以启动、启动、停止和删除,以确保平台的安全。一个简单的Linux环境(包括root用户权限、镜像空间、用户空间、网络空间等)以及其中运行的应用程序

%20

3)Repository仓库

仓库是图像文件的集中存储。注册中心是仓库的主/从服务器,每个仓库存储多个镜像,每个镜像都有不同的标签。

仓库有两种:公共引用仓库和私有仓库,最大的公共仓库是一个Docker%20%20池,里面存储了大量的镜像供用户下周使用,这里的仓库概念和我的Git%20%20类似。注册中心可以理解为这样的托管服务。

10、docker的主要用途

%20正式版本是Bulid,发布,在任何应用程序/任何地方运行,编译,加载,运行,在任何应用程序/任何地方运行。

它为应用程序封装、部署和操作提供生命周期管理,并且可以在glibc%20%20环境中执行。

运维生产环境:Docker化。

当你发布一个服务时,Docker会自动分配到你所有的服务器上,自动部署、自动安装、自动运行。无需担心磁盘问题、CPU%20%20问题或系统问题。其他服务引擎问题会自动解决和迁移。不会有任何问题,而且会更容易管理。

11、docker改变了什么

%20以产品为导向:以产品交付为导向开发:简化环境搭建以测试为导向:多版本测试以运维为导向:环境一致性以架构为导向:自动扩展(微服务)

%20

二、docker架构

1、总体架构

%20

该发行版负责与Docker%20%20注册表交互并上传与v2%20注册表相关的总线映像和源数据。注册中心负责与Docker注册中心相关的身份认证、镜像搜索、镜像验证以及注册中心管理等工作。%20image负责镜像源数据相关的存储和检索。镜像tar包相关的索引、搜索、导入、导出操作会存储所有本地镜像的仓库和标签名,并维护映射关系。图层模块负责图像层和容器层的源数据,并将图像层的增删改查映射到图驱动模块,图驱动模块实际上存储图像层文件。%20Graghdriver是与容器镜像相关的所有操作的执行者。

2、docker架构2

%20如果你觉得上面的架构图有点混乱,可以看看下面的架构。

%20从上图可以很容易看出,用户使用Docker客户端与Docker守护进程建立通信,并向Docker守护进程发送请求。

作为Docker架构的关键部分,Docker守护进程首先提供服务器功能,以便它可以接受来自Docker客户端的请求。然后引擎在Docker%20%20内执行一系列任务。每项任务都是工作。

当作业执行过程中需要容器镜像时,从Docker注册中心下载镜像,当需要创建网络环境时,通过镜像管理驱动图驱动程序将下载的镜像以图的形式保存。%20Docker是通过网络管理驱动networkdriver创建的。另外,如果您需要限制Docker容器的执行资源或强制执行用户指令,请通过execdriver配置Docker容器的网络环境。

Libcontainer是一个独立的容器管理包。%20Networkdriver和execdriver使用libcontainer来实现对容器的某些操作。当执行运行容器的命令时,实际的Docker%20%20容器处于运行状态。容器具有独立的文件系统、独立且安全的操作环境等等。

3、docker架构3

%20让我们看看另一种架构。该架构简单明了地指定了服务器/客户端交互、容器、图像和数据之间的连接。

%20%20这个架构图让架构更加清晰

Docker%20%20daemon是docker的守护进程或者服务器端,与Docker客户端通过REST%20%20API进行通信。

docker%20%20cli%20%20用于管理容器和镜像。客户端提供只读镜像,通过该镜像可以创建多个容器。这些容器可以只是RFS(根文件系统)或包含用户应用程序的容器。使用RFS,容器专属于Docker%20%20客户端内的进程,并且这两个进程彼此不可见。

用户无法直接与服务器交互,但可以通过桥与容器交互,因此中间损失几乎可以忽略不计。

%20

三、docker架构2各个模块的功能(带完善)

%20主要模块有Docker客户端、Docker守护进程、Docker注册表、Graph、驱动程序、libcontainer和Docker容器。

1、docker%20%20client

%20docker客户端是docker架构中用户用来与docker%20%20daemon建立通信的客户端。您的可执行文件可以通过docker%20%20命令行工具发起许多容器管理请求。

Docker客户端可以通过三种方式与docker守护进程建立通信:tcp://host:port;fd://socketfd。Docker客户端可以通过设置命令行标志参数来设置传输层安全协议(TLS)相关参数并进行安全传输。

Docker客户端发送容器管理请求后,当Docker客户端收到返回的请求并继续处理时,Docker客户端的完整生命周期就结束了。要发送容器管理请求,用户必须使用docker%20%20可执行文件重新创建docker%20%20客户端。

2、docker%20%20daemon

%20docker%20%20daemon是驻留在docker架构后台的系统进程,其功能是接收并处理docker客户端发送的请求。守护进程在后台启动服务器,服务器负载接受Docker%20%20客户端发送的请求。服务器接受请求后,通过路由和分发调度找到相应的处理程序来执行该请求。

用于启动docker守护进程的可执行文件也是docker,运行docker命令时传递的参数区分了docker守护进程和docker客户端。

docker%20%20daemon架构可以分为docker服务器、引擎和作业。守护进程

3.Docker服务器

Docker%20%20服务器是Docker%20%20架构中专门为Docker%20%20客户端提供服务的服务器。服务器的功能是接受、调度和分发Docker客户端发送的请求。架构图如下:

%20%20Docker启动过程中,通过包Gorilla/mux(golang的类库解析)创建mux.Router,提供请求路由功能。在Golang%20%20中,gorilla/mux%20%20是一个强大的URL%20%20路由器和调度程序。%20mux.Router%20%20中添加了许多路由项。每个路由项由三部分组成:HTTP%20%20请求方法(PUT、POST、GET%20%20或DELETE)、URL%20%20和处理程序。

当Docker%20%20客户端通过HTTP%20%20访问Docker%20%20守护进程时,创建mux.Router%20%20后,Docker%20%20将服务器的监听地址和mux.Router%20%20作为参数,创建httpSrv=http.Server{},最后请求Run%20%20httpSrv.Serve()%20as%20%20Serve%20%20。

在服务器的服务过程中,服务器在监听器上接受Docker客户端的访问请求,并创建一个新的goroutine来处理请求。%20goroutine首先读取请求的内容,然后解析,找到对应的路由项,然后调用对应的handler来处理请求。最后,处理程序处理完请求后响应该请求。

请注意,Docker%20%20Server%20%20的执行是通过在Docker%20%20启动过程中执行一个名为“serveapi”的作业来完成的。原则上,运行Docker%20%20服务器是众多工作中的一项,但为了突出Docker%20%20服务器的重要性及其在服务后续工作中的关键功能,我们单独提取并分析“serveapi”工作,将其理解为Docker%20%20服务器。

4、engine

%20Engine是Docker架构中运行的引擎,也是Docker执行的核心模块。它充当Docker容器的存储仓库,并通过运行作业来管理这些容器。

Engine数据结构设计和实现过程包括handler对象。处理程序对象存储许多特定作业的处理程序处理访问权限。例如,Engine%20%20的处理程序对象之一是{"create"%20:%20daemon.ContainerCreate,}。这意味着daemon.ContainerCreate%20%20的处理程序将在名为“create”的作业运行时运行。

5、job

%20作业可以被视为Docker%20%20架构引擎内最基本的工作执行单元。%20Docker%20%20可以运行的任何作业都可以抽象为一个作业。例如,在容器内运行进程就是一项作业。创建新容器是一项工作。这包括为HTTP%20%20API%20%20创建服务器服务,如Docker%20%20服务器部分中所述。这也是工作等等。

作业设计者将该作业设计得类似于Unix%20%20进程。例如:一个作业包括名称、参数、环境变量、标准输入/输出、错误处理、返回状态等。

6、docker%20%20registry

%20DockerRegistry是存储容器镜像的仓库。创建容器时会加载容器镜像,并初始化容器的文件结构和目录。

Docker运行过程中,Docker守护进程与Docker注册中心进行通信,实现镜像搜索、镜像下载、镜像上传三个功能。这三个功能的作业名称分别是“Search”、“Pull”和“Push”。

其中,Docker架构允许Docker使用公共的Docker注册中心,俗称Docker%20%20Hub。因此,当Docker检索容器镜像文件时,也必须通过互联网访问Docker%20%20Hub。此外,用户还可以构建本地私有的Docker注册中心,保证容器镜像的检索在内网完成。

7、Graph

%20Graph负责维护下载的容器镜像,记录下载的容器镜像在Docker架构中的关系。%20Graph%20%20在存储带有版本信息的本地文件系统镜像的同时,还通过GraphDB%20%20记录所有文件系统镜像之间的关系。

该图的架构是:

=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720043489&x-signature=KDikFz2xQbkSgnZ6K4A8NLBwsas%3D"%20alt="1c725c4046da4993b0b9478de50fa74d~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720043489&x-signature=KDikFz2xQbkSgnZ6K4A8NLBwsas%3D"%20/>其中,GraphDB是一个构建在SQLite之上的小型图数据库,实现了节点的命名以及节点之间关联关系的记录。它仅仅实现了大多数图数据库所拥有的一个小的子集,但是提供了简单的接口表示节点之间的关系。 同时在Graph的本地目录中,关于每一个的容器镜像,具体存储的信息有:该容器镜像的元数据,容器镜像的大小信息,以及该容器镜像所代表的具体rootfs。 %20 8、driver Driver是Docker架构中的驱动模块。通过Driver驱动,Docker可以实现对Docker容器执行环境的定制。由于Docker运行的生命周期中,并非用户所有的操作都是针对Docker容器的管理,另外还有关于Docker运行信息的获取,Graph的存储与记录等。因此,为了将Docker容器的管理从Docker%20Daemon内部业务逻辑中区分开来,设计了Driver层驱动来接管所有这部分请求。 在Docker%20Driver的实现中,可以分为以下三类驱动:graphdriver、networkdriver和execdriver。 graphdriver主要用于完成容器镜像的管理,包括存储与获取。即当用户需要下载指定的容器镜像时,graphdriver将容器镜像存储在本地的指定目录;同时当用户需要使用指定的容器镜像来创建容器的rootfs时,graphdriver从本地镜像存储目录中获取指定的容器镜像。 在graphdriver的初始化过程之前,有4种文件系统或类文件系统在其内部注册,它们分别是aufs、btrfs、vfs和devmapper。而Docker在初始化之时,通过获取系统环境变量”DOCKER_DRIVER”来提取所使用driver的指定类型。而之后所有的graph操作,都使用该driver来执行。 graphdriver的架构如下: networkdriver的用途是完成Docker容器网络环境的配置,其中包括Docker启动时为Docker环境创建网桥;Docker容器创建时为其创建专属虚拟网卡设备;以及为Docker容器分配IP、端口并与宿主机做端口映射,设置容器防火墙策略等。networkdriver的架构如下: %20 execdriver作为Docker容器的执行驱动,负责创建容器运行命名空间,负责容器资源使用的统计与限制,负责容器内部进程的真正运行等。在execdriver的实现过程中,原先可以使用LXC驱动调用LXC的接口,来操纵容器的配置以及生命周期,而现在execdriver默认使用native驱动,不依赖于LXC。 具体体现在Daemon启动过程中加载的ExecDriverflag参数,该参数在配置文件已经被设为”native”。这可以认为是Docker在1.2版本上一个很大的改变,或者说Docker实现跨平台的一个先兆。execdriver架构如下:

9、libcontainer

libcontainer是Docker架构中一个使用Go语言设计实现的库,设计初衷是希望该库可以不依靠任何依赖,直接访问内核中与容器相关的API。 正是由于libcontainer的存在,Docker可以直接调用libcontainer,而最终操纵容器的namespace、cgroups、apparmor、网络设备以及防火墙规则等。这一系列操作的完成都不需要依赖LXC或者其他包。libcontainer架构如下: 另外,libcontainer提供了一整套标准的接口来满足上层对容器管理的需求。或者说,libcontainer屏蔽了Docker上层对容器的直接管理。又由于libcontainer使用Go这种跨平台的语言开发实现,且本身又可以被上层多种不同的编程语言访问,因此很难说,未来的Docker就一定会紧紧地和Linux捆绑在一起。而于此同时,Microsoft在其著名云计算平台Azure中,也添加了对Docker的支持,可见Docker的开放程度与业界的火热度。 暂不谈Docker,由于libcontainer的功能以及其本身与系统的松耦合特性,很有可能会在其他以容器为原型的平台出现,同时也很有可能催生出云计算领域全新的项目。

10、docker%20container

Docker%20container(Docker容器)是Docker架构中服务交付的最终体现形式。 Docker按照用户的需求与指令,订制相应的Docker容器: 用户通过指定容器镜像,使得Docker容器可以自定义rootfs等文件系统;用户通过指定计算资源的配额,使得Docker容器使用指定的计算资源;用户通过配置网络及其安全策略,使得Docker容器拥有独立且安全的网络环境;用户通过指定运行的命令,使得Docker容器执行指定的工作。  

四、docker简单使用

1、安装

yum%20install%20docker%20-y%20systemctl%20enable%20dockersystemctl%20start%20docker 注意:启动前应当设置源 vim%20/usr/lib/systemd/system/docker.service 这里设置阿里的,注册阿里云账户号每个用户都有: [root@web1%20~]#%20vim%20/usr/lib/systemd/system/docker.service[Unit]Description=Docker%20Application%20Container%20EngineDocumentation=http://docs.docker.comAfter=network.targetWants=docker-storage-setup.serviceRequires=docker-cleanup.timer[Service]Type=notifyNotifyAccess=mainEnvironmentFile=-/run/containers/registries.confEnvironmentFile=-/etc/sysconfig/dockerEnvironmentFile=-/etc/sysconfig/docker-storageEnvironmentFile=-/etc/sysconfig/docker-networkEnvironment=GOTRACEBACK=crashEnvironment=DOCKER_HTTP_HOST_COMPAT=1Environment=PATH=/usr/libexec/docker:/usr/bin:/usr/sbinExecStart=/usr/bin/dockerd-current%20--registry-mirror=https://rfcod7oz.mirror.aliyuncs.com%20#这个值可以登陆阿里云账号请参考下图%20--add-runtime%20docker-runc=/usr/libexec/docker/docker-runc-current%20--default-runtime=docker-runc%20--exec-opt%20native.cgroupdriver=systemd%20--userland-proxy-path=/usr/libexec/docker/docker-proxy-current%20--init-path=/usr/libexec/docker/docker-init-current%20--seccomp-profile=/etc/docker/seccomp.json%20$OPTIONS%20$DOCKER_STORAGE_OPTIONS%20$DOCKER_NETWORK_OPTIONS%20$ADD_REGISTRY%20$BLOCK_REGISTRY%20$INSECURE_REGISTRY%20$REGISTRIESExecReload=/bin/kill%20-s%20HUP%20$MAINPIDLimitNOFILE=1048576LimitNPROC=1048576LimitCORE=infinityTimeoutStartSec=0Restart=on-abnormalKillMode=process[Install]WantedBy=multi-user.target     2、docker版本查询 [root@web1%20~]#%20docker%20versionClient:%20Version:%201.13.1%20API%20version:%201.26%20Package%20version:%20docker-1.13.1-96.gitb2f74b2.el7.centos.x86_64%20Go%20version:%20go1.10.3%20Git%20commit:%20b2f74b2/1.13.1%20Built:%20Wed%20May%201%2014:55:20%202019%20OS/Arch:%20linux/amd64Server:%20Version:%201.13.1%20API%20version:%201.26%20(minimum%20version%201.12)%20Package%20version:%20docker-1.13.1-96.gitb2f74b2.el7.centos.x86_64%20Go%20version:%20go1.10.3%20Git%20commit:%20b2f74b2/1.13.1%20Built:%20Wed%20May%201%2014:55:20%202019%20OS/Arch:%20linux/amd64%20Experimental:%20false 3、搜索下载镜像 docker%20pull%20alpine          #下载镜像docker%20search%20nginx         %20#查看镜像docker%20pull%20nginx

4、查看已经下载的镜像

[root@web1%20~]#%20docker%20imagesREPOSITORY%20TAG%20IMAGE%20ID%20CREATED%20SIZEzxg/my_nginx%20v1%20b164f4c07c64%208%20days%20ago%20126%20MBzxg/my_nginx%20latest%20f07837869dfc%208%20days%20ago%20126%20MBdocker.io/nginx%20latest%20e445ab08b2be%202%20weeks%20ago%20126%20MBdocker.io/alpine%20latest%20b7b28af77ffe%203%20weeks%20ago%205.58%20MBdocker.io/centos%20latest%209f38484d220f%204%20months%20ago%20202%20MB[root@web1%20~]#

5、导出镜像

docker%20save%20nginx%20>/tmp/nginx.tar.gz

6、删除镜像

docker%20rmi%20-f%20nginx

7、导入镜像

docker%20load%20</tmp/nginx.tar.gz

8、默认配置文件

vim%20/usr/lib/systemd/system/docker.service%20 [Unit]Description=Docker%20Application%20Container%20EngineDocumentation=http://docs.docker.comAfter=network.targetWants=docker-storage-setup.serviceRequires=docker-cleanup.timer[Service]Type=notifyNotifyAccess=mainEnvironmentFile=-/run/containers/registries.confEnvironmentFile=-/etc/sysconfig/dockerEnvironmentFile=-/etc/sysconfig/docker-storageEnvironmentFile=-/etc/sysconfig/docker-networkEnvironment=GOTRACEBACK=crashEnvironment=DOCKER_HTTP_HOST_COMPAT=1Environment=PATH=/usr/libexec/docker:/usr/bin:/usr/sbinExecStart=/usr/bin/dockerd-current%20--registry-mirror=https://rfcod7oz.mirror.aliyuncs.com%20--add-runtime%20docker-runc=/usr/libexec/docker/docker-runc-current%20--default-runtime=docker-runc%20--exec-opt%20native.cgroupdriver=systemd%20--userland-proxy-path=/usr/libexec/docker/docker-proxy-current%20--init-path=/usr/libexec/docker/docker-init-current%20--seccomp-profile=/etc/docker/seccomp.json%20$OPTIONS%20$DOCKER_STORAGE_OPTIONS%20$DOCKER_NETWORK_OPTIONS%20$ADD_REGISTRY%20$BLOCK_REGISTRY%20$INSECURE_REGISTRY%20$REGISTRIESExecReload=/bin/kill%20-s%20HUP%20$MAINPIDLimitNOFILE=1048576LimitNPROC=1048576LimitCORE=infinityTimeoutStartSec=0Restart=on-abnormalKillMode=process[Install]WantedBy=multi-user.target~~~~ 如果更改存储目录就添加   --graph=/opt/docker 如果更改DNS——默认采用宿主机的dns --dns=xxxx的方式指定

9、运行hello%20world

这里用centos镜像echo一个hello%20word [root@web1%20overlay2]#%20docker%20imagesREPOSITORY%20TAG%20IMAGE%20ID%20CREATED%20SIZEzxg/my_nginx%20v1%20b164f4c07c64%208%20days%20ago%20126%20MBzxg/my_nginx%20latest%20f07837869dfc%208%20days%20ago%20126%20MBdocker.io/nginx%20latest%20e445ab08b2be%202%20weeks%20ago%20126%20MBdocker.io/alpine%20latest%20b7b28af77ffe%203%20weeks%20ago%205.58%20MBdocker.io/centos%20latest%209f38484d220f%204%20months%20ago%20202%20MB[root@web1%20overlay2]#%20docker%20run%20centos%20echo%20"hello%20world"hello%20world[root@web1%20overlay2]#

10、运行一个容器-run

[root@web1%20overlay2]#%20docker%20run%20-it%20alpine%20sh%20#运行并进入alpine/%20#/%20#/%20#/%20#/%20#/%20#%20lsbin%20etc%20lib%20mnt%20proc%20run%20srv%20tmp%20vardev%20home%20media%20opt%20root%20sbin%20sys%20usr/%20#%20cd%20tmp/tmp%20#%20exit 后台运行(-d后台运行)(--name添加一个名字) [root@web1%20overlay2]#%20docker%20run%20-it%20-d%20--name%20test1%20alpineac46c019b800d34c37d4f9dcd56c974cb82eca3acf185e5f8f80c8a60075e343[root@web1%20overlay2]#%20docker%20psCONTAINER%20ID%20IMAGE%20COMMAND%20CREATED%20STATUS%20PORTS%20NAMESac46c019b800%20alpine%20"/bin/sh"%205%20seconds%20ago%20Up%203%20seconds%20test1[root@web1%20overlay2]# 还有一种-rm参数,ctrl+c后就删除,可以测试环境用,生成环境用的少 [root@web1%20overlay2]#%20docker%20run%20-it%20--rm%20--name%20centos%20nginx^C[root@web1%20overlay2]###另开一个窗口[root@web1%20~]#%20docker%20psCONTAINER%20ID%20IMAGE%20COMMAND%20CREATED%20STATUS%20PORTS%20NAMES3397b96ea7bd%20nginx%20"nginx%20-g%20'daemon%20..."%2027%20seconds%20ago%20Up%2025%20seconds%2080/tcp%20centosac46c019b800%20alpine%20"/bin/sh"%204%20minutes%20ago%20Up%204%20minutes%20test1[root@web1%20~]#%20docker%20psCONTAINER%20ID%20IMAGE%20COMMAND%20CREATED%20STATUS%20PORTS%20NAMESac46c019b800%20alpine%20"/bin/sh"%204%20minutes%20ago%20Up%204%20minutes%20test1[root@web1%20~]#

11、如何进入容器

三种方法,上面已经演示了一种 第一种,需要容器本身的pid及util-linux,不推荐,暂时不演示了 第二种,不分配bash终端的一种实施操作,不推荐,这种操作如果在开一个窗口也能看到操作的指令,所有人都能看到。 [root@web1%20overlay2]#%20docker%20psCONTAINER%20ID%20IMAGE%20COMMAND%20CREATED%20STATUS%20PORTS%20NAMES9fc796e928d7%20nginx%20"sh"%202%20minutes%20ago%20Up%208%20seconds%2080/tcp%20mynginxac46c019b800%20alpine%20"/bin/sh"%2012%20minutes%20ago%20Up%2012%20minutes%20test1[root@web1%20overlay2]#%20docker%20attach%20mynginx#####%20lsbin%20boot%20dev%20etc%20home%20lib%20lib64%20media%20mnt%20opt%20proc%20root%20run%20sbin%20srv%20sys%20tmp%20usr%20var#%20exit  [root@web1%20overlay2]#%20docker%20attach%20mynginxYou%20cannot%20attach%20to%20a%20stopped%20container,%20start%20it%20first[root@web1%20overlay2]#%20docker%20psCONTAINER%20ID%20IMAGE%20COMMAND%20CREATED%20STATUS%20PORTS%20NAMESac46c019b800%20alpine%20"/bin/sh"%2013%20minutes%20ago%20Up%2013%20minutes%20test1[root@web1%20overlay2]# 第三种:exec方式,终端时分开的,推荐 [root@web1%20overlay2]#%20docker%20exec%20-it%20mynginx%20sh####%20lsbin%20boot%20dev%20etc%20home%20lib%20lib64%20media%20mnt%20opt%20proc%20root%20run%20sbin%20srv%20sys%20tmp%20usr%20var#%20exit[root@web1%20overlay2]#[root@web1%20overlay2]#[root@web1%20overlay2]#[root@web1%20overlay2]#%20docker%20padocker:%20'pa'%20is%20not%20a%20docker%20command.See%20'docker%20--help'[root@web1%20overlay2]#%20docker%20psCONTAINER%20ID%20IMAGE%20COMMAND%20CREATED%20STATUS%20PORTS%20NAMES6fc2d091cfe9%20nginx%20"nginx%20-g%20'daemon%20..."%2045%20seconds%20ago%20Up%2043%20seconds%2080/tcp%20mynginxac46c019b800%20alpine%20"/bin/sh"%2016%20minutes%20ago%20Up%2016%20minutes%20test1

12、查看docker进程及删除容器

上面已经演示: [root@web1%20overlay2]#%20docker%20psCONTAINER%20ID%20IMAGE%20COMMAND%20CREATED%20STATUS%20PORTS%20NAMES9fc796e928d7%20nginx%20"sh"%202%20minutes%20ago%20Up%208%20seconds%2080/tcp%20mynginxac46c019b800%20alpine%20"/bin/sh"%2012%20minutes%20ago%20Up%2012%20minutes%20test1 [root@web1%20overlay2]#%20docker%20ps%20-a%20      #-a%20:显示所有的容器,包括未运行的CONTAINER%20ID%20IMAGE%20COMMAND%20CREATED%20STATUS%20PORTS%20NAMES9fc796e928d7%20nginx%20"sh"%204%20minutes%20ago%20Exited%20(0)%20About%20a%20minute%20ago%20mynginxac46c019b800%20alpine%20"/bin/sh"%2015%20minutes%20ago%20Up%2015%20minutes%20test13bf234febeaa%20alpine%20"sh"%2017%20minutes%20ago%20Exited%20(0)%2016%20minutes%20ago%20youthful_lumiereab113c63f0b4%20centos%20"echo%20'hello%20world'"%2031%20minutes%20ago%20Exited%20(0)%2031%20minutes%20ago%20infallible_torvaldsb326027dcf42%20zxg/my_nginx%20"nginx"%208%20days%20ago%20Exited%20(0)%208%20days%20ago%20my_nginx4f1f1ca319f2%20centos%20"bash"%208%20days%20ago%20Exited%20(137)%208%20days%20ago%20musing_lichterman64b4e32991c7%20nginx%20"nginx%20-g%20'daemon%20..."%2012%20days%20ago%20Exited%20(0)%2012%20days%20ago%20mynginx1aee506fe7b5a%20alpine%20"sh"%2012%20days%20ago%20Created%20infallible_haibt70620c73b9a0%20alpine%20"sh"%2012%20days%20ago%20Created%20gallant_volhard7655cbf87bb0%20alpine%20"sh"%2012%20days%20ago%20Created%20agitated_brahmagupta33fb949372e8%20fce289e99eb9%20"/hello"%2012%20days%20ago%20Created%20elastic_dijkstra9de47616aea4%20fce289e99eb9%20"/hello"%2013%20days%20ago%20Created%20confident_fermi[root@web1%20overlay2]#%20docker%20rm%209fc796e928d7%20#rm时删除一个或多个容器9fc796e928d7

13、查看容器详细信息

并不需要进入到容器里面,通过查看详细信息看到了刚才运行的nginx,宿主机curl%20ip地址访问一下运行情况。 [root@web1%20overlay2]#%20docker%20inspect%20mynginx[%20{%20"Id":%20"6fc2d091cfe9b0484da3e70db842446bbdfeb7f5e5409c2e40ae21b99498d010",%20"Created":%20"2019-08-07T08:57:48.864538933Z",%20"Path":%20"nginx",%20"Args":%20[%20"-g",%20"daemon%20off;"],%20"State":%20{%20"Status":%20"running",%20"Running":%20true,%20"Paused":%20false,%20"Restarting":%20false,%20"OOMKilled":%20false,%20"Dead":%20false,%20"Pid":%20119948,%20"ExitCode":%200,%20"Error":%20"",%20"StartedAt":%20"2019-08-07T08:57:49.417992182Z",%20"FinishedAt":%20"0001-01-01T00:00:00Z"%20},%20"Image":%20"sha256:e445ab08b2be8b178655b714f89e5db9504f67defd5c7408a00bade679a50d44",%20"ResolvConfPath":%20"/var/lib/docker/containers/6fc2d091cfe9b0484da3e70db842446bbdfeb7f5e5409c2e40ae21b99498d010/resolv.conf",%20"HostnamePath":%20"/var/lib/docker/containers/6fc2d091cfe9b0484da3e70db842446bbdfeb7f5e5409c2e40ae21b99498d010/hostname",%20"HostsPath":%20"/var/lib/docker/containers/6fc2d091cfe9b0484da3e70db842446bbdfeb7f5e5409c2e40ae21b99498d010/hosts",%20"LogPath":%20"",%20"Name":%20"/mynginx",%20"RestartCount":%200,%20"Driver":%20"overlay2",%20"MountLabel":%20"",%20"ProcessLabel":%20"",%20"AppArmorProfile":%20"",%20"ExecIDs":%20null,%20"HostConfig":%20{%20"Binds":%20null,%20"ContainerIDFile":%20"",%20"LogConfig":%20{%20"Type":%20"journald",%20"Config":%20{}%20},%20"NetworkMode":%20"default",%20"PortBindings":%20{},%20"RestartPolicy":%20{%20"Name":%20"no",%20"MaximumRetryCount":%200%20},%20"AutoRemove":%20false,%20"VolumeDriver":%20"",%20"VolumesFrom":%20null,%20"CapAdd":%20null,%20"CapDrop":%20null,%20"Dns":%20[],%20"DnsOptions":%20[],%20"DnsSearch":%20[],%20"ExtraHosts":%20null,%20"GroupAdd":%20null,%20"IpcMode":%20"",%20"Cgroup":%20"",%20"Links":%20null,%20"OomScoreAdj":%200,%20"PidMode":%20"",%20"Privileged":%20false,%20"PublishAllPorts":%20false,%20"ReadonlyRootfs":%20false,%20"SecurityOpt":%20null,%20"UTSMode":%20"",%20"UsernsMode":%20"",%20"ShmSize":%2067108864,%20"Runtime":%20"docker-runc",%20"ConsoleSize":%20[%200,%200%20],%20"Isolation":%20"",%20"CpuShares":%200,%20"Memory":%200,%20"NanoCpus":%200,%20"CgroupParent":%20"",%20"BlkioWeight":%200,%20"BlkioWeightDevice":%20null,%20"BlkioDeviceReadBps":%20null,%20"BlkioDeviceWriteBps":%20null,%20"BlkioDeviceReadIOps":%20null,%20"BlkioDeviceWriteIOps":%20null,%20"CpuPeriod":%200,%20"CpuQuota":%200,%20"CpuRealtimePeriod":%200,%20"CpuRealtimeRuntime":%200,%20"CpusetCpus":%20"",%20"CpusetMems":%20"",%20"Devices":%20[],%20"DiskQuota":%200,%20"KernelMemory":%200,%20"MemoryReservation":%200,%20"MemorySwap":%200,%20"MemorySwappiness":%20-1,%20"OomKillDisable":%20false,%20"PidsLimit":%200,%20"Ulimits":%20null,%20"CpuCount":%200,%20"CpuPercent":%200,%20"IOMaximumIOps":%200,%20"IOMaximumBandwidth":%200%20},%20"GraphDriver":%20{%20"Name":%20"overlay2",%20"Data":%20{%20"LowerDir":%20"/var/lib/docker/overlay2/937140af0aee6c43f04c2d7b72e6b5451a44fef921417e8236d9fe01e9286c7a-init/diff:/var/lib/docker/overlay2/d8e95505fc3894eb30b48e4b0f48ab5e89d99c09a07c79c0b057c611621e31eb/diff:/var/lib/docker/overlay2/b2a6a25974bf17398b698a27208711574be3c69a2cd06658bbe838359f373a27/diff:/var/lib/docker/overlay2/d4610bc89b3ba8ad6ab30ea895fc3a06efff15db493d86ac9bc100e04abbab67/diff",%20"MergedDir":%20"/var/lib/docker/overlay2/937140af0aee6c43f04c2d7b72e6b5451a44fef921417e8236d9fe01e9286c7a/merged",%20"UpperDir":%20"/var/lib/docker/overlay2/937140af0aee6c43f04c2d7b72e6b5451a44fef921417e8236d9fe01e9286c7a/diff",%20"WorkDir":%20"/var/lib/docker/overlay2/937140af0aee6c43f04c2d7b72e6b5451a44fef921417e8236d9fe01e9286c7a/work"%20}%20},%20"Mounts":%20[],%20"Config":%20{%20"Hostname":%20"6fc2d091cfe9",%20"Domainname":%20"",%20"User":%20"",%20"AttachStdin":%20false,%20"AttachStdout":%20false,%20"AttachStderr":%20false,%20"ExposedPorts":%20{%20"80/tcp":%20{}%20},%20"Tty":%20true,%20"OpenStdin":%20true,%20"StdinOnce":%20false,%20"Env":%20[%20"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",%20"NGINX_VERSION=1.17.2",%20"NJS_VERSION=0.3.3",%20"PKG_RELEASE=1~buster"%20],%20"Cmd":%20[%20"nginx",%20"-g",%20"daemon%20off;"%20],%20"ArgsEscaped":%20true,%20"Image":%20"nginx",%20"Volumes":%20null,%20"WorkingDir":%20"",%20"Entrypoint":%20null,%20"OnBuild":%20null,%20"Labels":%20{%20"maintainer":%20"NGINX%20Docker%20Maintainers%20<docker-maint@nginx.com>"%20},%20"StopSignal":%20"SIGTERM"%20},%20"NetworkSettings":%20{%20"Bridge":%20"",%20"SandboxID":%20"3ece36008fbc5f3f46d3d251cf803c1478cc14032d74a36747e4ed8a115b81df",%20"HairpinMode":%20false,%20"LinkLocalIPv6Address":%20"",%20"LinkLocalIPv6PrefixLen":%200,%20"Ports":%20{%20"80/tcp":%20null%20},%20"SandboxKey":%20"/var/run/docker/netns/3ece36008fbc",%20"SecondaryIPAddresses":%20null,%20"SecondaryIPv6Addresses":%20null,%20"EndpointID":%20"898de81d97d54d2b60aeb6cc77ef1b4f9b481d1b72f542faa496494594024eac",%20"Gateway":%20"172.17.0.1",%20"GlobalIPv6Address":%20"",%20"GlobalIPv6PrefixLen":%200,%20"IPAddress":%20"172.17.0.3",%20      #看到ip地址%20"IPPrefixLen":%2016,%20"IPv6Gateway":%20"",%20"MacAddress":%20"02:42:ac:11:00:03",%20"Networks":%20{%20"bridge":%20{%20"IPAMConfig":%20null,%20"Links":%20null,%20"Aliases":%20null,%20"NetworkID":%20"2edae9131e77500a56d251b94ab2cdf0bc86f8df9f2453fa46bf4bab2f7be99f",%20"EndpointID":%20"898de81d97d54d2b60aeb6cc77ef1b4f9b481d1b72f542faa496494594024eac",%20"Gateway":%20"172.17.0.1",%20"IPAddress":%20"172.17.0.3",%20"IPPrefixLen":%2016,%20"IPv6Gateway":%20"",%20"GlobalIPv6Address":%20"",%20"GlobalIPv6PrefixLen":%200,%20"MacAddress":%20"02:42:ac:11:00:03"%20}%20}%20}%20}][root@web1%20overlay2]#%20curl%20172.17.0.1      #访问一下<!DOCTYPE%20html%20PUBLIC%20"-//W3C//DTD%20XHTML%201.1//EN"%20"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"><html%20xmlns="http://www.w3.org/1999/xhtml"%20xml:lang="en">%20<head>%20<title>Test%20Page%20for%20the%20Nginx%20HTTP%20Server%20on%20Fedora</title>%20<meta%20http-equiv="Content-Type"%20content="text/html;%20charset=UTF-8"%20/>%20<style%20type="text/css">%20/*<![CDATA[*/%20body%20{%20background-color:%20#fff;%20color:%20#000;%20font-size:%200.9em;%20font-family:%20sans-serif,helvetica;%20margin:%200;%20padding:%200;%20}%20:link%20{%20color:%20#c00;%20}%20:visited%20{%20color:%20#c00;%20}%20a:hover%20{%20color:%20#f50;%20}%20h1%20{%20text-align:%20center;%20margin:%200;%20padding:%200.6em%202em%200.4em;%20background-color:%20#294172;%20color:%20#fff;%20font-weight:%20normal;%20font-size:%201.75em;%20border-bottom:%202px%20solid%20#000;%20}%20h1%20strong%20{%20font-weight:%20bold;%20font-size:%201.5em;%20}%20h2%20{%20text-align:%20center;%20background-color:%20#3C6EB4;%20font-size:%201.1em;%20font-weight:%20bold;%20color:%20#fff;%20margin:%200;%20padding:%200.5em;%20border-bottom:%202px%20solid%20#294172;%20}%20hr%20{%20display:%20none;%20}%20.content%20{%20padding:%201em%205em;%20}%20.alert%20{%20border:%202px%20solid%20#000;%20}%20img%20{%20border:%202px%20solid%20#fff;%20padding:%202px;%20margin:%202px;%20}%20a:hover%20img%20{%20border:%202px%20solid%20#294172;%20}%20.logos%20{%20margin:%201em;%20text-align:%20center;%20}%20/*]]>*/%20</style>%20</head>%20<body>%20<h1>Welcome%20to%20<strong>nginx</strong>%20on%20Fedora!</h1>%20<div%20class="content">%20<p>This%20page%20is%20used%20to%20test%20the%20proper%20operation%20of%20the%20<strong>nginx</strong>%20HTTP%20server%20after%20it%20has%20been%20installed.%20If%20you%20can%20read%20this%20page,%20it%20means%20that%20the%20web%20server%20installed%20at%20this%20site%20is%20working%20properly.</p>%20<div%20class="alert">%20<h2>Website%20Administrator</h2>%20<div%20class="content">%20<p>This%20is%20the%20default%20<tt>index.html</tt>%20page%20that%20is%20distributed%20with%20<strong>nginx</strong>%20on%20Fedora.%20It%20is%20located%20in%20<tt>/usr/share/nginx/html</tt>.</p>%20<p>You%20should%20now%20put%20your%20content%20in%20a%20location%20of%20your%20choice%20and%20edit%20the%20<tt>root</tt>%20configuration%20directive%20in%20the%20<strong>nginx</strong>%20configuration%20file%20<tt>/etc/nginx/nginx.conf</tt>.</p>%20</div>%20</div>%20<div%20class="logos">%20<a%20href="http://nginx.net/"><img%20src="nginx-logo.png" alt="[ Powered by nginx ]" width="121" height="32" /></a> <a href="http://fedoraproject.org/"><img src="poweredby.png" alt="[ Powered by Fedora ]" width="88" height="31" /></a> </div> </div> </body></html>[root@web1 overlay2]#

14、查看日志

-f 挂起这个终端,动态查看日志 [root@web1 ~]# docker logs -f mynginx 参考文章: https://cloud.tencent.com/developer/article/1006116 https://yq.aliyun.com/articles/65145 https://blog.51cto.com/10085711/2068290 https://www.cnblogs.com/zuxing/articles/8717415.html 作者:乐章 来源:cnblogs.com/zhangxingeng/p/11236968.html - END - 239fbaae804f4861a91ebfd0883c13e1~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720043489&x-signature=gsqsIZZoJynyx2hXXwE9ifX3ofQ%3D●我 45 岁还写代码,怎么了? ●Linux 最常用命令整理,建议收藏! ●几个 BeanUtils 中的坑,千万别踩! ●不是我吹,Lambda这个坑你肯定不知道! ●你知道 Java 类是如何被加载的吗? Java架构师日记 d0c6dcac4ca6467b9143301b30742ffc~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720043489&x-signature=0bByXwn1XCCAVe0yjB9ArXSlzbQ%3D 扫描上面二维码发现更多精彩! 小贴士 返回 上一级 输入“基础” 等关键词获取相关资料推荐。 版权声明:本文转载于网络,版权归作者所有,如果侵权,请联系本站编辑删除

猜你喜欢