一、Docker入门
1.概念
Docker:Docker其实是一个虚拟机,主要是在应用在Linux和后台的虚拟机。
镜像:Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。Docker 镜像是用于创建 Docker 容器的模板,比如 Ubuntu 系统。
容器 :镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。容器是独立运行的一个或一组应用,是镜像运行时的实体。
tar文件:类似于vm使用时的vmdk文件,它可以将一个镜像直接保存成一个tar文件,然后这样给别人,别人通过load指令,重新加载成一个镜像,然后通过run指令就起来一个正在运行的虚拟机了(容器)。
dockerfile:是一个配置文件,很短的一个配置文件,通过写“如何构建”的步骤,来指定一个镜像是如何构建的,通过docker build指令可以将dockerfile构建成一个镜像。
仓库:这个仓库保存了很多镜像,包括一些共有的第三方已做好的镜像比如Ubuntu镜像nginx镜像MySQL镜像tomcat镜像,可以通过docker poll指令下载这些镜像到本地,也可以通过把自己的镜像通过push指令上传上去。Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。
一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。
通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。
Docker 客户端(Client):Docker 客户端通过命令行或者其他工具使用 Docker SDK (https://docs.docker.com/develop/sdk/) 与 Docker 的守护进程通信。
Docker 主机(Host):一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。
Docker Machine: Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。
2.命令
2.1.帮助命令
docker version # 显示docker的版本信息
docker info # 显示docker的系统信息,包括镜像和容器的数量
docker 命令 --help # 帮助命令
2.2.镜像命令
docker images 查看所有本地的主机上的镜像
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
rabbitmq latest df2459d4604b 6 days ago 220MB
redis latest aa4d65e670d6 9 days ago 105MB
# 解释
REPOSITORY #镜像的仓库源
TAG #镜像的标签
IMAGE ID #镜像的id
CREATED #镜像的创建时间
SIZE #镜像的大小
# 可选项
-a, --all #列出所有镜像
-q, --quiet #只显示镜像的id
docker search 搜索镜像
docker search mysql
NAME DESCRIPTION STARS TOMATED
mysql MySQL is a widely used, open-source relation… 11197
# 可选项,通过搜藏来过滤
--filter=STARTS=3000 # 搜索出来的镜像就是STARS大于3000的
docker pull 下载镜像
docker rmi 删除镜像
docker rmi -f 容器id # 删除指定的容器
docker rmi -f 容器id 容器id 容器id # 删除多个容器
docker rmi -f $(docker images -aq) # 删除全部的j
2.3.容器命令
说明:我们有了镜像才可以创建容器。
docker run [可选参数] image
# 参数说明
--name="Name" 容器名字 tomcat01 tomcat02
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口 -p 8080:8080
-p ip:主机端口:容器端口
-p 主机端口:容器端口
-p 容器端口
容器端口
-P 随机指定端口
#测试,启动并进入容器
docker run -it centos /bin/bash
#从容器中退回主机
exit
列出所有的运行容器
docker ps命令
-a #列出当前正在运行的容器+带出历史运行过的容器
-n=? #显示最近创建的容器
-q #只显示容器编号
退出容器
exit #直接容器停止并退出
Ctrl+P+Q #容器不停止退出
删除容器
docker rm 删除容器id #删除指定的容器,不能删除正在运行的容器,如果强制删除rm -f
docker rm -f $(docker ps -aq) #删除所有的容器
docker ps -a -q|xargs docker rm #删除所有的容器
启动和停止容器的操作
docker start 容器id #启动容器
docker restart 容器id #重启容器
docker stop 容器id #停止当前正在运行的容器
docker kill 容器id #强制停止当前容器
2.4.常用其他命令
#docker run -d 镜像名 #docker后台启动命令
docker logs -f -t --tail 条数 #查看具体数量日志
docker log -tf #查看所有日志
docker top 容器id #查看容器中进程的id
查看镜像的元数据
# 命令
docker inspect 容器id
# 测试
[root@iZuf6dgi189tnisr886j0iZ ~]# docker inspect 39b801acd1bd
[
{
"Id": "39b801acd1bd8ce6fdde0cbab88d9a5cf15259bcf2caa47569ebbba3178b0e91",
"Created": "2021-08-02T07:19:17.472066357Z",
"Path": "/docker-entrypoint.sh",
"Args": [
"nginx",
"-g",
"daemon off;"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 125228,
"ExitCode": 0,
"Error": "",
"StartedAt": "2021-08-02T07:19:17.972359875Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:08b152afcfae220e9709f00767054b824361c742ea03a9fe936271ba520a0a4b",
"ResolvConfPath": "/var/lib/docker/containers/39b801acd1bd8ce6fdde0cbab88d9a5cf15259bcf2caa47569ebbba3178b0e91/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/39b801acd1bd8ce6fdde0cbab88d9a5cf15259bcf2caa47569ebbba3178b0e91/hostname",
"HostsPath": "/var/lib/docker/containers/39b801acd1bd8ce6fdde0cbab88d9a5cf15259bcf2caa47569ebbba3178b0e91/hosts",
"LogPath": "/var/lib/docker/containers/39b801acd1bd8ce6fdde0cbab88d9a5cf15259bcf2caa47569ebbba3178b0e91/39b801acd1bd8ce6fdde0cbab88d9a5cf15259bcf2caa47569ebbba3178b0e91-json.log",
"Name": "/nginx-test",
"RestartCount": 0,
"Driver": "overlay2",
"Platform": "linux",
"MountLabel": "",
"ProcessLabel": "",
"AppArmorProfile": "",
"ExecIDs": null,
"HostConfig": {
"Binds": null,
"ContainerIDFile": "",
"LogConfig": {
"Type": "json-file",
"Config": {
}
},
"NetworkMode": "default",
"PortBindings": {
"80/tcp": [
{
"HostIp": "",
"HostPort": "8080"
}
]
},
"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/c794a802965e7d7a4f6ee4cbbaa629bcc79460cc44f1d5a307499700eeb9fa44-init/diff:/var/lib/docker/overlay2/fcdb6d02d1e7795e53358600535010beec119281e67def12567d47530e5f0d1e/diff:/var/lib/docker/overlay2/129889b28869a55932ad283a33fd5980ec1001a9c908aa008f690a8901868d3f/diff:/var/lib/docker/overlay2/277470174fb64c473e468f4d5ea6b118eea3bb6fc79dd318e7abcf8652caea80/diff:/var/lib/docker/overlay2/0e6f7d7858bb0be0806f7be5e898d39002d576219e5a0870be3c93ccea2fa589/diff:/var/lib/docker/overlay2/f082b1c89605747d00fd3d5965b75967b526c6aeb616c9efc9277966e4303934/diff:/var/lib/docker/overlay2/66ddb680b0700a454cb800b71844a55fd86c7a786e4b0405aa217294912e607d/diff",
"MergedDir": "/var/lib/docker/overlay2/c794a802965e7d7a4f6ee4cbbaa629bcc79460cc44f1d5a307499700eeb9fa44/merged",
"UpperDir": "/var/lib/docker/overlay2/c794a802965e7d7a4f6ee4cbbaa629bcc79460cc44f1d5a307499700eeb9fa44/diff",
"WorkDir": "/var/lib/docker/overlay2/c794a802965e7d7a4f6ee4cbbaa629bcc79460cc44f1d5a307499700eeb9fa44/work"
},
"Name": "overlay2"
},
"Mounts": [],
"Config": {
"Hostname": "39b801acd1bd",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"80/tcp": {
}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"NGINX_VERSION=1.21.1",
"NJS_VERSION=0.6.1",
"PKG_RELEASE=1~buster"
],
"Cmd": [
"nginx",
"-g",
"daemon off;"
],
"Image": "nginx",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": [
"/docker-entrypoint.sh"
],
"OnBuild": null,
"Labels": {
"maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"
},
"StopSignal": "SIGQUIT"
},
"NetworkSettings": {
"Bridge"