docker新手入门(2)之容器使用

docker客户端

docker客户端的命令可以用docker命令来查看

1
root@blacsheep-myubuntu:/home/blacsheep# docker

然后可以通过docker command --help来查看具体命令的使用 比如

1
2
3
4
5
6
7
8
9
10
11
12
root@blacsheep-myubuntu:/home/blacsheep# docker stats --help

Usage: docker stats [OPTIONS] [CONTAINER...]

Display a live stream of container(s) resource usage statistics

Options:
-a, --all Show all containers (default shows just running)
--format string Pretty-print images using a Go template
--no-stream Disable streaming stats and only pull the first result
--no-trunc Do not truncate output
root@blacsheep-myubuntu:/home/blacsheep#

运行一个web应用

尝试使用docker来构建一个web应用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
root@blacsheep-myubuntu:/home/blacsheep# docker pull training/webapp
Using default tag: latest
latest: Pulling from training/webapp
e190868d63f8: Pull complete
909cd34c6fd7: Pull complete
0b9bfabab7c1: Pull complete
a3ed95caeb02: Pull complete
10bbbc0fc0ff: Pull complete
fca59b508e9f: Pull complete
e7ae2541b15b: Pull complete
9dd97ef58ce9: Pull complete
a4c1b0cb7af7: Pull complete
Digest: sha256:06e9c1983bd6d5db5fba376ccd63bfa529e8d02f23d5079b8f74a616308fb11d
Status: Downloaded newer image for training/webapp:latest
root@blacsheep-myubuntu:/home/blacsheep# docker run -d -P training/webapp python app.py
b9f2592e87cea8935e568cc401b090c50cfb01c486189aa44c893055ef751dcc

这里的pull是从网上拉镜像,然后后面的run的参数中,-d让容器后台运行,-P让容器内部使用的网络端口映射到我们的主机

查看web应用容器

1
2
3
root@blacsheep-myubuntu:/home/blacsheep# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b9f2592e87ce training/webapp "python app.py" 7 minutes ago Up 7 minutes 0.0.0.0:32768->5000/tcp clever_raman

这里多了一些端口的信息,其实是docker开放的5000端口(flask默认端口)映射到了主机的32768端口,我们浏览器访问一下 blacsheep 当然,端口也可以自己指定

1
2
3
4
5
root@blacsheep-myubuntu:/home/blacsheep# docker run -d -p 5000:5000 training/webapp python app.py
af7264cd0a971c40555a0dcf65dfa31bea74b92c497816e705cb009bdda8dc2d
root@blacsheep-myubuntu:/home/blacsheep# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
af7264cd0a97 training/webapp "python app.py" 6 seconds ago Up 5 seconds 0.0.0.0:5000->5000/tcp sharp_noyce

这里就是把容器内部的5000端口映射到了我们本地的5000端口

网络端口查看的快捷方式

docker ps当然可以查看端口情况,但其实还有一个命令也可以,docker port也可以查看固定id或名字的容器的端口映射情况 比如

1
2
root@blacsheep-myubuntu:/home/blacsheep# docker port af7264cd0a97
5000/tcp -> 0.0.0.0:5000

这里只是一种快捷方式,作为了解吧

查看web应用的日志

我们使用docker logs [id或名字]可以查看容器内部的标准输出,就像我们本地运行flask就会有*Running on xxxx一样 我们运行一下docker logs -f [id或名字]

1
2
3
4
root@blacsheep-myubuntu:/home/blacsheep# docker logs -f af7264cd0a97
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
172.17.0.1 - - [27/Jan/2018 07:08:00] "GET / HTTP/1.1" 200 -
172.17.0.1 - - [27/Jan/2018 07:08:00] "GET /favicon.ico HTTP/1.1" 404 -

这个就是我们刚刚的记录 这里的-f表示实时显示日志,就像我们再访问一下127.0.0.1:5000日志会自己写上去一样

查看web应用容器的进程

1
2
3
root@blacsheep-myubuntu:/home/blacsheep# docker top af7264cd0a97
UID PID PPID C STIME TTY TIME CMD
root 3844 3827 0 15:01 ? 00:00:00 python app.py

检查web应用程序

使用docker inspect xxx 比如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
root@blacsheep-myubuntu:/home/blacsheep# docker inspect af7264cd0a97
[
{
"Id": "af7264cd0a971c40555a0dcf65dfa31bea74b92c497816e705cb009bdda8dc2d",
"Created": "2018-01-27T07:01:48.216732532Z",
"Path": "python",
"Args": [
"app.py"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 3844,
"ExitCode": 0,
"Error": "",
"StartedAt": "2018-01-27T07:01:48.855558432Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:6fae60ef344644649a39240b94d73b8ba9c67f898ede85cf8e947a887b3e6557",
"ResolvConfPath": "/var/lib/docker/containers/af7264cd0a971c40555a0dcf65dfa31bea74b92c497816e705cb009bdda8dc2d/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/af7264cd0a971c40555a0dcf65dfa31bea74b92c497816e705cb009bdda8dc2d/hostname",
"HostsPath": "/var/lib/docker/containers/af7264cd0a971c40555a0dcf65dfa31bea74b92c497816e705cb009bdda8dc2d/hosts",
"LogPath": "/var/lib/docker/containers/af7264cd0a971c40555a0dcf65dfa31bea74b92c497816e705cb009bdda8dc2d/af7264cd0a971c40555a0dcf65dfa31bea74b92c497816e705cb009bdda8dc2d-json.log",
"Name": "/sharp_noyce",
"RestartCount": 0,
"Driver": "overlay2",
"Platform": "linux",
"MountLabel": "",
"ProcessLabel": "",
"AppArmorProfile": "docker-default",
"ExecIDs": null,
"HostConfig": {
"Binds": null,
"ContainerIDFile": "",
"LogConfig": {
"Type": "json-file",
"Config": {}
},
"NetworkMode": "default",
"PortBindings": {
"5000/tcp": [
{
"HostIp": "",
"HostPort": "5000"
}
]
},
"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/f7d660148c54b02dbdf3984f960d214707d939d7668e5df0c0954dda98273539-init/diff:/var/lib/docker/overlay2/b10716ca735ef9763f741ad0beb59aed4e7c7859bb4fecff04d8df91d84b22d6/diff:/var/lib/docker/overlay2/ff54443de624d248e7c25d4418ad0b31f4d00313ff8a6f5a5bd03d3477f666d2/diff:/var/lib/docker/overlay2/3dfaea4a76ba9e41e0f7f02859e31b7997ccb4b020e843e626283a405d286d19/diff:/var/lib/docker/overlay2/80098f33e92c084bd0d2145f7ee6a538dd5a8452b84e33418c05e0f47b3ce6b7/diff:/var/lib/docker/overlay2/0ca15e9df32499884ac3a1508ee6f854baaa832ba38dd67dda99caf8a354122b/diff:/var/lib/docker/overlay2/3fc01c213b12be2701b8e5c876742ca08fbf3f28c0729253216f86cd72dcf05d/diff:/var/lib/docker/overlay2/8ae1b6be565d46876f4cd1ea83ee22210e88d3331588f5e8c0e368de4a453091/diff:/var/lib/docker/overlay2/e6f44ca033c4fe66c3d51ad52cf1cbaff727f6809fa97a13323065056b9fd26c/diff:/var/lib/docker/overlay2/f23602b28997b720d79fd26fa4726d75f0bf396b0ccc22b95ae1cdc56a2d3191/diff:/var/lib/docker/overlay2/3222e61d544a81a68b93dfbbbe84fb97d180d1df827b90d1352a895b51729f55/diff:/var/lib/docker/overlay2/13cddf08b673042298865b2daac520b9d63806ce045b977af176694cfe703593/diff:/var/lib/docker/overlay2/ad5eefb4e45d4b347cac3475e64ffcd63ab7a3aa42fde14115e38c5467c91d9f/diff:/var/lib/docker/overlay2/405f4f83e271e45edb3f0df3476e4eb433d213adeb64ea71e2f4b1a820ec8d43/diff",
"MergedDir": "/var/lib/docker/overlay2/f7d660148c54b02dbdf3984f960d214707d939d7668e5df0c0954dda98273539/merged",
"UpperDir": "/var/lib/docker/overlay2/f7d660148c54b02dbdf3984f960d214707d939d7668e5df0c0954dda98273539/diff",
"WorkDir": "/var/lib/docker/overlay2/f7d660148c54b02dbdf3984f960d214707d939d7668e5df0c0954dda98273539/work"
},
"Name": "overlay2"
},
"Mounts": [],
"Config": {
"Hostname": "af7264cd0a97",
"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": "07146affbe8795cdade88d6ce45407d3aa77d2a3db946390a89a12eddf4f2281",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {
"5000/tcp": [
{
"HostIp": "0.0.0.0",
"HostPort": "5000"
}
]
},
"SandboxKey": "/var/run/docker/netns/07146affbe87",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "f95361cc2fec09e16108de8c1818e659e5a67a0e7ee1f810f5425f48b3ba2311",
"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": "f4c8148425eecef64502c5c3292494d640bb0670219d160f4bcd9edd7217af4b",
"EndpointID": "f95361cc2fec09e16108de8c1818e659e5a67a0e7ee1f810f5425f48b3ba2311",
"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
}
}
}
}
]
root@blacsheep-myubuntu:/home/blacsheep#

这个会返回一个json,json里面是docker容器的配置

对容器的一些操作

docker stop xxx:停止容器 docker start xxx:启动容器 docker restart xxx:重启容器 docker rm xxx:移除容器 ok,对容器的处理就到这里了,边学边尝试吧