首页 » 翻译 » Docker » 正文

Docker 入门教程03 使用容器工作

原文地址:
https://docs.docker.com/userguide/usingdocker/

在上一个教程01中,我们成功的载入了我们的第一个容器,并且我们使用docker run命令载入了两个容器(在02中),我们由此得到两个结论

1:我们可以和容器进行显示的交互
2: 容器可以以一种后台运行的方式存在

并且我们学到了好几个docker相关的命令

docker ps 显示容器列表
docker log 给我们制订容器显示标准输出
docker stop 停止制订容器

docker客户端是非常简单的,每一个操作都是一条命令,每一个命令都有多个参数可以进行传递

# Usage: [sudo] docker [command] [flags] [arguments] ..
# Example:
$ docker run -i -t ubuntu /bin/bash

我们看一下docker version 的返回值

这条命令不仅会显示docker的版本,而且会显示出go语言的版本

Client version: 0.8.0
Go version (client): go1.2

Git commit (client): cc3a8c8
Server version: 0.8.0

Git commit (server): cc3a8c8
Go version (server): go1.2

Last stable version: 0.8.0

docker帮助
你可以通过如下命令来获取docker自带的帮助文档:

docker –help

如果你想获取指定命令的帮助,可以通过如下方式获取

$ docker attach –help

Usage: docker attach [OPTIONS] CONTAINER

Attach to a running container

–help=false Print usage
–no-stdin=false Do not attach stdin
–sig-proxy=true Proxy all received signals to the process

在容器中运行一个web应用

我们已经学习了一些docker客户端应用的,我们需要继续学习比较重要的东西了,加载更多的容器,到目前为止,我们所有run的容器基本都没什么用处,那么下面我们开始创建一个web的容器的例子

我们要执行的是一个Python的应用,我们通过docker run来开始

docker run -d -P training/webapp python app.py

我们来逐一分析一下这个命令都干了什么

-d -p ,-d我们已经知道了,说明是要让我们的容器后台运行,但是-P我们没有使用过,-P的目的是告诉docker去在所需要的端口之间进行映射(容器和主机之间的映射),之后映射之后,我们才可以通过主机的端口进行访问

然后我们指定了镜像名称 training/webapp ,这个镜像是之前就创建好的,其中包含了之前提到的Python应用,最后,我们指定了在容器成功加载之后要执行的命令: python app.py

命令之后,我们可以通如下命令查看:
[root@fedora ~]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9f38b44d16ca training/webapp “python app.py” 38 seconds ago Up 37 seconds 0.0.0.0:32768->5000/tcp determined_bell
[root@fedora ~]#

(此处的 -l 意思是last最后启动的容器)

这个时候我们注意到PROTS部分

0.0.0.0:32768->5000/tcp
这个就是-P的作用,此例子中,容器的端口5000对应了主机的32768端口,当然,我们可能不希望使用32768这个端口来作为映射,我们可以通过简单的命令指定对应的端口:

docker run -d -p 80:5000 training/webapp python app.py

至于为什么不直接使用1:1的关系把容器里的端口映射到本机,原因是如果你启动了两个 刚刚一摸一样的容器,1:1的端口映射就行不通了….

好了,我们可以通过打开浏览器来访问32768(我直接curl了)

[root@fedora ~]# curl http://localhost:32768
Hello world![root@fedora ~]#

网络简便用法
虽然我们可以通过docker ps来获取端口的情况,但是感觉很复杂,我们可以通过一种简单的方式进行:
docker port

在使用的时候我们需要指定ID 或者name (容器的)

docker port determined_bell 5000

(这个地方的5000是容器里边开发的端口)

查看web应用日志

docker logs -f determined_bell

-f 的作用和tail -f 中的作用是一致的,实时,最后
通过日志我们也可以看到我们的应用跑在5000端口上

查看容器中的进程

docker top determined_bell
结果如下:
UID PID PPID C STIME TTY TIME CMD
root 7243 4785 0 10:54 ? 00:00:00 python app.py

校验我们的web应用容器(Inspecting)

我们可以通过一个命令来返回json格式的数据

例如针对我们现在容器

[root@fedora ~]# docker inspect determined_bell
[
{
“Id”: “9f38b44d16ca377897f7a5e468046d6972720f05c594415b1e569f6775f9f673″,
“Created”: “2015-06-24T02:54:31.376170123Z”,
“Path”: “python”,
“Args”: [
“app.py”
],
“State”: {
“Running”: true,
“Paused”: false,
“Restarting”: false,
“OOMKilled”: false,
“Dead”: false,
“Pid”: 7243,
“ExitCode”: 0,
“Error”: “”,
“StartedAt”: “2015-06-24T02:54:31.997274384Z”,
“FinishedAt”: “0001-01-01T00:00:00Z”
},
“Image”: “02a8815912ca800f99b7d912485e8c618260e27c6de8d7a161b356b322d5c121″,
“NetworkSettings”: {
“Bridge”: “”,
“EndpointID”: “e7b9416f4b0cd78603247ebca4563688f1019ced749328ccb971c728e240cd66″,
“Gateway”: “172.17.42.1”,
“GlobalIPv6Address”: “”,
“GlobalIPv6PrefixLen”: 0,
“HairpinMode”: false,
“IPAddress”: “172.17.0.5”,
“IPPrefixLen”: 16,
“IPv6Gateway”: “”,
“LinkLocalIPv6Address”: “”,
“LinkLocalIPv6PrefixLen”: 0,
“MacAddress”: “02:42:ac:11:00:05″,
“NetworkID”: “15e8df8a477f894d4d007ad173881d7467c13c9f499d70e26ad60c9c2d10f3f5″,
“PortMapping”: null,
“Ports”: {
“5000/tcp”: [
{
“HostIp”: “0.0.0.0”,
“HostPort”: “32768”
}
]
},
“SandboxKey”: “/var/run/docker/netns/9f38b44d16ca”,
“SecondaryIPAddresses”: null,
“SecondaryIPv6Addresses”: null
},
“ResolvConfPath”: “/var/lib/docker/containers/9f38b44d16ca377897f7a5e468046d6972720f05c594415b1e569f6775f9f673/resolv.conf”,
“HostnamePath”: “/var/lib/docker/containers/9f38b44d16ca377897f7a5e468046d6972720f05c594415b1e569f6775f9f673/hostname”,
“HostsPath”: “/var/lib/docker/containers/9f38b44d16ca377897f7a5e468046d6972720f05c594415b1e569f6775f9f673/hosts”,
“LogPath”: “/var/lib/docker/containers/9f38b44d16ca377897f7a5e468046d6972720f05c594415b1e569f6775f9f673/9f38b44d16ca377897f7a5e468046d6972720f05c594415b1e569f6775f9f673-json.log”,
“Name”: “/determined_bell”,
“RestartCount”: 0,
“Driver”: “devicemapper”,
“ExecDriver”: “native-0.2″,
“MountLabel”: “”,
“ProcessLabel”: “”,
“Volumes”: {},
“VolumesRW”: {},
“AppArmorProfile”: “”,
“ExecIDs”: null,
“HostConfig”: {
“Binds”: null,
“ContainerIDFile”: “”,
“LxcConf”: [],
“Memory”: 0,
“MemorySwap”: 0,
“CpuShares”: 0,
“CpuPeriod”: 0,
“CpusetCpus”: “”,
“CpusetMems”: “”,
“CpuQuota”: 0,
“BlkioWeight”: 0,
“OomKillDisable”: false,
“Privileged”: false,
“PortBindings”: {},
“Links”: null,
“PublishAllPorts”: true,
“Dns”: null,
“DnsSearch”: null,
“ExtraHosts”: null,
“VolumesFrom”: null,
“Devices”: [],
“NetworkMode”: “bridge”,
“IpcMode”: “”,
“PidMode”: “”,
“UTSMode”: “”,
“CapAdd”: null,
“CapDrop”: null,
“RestartPolicy”: {
“Name”: “no”,
“MaximumRetryCount”: 0
},
“SecurityOpt”: null,
“ReadonlyRootfs”: false,
“Ulimits”: null,
“LogConfig”: {
“Type”: “json-file”,
“Config”: {}
},
“CgroupParent”: “”
},
“Config”: {
“Hostname”: “9f38b44d16ca”,
“Domainname”: “”,
“User”: “”,
“AttachStdin”: false,
“AttachStdout”: false,
“AttachStderr”: false,
“PortSpecs”: null,
“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,
“VolumeDriver”: “”,
“WorkingDir”: “/opt/webapp”,
“Entrypoint”: null,
“NetworkDisabled”: false,
“MacAddress”: “”,
“OnBuild”: null,
“Labels”: {}
}
}
]

当然如果你觉得输出太多,也可以直接输出想要的某一特定项目,例如:
docker inspect -f ‘{{ .NetworkSettings.IPAddress }}’ determined_bell

172.17.0.5

停止容器

下面说说如何停止容器,很简单

docker stop determined_bell

然后我们在使用docker ps -l 就没有数据了。

启动容器

我们如果想再启动它怎么启动呢?
docker start determined_bell

docker ps -l (又回来了…但是绑定的端口可能会变哦)

(我们也可以使用restart命令来完成停止和启动命令)

删除容器

docker rm determined_bell

Error response from daemon: Cannot destroy container determined_bell: Conflict, You cannot remove a running container. Stop the container before attempting removal or use -f
Error: failed to remove containers: [determined_bell]

擦,居然报错,为什么?因为上一步我们把docker启动了又,删除之前一定要先停止再删除

docker stop determined_bell

docker rm determined_bell

删除成功

欢迎转载,转载请注明出处:http://www.503error.com/

Zhiming Zhang

Senior devops at Appannie
一个奔跑在运维路上的胖子
Zhiming Zhang

Latest posts by Zhiming Zhang (see all)