当前位置:   article > 正文

狂神jetson nano Docker进阶篇学习笔记(一)_jetson nano flask

jetson nano flask

目录

Docker Compose

简介

安装

体验 

第 1 步:设置

第 2 步:创建一个 Dockerfile

第 3 步:在 Compose 文件中定义服务

第 4 步:使用 Compose 构建并运行您的应用程序

第 5 步:编辑 Compose 文件以添加绑定挂载 

第 6 步:使用 Compose 重新构建并运行应用程序

第 7 步:更新应用程序

第 8 步:尝试一些其他命令

小结


学习通道:【狂神说Java】Docker进阶篇超详细版教程通俗易懂

docker官网:Docker Documentation | Docker Documentation

docker hun:Docker Hub


Docker Compose


简介


Docker-Compose 详解

简而言之,Docker Compose是一个轻松高效的容器管理工具!能够定义运行多个容器!

官方介绍

 

有道翻译一下嘿嘿:Compose是一个用于定义和运行多容器Docker应用程序的工具。使用Compose,您可以使用YAML文件来配置应用程序的服务。然后,通过一个命令,您可以创建并启动配置中的所有服务。要了解有关Compose所有特性的更多信息,请参阅特性列表。

组合所有环境中的工作:生产环境、登台环境、开发环境、测试环境以及CI工作流。您可以在“常用用例”中了解更多关于每个用例的信息。

使用Compose基本上有三个步骤:

1、用Dockerfile定义你的应用环境,这样它就可以在任何地方复制。

2、在docker-compose中定义组成应用的服务。这样它们就可以在一个隔离的环境中一起运行。

3、运行docker compose命令,docker compose命令启动并运行你的整个应用。你也可以使用docker-compose二进制文件运行docker-compose。

作用:批量容器编排。

docker-compose是Docker官方的开源项目,需要安装!

Dockerfile让程序在任何地方运行。web服务,Redis,mysql、Nginx。。。多个容器,如果需要用docker build服务一个一个启动的话会非常麻烦!因此出现了Compose。

  1. version: "3.9" # optional since v1.27.0
  2. services:
  3. web:
  4. build: .
  5. ports:
  6. - "5000:5000"
  7. volumes:
  8. - .:/code
  9. - logvolume01:/var/log
  10. links:
  11. - redis
  12. redis:
  13. image: redis
  14. volumes:
  15. logvolume01: {}

通过docker-compose up 我们就能启动10个、100个乃至1000个服务!

Compose的两个重要概念:

1、它是一个服务service,容器服务,应用服务。(web、Redis、mysql)

2、所有微服务运行起来后组成的一个项目project,一组相关联的容器。比如一个博客:包含有web、mysql、wp等服务,组合起来就是一个博客项目!

安装


1、下载

国外地址:

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

国内地址:

curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

2、授权

sudo chmod +x /usr/local/bin/docker-composeroot

3、查看版本信息确认是否安装成功

docker-compose -v

 在虚拟机安装的时候一切正常,但是在nano上安装就出现错误了!执行docker-compose -v会报错:Docker-compose: /usr/local/bin/docker-compose : line 1: Not: command not found

参考:Docker-compose: /usr/local/bin/docker-compose : line 1: Not: command not found

解决办法:

sudo apt-get install docker-compose 

直接通过apt下载docker-compose!

但是这里的build unknown我没明白,有大佬知道的请在评论区留言一下解惑!

体验 


官方地址:Get started with Docker Compose | Docker Documentation

第 1 步:设置


1、创建一个项目文件

  1. mkdir composetest
  2. cd composetest

 2、创建一个app.py脚本文件编辑下面的内容

  1. import time
  2. import redis
  3. from flask import Flask
  4. app = Flask(__name__)
  5. cache = redis.Redis(host='redis', port=6379)
  6. def get_hit_count():
  7. retries = 5
  8. while True:
  9. try:
  10. return cache.incr('hits')
  11. except redis.exceptions.ConnectionError as exc:
  12. if retries == 0:
  13. raise exc
  14. retries -= 1
  15. time.sleep(0.5)
  16. @app.route('/')
  17. def hello():
  18. count = get_hit_count()
  19. return 'Hello World! I have been seen {} times.\n'.format(count)

在此示例中,redis是应用程序网络上的 redis 容器的主机名。我们使用 Redis 的默认端口,6379.

处理瞬态错误

注意get_hit_count函数的编写方式。如果 redis 服务不可用,这个基本的重试循环允许我们多次尝试我们的请求。这在应用程序上线时的启动时很有用,但如果 R​​edis 服务需要在应用程序的生命周期内随时重新启动,这也会使我们的应用程序更具弹性。在集群中,这也有助于处理节点之间的瞬时连接中断。

 

3、requirements.txt在您的项目目录中创建另一个文件并将其粘贴到:

flask
redis

第 2 步:创建一个 Dockerfile


在此步骤中,您将编写一个用于构建 Docker 映像的 Dockerfile。该图像包含 Python 应用程序所需的所有依赖项,包括 Python 本身。

在您的项目目录中,创建一个名为Dockerfile并粘贴以下内容的文件:

  1. # syntax=docker/dockerfile:1
  2. FROM python:3.7-alpine
  3. WORKDIR /code
  4. ENV FLASK_APP=app.py
  5. ENV FLASK_RUN_HOST=0.0.0.0
  6. RUN apk add --no-cache gcc musl-dev linux-headers
  7. COPY requirements.txt requirements.txt
  8. RUN pip install -r requirements.txt
  9. EXPOSE 5000
  10. COPY . .
  11. CMD ["flask", "run"]

这告诉 Docker:

  • 从 Python 3.7 映像开始构建映像。
  • 将工作目录设置为/code.
  • 设置flask命令使用的环境变量。
  • 安装 gcc 和其他依赖项
  • 复制requirements.txt并安装 Python 依赖项。
  • 将元数据添加到图像以描述容器正在侦听端口 5000
  • .项目中的当前目录复制到.镜像中的workdir 。
  • 将容器的默认命令设置为flask run.

有关如何编写 Dockerfile 的更多信息,请参阅 Docker 用户指南 和Dockerfile 参考

第 3 步:在 Compose 文件中定义服务


docker-compose.yml在您的项目目录中创建一个名为的文件并粘贴以下内容:

  1. version: "3.9"
  2. services:
  3. web:
  4. build: .
  5. ports:
  6. - "5000:5000"
  7. redis:
  8. image: "redis:alpine"

 这个 Compose 文件定义了两个服务:webredis.

网络服务

web服务使用从Dockerfile当前目录中构建的映像。然后它将容器和主机绑定到暴露的端口5000. 此示例服务使用 Flask Web 服务器的默认端口5000.

Redis服务

redis服务使用 从 Docker Hub 注册表中提取的公共Redis映像。

第 4 步:使用 Compose 构建并运行您的应用程序


1、从您的项目目录,通过运行启动您的应用程序docker-compose up

  1. docker-compose up
  2. Creating network "composetest_default" with the default driver
  3. Creating composetest_web_1 ...
  4. Creating composetest_redis_1 ...
  5. Creating composetest_web_1
  6. Creating composetest_redis_1 ... done
  7. Attaching to composetest_web_1, composetest_redis_1
  8. web_1 | * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
  9. redis_1 | 1:C 17 Aug 22:11:10.480 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
  10. redis_1 | 1:C 17 Aug 22:11:10.480 # Redis version=4.0.1, bits=64, commit=00000000, modified=0, pid=1, just started
  11. redis_1 | 1:C 17 Aug 22:11:10.480 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
  12. web_1 | * Restarting with stat
  13. redis_1 | 1:M 17 Aug 22:11:10.483 * Running mode=standalone, port=6379.
  14. redis_1 | 1:M 17 Aug 22:11:10.483 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
  15. web_1 | * Debugger is active!
  16. redis_1 | 1:M 17 Aug 22:11:10.483 # Server initialized
  17. redis_1 | 1:M 17 Aug 22:11:10.483 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.

2、在浏览器中输入 http://localhost:5000/ 以查看应用程序正在运行。

如果您在 Linux、Mac 的 Docker 桌面或 Windows 的 Docker 桌面上本地使用 Docker,那么 Web 应用程序现在应该在 Docker 守护程序主机上侦听端口 5000。将 Web 浏览器指向 http://localhost:5000 以查找Hello World消息。如果这不能解决,您也可以尝试 http://127.0.0.1:5000。

如果您在 Mac 或 Windows 上使用 Docker Machine,请使用docker-machine ip MACHINE_VM获取 Docker 主机的 IP 地址。然后,http://MACHINE_VM_IP:5000在浏览器中打开 。

您应该在浏览器中看到一条消息:

Hello World! I have been seen 1 times.

3、刷新页面。数字应该递增。

问题1:一开始build构建的时候提示版本不对应

 

解决办法:将docker-compose.yml的version降低到3.5之后即可运行

 

问题2:中间下载gcc到11步的时候会卡住很久,将Dockerfile中gcc之后的内容注释掉

 4、切换到另一个终端窗口,然后键入docker image ls以列出本地图像。

此时列出图像应返回redisweb

您可以使用docker inspect <tag or id>.

5.停止应用程序,方法是docker-compose down 在第二个终端的项目目录中运行,或者在启动应用程序的原始终端中按 CTRL+C。

第 5 步:编辑 Compose 文件以添加绑定挂载 


编辑docker-compose.yml在项目目录添加 绑定安装web服务:

  1. version: "3.9"
  2. services:
  3. web:
  4. build: .
  5. ports:
  6. - "5000:5000"
  7. volumes:
  8. - .:/code
  9. environment:
  10. FLASK_ENV: development
  11. redis:
  12. image: "redis:alpine"

 新volumes密钥将主机上的项目目录(当前目录)挂载到/code容器内部,允许您即时修改代码,而无需重新构建映像。该environment键设置 FLASK_ENV环境变量,它告诉flask run在开发模式下运行,并重新加载更改代码。这种模式应该只在开发中使用。

第 6 步:使用 Compose 重新构建并运行应用程序


从您的项目目录中,键入docker-compose up以使用更新的 Compose 文件构建应用程序,然后运行它。

 

Hello World再次在 Web 浏览器中检查消息,然后刷新以查看计数增量。

共享文件夹、卷和绑定安装

  • 如果您的项目在Users目录 ( cd ~) 之外,那么您需要共享您正在使用的 Dockerfile 和卷的驱动器或位置。如果您收到表明未找到应用程序文件、卷安装被拒绝或服务无法启动的运行时错误,请尝试启用文件或驱动器共享。对于位于C:\Users(Windows) 或/Users(Mac)之外的项目,卷挂载需要共享驱动器,并且对于使用Linux 容器的Docker Desktop for Windows 上的任何项目都需要共享驱动器 。有关更多信息,请参阅Docker for Mac 上的文件共享,以及有关如何在容器中管理数据的一般示例 。

  • 如果您在较旧的 Windows 操作系统上使用 Oracle VirtualBox,您可能会遇到此VB 故障单 中所述的共享文件夹问题。较新的 Windows 系统满足Docker Desktop for Windows的要求,不需要 VirtualBox。

第 7 步:更新应用程序


由于应用程序代码现在使用卷挂载到容器中,因此您可以对其代码进行更改并立即查看更改,而无需重新构建映像。

更改问候语app.py并保存。例如,将Hello World! 消息更改为Hello from Docker!

return 'Hello from Docker! I have been seen {} times.\n'.format(count)

在浏览器中刷新应用程序。应该更新问候语,并且计数器应该仍在增加。 

 

第 8 步:尝试一些其他命令


如果您想在后台运行您的服务,您可以将-d标志(用于“分离”模式)传递给docker-compose up并用于docker-compose ps查看当前正在运行的内容:

  1. $ docker-compose up -d
  2. Starting composetest_redis_1...
  3. Starting composetest_web_1...
  4. $ docker-compose ps
  5. Name Command State Ports
  6. -------------------------------------------------------------------------------------
  7. composetest_redis_1 docker-entrypoint.sh redis ... Up 6379/tcp
  8. composetest_web_1 flask run Up 0.0.0.0:5000->5000/tcp

 该docker-compose run命令允许您为您的服务运行一次性命令。例如,要查看web服务可用的环境变量 :

 docker-compose run web env
  1. root@nano:/home/agilex/composetest# docker-compose run web env
  2. PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
  3. HOSTNAME=a1b76d133282
  4. TERM=xterm
  5. FLASK_ENV=development
  6. LANG=C.UTF-8
  7. GPG_KEY=0D96DF4D4110E5C43FBFB17F2D347EA6AA65421D
  8. PYTHON_VERSION=3.7.12
  9. PYTHON_PIP_VERSION=21.2.4
  10. PYTHON_SETUPTOOLS_VERSION=57.5.0
  11. PYTHON_GET_PIP_URL=https://github.com/pypa/get-pip/raw/3cb8888cc2869620f57d5d2da64da38f516078c7/public/get-pip.py
  12. PYTHON_GET_PIP_SHA256=c518250e91a70d7b20cceb15272209a4ded2a0c263ae5776f129e0d9b5674309
  13. FLASK_APP=app.py
  14. FLASK_RUN_HOST=0.0.0.0
  15. HOME=/root

请参阅docker-compose --help以查看其他可用命令。您还可以为bash 和 zsh shell安装命令完成,这也会显示可用的命令。

如果您使用 Compose 启动 Compose docker-compose up -d,请在完成服务后停止服务:

 docker-compose stop
  1. root@nano:/home/agilex/composetest# docker-compose stop
  2. Stopping composetest_web_1 ... done
  3. Stopping composetest_redis_1 ... done

 您可以使用以下down 命令将所有内容都关闭,完全删除容器。传递--volumes给 Redis 容器使用的数据卷:

docker-compose down --volumes
  1. root@nano:/home/agilex/composetest# docker-compose down --volumes
  2. Removing composetest_web_run_1 ... done
  3. Removing composetest_web_1 ... done
  4. Removing composetest_redis_1 ... done
  5. Removing network composetest_default
  6. root@nano:/home/agilex/composetest# docker ps
  7. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

至此,您已经了解了 Compose 工作原理的基础知识。 

小结


docker-compose能够同时运行多个容器和服务这一点是非常爽的,不用docker run一个一个运行了,项目化之后运行起来就很流畅。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/73541
推荐阅读
相关标签
  

闽ICP备14008679号