docker基础用法
文章目录
什么是 Docker
Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目。它基于 Google 公司推出的 Go 语言实现。项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议,项目代码在GitHub 上进行维护。
Docker 自开源后受到广泛的关注和讨论,以至于 dotCloud 公司后来都改名为 Docker Inc。Redhat 已经在其 RHEL6.5 中集中支持 Docker;Google 也在其 PaaS 产品中广泛应用。
Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。Docker 的基础是 Linux 容器(LXC)等技术。
在 LXC 的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单。
docker中的容器:
- lxc --> libcontainer --> runC
为什么要使用 Docker?
作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势。
首先,Docker 容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多。其次,Docker 对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器。
容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小。传统虚拟机方式运行 10 个不同的应用就要起 10 个虚拟机,而Docker 只需要启动 10 个隔离的应用即可。
具体说来,Docker 在如下几个方面具有较大的优势。
更高效的利用系统资源
由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker对系统资源的利用率更高,无论是应用执行速度,内存消耗以及文件存储速度,都要比传统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应用。
更快速的启动时间
传统的虚拟机技术启动应用服务往往需要数分钟,而Docker容器应用,由于直接运行与宿主内核,无序启动完整的操作系统,因此可以做到妙级,甚至毫秒级的启动时间,大大的节约了开发,测试,部署的时间。
一致的运行环境
开发过程中一个常见的问题是环境一致性问题,由于开发环境,测试环境,生产环境不一致,导致有些bug并未在开发过程中被发现,而Docker的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性。从而不会再出现(这段代码在我机器上运行没问题啊)zz这类问题。
持续交付和部署
对于开发和运维人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。
使用Docker可以通过定制应用镜像来实现持续集成,持续交付,部署。开发人员可以通过Dockerfile来进行镜像构建,并结合持续集成系统进行集成测试,而运维人员则可以在生产环境中快速部署该镜像,甚至结合持续部署系统进行自动部署
更轻松的迁移
由于Docker确保了执行环境的一致性,使得应用的迁移更加容易,Docker可以在很多平台上运行,无论是物理机,虚拟机,公有云,私有云,甚至是比较本,其运行结果是一致的,因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。
更轻松的维护和扩展
Docker使用的分层存数以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单,此外,Docker团队同各个开源项目团队一起维护了一大批高质量的官方镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。
更快速的交付和部署
对开发和运维(devop)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。
开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。Docker 可以快速创建容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。Docker 容器很轻很快!容器的启动时间是秒级的,大量地节约开发、测试、部署的时间。
更高效的虚拟化
Docker 容器的运行不需要额外的 hypervisor 支持,它是内核级的虚拟化,因此可以实现更高的性能和效率。
更轻松的迁移和扩展
Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个。
更简单的管理
使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理。
对比传统虚拟机总结
特性 | 容器 | 虚拟机 |
---|---|---|
启动 | 秒级 | 分钟级 |
硬盘使用 | 一般为 MB | 一般为 GB |
性能 | 接近原生 | 弱于 |
系统支持量 | 单机支持上千个容器 | 一般几十个 |
OCI(Open Container Initiative) & OCF (Open Container Format)
Linux基金会于2015年6月成立OCI(Open Container Initiative)组织,旨在围绕容器格式和运行时制定一个开放的工业化标准。
开放容器格式标准(OCF, Open Container Format)
容器格式标准
制定容器格式标准的宗旨概括来说就是不受上层结构的绑定,如特定的客户端、编排栈等,同时也不受特定的供应商或项目的绑定,即不限于某种特定操作系统、硬件、CPU架构、公有云等。
容器标准化宗旨
- 操作标准化:容器的标准化操作包括使用标准容器感觉创建、启动、停止容器,使用标准文件系统工具复制和创建容器快照,使用标准化网络工具进行下载和上传。
- 内容无关:内容无关指不管针对的具体容器内容是什么,容器标准操作执行后都能产生同样的效果。如容器可以用同样的方式上传、启动,不管是php应用还是mysql数据库服务。
- 基础设施无关:无论是个人的笔记本电脑还是AWS S3,亦或是Openstack,或者其他基础设施,都应该对支持容器的各项操作。
- 为自动化量身定制:制定容器统一标准,是的操作内容无关化、平台无关化的根本目的之一,就是为了可以使容器操作全平台自动化。
- 工业级交付:制定容器标准一大目标,就是使软件分发可以达到工业级交付成为现实。
容器标准包(bundle)和配置
一个标准的容器包, 具体包含下面三个部分:
- config.json : 基本配置文件, 包括与宿主机独立和应用相关的特定信息, 如安全权限,环境变量和参数等. 具体如下
- 容器格式版本
- rootfs 路径及是否只读
- 各类文件挂载点及相应容器内挂载目录(此处信息必须与 runtime.json 配置中保持一致.
- 初始化进程配置信息, 包括是否绑定终端, 运行可执行文件的工作目录,环境变量配置,可执行文件及执行参数,uid,gid 以及 额外需要加入的 gid,hostname,底层操作系统及 CPU 架构信息.
- runtime.json : 运行时配置文件, 包含运行时与主机相关的信息, 如内存限制,本地设备访问权限,挂载点等. 除了上述配置信息以外, 运行时配置文件还提供了 “钩子(hook)” 的特性, 这样可以在容器运行前和体制后各执行一些自定义脚本. hooks 的配置包含执行脚本路径,参数,环境变量等.
- rootfs : 根文件系统目录, 包含了容器执行所需的必要环境依赖. 如 /bin,/var,/dev,/usr 等目录及相应文件. rootfs 目录必须与包含配置信息的 config.json 文件同时存在容器目录最顶层.
容器运行时和生命周期
容器标准格式也要求 容器把自身运行时的状态持久化到磁盘中, 这样便于其他工具对此信息的使用和演绎. 该运行时状态已 JSON 格式编码存储. 推荐吧运行时状态的 json 文件保存在临时文件系统中, 以便于系统重启后自动移除.
基于 Linux 内核的操作系统, 该信息应该统一存储于 /run/opencontainer/containers 目录下, 该目录结构下已容器 ID 命名的文件夹(/run/opencontainer/containers//state.json)中存放容器的状态信息并实时更新.
state.json 文件中包含的具体信息如下:
1. 版本信息 : 存放 OCI 标准的具体版本号.
2. 容器ID : 通常是一个哈希值, 也可以是一个易读的字符串. 在 state.json 文件中加入容器ID是为了便于之前提到的运行时 hooks 只需载入 state.json 就可以定位到容器, 然后检测 state.json ,发现文件不见了就认为容器关闭, 然后执行响应预定义的脚本操作.
3. PID : 容器中运行的首个进程在宿主机上的进程号.
4. 容器文件目录 : 存放容器 rootfs 及响应配置的目录. 外部程序只需读取 state.json 即可定位到宿主机上的容器文件目录.
标准的容器生命周期有以下三个基本过程:
1. 容器创建 : 创建包括文件系统、namespaces、cgroups、用户权限在内的各项内容。
2. 容器进程启动 : 运行容器进程,进程的可执行文件定义在的config.json中,args项。
3. 容器暂停 : 容器实际上作为进程可以被外部程序关停(kill),然后容器标准规范应该包含对容器暂停信号的捕获,并做相应资源回收的处理,避免孤儿进程的出现。
基于 OCF 标准的具体实现.
容器运行时opencontainers/runc : docker 贡献的 runc项目,是后来者的参照标准。
虚拟机运行时hyperhq/runv : 基于Hypervisor技术的开放容器规范实现。
测试huawei-openlab/oct : 基于开放容器规范的测试框架。
docker架构
为什么镜像仓库名字是Registry而不是repository?在docker中仓库的名字是以应用的名称取名的。
镜像是静态的,而容器是动态的,容器有其生命周期,镜像与容器的关系类似于程序与进程的关系。镜像类似于文件系统中的程序文件,而容器则类似于将一个程序运行起来的状态,也即进程。所以容器是可以删除的,容器被删除后其镜像是不会被删除的。
docker工作原理
Docker在Linux系统镜像上创建容器。就像其他半虚拟化工具如Virtuozzo等,所有的实例基本上运行在主机系统的内核之上,但锁定在自己的运行时间环境中,与主机环境是隔离的。
当你启动或创建一个Docker容器时,只有容器内的激活进程运行时才能开始活动。如果开启一个daemonized进程,容器会立刻结束运行,因为该进程在前端不是激活状态。如果你在前端开启一个进程,容器能正常运行,直到该进程结束。这和其他的半虚拟化工具不同,其他的半虚拟化工具基本上在相同的主机上建立“正常的”虚拟服务器实例。即使前台进程未激活,这些实例也能正常运行。
Docker可以安装在大多数Linux发行版以及Mac OS X和Windows系统上。但后两者只能使用仿真虚拟机作为主机。
在大多数情况下,在主机上安装Docker运行时间是一个非常简单的过程,只需要多数Linux发行版上正常的安装包管理命令。在Docker网站上,你会发现大多数Linux发行版和云服务,以及Mac和Windows系统的非常完整的安装说明。
docker安装
[root@localhost ~]# vim /etc/yum.repos.d/docker-ce.repo
[root@localhost ~]# cat /etc/yum.repos.d/docker-ce.repo
[docker-ce]
name=docker-ce
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/8/x86_64/stable/
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
enabled=1
[root@localhost ~]# yum clean all
21 files removed
[root@localhost ~]# yum list all |grep docker
docker-ce 33 kB/s | 14 kB 00:00
containerd.io.x86_64 1.4.8-3.1.el8 docker-ce
docker-ce.x86_64 3:20.10.7-3.el8 docker-ce
docker-ce-cli.x86_64 1:20.10.7-3.el8 docker-ce
docker-ce-rootless-extras.x86_64 20.10.7-3.el8 docker-ce
docker-scan-plugin.x86_64 0.8.0-3.el8 docker-ce
pcp-pmda-docker.x86_64 5.3.1-3.el8 appstream
podman-docker.noarch 3.1.0-0.13.module_el8.5.0+733+9bb5dffa appstream
[root@localhost ~]# yum -y install docker-ce
#安装过程省略
[root@localhost ~]# systemctl enable --now docker
Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /usr/lib/systemd/system/docker.service.
[root@localhost ~]# ls /etc/docker/
key.json
docker加速
docker-ce的配置文件是/etc/docker/daemon.json,此文件默认不存在,需要我们手动创建并进行配置,而docker的加速就是通过配置此文件来实现的。
docker的加速有多种方式:
- docker cn
- 中国科技大学加速器
- 阿里云加速器(需要通过阿里云开发者平台注册帐号,免费使用个人私有的加速器)
这里作者使用的是阿里云加速器
复制加速器地址
[root@localhost ~]# vim /etc/docker/daemon.json
[root@localhost ~]# cat /etc/docker/daemon.json
{
"registry-mirrors": ["加速器地址"]
}
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl restart docker
[root@localhost ~]# docker info
Client:
Context: default
Debug Mode: false
Plugins:
app: Docker App (Docker Inc., v0.9.1-beta3)
buildx: Build with BuildKit (Docker Inc., v0.5.1-docker)
scan: Docker Scan (Docker Inc., v0.8.0)
Server:
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 20.10.7
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: 7eba5930496d9bbe375fdf71603e610ad737d2b2
runc version: v1.0.0-0-g84113ee
init version: de40ad0
Security Options:
seccomp
Profile: default
Kernel Version: 4.18.0-294.el8.x86_64
Operating System: CentOS Stream 8
OSType: linux
Architecture: x86_64
CPUs: 2
Total Memory: 3.623GiB
Name: localhost.localdomain
ID: UYTA:DAJB:XNJE:PRIC:KYIT:PER6:MM43:BLNV:FFCE:MBAT:JKAS:6BNX
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:
加速器地址
Live Restore Enabled: false
docker常用操作
命令 | 功能 |
---|---|
docker search | Search the Docker Hub for images(在Docker Hub中搜索镜像) |
docker pull | Pull an image or a repository from a registry(从注册表中提取镜像或存储库) |
docker images | List images(列出镜像) |
docker create | Create a new conntainer(创建一个新的容器) |
docker start | Start one or more stopped containers(启动一个或多个已停止的容器) |
docker run | Run a command in a new container(在新容器中运行命令) |
docker attach | Attach to a runninng container(进入到运行容器中,退出时容器停止运行) |
docker ps | List containers(列出容器) |
docker logs | Fetch the logs of a container(提取容器的日志) |
docker restart | Restart a container(重新启动容器) |
docker stop | Stop one or more running containers(停止一个或多个运行中的容器) |
docker kill | Kill one or more running containers(杀死一个或多个正在运行的容器) |
docker rm | Remove onne or more containers(取出一个或更多的容器) |
docker exec | Run a command in a running container(进入容器中) |
docker info | Display system-wide information(显示系统范围的信息) |
docker inspect | Return low-level information on Docker objects(返回有关Docker对象的低级信息) |
//搜索镜像
[root@localhost ~]# docker search busybox
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
busybox Busybox base image. 2300 [OK]
progrium/busybox 70 [OK]
radial/busyboxplus Full-chain, Internet enabled, busybox made f… 41 [OK]
yauritux/busybox-curl Busybox with CURL 16
arm32v7/busybox Busybox base image. 9
armhf/busybox Busybox base image. 6
odise/busybox-python 4 [OK]
odise/busybox-curl 4 [OK]
arm64v8/busybox Busybox base image. 3
aarch64/busybox Busybox base image. 2
prom/busybox Prometheus Busybox Docker base images 2 [OK]
i386/busybox Busybox base image. 2
s390x/busybox Busybox base image. 2
joeshaw/busybox-nonroot Busybox container with non-root user nobody 2
arm32v6/busybox Busybox base image. 2
p7ppc64/busybox Busybox base image for ppc64. 2
mips64le/busybox Busybox base image. 1
lqshow/busybox-curl Busybox image adds a curl binary to /usr/bin 1 [OK]
spotify/busybox Spotify fork of https://hub.docker.com/_/bus… 1
ppc64le/busybox Busybox base image. 1
vukomir/busybox busybox and curl 1
arm32v5/busybox Busybox base image. 0
amd64/busybox Busybox base image. 0
concourse/busyboxplus 0
sou856099/busybox 0
//拉取镜像
从Docker仓库下载镜像到本地,镜像名称格式为 名称:版本号,如果版本号不指定则是最新的版本。
[root@localhost ~]# docker pull httpd
Using default tag: latest
latest: Pulling from library/httpd
33847f680f63: Pull complete
d74938eee980: Pull complete
963cfdce5a0c: Pull complete
8d5a3cca778c: Pull complete
e06a573b193b: Pull complete
Digest: sha256:61e49dd08a51d6fc421ed257bd8eb461cf2d48269d9ab2b4ff5d4c69826c3c9c
Status: Downloaded newer image for httpd:latest
docker.io/library/httpd:latest
//查看镜像
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd latest 73b8cfec1155 5 days ago 138MB
[root@localhost ~]# docker images -q //显示镜像ID
73b8cfec1155
//创建容器
[root@localhost ~]# docker create httpd
7820393d101ead0ad5c8b84092fdc4c8981407ab19c2085c4b8b1c871670f21e
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd latest 73b8cfec1155 5 days ago 138MB
//查看所有容器
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7820393d101e httpd "httpd-foreground" 59 seconds ago Created kind_shamir
5b0e2cdeafc1 httpd "httpd-foreground" 3 minutes ago Created frosty_mirzakhani
//启动容器
[root@localhost ~]# docker start 7820393d101e
7820393d101e
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7820393d101e httpd "httpd-foreground" 4 minutes ago Up 51 seconds 80/tcp kind_shamir
//返回有关Docker对象的低级信息
[root@localhost ~]# docker inspect 7820393d101e
[
{
"Id": "7820393d101ead0ad5c8b84092fdc4c8981407ab19c2085c4b8b1c871670f21e",
"Created": "2021-07-27T13:25:28.494044423Z",
"Path": "httpd-foreground",
"Args": [],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 13266,
"ExitCode": 0,
"Error": "",
"StartedAt": "2021-07-27T13:29:30.039623988Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:73b8cfec11558fe86f565b4357f6d6c8560f4c49a5f15ae970a24da86c9adc93",
"ResolvConfPath": "/var/lib/docker/containers/7820393d101ead0ad5c8b84092fdc4c8981407ab19c2085c4b8b1c871670f21e/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/7820393d101ead0ad5c8b84092fdc4c8981407ab19c2085c4b8b1c871670f21e/hostname",
"HostsPath": "/var/lib/docker/containers/7820393d101ead0ad5c8b84092fdc4c8981407ab19c2085c4b8b1c871670f21e/hosts",
"LogPath": "/var/lib/docker/containers/7820393d101ead0ad5c8b84092fdc4c8981407ab19c2085c4b8b1c871670f21e/7820393d101ead0ad5c8b84092fdc4c8981407ab19c2085c4b8b1c871670f21e-json.log",
"Name": "/kind_shamir",
"RestartCount": 0,
"Driver": "overlay2",
"Platform": "linux",
"MountLabel": "",
"ProcessLabel": "",
"AppArmorProfile": "",
"ExecIDs": null,
"HostConfig": {
"Binds": null,
"ContainerIDFile": "",
"LogConfig": {
"Type": "json-file",
"Config": {}
},
"NetworkMode": "default",
"PortBindings": {},
"RestartPolicy": {
"Name": "no",
"MaximumRetryCount": 0
},
"AutoRemove": false,
"VolumeDriver": "",
"VolumesFrom": null,
"CapAdd": null,
"CapDrop": null,
"CgroupnsMode": "host",
"Dns": [],
"DnsOptions": [],
"DnsSearch": [],
"ExtraHosts": null,
"GroupAdd": null,
"IpcMode": "private",
"Cgroup": "",
"Links": null,
"OomScoreAdj": 0,
"PidMode": "",
"Privileged": false,
"PublishAllPorts": false,
"ReadonlyRootfs": false,
"SecurityOpt": null,
"UTSMode": "",
"UsernsMode": "",
"ShmSize": 67108864,
"Runtime": "runc",
"ConsoleSize": [
0,
0
],
"Isolation": "",
"CpuShares": 0,
"Memory": 0,
"NanoCpus": 0,
"CgroupParent": "",
"BlkioWeight": 0,
"BlkioWeightDevice": [],
"BlkioDeviceReadBps": null,
"BlkioDeviceWriteBps": null,
"BlkioDeviceReadIOps": null,
"BlkioDeviceWriteIOps": null,
"CpuPeriod": 0,
"CpuQuota": 0,
"CpuRealtimePeriod": 0,
"CpuRealtimeRuntime": 0,
"CpusetCpus": "",
"CpusetMems": "",
"Devices": [],
"DeviceCgroupRules": null,
"DeviceRequests": null,
"KernelMemory": 0,
"KernelMemoryTCP": 0,
"MemoryReservation": 0,
"MemorySwap": 0,
"MemorySwappiness": null,
"OomKillDisable": false,
"PidsLimit": null,
"Ulimits": null,
"CpuCount": 0,
"CpuPercent": 0,
"IOMaximumIOps": 0,
"IOMaximumBandwidth": 0,
"MaskedPaths": [
"/proc/asound",
"/proc/acpi",
"/proc/kcore",
"/proc/keys",
"/proc/latency_stats",
"/proc/timer_list",
"/proc/timer_stats",
"/proc/sched_debug",
"/proc/scsi",
"/sys/firmware"
],
"ReadonlyPaths": [
"/proc/bus",
"/proc/fs",
"/proc/irq",
"/proc/sys",
"/proc/sysrq-trigger"
]
},
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/c4ba6b2cd5b981546c6b0262b5d908efe0c84a41f29d7b9ec44de84b9609b59f-init/diff:/var/lib/docker/overlay2/cdd4959dd4fc9b8acb361193b64950146354298475a93d08606adb61aed10358/diff:/var/lib/docker/overlay2/990045c66fb5109528cdaa27a9381d5343804719b4af148091eb65e88c396ac7/diff:/var/lib/docker/overlay2/9700d2db53c49910be0d1e395ea4850b831089f2f654094d109046335fec6fdc/diff:/var/lib/docker/overlay2/24f99afae8efc3bc79364dd3343bc249f95a9e2361e29ff4106211d7d58ccf30/diff:/var/lib/docker/overlay2/cd9ff497a2072f68ad65544637b1bec127043f8f79d8793aaa7b89ef6033015a/diff",
"MergedDir": "/var/lib/docker/overlay2/c4ba6b2cd5b981546c6b0262b5d908efe0c84a41f29d7b9ec44de84b9609b59f/merged",
"UpperDir": "/var/lib/docker/overlay2/c4ba6b2cd5b981546c6b0262b5d908efe0c84a41f29d7b9ec44de84b9609b59f/diff",
"WorkDir": "/var/lib/docker/overlay2/c4ba6b2cd5b981546c6b0262b5d908efe0c84a41f29d7b9ec44de84b9609b59f/work"
},
"Name": "overlay2"
},
"Mounts": [],
"Config": {
"Hostname": "7820393d101e",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": true,
"AttachStderr": true,
"ExposedPorts": {
"80/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/apache2/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"HTTPD_PREFIX=/usr/local/apache2",
"HTTPD_VERSION=2.4.48",
"HTTPD_SHA256=1bc826e7b2e88108c7e4bf43c026636f77a41d849cfb667aa7b5c0b86dbf966c",
"HTTPD_PATCHES="
],
"Cmd": [
"httpd-foreground"
],
"Image": "httpd",
"Volumes": null,
"WorkingDir": "/usr/local/apache2",
"Entrypoint": null,
"OnBuild": null,
"Labels": {},
"StopSignal": "SIGWINCH"
},
"NetworkSettings": {
"Bridge": "",
"SandboxID": "c0234566cf7c18fd49a3351a5baa0000f898fa67d6e824cc591c3f240b353443",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {
"80/tcp": null
},
"SandboxKey": "/var/run/docker/netns/c0234566cf7c",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "47d128b13a97cd609d669ee6cb4506196c914997d2808cd2f8a34bd3b28050bf",
"Gateway": "172.17.0.1",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"MacAddress": "02:42:ac:11:00:02",
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "c88a3f1f0b5c871a291489ac2c1334ec3f6ee1ef5d94a022128667d40f387836",
"EndpointID": "47d128b13a97cd609d669ee6cb4506196c914997d2808cd2f8a34bd3b28050bf",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:02",
"DriverOpts": null
}
}
}
}
]
[root@localhost ~]# curl 172.17.0.2
<html><body><h1>It works!</h1></body></html>
//停止、启动、重启容器
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7820393d101e httpd "httpd-foreground" 15 minutes ago Up 11 minutes 80/tcp kind_shamir
[root@localhost ~]# docker stop 7820393d101e
7820393d101e
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@localhost ~]# docker start 7820393d101e
7820393d101e
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7820393d101e httpd "httpd-foreground" 16 minutes ago Up 1 second 80/tcp kind_shamir
[root@localhost ~]# docker restart 7820393d101e
7820393d101e
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7820393d101e httpd "httpd-foreground" 16 minutes ago Up 1 second 80/tcp kind_shamir
//删除镜像
[root@localhost ~]# docker images -q
73b8cfec1155
[root@localhost ~]# docker rmi 73b8cfec1155
Untagged: httpd:latest
Untagged: httpd@sha256:61e49dd08a51d6fc421ed257bd8eb461cf2d48269d9ab2b4ff5d4c69826c3c9c
Deleted: sha256:73b8cfec11558fe86f565b4357f6d6c8560f4c49a5f15ae970a24da86c9adc93
Deleted: sha256:8dfdbde7a5f7b804884b5e1140b66cc78155416621e63369044f370278171f2a
Deleted: sha256:c4d64464b597b3d82b3a3bdb91979a70a8db3c707d484e54420573b33300f58c
Deleted: sha256:75b62cbb47406663192fa84a9fc496c5b3dec3b2f489a01a073587af9218ca7d
Deleted: sha256:1a75986150c7f76dac53856bced40beed6b7642e1686f11286325765f0c3b00c
Deleted: sha256:814bff7343242acfd20a2c841e041dd57c50f0cf844d4abd2329f78b992197f4
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
//删除容器
如果容器是运行状态则删除失败,需要停止容器或使用-f选项才能删除
[root@localhost ~]# docker rm -f 7820393d101e
7820393d101e
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
//启动容器
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@localhost ~]# docker run -d httpd
47da84658a2c46b104aea49e2904619e99123abdb01258ca9965c48f12357ebe
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
47da84658a2c httpd "httpd-foreground" 3 seconds ago Up 2 seconds 80/tcp quizzical_johnson
//进入容器
参数:
-i 保持容器运行。通常与 -t 同时使用。加入it这两个参数后,容器创建后自动进入容器中,退出容器后,容器自动关闭。
-t 为容器重新分配一个伪输入终端,通常与 -i 同时使用。
-d 以守护(后台)模式运行容器。创建一个容器在后台运行,需要使用docker exec 进入容器。退出后,容器不会关闭。
-it 创建的容器一般称为交互式容器,-id 创建的容器一般称为守护式容器
–name 为创建的容器命名。
[root@localhost ~]# docker exec -it 47da84658a2c /bin/bash
root@47da84658a2c:/usr/local/apache2#
//退出容器,容器不会关闭
root@47da84658a2c:/usr/local/apache2# exit
exit
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
47da84658a2c httpd "httpd-foreground" 3 minutes ago Up 3 minutes 80/tcp quizzical_johnson
//获取容器日志
[root@localhost ~]# docker logs 47da84658a2c
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
[Tue Jul 27 13:47:36.517430 2021] [mpm_event:notice] [pid 1:tid 140148978943104] AH00489: Apache/2.4.48 (Unix) configured -- resuming normal operations
[Tue Jul 27 13:47:36.517646 2021] [core:notice] [pid 1:tid 140148978943104] AH00094: Command line: 'httpd -D FOREGROUND'
//查看容器信息
[root@localhost ~]# docker inspect 47da84658a2c
[
{
"Id": "47da84658a2c46b104aea49e2904619e99123abdb01258ca9965c48f12357ebe",
"Created": "2021-07-27T13:47:36.042761643Z",
"Path": "httpd-foreground",
"Args": [],
"State": {
......
//显示系统范围的信息
[root@localhost ~]# docker info
Client:
Context: default
Debug Mode: false
Plugins:
app: Docker App (Docker Inc., v0.9.1-beta3)
buildx: Build with BuildKit (Docker Inc., v0.5.1-docker)
scan: Docker Scan (Docker Inc., v0.8.0)
Server:
Containers: 4
Running: 1
Paused: 0
Stopped: 3
Images: 1
Server Version: 20.10.7
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: 7eba5930496d9bbe375fdf71603e610ad737d2b2
runc version: v1.0.0-0-g84113ee
init version: de40ad0
Security Options:
seccomp
Profile: default
Kernel Version: 4.18.0-294.el8.x86_64
Operating System: CentOS Stream 8
OSType: linux
Architecture: x86_64
CPUs: 2
Total Memory: 3.623GiB
Name: localhost.localdomain
ID: UYTA:DAJB:XNJE:PRIC:KYIT:PER6:MM43:BLNV:FFCE:MBAT:JKAS:6BNX
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://pu2s3wy2.mirror.aliyuncs.com/
Live Restore Enabled: false