Docker 容器使用
Docker 客户端
docker 客户端非常简单 ,我们可以直接输入 docker 命令来查看到 Docker 客户端的所有命令选项。
edualiyun@edualiyun:~# docker
可以通过命令 docker command --help 更深入的了解指定的 Docker 命令使用方法。
例如我们要查看 docker stats 指令的具体使用方法:
edualiyun@edualiyun:~# docker stats --help
我的实验过程:
[root@localhost ~]# docker
[root@localhost ~]# docker stats --help
运行一个web应用
前面我们运行的容器并没有一些什么特别的用处。
接下来让我们尝试使用 docker 构建一个 web 应用程序。
我们将在docker容器中运行一个 Python Flask 应用来运行一个web应用。
edualiyun@edualiyun:~# docker run -d -P training/webapp python app.py
参数说明:
-d:让容器在后台运行。
-P:将容器内部使用的网络端口映射到我们使用的主机上。
我的实验过程:
[root@localhost ~]# docker run -d -P training/webapp python app.py
查看 WEB 应用容器
使用 docker ps 来查看我们正在运行的容器
edualiyun@edualiyun:~$ docker ps
这里多了端口信息。
PORTS0.0.0.0:32769->5000/tcp
Docker 开放了 5000 端口(默认 Python Flask 端口)映射到主机端口 32769 上。
这时我们可以通过浏览器访问WEB应用
我们也可以指定 -p 标识来绑定指定端口
edualiyun@edualiyun:~$ docker run -d -p 5000:5000 training/webapp python app.py
docker ps查看正在运行的容器
容器内部的 5000 端口映射到我们本地主机的 5000 端口上。
我的实验过程:
[root@localhost ~]# docker ps
网络端口的快捷方式
通过docker ps 命令可以查看到容器的端口映射,docker还提供了另一个快捷方式:docker port,使用 docker port 可以查看指定 (ID或者名字)容器的某个确定端口映射到宿主机的端口号。
上面我们创建的web应用容器ID为:7a38a1ad55c6 名字为:determined_swanson
我可以使用docker port 7a38a1ad55c6 或docker port determined_swanson来查看容器端口的映射情况
edualiyun@edualiyun:~$ docker port 7a38a1ad55c65000/tcp -> 0.0.0.0:5000
edualiyun@edualiyun:~$ docker port determined_swanson5000/tcp -> 0.0.0.0:5000
我的实验过程:
[root@localhost ~]# docker ps
[root@localhost ~]# docker port 70ae41e0b1bf
5000/tcp -> 0.0.0.0:32768
[root@localhost ~]# docker port hopeful_lovelace
5000/tcp -> 0.0.0.0:32768
[root@localhost ~]#
查看WEB应用程序日志
docker logs [ID或者名字] 可以查看容器内部的标准输出。
edualiyun@edualiyun:~$ docker logs -f 7a38a1ad55c6 * 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:让 dokcer logs 像使用 tail -f 一样来输出容器内部的标准输出。
从上面,我们可以看到应用程序使用的是 5000 端口并且能够查看到应用程序的访问日志。
我的实验过程:
[root@localhost ~]# docker logs -f 70ae41e0b1bf
- Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
192.168.59.1 - - [22/Jan/2019 11:14:52] “GET / HTTP/1.1” 200 -
192.168.59.1 - - [22/Jan/2019 11:14:52] “GET /favicon.ico HTTP/1.1” 404 -
查看WEB应用程序容器的进程
我们还可以使用 docker top 来查看容器内部运行的进程
edualiyun@edualiyun:~$ docker top determined_swanson
我的实验过程:
[root@localhost ~]# docker top hopeful_lovelace
检查WEB应用程序
使用 docker inspect 来查看Docker的底层信息。它会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息。
edualiyun@edualiyun:~$ docker inspect determined_swanson[
{
"Id": "7a38a1ad55c6914b360b565819604733db751d86afd2575236a70a2519527361",
"Created": "2016-05-09T16:20:45.427996598Z",
"Path": "python",
"Args": [
"app.py"
],
"State": {
"Status": "running",......
我的实验过程:
[root@localhost ~]# docker inspect hopeful_lovelace
[
{
“Id”: “70ae41e0b1bffb5806de507321b36002da9b96b2f7164c71c5cc17fc22cdee21”,
“Created”: “2019-01-22T11:11:15.940073045Z”,
“Path”: “python”,
“Args”: [
“app.py”
],
“State”: {
“Status”: “running”,
“Running”: true,
“Paused”: false,
“Restarting”: false,
“OOMKilled”: false,
“Dead”: false,
“Pid”: 16744,
“ExitCode”: 0,
“Error”: “”,
“StartedAt”: “2019-01-22T11:11:20.215442454Z”,
“FinishedAt”: “0001-01-01T00:00:00Z”
},
“Image”: “sha256:6fae60ef344644649a39240b94d73b8ba9c67f898ede85cf8e947a887b3e6557”,
“ResolvConfPath”: “/var/lib/docker/containers/70ae41e0b1bffb5806de507321b36002da9b96b2f7164c71c5cc17fc22cdee21/resolv.conf”,
“HostnamePath”: “/var/lib/docker/containers/70ae41e0b1bffb5806de507321b36002da9b96b2f7164c71c5cc17fc22cdee21/hostname”,
“HostsPath”: “/var/lib/docker/containers/70ae41e0b1bffb5806de507321b36002da9b96b2f7164c71c5cc17fc22cdee21/hosts”,
“LogPath”: “”,
“Name”: “/hopeful_lovelace”,
“RestartCount”: 0,
“Driver”: “overlay2”,
“MountLabel”: “”,
“ProcessLabel”: “”,
“AppArmorProfile”: “”,
“ExecIDs”: null,
“HostConfig”: {
“Binds”: null,
“ContainerIDFile”: “”,
“LogConfig”: {
“Type”: “journald”,
“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”: “”,
“Cgroup”: “”,
“Links”: null,
“OomScoreAdj”: 0,
“PidMode”: “”,
“Privileged”: false,
“PublishAllPorts”: true,
“ReadonlyRootfs”: false,
“SecurityOpt”: null,
“UTSMode”: “”,
“UsernsMode”: “”,
“ShmSize”: 67108864,
“Runtime”: “docker-runc”,
“ConsoleSize”: [
0,
0
],
“Isolation”: “”,
“CpuShares”: 0,
“Memory”: 0,
“NanoCpus”: 0,
“CgroupParent”: “”,
“BlkioWeight”: 0,
“BlkioWeightDevice”: null,
“BlkioDeviceReadBps”: null,
“BlkioDeviceWriteBps”: null,
“BlkioDeviceReadIOps”: null,
“BlkioDeviceWriteIOps”: null,
“CpuPeriod”: 0,
“CpuQuota”: 0,
“CpuRealtimePeriod”: 0,
“CpuRealtimeRuntime”: 0,
“CpusetCpus”: “”,
“CpusetMems”: “”,
“Devices”: [],
“DiskQuota”: 0,
“KernelMemory”: 0,
“MemoryReservation”: 0,
“MemorySwap”: 0,
“MemorySwappiness”: -1,
“OomKillDisable”: false,
“PidsLimit”: 0,
“Ulimits”: null,
“CpuCount”: 0,
“CpuPercent”: 0,
“IOMaximumIOps”: 0,
“IOMaximumBandwidth”: 0
},
“GraphDriver”: {
“Name”: “overlay2”,
“Data”: {
“LowerDir”: “/var/lib/docker/overlay2/c0a37546b8b66121175d078ca76de18b556b7bdf255ab858175ec248ce7eccef-init/diff:/var/lib/docker/overlay2/adca543ad73a6be9679776e053b1288a3f34f0e5c6d6842c18e71ab3d2a826fd/diff:/var/lib/docker/overlay2/f57a38911b23c54db4bb285afc476c8f919d2d0997cbae6a6a44cebe60057cde/diff:/var/lib/docker/overlay2/88a825f4fecda63ef00421310ae0a699fd47ce11ede52d6270af6a34d6e4bf53/diff:/var/lib/docker/overlay2/aba725960cad10a970b108a5179f15b26fc78d1ea5b61ee85bcae09a861aeaa2/diff:/var/lib/docker/overlay2/66eb82bf38a8cf1e839ca17167f51b4c7d9ba9a223f19b90529642fe4605dc37/diff:/var/lib/docker/overlay2/1f37174e61d3fc1c6cb0ebb347adf29173af5fa31d8b5aa945d7eecb58ec6595/diff:/var/lib/docker/overlay2/378b8c3231fa1f46245931e5bb04df014c886d07d929fc315c93f7dfd1fbe5b0/diff:/var/lib/docker/overlay2/185fd5c51056312250c61e7e4b215250940a5af274c32c958737578a4c1aafab/diff:/var/lib/docker/overlay2/e207f5e3e00b3264c9919d6271f344ba8151258d0cefc4e300d7dbc6988c8477/diff:/var/lib/docker/overlay2/692eaa30450c748c7f0095df931e9665378bc6057b86d7abc618eff6a4f9a91e/diff:/var/lib/docker/overlay2/ae889c4dc876c13b5e2edc981203f94503344c6f437527ddc0818d58a0f8c677/diff:/var/lib/docker/overlay2/8140e51649d864469a1838380b934c5a55f1bd2c720b7aeb34df8446f585c256/diff:/var/lib/docker/overlay2/624452ae3f955018a26d88ad05552c9e71de7b44efaf6cc0a926674bcc105ed6/diff”,
“MergedDir”: “/var/lib/docker/overlay2/c0a37546b8b66121175d078ca76de18b556b7bdf255ab858175ec248ce7eccef/merged”,
“UpperDir”: “/var/lib/docker/overlay2/c0a37546b8b66121175d078ca76de18b556b7bdf255ab858175ec248ce7eccef/diff”,
“WorkDir”: “/var/lib/docker/overlay2/c0a37546b8b66121175d078ca76de18b556b7bdf255ab858175ec248ce7eccef/work”
}
},
“Mounts”: [],
“Config”: {
“Hostname”: “70ae41e0b1bf”,
“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”: “952d94fefbe7c1af1db17b16c1cde40a1d83698fc13d4cfc76c14b7bc6591a91”,
“HairpinMode”: false,
“LinkLocalIPv6Address”: “”,
“LinkLocalIPv6PrefixLen”: 0,
“Ports”: {
“5000/tcp”: [
{
“HostIp”: “0.0.0.0”,
“HostPort”: “32768”
}
]
},
“SandboxKey”: “/var/run/docker/netns/952d94fefbe7”,
“SecondaryIPAddresses”: null,
“SecondaryIPv6Addresses”: null,
“EndpointID”: “1a27623fbb4ee0059e7f7f2fb741e2360ef14234804443bfcfc2f202fac2b298”,
“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”: “6fea1de4e68e5b77670b9d63da905ab9dc3a589ac376a85f3fa7198d49f40b88”,
“EndpointID”: “1a27623fbb4ee0059e7f7f2fb741e2360ef14234804443bfcfc2f202fac2b298”,
“Gateway”: “172.17.0.1”,
“IPAddress”: “172.17.0.3”,
“IPPrefixLen”: 16,
“IPv6Gateway”: “”,
“GlobalIPv6Address”: “”,
“GlobalIPv6PrefixLen”: 0,
“MacAddress”: “02:42:ac:11:00:03”
}
}
}
} ]
停止WEB应用容器
edualiyun@edualiyun:~$ docker stop determined_swanson
determined_swanson
实验过程:
[root@localhost ~]# docker stop hopeful_lovelace
hopeful_lovelace
[root@localhost ~]#
重启WEB应用容器
已经停止的容器,我们可以使用命令 docker start 来启动。
edualiyun@edualiyun:~$ docker start determined_swanson
determined_swanson
docker ps -l 查询最后一次创建的容器:
我的实验过程:
[root@localhost ~]# docker start hopeful_lovelace
hopeful_lovelace
[root@localhost ~]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
70ae41e0b1bf training/webapp “python app.py” 18 minutes ago Up 9 seconds 0.0.0.0:32769->5000/tcp hopeful_lovelace
[root@localhost ~]#
正在运行的容器,我们可以使用 docker restart 命令来重启
移除WEB应用容器
我们可以使用 docker rm 命令来删除不需要的容器
edualiyun@edualiyun:~$ docker rm determined_swanson
determined_swanson
删除容器时,容器必须是停止状态,否则会报如下错误
edualiyun@edualiyun:~$ docker rm determined_swansonError response from daemon: You cannot remove a running container 7a38a1ad55c6914b360b565819604733db751d86afd2575236a70a2519527361. Stop the container before attempting removal or use -f
我的实验过程:
[root@localhost ~]# docker stop hopeful_lovelace
hopeful_lovelace
[root@localhost ~]# docker rm hopeful_lovelace
hopeful_lovelace
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f640f8bf5477 ubuntu:15.10 “/bin/sh -c 'while…” About an hour ago Up About an hour friendly_tesla
[root@localhost ~]#