Docker 容器使用
Docker 客户端
docker 客户端非常简单 ,可以直接输入 docker 命令来查看到 Docker 客户端的所有命令选项
查看容器相关依赖容器
# docker ps -a
深入了解 Docker 命令
#docker command --help
例如要查看 docker stats 指令的具体使用方法:
# docker stats --help
运行一个web应用
用 docker 构建一个 web 应用程序
docker容器中运行一个 Python Flask 应用来运行一个web应用
# docker pull training/webapp # 载入镜像 # docker run -d -P training/webapp python app.py
参数说明:
-d:让容器在后台运行。
-P:将容器内部使用的网络端口映射到使用的主机上。
查看 WEB 应用容器
docker ps 查看正在运行的容器:
# docker ps CONTAINER ID IMAGE COMMAND ... PORTS d3d5e39ed9d3 training/webapp "python app.py" ... 0.0.0.0:32769->5000/tcp
PORTS 0.0.0.0:32769->5000/tcp
Docker 开放了 5000 端口(默认 Python Flask 端口)映射到主机端口 32769 上
这时可以通过浏览器访问WEB应用
可以通过 -p 参数来设置不一样的端口:
$ docker run -d -p 5000:5000 training/webapp python app.py
# docker ps CONTAINER ID IMAGE PORTS NAMES bf08b7f2cd89 training/webapp ... 0.0.0.0:5000->5000/tcp wizardly_chandrasekhar d3d5e39ed9d3 training/webapp ... 0.0.0.0:32769->5000/tcp xenodochial_hoov
容器内部的 5000 端口映射到本地主机的 5000 端口上
网络端口的快捷方式
docker ps 命令可以查看到容器的端口映射
docker 还提供了另一个快捷方式 docker port
docker port 查看指定 (ID 或者名字)容器的某个确定端口映射到宿主机的端口号
ID 为 bf08b7f2cd89 名字为 wizardly_chandrasekhar
可以用 docker port bf08b7f2cd89 或 docker port wizardly_chandrasekhar 来查看容器端口的映射情况
$ docker port bf08b7f2cd89 5000/tcp -> 0.0.0.0:5000
$ docker port wizardly_chandrasekhar 5000/tcp -> 0.0.0.0:5000
看 WEB 应用程序日志
docker logs [ID或者名字] 查看容器内部的标准输出
$ docker logs -f bf08b7f2cd89 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
-f: 让 docker logs 像使用 tail -f 一样来输出容器内部的标准输出。
应用程序使用的是 5000 端口并且能够查看到应用程序的访问日志
查WEB应用程序容器的进程
docker top 来查看容器内部运行的进程
$ docker top wizardly_chandrasekhar UID PID PPID ... TIME CMD root 23245 23228 ... 00:00:00 python app.py
检查 WEB 应用程序
docker inspect 查看 Docker 的底层信息
会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息。
facesoho@facesoho:~$ docker inspect wizardly_chandrasekhar
停止 WEB 应用容器
$ docker stop wizardly_chandrasekhar
重启WEB应用容器
docker start 来启动
$ docker start wizardly_chandrasekhar
docker ps -l 查询最后一次创建的容器:
# docker ps -l CONTAINER ID IMAGE PORTS NAMES bf08b7f2cd89 training/webapp ... 0.0.0.0:5000->5000/tcp wizardly_chandrasekhar
正在运行的容器,可以使用 docker restart 命令来重启
移除WEB应用容器
docker rm 命令来删除不需要的容器
$ docker rm wizardly_chandrasekhar
删除容器时容器必须是停止状态否则会报错
$ docker rm wizardly_chandrasekhar Error response from daemon: You cannot remove a running container bf08b7f2cd897b5964943134aa6d373e355c286db9b9885b1f60b6e8f82b2b85. Stop the container before attempting removal or force remove
大王叫我来巡山1998
docker 创建 WEB 应用容器 python flask
Docker 客户端
直接输入 docker 命令 查看 Docker 客户端 命令选项
~# docker
通过命令 docker command --help 了解指定的 Docker 命令使用方法
例如 查看 docker stats 指令
~# docker stats --help
运行一个web应用
在docker容器中运行 Python Flask 应用 运行一个web应用
# docker run -d -P training/webapp python app.py
参数
-d 让容器在后台运行
-P 将容器内部使用的网络端口映射到我们使用的主机上
# docker run -d -P training/webapp python app.py
使用 docker ps 来查看 正在运行的容器
$ docker ps
CONTAINER ID IMAGE COMMAND C
STATUS PORTS NAMES
78f25ddf3e5e training/webapp "python app.py" L
go Up 29 seconds 0.0.0.0:32769->5000/tcp facesoho
Docker 开放了 5000 端口(默认 Python Flask 端口)映射到主机端口 32769 上
可以通过浏览器访问WEB应用
可以指定 -p 标识来绑定指定端口
$ docker run -d -p 5000 5000 training/webapp python app.py
使用 Inspect 和 network ls 查看 看是否是与宿主机是一个IP
也可以用命令查看详情
# docker inspect 78f25ddf3e5e
$ docker inspect 78f25ddf3e5e
[{
"Id": "iamcontainerid",
"Created": "2019-06-23T02:36:10.867602229Z",
"Path": "python",
"Args": ["app.py" ],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 3827,
"ExitCode": 0,
"Error": "",
"StartedAt": "2019-06-23T02:36:15.740543346Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:6fae60ef344644649a39240b94d73b8ba9c67f898ede85cf8e947a887b3e6557",
"ResolvConfPath": "/mnt/sda1/var/lib/docker/containers/iamcontainerid/resolv.conf",
"HostnamePath": "/mnt/sda1/var/lib/docker/containers/iamcontainerid/hostname",
"HostsPath": "/mnt/sda1/var/lib/docker/containers/iamcontainerid/hosts",
"LogPath": "/mnt/sda1/var/lib/docker/containers/iamcontainerid/iamcontainerid-json.log",
"Name": "/facesoho",
"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": true,
"ReadonlyRootfs": false,
"SecurityOpt": null,
"UTSMode": "",
"UsernsMode": "",
"ShmSize": 67108864,
"Runtime": "runc",
"ConsoleSize": [
25,
80
],
"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,
"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": "/mnt/sda1/var/lib/docker/overlay2/bd6a6ae7eb150f14653482db53d963c0c13f5bb5a580de46ab64bfa41f815d3c-init/diff:/mnt/sda1/var/lib/docker/overlay2/bd4edb545385585b4af8d4feb4c6e890352066649a3ae25e3726c5e92ff77c1/diff:/mnt/sda1/var/lib/docker/overlay2/7dc6b634c571acc751066bc7d19a60573b229609f9060ad8269651dc4c392102/diff:/mnt/sda1/var/lib/docker/oerlay2/a5dee5a4228d115041053d6585214aeaaee1ea8b418756177a8dd6ddee502742/diff:/mnt/sda1/var/lib/docker/overlay2/eab74d9d693480ea2db05daea4ac5a49ab68f58b2ba9e37edde7c12936e55e2/diff:/mnt/sda1/var/lib/docker/overlay2/dee73f5bcb1d2c616f734eae70a8a25f26c28e6b1123405fd9cd7092fb897c66/diff:/mnt/sda1/var/lib/docker/overlay2/2b15b2467a6624ef1dd0f40e14f3533e321da16ff33501fdf96dc7f9160fa52/diff:/mnt/sda1/var/lib/docker/overlay2/74af237df6c3bd59b34f51be66aca90d0e759a3513c07ba1904dbc1e911fb942/diff:/mnt/sda1/var/lib/docker/verlay2/95fba65a0efb49a11570e42c56ecb84e134a631357d82adec4d220ffc33b77c6/diff:/mnt/sda1/var/lib/docker/overlay2/a27a54afcd6558d1f6b488f594436a40d7572ca5906a107d6b25bad33936b6a/diff:/mnt/sda1/var/lib/docker/overlay2/c7fc89c3fb9f7b2aa39b8a6d6076df0788ebfa11f945b522611a07a2235542ad/diff:/mnt/sda1/var/lib/docker/overlay2/229882acb225caec4e5c5b791ded480c1a9bcd5a10ee939301727d43fc36c85/diff:/mnt/sda1/var/lib/docker/overlay2/9dc3110a881d33bf5c253e5280910bcb87f18b75b959a9019ff9ea544383a3b7/diff:/mnt/sda1/var/lib/dockeroverlay2/6b62019304b64efe921bdd8c157c81ea842c07a99831f941fd601a8288d67f10/diff",
"MergedDir": "/mnt/sda1/var/lib/docker/overlay2/bd6a6ae7eb150f14653482db53d963c0c13f5bb5a580de46ab64bfa41f815d3c/merged", "UpperDir":"/mnt/sda1/var/lib/docker/overlay2/bd6a6ae7eb150f14653482db53d963c0c13f5bb5a580de46ab64bfa41f815d3c/diff", "WorkDir":"/mnt/sda1/var/lib/docker/overlay2/bd6a6ae7eb150f14653482db53d963c0c13f5bb5a580de46ab64bfa41f815d3c/work"
},
"Name": "overlay2"
},
"Mounts": [],
"Config": {
"Hostname": "78f25ddf3e5e",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"5000/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ],
"Cmd": [
"python",
"app.py"
],
"Image": "training/webapp",
"Volumes": null,
"WorkingDir": "/opt/webapp",
"Entrypoint": null,
"OnBuild": null,
"Labels": {}
},
"NetworkSettings": {
"Bridge": "",
"SandboxID": "189ab25e414f6216444fedf67454e2af58154312217aee7bcc1dc876214ac71f",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {
"5000/tcp": [{"HostIp": "0.0.0.0","HostPort": "32769"}
]
},
"SandboxKey": "/var/run/docker/netns/189ab25e414f",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "04c2ae0fb3a90743ee16db94768e1aefd524cc54b14d0b7d86fdde98bedb323b",
"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": "645a396201b4bb77813da346460bfd471c228b1078b0895353229ae73a5956bd",
"EndpointID": "04c2ae0fb3a90743ee16db94768e1aefd524cc54b14d0b7d86fdde98bedb323b",
"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
}
}
}
}
]
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
645a396201b4 bridge bridge local
e080f787ef30 host host local
f6f085729cd0 none null local
由此可以采用桥连接 与宿主机是一个IP 连接验证如下
网络端口的快捷方式
通过docker ps 命令可以查看到容器的端口映射 docker还提供了另一个快捷方式 docker port 可以查看指定 (ID或者名字)容器的某个确定端口映射到宿主机的端口号
上面 创建的web应用容器ID为 78f25ddf3e5e 名字为 facesoho
可以使用docker port 78f25ddf3e5e 或docker port facesoho来查看容器端口的映射情况
$ docker port 78f25ddf3e5e
5000/tcp -> 0.0.0.0 5000
$ docker port facesoho
5000/tcp -> 0.0.0.0 5000
查看WEB应用程序日志
docker logs [ID或者名字] 可以查看容器内部的标准输出
$ docker logs -f 78f25ddf3e5e
* Running on http //0.0.0.0 5000/ (Press CTRL+C to quit)
192.168.239.1 - - [09/May/2016 16 30 37] "GET / HTTP/1.1" 200 -
192.168.239.1 - - [09/May/2016 16 30 37] "GET /favicon.ico HTTP/1.1" 404 -
-f 表示实时输出
查看 内部运行的进程
$ docker top facesoho
停止WEB应用容器
$ docker stop facesoho
重启WEB应用容器
$ docker restart facesoho
$ docker start facesoho
facesoho
docker ps -l 查询最后一次创建的容器:
正在运行的容器 可以使用 docker restart 命令来重启
使用 docker rm 命令 删除不需要的容器
$ docker rm facesoho
facesoho
删除容器时 容器必须是停止状态 否则会报如下错误
$ docker rm facesoho
Error response from daemon You cannot remove a running container iamcontainerid. Stop the container before attempting removal or use -f