Docker
Docker的发展简史
Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,它是基于 dotCloud 公司多年云服务技术的一次革新,并于 2013 年 3 月以 Apache 2.0 授权协议开源),主要项目代码在 GitHub 上进行维护。Docker 项目后来还加入了 Linux 基金会,并成立推动开放容器联盟。
Docker 自开源后受到广泛的关注和讨论,至今其 GitHub 项目已经超过 3 万 6 千个星标和一万多个 fork。甚至由于 Docker 项目的火爆,在 2013 年底,dotCloud 公司决定改名为 Docker。Docker 最初是在 Ubuntu 12.04 上开发实现的;Red Hat 则从 RHEL 6.5 开始对 Docker 进行支持;Google 也在其 PaaS 产品中广泛应用 Docker。
Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroup,namespace,以及 AUFS 类的 Union FS 等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。最初实现是基于 LXC,从 0.7 以后开始去除 LXC,转而使用自行开发的 libcontainer,从 1.11 开始,则进一步演进为使用 runC 和 containerd。
Docker 在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护。使得 Docker 技术比虚拟机技术更为轻便、快捷。
docker基本用法
docker架构:
Docker的基本架构由3个主要部分组成:
1.Docker Host
-
Docker Client
-
Registry

Docker使用客户端 - 服务器架构。守护程序docker daemon 负责构建,上传和运行您的Docker容器。
Docker客户端和守护程序可以在同一系统上运行,也可以将Docker客户端连接到远程Docker守护程序。Docker客户端和守护程序使用REST API,通过UNIX套接字或网络接口进行通信。
Docker主机
Docker主机运行docker daemon。Docker守护程序侦听Docker请求。
Docker请求可以是“docker run”,“docker build”,任何命令。
它管理docker对象,如镜像,容器,网络和卷。
Docker客户端
Docker Client用于触发Docker命令。当我们发送任何命令(docker build,docker run等)时,docker客户端会将这些命令结束到Docker守护进程,这将进一步处理它们。
注意:Docker客户端可以与多个守护程序通信。
Docker仓库
Registry是一个无状态,高度可扩展的服务器端应用程序,可存储并允许您分发Docker镜像。您可以创建自己的镜像,也可以使用公共仓库,即Docker Hub和Docker Cloud。Docker配置为默认在Docker Hub上查找镜像。
我们实际上可以创建自己的仓库。
因此,当我们运行命令docker pull或docker run时,将从配置的仓库中提取所需的映像。使用docker push命令时,映像将被推送到配置的仓库。
Docker对象
Docker镜像,容器,网络,卷,插件等是Docker对象。
在Dockerland,有图像,有容器。这两者密切相关,但截然不同。但这一切都始于Dockerfile。
一个Dockerfile是您创建镜像时,你建立的一个文件。它包含一堆指令,告知Docker如何构建Docker镜像。
你可以把它与烹饪联系起来。在烹饪中你有食谱。通过配方,您可以了解必须采取的所有步骤,以便生成您想要烹饪的任何内容。烹饪行为正在建立食谱。
Dockerfile是构建Docker镜像的配方或蓝图,运行单独的构建命令的行为会从配方生成Docker镜像。
Docker Images
一个镜像是一个惰性的,不可变的文件,它本质上是一个容器的快照。它只是一个模板,其中包含有关创建Docker容器的说明。
镜像存储在Docker仓库中,例如registry.hub.docker.com。因为它们可能变得非常大,所以镜像被设计为由其他镜像的层组成,允许在通过网络传输图像时发送最少量的数据。
Docker容器
要使用编程比喻,如果镜像是类,则容器是类的实例 - 运行时的对象。它们是运行应用程序的环境的轻量级和便携式封装。
您可以使用Docker API或CLI创建,启动,停止,移动或删除容器。您可以将容器连接到一个或多个网络,将存储连接到它,甚至可以根据其当前状态创建新映像。
Docker镜像仓库

镜像和容器
docker 镜像是一个只读的 docker 容器模板,含有启动 docker 容器所需的文件系统结构及其内容,因此是启动一个 docker 容器的基础。docker 镜像的文件内容以及一些运行 docker 容器的配置文件组成了 docker 容器的静态文件系统运行环境:rootfs。可以这么理解,docker 镜像是 docker 容器的静态视角,docker 容器是 docker 镜像的运行状态。我们可以通过下图来理解 docker daemon、docker 镜像以及 docker 容器三者的关系(此图来自互联网):

从上图中我们可以看到,当由 ubuntu:14.04 镜像启动容器时,ubuntu:14.04 镜像的镜像层内容将作为容器的 rootfs;而 ubuntu:14.04 镜像的 json 文件,会由 docker daemon 解析,并提取出其中的容器执行入口 CMD 信息,以及容器进程的环境变量 ENV 信息,最终初始化容器进程。当然,容器进程的执行入口来源于镜像提供的 rootfs。
rootfs
rootfs 是 docker 容器在启动时内部进程可见的文件系统,即 docker 容器的根目录。rootfs 通常包含一个操作系统运行所需的文件系统,例如可能包含典型的类 Unix 操作系统中的目录系统,如 /dev、/proc、/bin、/etc、/lib、/usr、/tmp 及运行 docker 容器所需的配置文件、工具等。
在传统的 Linux 操作系统内核启动时,首先挂载一个只读的 rootfs,当系统检测其完整性之后,再将其切换为读写模式。而在 docker 架构中,当 docker daemon 为 docker 容器挂载 rootfs 时,沿用了 Linux 内核启动时的做法,即将 rootfs 设为只读模式。在挂载完毕之后,利用联合挂载(union mount)技术在已有的只读 rootfs 上再挂载一个读写层。这样,可读写的层处于 docker 容器文件系统的最顶层,其下可能联合挂载了多个只读的层,只有在 docker 容器运行过程中文件系统发生变化时,才会把变化的文件内容写到可读写层,并隐藏只读层中的旧版本文件。
Docker 镜像的主要特点
为了更好的理解 docker 镜像的结构,下面介绍一下 docker 镜像设计上的关键技术。
分层
docker 镜像是采用分层的方式构建的,每个镜像都由一系列的 "镜像层" 组成。分层结构是 docker 镜像如此轻量的重要原因。当需要修改容器镜像内的某个文件时,只对处于最上方的读写层进行变动,不覆写下层已有文件系统的内容,已有文件在只读层中的原始版本仍然存在,但会被读写层中的新版本所隐藏。当使用 docker commit 提交这个修改过的容器文件系统为一个新的镜像时,保存的内容仅为最上层读写文件系统中被更新过的文件。分层达到了在不的容器同镜像之间共享镜像层的效果。
写时复制
docker 镜像使用了写时复制(copy-on-write)的策略,在多个容器之间共享镜像,每个容器在启动的时候并不需要单独复制一份镜像文件,而是将所有镜像层以只读的方式挂载到一个挂载点,再在上面覆盖一个可读写的容器层。在未更改文件内容时,所有容器共享同一份数据,只有在 docker 容器运行过程中文件系统发生变化时,才会把变化的文件内容写到可读写层,并隐藏只读层中的老版本文件。写时复制配合分层机制减少了镜像对磁盘空间的占用和容器启动时间。
内容寻址
在 docker 1.10 版本后,docker 镜像改动较大,其中最重要的特性便是引入了内容寻址存储(content-addressable storage) 的机制,根据文件的内容来索引镜像和镜像层。与之前版本对每个镜像层随机生成一个 UUID 不同,新模型对镜像层的内容计算校验和,生成一个内容哈希值,并以此哈希值代替之前的 UUID 作为镜像层的唯一标识。该机制主要提高了镜像的安全性,并在 pull、push、load 和 save 操作后检测数据的完整性。另外,基于内容哈希来索引镜像层,在一定程度上减少了 ID 的冲突并且增强了镜像层的共享。对于来自不同构建的镜像层,主要拥有相同的内容哈希,也能被不同的镜像共享。
联合挂载
通俗地讲,联合挂载技术可以在一个挂载点同时挂载多个文件系统,将挂载点的原目录与被挂载内容进行整合,使得最终可见的文件系统将会包含整合之后的各层的文件和目录。实现这种联合挂载技术的文件系统通常被称为联合文件系统(union filesystem)。以下图所示的运行 Ubuntu:14.04 镜像后的容器中的 aufs 文件系统为例:
由于初始挂载时读写层为空,所以从用户的角度看,该容器的文件系统与底层的 rootfs 没有差别;然而从内核的角度看,则是显式区分开来的两个层次。当需要修改镜像内的某个文件时,只对处于最上方的读写层进行了变动,不复写下层已有文件系统的内容,已有文件在只读层中的原始版本仍然存在,但会被读写层中的新版本文件所隐藏,当 docker commit 这个修改过的容器文件系统为一个新的镜像时,保存的内容仅为最上层读写文件系统中被更新过的文件。
联合挂载是用于将多个镜像层的文件系统挂载到一个挂载点来实现一个统一文件系统视图的途径,是下层存储驱动(aufs、overlay等) 实现分层合并的方式。所以严格来说,联合挂载并不是 docker 镜像的必需技术,比如在使用 device mapper 存储驱动时,其实是使用了快照技术来达到分层的效果。
Docker 镜像的存储组织方式
综合考虑镜像的层级结构,以及 volume、init-layer、可读写层这些概念,一个完整的、在运行的容器的所有文件系统结构可以用下图来描述:
从图中我们不难看到,除了 echo hello 进程所在的 cgroups 和 namespace 环境之外,容器文件系统其实是一个相对独立的组织。可读写部分(read-write layer 以及 volumes)、init-layer、只读层(read-only layer) 这 3 部分结构共同组成了一个容器所需的下层文件系统,它们通过联合挂载的方式巧妙地表现为一层,使得容器进程对这些层的存在一无所知。
Docker 镜像中的关键概念
registry
我们知道,每个 docker 容器都要依赖 docker 镜像。那么当我们第一次使用 docker run 命令启动一个容器时,是从哪里获取所需的镜像呢?答案是,如果是第一次基于某个镜像启动容器,且宿主机上并不存在所需的镜像,那么 docker 将从 registry 中下载该镜像并保存到宿主机。如果宿主机上存在该镜像,则直接使用宿主机上的镜像完成容器的启动。那么 registry 是什么呢?
registry 用以保存 docker 镜像,其中还包括镜像层次结构和关于镜像的元数据。可以将 registry 简单的想象成类似于 Git 仓库之类的实体。
用户可以在自己的数据中心搭建私有的 registry,也可以使用 docker 官方的公用 registry 服务,即 Docker Hub。它是由 Docker 公司维护的一个公共镜像库。Docker Hub 中有两种类型的仓库,即用户仓库(user repository) 与顶层仓库(top-level repository)。用户仓库由普通的 Docker Hub 用户创建,顶层仓库则由 Docker 公司负责维护,提供官方版本镜像。理论上,顶层仓库中的镜像经过 Docker 公司验证,被认为是架构良好且安全的。
repository
repository 由具有某个功能的 docker 镜像的所有迭代版本构成的镜像组。Registry 由一系列经过命名的 repository 组成,repository 通过命名规范对用户仓库和顶层仓库进行组织。所谓的顶层仓库,其其名称只包含仓库名,如:
而用户仓库的表示类似下面:
可以看出,用户仓库的名称多了 "用户名/" 部分。
比较容易让人困惑的地方在于,我们经常把 mysql 视为镜像的名称,其实 mysql 是 repository 的名称。repository 是一个镜像的集合,其中包含了多个不同版本的镜像,这些镜像之间使用标签进行版本区分,如 mysql:5.6、mysql:5.7 等,它们均属于 mysql 这个 repository。
简单来说,registry 是 repository 的集合,repository 是镜像的集合。
manifest
manifest(描述文件)主要存在于 registry 中作为 docker 镜像的元数据文件,在 pull、push、save 和 load 过程中作为镜像结构和基础信息的描述文件。在镜像被 pull 或者 load 到 docker 宿主机时,manifest 被转化为本地的镜像配置文件 config。在我们拉取镜像时显示的摘要(Digest):
就是对镜像的 manifest 内容计算 sha256sum 得到的。
image 和 layer
docker 内部的 image 概念是用来存储一组镜像相关的元数据信息,主要包括镜像的架构(如 amd64)、镜像默认配置信息、构建镜像的容器配置信息、包含所有镜像层信息的 rootfs。docker 利用 rootfs 中的 diff_id 计算出内容寻址的索引(chainID) 来获取 layer 相关信息,进而获取每一个镜像层的文件内容。
layer(镜像层) 是 docker 用来管理镜像层的一个中间概念。我们前面提到,镜像是由镜像层组成的,而单个镜像层可能被多个镜像共享,所以 docker 将 layer 与 image 的概念分离。docker 镜像管理中的 layer 主要存放了镜像层的 diff_id、size、cache-id 和 parent 等内容,实际的文件内容则是由存储驱动来管理,并可以通过 cache-id 在本地索引到。
Dockerfile
Dockerfile 是通过 docker build 命令构建 docker 镜像时用到的配置文件。它允许用户使用基本的 DSL 语法来定义 docker 镜像,其中的每一条指令描述一个构建镜像的步骤。
Docker引擎
Docker Engine是一个客户端 - 服务器应用程序,包含以下主要组件:
服务器,是一种长时间运行的程序,称为守护程序进程( dockerd命令)。
一个REST API,它指定程序可以用来与守护进程通信并指示它做什么的接口。
命令行界面(CLI)客户端(docker命令)。
CLI使用Docker REST API通过脚本或直接CLI命令控制Docker守护程序或与之交互。许多其他Docker应用程序使用底层API和CLI。
守护程序创建和管理Docker 对象,例如镜像,容器,网络和卷
安装docker
[root@localhost ~]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# ls
CentOS-Base.repo epel.repo epel-testing.repo
epel-modular.repo epel-testing-modular.repo
[root@localhost yum.repos.d]# curl -o docker-ce.repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 1919 100 1919 0 0 6527 0 --:--:-- --:--:-- --:--:-- 6527
[root@localhost yum.repos.d]# ls
CentOS-Base.repo epel-modular.repo epel-testing-modular.repo
docker-ce.repo epel.repo epel-testing.repo
[root@localhost yum.repos.d]# sed -i 's@https://download.docker.com@https://mirrors.tuna.tsinghua.edu.cn/docker-ce@g' docker-ce.repo
[root@localhost yum.repos.d]# yum -y install docker-ce --allowerasing
#等待安装
[root@localhost yum.repos.d]# systemctl start docker
[root@localhost yum.repos.d]# systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: dis>
Active: active (running) since Sat 2022-08-06 21:04:54 CST; 1s ago
Docs: https://docs.docker.com
Main PID: 3142 (dockerd)
Tasks: 9
Memory: 38.0M
CGroup: /system.slice/docker.service
└─3142 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.so>
[root@localhost yum.repos.d]# systemctl enable docker
Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /usr/lib/systemd/system/docker.service.
docker加速
docker-ce的配置文件是/etc/docker/daemon.json,此文件默认不存在,需要我们手动创建并进行配置,而docker的加速就是通过配置此文件来实现的。
docker的加速有多种方式:
- docker cn
- 中国科技大学加速器
- 阿里云加速器(需要通过阿里云开发者平台注册帐号,免费使用个人私有的加速器)



[root@localhost ~]# sudo mkdir -p /etc/docker
[root@localhost ~]# sudo tee /etc/docker/daemon.json <<-'EOF'
#输入自己的阿里云镜像加速器配置
[root@localhost ~]# sudo systemctl daemon-reload
[root@localhost ~]# sudo systemctl restart docker
docker常用操作
| 命令 | 功能 |
|---|---|
| docker search | 在 Docker 中心搜索映像 |
| docker pull | 从注册表中拉取映像或存储库 |
| docker images | 列出镜像 |
| docker create | 创建新的容器 |
| docker start | 启动一个或多个已停止的容器 |
| docker run | 在新容器中运行命令 |
| docker attach | (进入容器使用的命令,连接到正在运行的容器,只能在前端查看,不能退出) |
| docker ps | 列出容器列表,查看容器状态 |
| docker logs | 获取容器的日志 |
| docker restart | 重新启动容器 |
| docker stop | 停止一个或多个正在运行的容器 |
| docker kill | 杀死一个或多个正在运行的容器 |
| docker rm | 删除容器或更多容器 |
| docker exec | 进入容器使用的命令,在正在运行的容器中运行命令,查看一些精简信息,用exit退出 |
| docker info | 显示整个系统的信息 |
| docker inspect | 查看docker容器的详细信息 |
命令演示
#查看版本信息
[root@localhost ~]# docker version
Client: Docker Engine - Community
Version: 20.10.17
API version: 1.41
Go version: go1.17.11
Git commit: 100c701
Built: Mon Jun 6 23:03:11 2022
OS/Arch: linux/amd64
Context: default
Experimental: true
Server: Docker Engine - Community
Engine:
Version: 20.10.17
API version: 1.41 (minimum version 1.12)
Go version: go1.17.11
Git commit: a89b842
Built: Mon Jun 6 23:01:29 2022
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.6.6
GitCommit: 10c12954828e7c7c9b6e0ea9b0c02b01407d3ae1
runc:
Version: 1.1.2
GitCommit: v1.1.2-0-ga916309
docker-init:
Version: 0.19.0
GitCommit: de40ad0
#查看是否有加速器
[root@localhost ~]# docker info
Client:
Context: default
Debug Mode: false
Plugins:
app: Docker App (Docker Inc., v0.9.1-beta3)
buildx: Docker Buildx (Docker Inc., v0.8.2-docker)
scan: Docker Scan (Docker Inc., v0.17.0)
Server:
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 20.10.17
Storage Driver: overlay2
Backing Filesystem: xfs
Supports d_type: true
Native Overlay Diff: true
userxattr: false
Logging Driver: json-file
Cgroup Driver: cgroupfs
Cgroup Version: 1
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 10c12954828e7c7c9b6e0ea9b0c02b01407d3ae1
runc version: v1.1.2-0-ga916309
init version: de40ad0
Security Options:
seccomp
Profile: default
Kernel Version: 4.18.0-257.el8.x86_64
Operating System: CentOS Stream 8
OSType: linux
Architecture: x86_64
CPUs: 4
Total Memory: 7.559GiB
Name: localhost.localdomain
ID: TL7M:YMO5:T42H:PLM7:CW56:URSG:R4CH:KKPN:WVEU:VEPE:YTAD:GA4P
Docker Root Dir: /var/lib/docker
Debug Mode: false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Registry Mirrors: #这里是加速器配置有怎么配置成功
https://XXXXXXXXXX.XXXXXXX.XXXXXX.XXXX/
Live Restore Enabled: false
[root@localhost ~]#
#搜索镜像
[root@localhost ~]# docker search httpd
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
httpd The Apache HTTP Server Project 4109 [OK]
centos/httpd-24-centos7 Platform for running Apache httpd 2.4 or bui… 44
centos/httpd 35 [OK]
clearlinux/httpd httpd HyperText Transfer Protocol (HTTP) ser… 2
hypoport/httpd-cgi httpd-cgi 2 [OK]
solsson/httpd-openidc mod_auth_openidc on official httpd image, ve… 2 [OK]
dockerpinata/httpd 1
nnasaki/httpd-ssi SSI enabled Apache 2.4 on Alpine Linux 1
lead4good/httpd-fpm httpd server which connects via fcgi proxy h… 1 [OK]
inanimate/httpd-ssl A play container with httpd, ssl enabled, an… 1 [OK]
publici/httpd httpd:latest 1 [OK]
dariko/httpd-rproxy-ldap Apache httpd reverse proxy with LDAP authent… 1 [OK]
manageiq/httpd Container with httpd, built on CentOS for Ma… 1 [OK]
centos/httpd-24-centos8 1
manasip/httpd 0
patrickha/httpd-err 0
amd64/httpd The Apache HTTP Server Project 0
manageiq/httpd_configmap_generator Httpd Configmap Generator 0 [OK]
httpdss/archerysec ArcherySec repository 0 [OK]
paketobuildpacks/httpd 0
httpdocker/kubia 0
e2eteam/httpd 0
sandeep1988/httpd-new httpd-new 0
19022021/httpd-connection_test This httpd image will test the connectivity … 0
sherazahmedvaival/httpd-php-fpm74 0
[root@localhost ~]#
#拉取httpd这个容器容器
[root@localhost ~]# docker pull httpd
Using default tag: latest
latest: Pulling from library/httpd
a2abf6c4d29d: Pull complete
dcc4698797c8: Pull complete
41c22baa66ec: Pull complete
67283bbdd4a0: Pull complete
d982c879c57e: Pull complete
Digest: sha256:0954cc1af252d824860b2c5dc0a10720af2b7a3d3435581ca788dff8480c7b32
Status: Downloaded newer image for httpd:latest
docker.io/library/httpd:latest
[root@localhost ~]#
#查看拉取的镜像
# 解释
REPOSITORY # 镜像仓库源
TAG # 镜像的标签
IMAGE ID # 镜像的ID
CREATED # 镜像的创建时间
SIZE # 镜像的大小
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd latest dabbfbe0c57b 7 months ago 144MB
[root@localhost ~]#
#在新容器中运行命令
#这就是运行docker镜像并获得一个容器,该容器内就部署了apache的web服务,
#此时运行该容器,就可以使用nettools里的netstat来查看80端口是否开放,
#然后可以直接在外部浏览器里运行ip地址或域名。
[root@localhost ~]# docker run -p 80:80 --name demo -d httpd
2ae8acaa6ce0a58f272c626a5863fdb6740fd08e076f9a3a422e8c0c4c7f74d0
[root@localhost ~]#
#进行访问会出现网页编辑内容,也可以自己创建web网页进行访问
[root@localhost ~]# curl 192.168.141.135
<html><body><h1>It works!</h1></body></html>
[root@localhost ~]#
#列出容器运行状态
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2ae8acaa6ce0 httpd "httpd-foreground" 10 minutes ago Up 10 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp demo
[root@localhost ~]#
#停止容器
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2ae8acaa6ce0 httpd "httpd-foreground" 10 minutes ago Up 10 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp demo
#使用ID停止运行的容器
[root@localhost ~]# docker stop 2ae8acaa6ce0
2ae8acaa6ce0
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@localhost ~]#
#后台启动docker,参数是 -d
#问题:docker 容器使用后台运行,用docker ps 查看的时候 发现停止了
#原因:后台运行,docker发现前台没有,容器启动后,发现自己没有提供服务,会立刻停止
#查看日志
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c302aecd8ea5 httpd "httpd-foreground" 37 seconds ago Up 36 seconds 80/tcp musing_poincare
[root@localhost ~]# docker logs c302aecd8ea5
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
[Sat Aug 06 16:26:05.589071 2022] [mpm_event:notice] [pid 1:tid 139690166902080] AH00489: Apache/2.4.52 (Unix) configured -- resuming normal operations
[Sat Aug 06 16:26:05.589147 2022] [core:notice] [pid 1:tid 139690166902080] AH00094: Command line: 'httpd -D FOREGROUND'
[root@localhost ~]#
#重启容器
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c302aecd8ea5 httpd "httpd-foreground" 2 minutes ago Up 2 minutes 80/tcp musing_poincare
[root@localhost ~]# docker restart c302aecd8ea5
c302aecd8ea5
[root@localhost ~]#
#杀死运行的容器
[root@localhost ~]# docker kill c302aecd8ea5
c302aecd8ea5
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@localhost ~]#
[root@localhost ~]# docker inspect httpd
[
{
"Id": "sha256:dabbfbe0c57b6e5cd4bc089818d3f664acfad496dc741c9a501e72d15e803b34",
"RepoTags": [
"httpd:latest"
],
"RepoDigests": [
"httpd@sha256:0954cc1af252d824860b2c5dc0a10720af2b7a3d3435581ca788dff8480c7b32"
],
"Parent": "",
"Comment": "",
"Created": "2021-12-21T01:36:12.729599368Z",
"Container": "2e3825874c832964f871068b149d74ac708e0968257683b2177adc127faf9b4e",
"ContainerConfig": {
"Hostname": "2e3825874c83",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"80/tcp": {}
},
.....
docker event state


浙公网安备 33010602011771号