初识docker—创建WEB应用容器1python+flask

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 初识docker—创建WEB应用容器1python+flask Docker 客户端 docker 客户端非常简单 ,我们可以直接输入 docker 命令来查看到 Docker 客户端的所有命令选项。

初识docker—创建WEB应用容器1python+flask

Docker 客户端

docker 客户端非常简单 ,我们可以直接输入 docker 命令来查看到 Docker 客户端的所有命令选项。

runoob@runoob:~# docker

可以通过命令 docker command --help 更深入的了解指定的 Docker 命令使用方法。

例如我们要查看 docker stats 指令的具体使用方法:

runoob@runoob:~# docker stats --help

运行一个web应用

前面我们运行的容器并没有一些什么特别的用处。

接下来让我们尝试使用 docker 构建一个 web 应用程序。

我们将在docker容器中运行一个 Python Flask 应用来运行一个web应用。

runoob@runoob:~# docker run -d -P training/webapp python app.py

参数说明:

  • -d:让容器在后台运行。
  • -P:将容器内部使用的网络端口映射到我们使用的主机上。

    自我练习

    [root@CentOS1611 multi-user.target.wants]# docker ps

    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

    [root@CentOS1611 multi-user.target.wants]# docker images

    REPOSITORY TAG IMAGE ID CREATED SIZE

    hello-world latest 05a3bd381fc2 5 weeks ago 1.84kB

    [root@CentOS1611 multi-user.target.wants]# docker run -d -P training/webapp python app.py

    Unable to find image 'training/webapp:latest' locally

    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

    e318b989ecc3917d14c834c2e80c26046c1c64bd92522b365185652eca265438

    [root@CentOS1611 multi-user.target.wants]#

     

    查看 WEB 应用容器

    使用 docker ps 来查看我们正在运行的容器

    runoob@runoob:~$ docker ps

    这里多了端口信息。

    PORTS

    0.0.0.0:32769->5000/tcp

    Docker 开放了 5000 端口(默认 Python Flask 端口)映射到主机端口 32769 上。

    这时我们可以通过浏览器访问WEB应用

    我们也可以指定 -p 标识来绑定指定端口。

    runoob@runoob:~$ docker run -d -p 5000:5000 training/webapp python app.py

    docker ps查看正在运行的容器

    容器内部的 5000 端口映射到我们本地主机的 5000 端口上。

     

     

    自我练习

     

    [root@CentOS1611 multi-user.target.wants]# docker ps

    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

    e318b989ecc3 training/webapp "python app.py" 5 minutes ago Up 5 minutes 0.0.0.0:32768->5000/tcp determined_poitras

    [root@CentOS1611 multi-user.target.wants]#

     

    此时我们需要知道这个容器的IP和端口号,从上图可以知道端口号是32768.

    想知道网络信息,可以使用Inspect和network ls查看。看是否是与宿主机是一个IP

    也可以用命令查看详情

    [root@CentOS1611 multi-user.target.wants]# docker inspect e318b989

    [

    {

    "Id": "e318b989ecc3917d14c834c2e80c26046c1c64bd92522b365185652eca265438",

    "Created": "2017-10-19T09:37:11.706960417Z",

    "Path": "python",

    "Args": [

    "app.py"

    ],

    "State": {

    "Status": "running",

    "Running": true,

    "Paused": false,

    "Restarting": false,

    "OOMKilled": false,

    "Dead": false,

    "Pid": 8408,

    "ExitCode": 0,

    "Error": "",

    "StartedAt": "2017-10-19T09:37:11.923778391Z",

    "FinishedAt": "0001-01-01T00:00:00Z"

    },

    "Image": "sha256:6fae60ef344644649a39240b94d73b8ba9c67f898ede85cf8e947a887b3e6557",

    "ResolvConfPath": "/var/lib/docker/containers/e318b989ecc3917d14c834c2e80c26046c1c64bd92522b365185652eca265438/resolv.conf",

    "HostnamePath": "/var/lib/docker/containers/e318b989ecc3917d14c834c2e80c26046c1c64bd92522b365185652eca265438/hostname",

    "HostsPath": "/var/lib/docker/containers/e318b989ecc3917d14c834c2e80c26046c1c64bd92522b365185652eca265438/hosts",

    "LogPath": "/var/lib/docker/containers/e318b989ecc3917d14c834c2e80c26046c1c64bd92522b365185652eca265438/e318b989ecc3917d14c834c2e80c26046c1c64bd92522b365185652eca265438-json.log",

    "Name": "/determined_poitras",

    "RestartCount": 0,

    "Driver": "overlay",

    "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": "",

    "Cgroup": "",

    "Links": null,

    "OomScoreAdj": 0,

    "PidMode": "",

    "Privileged": false,

    "PublishAllPorts": true,

    "ReadonlyRootfs": false,

    "SecurityOpt": null,

    "UTSMode": "",

    "UsernsMode": "",

    "ShmSize": 67108864,

    "Runtime": "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": [],

    "DeviceCgroupRules": null,

    "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": {

    "Data": {

    "LowerDir": "/var/lib/docker/overlay/486c8e9e565be0450b7af95e3ee4e64f3175864e812b3963bd82d0674362e72d/root",

    "MergedDir": "/var/lib/docker/overlay/eb9d82883cf23ee5f87943ff645256abb0f69f6333a6e07ae3f2d1bc20f19c36/merged",

    "UpperDir": "/var/lib/docker/overlay/eb9d82883cf23ee5f87943ff645256abb0f69f6333a6e07ae3f2d1bc20f19c36/upper",

    "WorkDir": "/var/lib/docker/overlay/eb9d82883cf23ee5f87943ff645256abb0f69f6333a6e07ae3f2d1bc20f19c36/work"

    },

    "Name": "overlay"

    },

    "Mounts": [],

    "Config": {

    "Hostname": "e318b989ecc3",

    "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": "d11c77eff37a27d80323d2c95b2c59b2a4a472d3ae908095302dc8c1e2478c4f",

    "HairpinMode": false,

    "LinkLocalIPv6Address": "",

    "LinkLocalIPv6PrefixLen": 0,

    "Ports": {

    "5000/tcp": [

    {

    "HostIp": "0.0.0.0",

    "HostPort": "32768"

    }

    ]

    },

    "SandboxKey": "/var/run/docker/netns/d11c77eff37a",

    "SecondaryIPAddresses": null,

    "SecondaryIPv6Addresses": null,

    "EndpointID": "46c8c004298140857b84a51b0a3aa146030e176132aa40ea2c71c6c05fe1edcb",

    "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": "b9e1d951899da3c16ba5dc6686b54e85c9c49842c3c23d5e3573c1f196b625a7",

    "EndpointID": "46c8c004298140857b84a51b0a3aa146030e176132aa40ea2c71c6c05fe1edcb",

    "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@CentOS1611 multi-user.target.wants]#

    [root@CentOS1611 multi-user.target.wants]# docker network ls

    NETWORK ID NAME DRIVER SCOPE

    b9e1d951899d bridge bridge local

    7577a140f2d2 host host local

    d4edaa484e93 none null local

     

    由此可以采用桥连接,与宿主机是一个IP,连接验证如下

    网络端口的快捷方式

    通过docker ps 命令可以查看到容器的端口映射,docker还提供了另一个快捷方式:docker port,使用 docker port 可以查看指定 ID或者名字)容器的某个确定端口映射到宿主机的端口号。

    上面我们创建的web应用容器ID:7a38a1ad55c6 名字为:determined_swanson

    我可以使用docker port 7a38a1ad55c6 docker port determined_swanson来查看容器端口的映射情况

    runoob@runoob:~$ docker port 7a38a1ad55c6

    5000/tcp -> 0.0.0.0:5000

    runoob@runoob:~$ docker port determined_swanson

    5000/tcp -> 0.0.0.0:5000

    查看WEB应用程序日志

    docker logs [ID或者名字] 可以查看容器内部的标准输出。

    runoob@runoob:~$ 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 一样来输出容器内部的标准输出。(补充:tail –f的意思是什么?tail 命令从指定点开始将文件写到标准输出.使用tail命令的-f选项可以方便的查阅正在改变的日志文件,tail -f filename会把filename里最尾部的内容显示在屏幕上,并且不但刷新,使你看到最新的文件内容用于显示指定文件末尾内容,不指定文件时,作为输入信息进行处理。常用查看日志文件。)

    从上面,我们可以看到应用程序使用的是 5000 端口并且能够查看到应用程序的访问日志。

    自我练习

    宿主机是10.24.11.52,

    查看WEB应用程序日志,下面显示的10.24.12.109是刚才访问过这个应用程序的IP地址。

    [root@CentOS1611 /]# docker ps

    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

    e318b989ecc3 training/webapp "python app.py" 23 minutes ago Up 23 minutes 0.0.0.0:32768->5000/tcp determined_poitras

    [root@CentOS1611 /]# docker logs -f e318b989ecc3

    * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)

    10.24.12.109 - - [19/Oct/2017 09:56:37] "GET / HTTP/1.1" 200 -

    10.24.12.109 - - [19/Oct/2017 09:56:37] "GET /favicon.ico HTTP/1.1" 404 -

    10.24.12.109 - - [19/Oct/2017 09:57:14] "GET / HTTP/1.1" 200 -

    10.24.12.109 - - [19/Oct/2017 09:57:15] "GET /favicon.ico HTTP/1.1" 404 -

     

    [root@CentOS1611 /]#

     

     

     

    查看WEB应用程序容器的进程

    我们还可以使用 docker top 来查看容器内部运行的进程

    runoob@runoob:~$ docker top determined_swanson

    检查WEB应用程序

    使用 docker inspect 来查看Docker的底层信息。它会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息。

    runoob@runoob:~$ docker inspect determined_swanson

    [

    {

    "Id": "7a38a1ad55c6914b360b565819604733db751d86afd2575236a70a2519527361",

    "Created": "2016-05-09T16:20:45.427996598Z",

    "Path": "python",

    "Args": [

    "app.py"

    ],

    "State": {

    "Status": "running",

    ......

    停止WEB应用容器

    runoob@runoob:~$ docker stop determined_swanson

    determined_swanson

    重启WEB应用容器

    已经停止的容器,我们可以使用命令 docker start 来启动。

    runoob@runoob:~$ docker start determined_swanson

    determined_swanson

    docker ps -l 查询最后一次创建的容器:

    正在运行的容器,我们可以使用 docker restart 命令来重启

    移除WEB应用容器

    我们可以使用 docker rm 命令来删除不需要的容器

    runoob@runoob:~$ docker rm determined_swanson

    determined_swanson

    删除容器时,容器必须是停止状态,否则会报如下错误

    runoob@runoob:~$ docker rm determined_swanson

    Error response from daemon: You cannot remove a running container 7a38a1ad55c6914b360b565819604733db751d86afd2575236a70a2519527361. Stop the container before attempting removal or use -f

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
3天前
|
数据挖掘 大数据 数据处理
Python在数据分析中的应用
【2月更文挑战第7天】传统的数据分析方法已经不能满足当今大数据环境下的需求,Python作为一种高效、灵活的编程语言,被广泛应用于数据分析领域。本文将介绍Python在数据分析中的优势以及其常用库和工具,并结合实际案例说明Python在数据分析中的应用。
|
3天前
|
机器学习/深度学习 人工智能 数据挖掘
Python在数据分析中的应用及未来发展趋势
【2月更文挑战第7天】传统的数据分析方法已经无法满足当今大数据时代的需求,Python作为一种高效、灵活的编程语言,在数据分析领域扮演着越来越重要的角色。本文将探讨Python在数据分析中的应用现状,并对其未来发展趋势进行展望。
|
3天前
|
机器学习/深度学习 数据可视化 数据挖掘
Python技术应用:数据分析与可视化的利器
【2月更文挑战第7天】在当今信息爆炸的时代,数据分析和可视化已经成为各行业的核心竞争力。Python作为一种简洁、高效的编程语言,为数据分析带来了全新的可能性。本文将介绍Python在数据分析和可视化领域的应用,探讨其在实际工作中的重要性和价值。
12 2
|
3天前
|
机器学习/深度学习 数据可视化 数据挖掘
Python在数据分析中的应用及其优势
【2月更文挑战第7天】 本文将探讨Python在数据分析领域的应用及其优势,着重介绍了Python在处理大规模数据、可视化分析和机器学习等方面的特点。通过实际案例和技术原理的介绍,帮助读者深入了解Python在数据分析中的价值和作用。
15 0
|
3天前
|
机器学习/深度学习 数据采集 数据可视化
Python在数据分析中的应用与优势
【2月更文挑战第7天】随着大数据时代的到来,数据分析逐渐成为各行各业的重要工具。本文探讨了Python作为一种强大的数据分析工具在实际应用中的优势和特点,介绍了其在数据清洗、可视化、机器学习等方面的应用,展示了Python在数据分析领域的重要性和灵活性。
|
3天前
|
机器学习/深度学习 人工智能 算法框架/工具
Python在人工智能领域的应用与发展
【2月更文挑战第6天】随着人工智能技术的快速发展,Python作为一种简洁高效的编程语言,在人工智能领域扮演着举足轻重的角色。本文将探讨Python在人工智能领域的应用现状和未来发展方向,分析其在机器学习、深度学习等方面的优势,并展望Python在人工智能领域的前景。
16 6
|
3天前
|
机器学习/深度学习 算法 数据挖掘
Python在数据分析中的应用与未来发展
【2月更文挑战第6天】 随着数据时代的到来,数据分析技术在各行各业中发挥着越来越重要的作用。Python作为一种高效、灵活的编程语言,被广泛运用于数据分析领域。本文将探讨Python在数据分析中的应用场景、优势以及未来发展趋势,旨在帮助读者更好地了解Python在数据分析领域的价值和潜力。
|
23小时前
|
人工智能 前端开发 算法
Python 潮流周刊#18:Flask、Streamlit、Polars 的学习教程
Python 潮流周刊#18:Flask、Streamlit、Polars 的学习教程
7 4
|
1天前
|
数据采集 机器学习/深度学习 存储
万字长文,Python的应用领域有哪些?
万字长文,Python的应用领域有哪些?
|
2天前
|
Python
Python编程中的装饰器应用探究
【2月更文挑战第8天】装饰器是Python编程中一个重要且强大的工具,它能够简洁地实现函数的包装和扩展,提高代码的复用性和可读性。本文将深入探讨装饰器在Python编程中的应用,结合实际例子详细讲解装饰器的定义、使用方法及常见应用场景,帮助读者更好地理解和运用装饰器这一高级特性。

相关产品

  • 容器镜像服务
  • 容器服务Kubernetes版