运行原理(Docker是怎么工作的)?
Docker是一个Client-Service结构的系统,Docker的守护进程结构运行在主机上。
通过Socket连接从客户端访问.。
当Docker Server收到Docker-client的指令,就会执行这个命令。
差不多长这个样子…
Docker为什么比VM快?
docker有着比虚拟机更少的抽象层。
docker利用的是宿主机的内核,vm需要时Guest OS。所以说docker不需要像虚拟机一样重新加载一个操作系统内核,避免引导性操作,虚拟机加载GuestOS是分钟级别的,而docker利用的是宿主机的操作系统,省略了这一段复杂的过程,所以快的多,基本是秒级的。
Docker命令
帮助命令
docker version # 显示docker版本信息
docker info # 显示docker系统信息,包括镜像和容器数量
docker 命令 --help # 无敌命令
官方文档地址:https://docs.docker.com/reference/
镜像命令
docker images
查看所有本地的主机上的镜像
docker images
REPOSITORY | TAG | IMAGE ID | CREATED | SIZE |
---|---|---|---|---|
镜像的仓库源 | 镜像标签 | 镜像id | 创建时间 | 大小 |
可选项
名称 | 释义 | 用法 |
---|---|---|
-a, --all | 列出所有镜像 | docker images -a 【显示所有镜像】 |
-f, --filter | 根据你给的条件过滤 | docker search mysql --filter=STARS=3000【过滤只显示点赞超过3000的mysql】 |
-q, – quiet | 只显示镜像id | docker images -q 【显示所有容器id】 |
docker search 搜索镜像
docker search
镜像名称
docker pull 下载镜像
他这个下载有点牛==>[联合文件系统],就是说 如果你之前下载过了以前的版本,现在下载一个其他版本,如果他们中间有一些文件是可共用的,他不会去下载可共用的哪些文件,而是去下载其他的文件。
docker pull 镜像名称:版本名称 举例 docker pull mysql:5.7
如果不指定版本默认下载最新的
这里有个注意点,。指定的版本必须的是官方存在的,不能瞎写.....
docker rmi -f 删除镜像
docker rmi -f 镜像id|镜像名称 删除单个镜像
docker rmi -f 镜像id 镜像id 镜像id 镜像id 删除多个镜像 中间用空格隔开
docker rmi -f $(docker images -aq) 删除所有镜像删除一个镜像【hello-world】
容器命令
前言:
得先有镜像才可以创建容器。这里我下在一个centos来写文章…
docker pull centos
我这里没有指定版本,他就自动下载最新得了。
新建容器并启动
1.docker run [可选参数] image
参数说明:
参数 | 说明 | 使用方法 |
---|---|---|
–name=“name” | 容器名字 区分容器如: tomcat01 tomcat02 | docker run --centos |
-d | 后台方式运行 | docker run -d centos |
-it | 使用交互方式运行,进入容器查看内容 | docker run -it centos /bin.bash |
-p | 指定容器得端口 -p8080:8080 | docker run -p8080:8080 |
-P | 随机指定端口 | docker run -P |
这里有一个坑
docker run -d 镜像名,当你容器后台运行的时候你前台必须得有一个进程,就是docker发现没有应用,就会自动停止。
nginx启动后发现自己没有服务,会立即自动停止。这样也是导致docker明明启动了,却又会自动停止得一个原因!!!
2.查看正在运行得容器
docker ps 列出当前正在运行得容器
参数说明:
参数 | 说明 | 使用方法 |
---|---|---|
-a | 列出当前正在运行得容器+带出历史运行过的容器 | docker ps -a |
-n=? | 显示最近创建过的容器 | ocker ps -a -n=1 |
-q | 只显示容器得编号 | docker ps -aq |
3.退出容器
exit
直接容器停止并退出
ctrl+p+q
不停止容器并退出
4.删除容器
docker rm 容器id 删除指定容器,不能删除正在运行得容器
docker rm -f $(docker ps -aq) 删除所有容器
docker ps -a -q|xagrs docker rm 删除所有容器
启动和停止容器
docker start 容器id 启动容器
docker restart 容器id 重启容器
docker stop 容器id 停止容器
docker kill 容器id 强制停止容器
常用其他命令
1.查看日志
docker logs -tr 镜像id # 显示所有日志
docker logs -f -t --tail 10 镜像id # 显示前十条日志
2.查看容器中得进程命令
docker top 容器id
3.查看镜像得元数据
docker inspect 容器id
[root@localhost ~]# docker inspect 6f152f6ddf90
[
{
"Id": "6f152f6ddf90fcc5edcfe0d65eb82db8eede95837e6eb11feb2c690122e37136",
"Created": "2021-07-24T16:00:00.635812865Z",
"Path": "/bin/bash",
"Args": [],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 14837,
"ExitCode": 0,
"Error": "",
"StartedAt": "2021-07-24T16:00:00.922854092Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:300e315adb2f96afe5f0b2780b87f28ae95231fe3bdd1e16b9ba606307728f55",
"ResolvConfPath": "/var/lib/docker/containers/6f152f6ddf90fcc5edcfe0d65eb82db8eede95837e6eb11feb2c690122e37136/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/6f152f6ddf90fcc5edcfe0d65eb82db8eede95837e6eb11feb2c690122e37136/hostname",
"HostsPath": "/var/lib/docker/containers/6f152f6ddf90fcc5edcfe0d65eb82db8eede95837e6eb11feb2c690122e37136/hosts",
"LogPath": "/var/lib/docker/containers/6f152f6ddf90fcc5edcfe0d65eb82db8eede95837e6eb11feb2c690122e37136/6f152f6ddf90fcc5edcfe0d65eb82db8eede95837e6eb11feb2c690122e37136-json.log",
"Name": "/pensive_minsky",
"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,
"Dns": [],
"DnsOptions": [],
"DnsSearch": [],
"ExtraHosts": null,
"GroupAdd": null,
"IpcMode": "shareable",
"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,
"DiskQuota": 0,
"KernelMemory": 0,
"MemoryReservation": 0,
"MemorySwap": 0,
"MemorySwappiness": null,
"OomKillDisable": false,
"PidsLimit": 0,
"Ulimits": null,
"CpuCount": 0,
"CpuPercent": 0,
"IOMaximumIOps": 0,
"IOMaximumBandwidth": 0
},
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/fc9fb10ada1992779ea8942c72f64e568a4c99327aaa3c28e648ef0b10cb07e5-init/diff:/var/lib/docker/overlay2/acba9e4a4877817013d47ef73f5edced9c404eb7ef3daab9e825be2ab9840e34/diff",
"MergedDir": "/var/lib/docker/overlay2/fc9fb10ada1992779ea8942c72f64e568a4c99327aaa3c28e648ef0b10cb07e5/merged",
"UpperDir": "/var/lib/docker/overlay2/fc9fb10ada1992779ea8942c72f64e568a4c99327aaa3c28e648ef0b10cb07e5/diff",
"WorkDir": "/var/lib/docker/overlay2/fc9fb10ada1992779ea8942c72f64e568a4c99327aaa3c28e648ef0b10cb07e5/work"
},
"Name": "overlay2"
},
"Mounts": [],
"Config": {
"Hostname": "6f152f6ddf90",
"Domainname": "",
"User": "",
"AttachStdin": true,
"AttachStdout": true,
"AttachStderr": true,
"Tty": true,
"OpenStdin": true,
"StdinOnce": true,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"/bin/bash"
],
"Image": "centos",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {
"org.label-schema.build-date": "20201204",
"org.label-schema.license": "GPLv2",
"org.label-schema.name": "CentOS Base Image",
"org.label-schema.schema-version": "1.0",
"org.label-schema.vendor": "CentOS"
}
},
"NetworkSettings": {
"Bridge": "",
"SandboxID": "3f700ed4cf3a2c9c37ef2d4f767f5b2f935febd129470ce80485581f3d163ea9",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {},
"SandboxKey": "/var/run/docker/netns/3f700ed4cf3a",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "59997188bb75e23e3d125dc5e136d2a4e0d3477d37d8c3a5603fbf569ba9e5c0",
"Gateway": "172.17.0.1",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "172.17.0.3",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"MacAddress": "02:42:ac:11:00:03",
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "a4401e76294f31d2d0e62934e0c56ff37d585c46f979cdf31a69104b98352a26",
"EndpointID": "59997188bb75e23e3d125dc5e136d2a4e0d3477d37d8c3a5603fbf569ba9e5c0",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.3",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:03",
"DriverOpts": null
}
}
}
}
]
4. 进入当前正在运行的容器
方式一:docker exec -it 容器id
: 用作与后台启动 从前台进入控制台!
方式二: docker attach 容器id
进入正在执行的终端
两者区别:
docker exec
进入容器开启一个新的终端,可以在里面操作。
docker attach
进入正在执行的终端, 不会开启新的进程。
5.从容器内拷贝文件到主机上
docker cp 容器id:/容器内路径 /目的主机路径