Window for Docker深入浅出
#### docker简介
docker是一个基于go语言实现的开源容器。
docker可以使项目的部署变得简单,只要服务器上也安装了docker,那么就不需要再在上面安装类似于tomcat,mysql,jdk这些软件,直接将docker镜像部署到服务器上的docker即可正常运行。
docker容器和虚拟机的比较
虚拟机是独立于本地操作系统的一个新的操作系统,占有自己独立的内存,cpu等本地资源,而且操作系统本身也消耗大量的系统资源。如果虚拟机数量越多,那么每个虚拟机所能分配的系统资源就会被减少。使用虚拟机的好处是能够在一台服务器上实现多个操作系统并行的工作,比如window安装了虚拟机软件vmware,上面可以同时运行ubuntu,centos,window7、8、10等不同类型和版本的操作系统。
docker容器不是一个新的虚拟机,它不会占用独立的系统资源,它运行在本地操作系统之上,多个docker容器共享本地操作系统的资源。docker容器不是虚拟机,所以同一台机器上的所有docker容器只适用于本地操作系统环境。使用docker的好处是,docker不会创建一个新的系统,所以一个docker容器占用的资源比虚拟机要低很多。而且多个docker是共享本地操作系统资源的,不会出现因容器资源不够需要重新调整的情况,因为docker容器直接用的就是本地操作系统的资源,并且多个docker容器共享这些资源,多个docker容器会自动协调处理。
Window下使用docker
我的window for docker版本如下
一般电脑默认安装的window家庭版,所以至少需要window专业版,因为需要window支持Hyper-V功能
如果必须用家庭版的话,就只能安装toolbox工具了,具体方法网上百度。
注册中心及配置国内镜像
Docker用Registry来保存用户构建的镜像。Registry分为公共和私有两种。Docker公司运营公共的Registry叫做Docker Hub。用户可以在Docker Hub注册账号,分享并保存自己的镜像(说明:在Docker Hub下载镜像巨慢,可以自己构建私有的Registry)。
Linux:修改/etc/docker/daemon.json
Window:修改%programdata%\docker\config\daemon.json
,在文件夹中直接输入%programdata%
就可以跳转到%programdata%
所指向的目录
在registry-mirrors
加上国内镜像地址https://docker.mirrors.ustc.edu.cn
,如果没有就创建
或者在docker可视化工具上面直接设置
我用的是网易源:http://hub-mirror.c.163.com
用了一会儿发现还是有问题,经常网络超时导致下载失败。后来发现阿里云上提供了镜像加速服务
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
加速器地址处提供了更加稳定高速的下载通道
docker镜像相关命令
docker镜像可以看作容器的模版,容器可以在镜像的基础上做任意修改而不会影响到镜像文件。如果想保留修改过后的容器配置,也可以再将容器备份成镜像文件来重复使用
-
docker images
:查看所有镜像可以看到,当前我没有安装任何镜像
REPOSITORY:镜像名称
TAG:版本号,因为docker可以安装多个不同版本的镜像,以此来区分
IMAGE ID:镜像id,全局唯一
CREATED:镜像创建时间
SIZE:镜像大小
-
docker search 镜像名
:镜像查找NAME:仓库名称
DESCRIPTION:镜像描述
STARS:用户评价,反应一个镜像的受欢迎程度
OFFICIAL:是否官方
AUTOMATED:自动构建,表示该镜像由Docker Hub自动构建流程创建的
-
docker pull 镜像名称
:从中央仓库中下载镜像到本地比如下载mysql,版本是5.7.28
-
docker rmi 镜像ID
:根据镜像id删除镜像,被删除的镜像不能被任意一个容器依赖
docker容器相关命令
-
docker run
:创建容器-i
:运行容器-t
:运行容器后并进入命令行,命令行退出时容器关闭,这是交互式运行容器-d
:后台运行容器,这是守护式运行容器--name
:为创建的容器命名-p
:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p
做多个端口映射-v
:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v
做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
(1)交互式方式创建容器
docker run -it --name=容器名称 镜像:版本 /bin/bash
不过在window上这样并没有直接进入容器命令行,需要启动容器之后,再用docker exec
命令进入
启动一个有centos镜像的容器
docker run -id --name=mycentos centos:7 /bin/bash
进入到centos系统容器的命令行
docker exec -it ebddc3d7ef1c /bin/bash
退出容器输入exit
(2)守护式方式创建容器
docker run -di --name=容器名称 镜像:版本
如果容器已被创建并且启动,则用docker exec 容器名称(或者容器ID)
命令再次声明容器是以交互式或者守护式启动
-
docker start 容器名称或id
:启动容器 -
docker stop 容器名称或id
:停止容器 -
docker ps
:查看正在运行的容器 -
docker ps –a
:查看所有容器 -
docker ps –l
:查看最后一次运行的容器 -
docker ps -f status=exited
:查看停止的容器 -
docker rm 容器名(容器id)
:删除容器
文件拷贝
-
docker cp 需要拷贝的文件或目录 容器名称:容器目录
:拷贝文件到容器中在桌面上创建一个文件
a.txt
:内容如下将本地文件拷贝到centos容器中,ebddc3d7ef1c是容器启动的id
docker cp .\a.txt ebddc3d7ef1c:/
查看centos容器,发现根目录多了a.txt文件
-
docker cp 容器名称:容器目录 需要拷贝的文件或目录
:拷贝容器文件到本地删除本地的a.txt文件,运行命令
docker cp ebddc3d7ef1c:/a.txt C:/Users/dagger/Desktop
目录挂载
在容器启动时,使用-v
将本地目录挂载到容器目录上,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器
docker run -di -v 本地目录:容器目录 --name=mycentos3 centos:7
如果报以下错误:Unhandled exception: Drive has not been shared
,则在window for docker上右击进入settings,在Resources -> FILE SHARING勾选要共享的盘符,然后apply
本地目录:
运行命令
docker run -di -v D:\Users\dagger\docker:/usr/local/myhtml233 --name=mycentos centos:7
进入centos容器,查看/usr/local/myhtml233目录
发现文件夹共享成功
查看容器信息
docker inspect 容器名(容器id)
[
{
"Id": "f8eb81b80dacb99c95c80d5203b9315d8088d283a74aa3324aa08a8970701447",
"Created": "2020-01-23T15:05:08.218933031Z",
"Path": "/bin/bash",
"Args": [],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 3941,
"ExitCode": 0,
"Error": "",
"StartedAt": "2020-01-23T15:05:08.69116933Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:5e35e350aded98340bc8fcb0ba392d809c807bc3eb5c618d4a0674d98d88bccd",
"ResolvConfPath": "/var/lib/docker/containers/f8eb81b80dacb99c95c80d5203b9315d8088d283a74aa3324aa08a8970701447/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/f8eb81b80dacb99c95c80d5203b9315d8088d283a74aa3324aa08a8970701447/hostname",
"HostsPath": "/var/lib/docker/containers/f8eb81b80dacb99c95c80d5203b9315d8088d283a74aa3324aa08a8970701447/hosts",
"LogPath": "/var/lib/docker/containers/f8eb81b80dacb99c95c80d5203b9315d8088d283a74aa3324aa08a8970701447/f8eb81b80dacb99c95c80d5203b9315d8088d283a74aa3324aa08a8970701447-json.log",
"Name": "/mycentos",
"RestartCount": 0,
"Driver": "overlay2",
"Platform": "linux",
"MountLabel": "",
"ProcessLabel": "",
"AppArmorProfile": "",
"ExecIDs": null,
"HostConfig": {
"Binds": [
"/host_mnt/d/Users/dagger/docker:/usr/local/myhtml233"
],
"ContainerIDFile": "",
"LogConfig": {
"Type": "json-file",
"Config": {}
},
"NetworkMode": "default",
"PortBindings": {},
"RestartPolicy": {
"Name": "no",
"MaximumRetryCount": 0
},
"AutoRemove": false,
"VolumeDriver": "",
"VolumesFrom": null,
"CapAdd": null,
"CapDrop": null,
"Capabilities": null,
"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": [
30,
98
],
"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/2ba91f7449cd21329222ff031dbf670babcc46eb1715d25854991447f8279a17-init/diff:/var/lib/docker/overlay2/b2189a3b36619b294ab99d2cf8f7a1ac6341f9cde9026af1cc064787df1294be/diff",
"MergedDir": "/var/lib/docker/overlay2/2ba91f7449cd21329222ff031dbf670babcc46eb1715d25854991447f8279a17/merged",
"UpperDir": "/var/lib/docker/overlay2/2ba91f7449cd21329222ff031dbf670babcc46eb1715d25854991447f8279a17/diff",
"WorkDir": "/var/lib/docker/overlay2/2ba91f7449cd21329222ff031dbf670babcc46eb1715d25854991447f8279a17/work"
},
"Name": "overlay2"
},
"Mounts": [
{
"Type": "bind",
"Source": "/host_mnt/d/Users/dagger/docker",
"Destination": "/usr/local/myhtml233",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
"Config": {
"Hostname": "f8eb81b80dac",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": true,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"/bin/bash"
],
"Image": "centos:7",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {
"org.label-schema.build-date": "20191001",
"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": "76994e52c7c0b37ee472ecff2e08d8354f7d7f8cf63f7b3d40b8e7b8a5c8984f",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {},
"SandboxKey": "/var/run/docker/netns/76994e52c7c0",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "f1d0e4e91ff76b7b194007f445a7105a9aa189921f11622fc721dc6caab9a0c3",
"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": "77e1860258ee30a2fb27db24dca139cf4853d7891e4895f61b419a4e438294b8",
"EndpointID": "f1d0e4e91ff76b7b194007f445a7105a9aa189921f11622fc721dc6caab9a0c3",
"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
}
}
}
}
]
获取指定信息,比如获取ip,外面一层引号,两边两个大括号,前面的.
不能少
docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名(容器id)