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

目录

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。

version: "3.9"  # optional since v1.27.0
services:
  web:
    build: .
    ports:
      - "5000:5000"
    volumes:
      - .:/code
      - logvolume01:/var/log
    links:
      - redis
  redis:
    image: redis
volumes:
  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、创建一个项目文件

mkdir composetest
cd composetest

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

import time

import redis
from flask import Flask

app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)

def get_hit_count():
    retries = 5
    while True:
        try:
            return cache.incr('hits')
        except redis.exceptions.ConnectionError as exc:
            if retries == 0:
                raise exc
            retries -= 1
            time.sleep(0.5)

@app.route('/')
def hello():
    count = get_hit_count()
    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并粘贴以下内容的文件:

# syntax=docker/dockerfile:1
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
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在您的项目目录中创建一个名为的文件并粘贴以下内容:

version: "3.9"
services:
  web:
    build: .
    ports:
      - "5000:5000"
  redis:
    image: "redis:alpine"

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

网络服务

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

Redis服务

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

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


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

 docker-compose up

Creating network "composetest_default" with the default driver
Creating composetest_web_1 ...
Creating composetest_redis_1 ...
Creating composetest_web_1
Creating composetest_redis_1 ... done
Attaching to composetest_web_1, composetest_redis_1
web_1    |  * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
redis_1  | 1:C 17 Aug 22:11:10.480 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
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
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
web_1    |  * Restarting with stat
redis_1  | 1:M 17 Aug 22:11:10.483 * Running mode=standalone, port=6379.
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.
web_1    |  * Debugger is active!
redis_1  | 1:M 17 Aug 22:11:10.483 # Server initialized
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服务:

version: "3.9"
services:
  web:
    build: .
    ports:
      - "5000:5000"
    volumes:
      - .:/code
    environment:
      FLASK_ENV: development
  redis:
    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查看当前正在运行的内容:

$ docker-compose up -d

Starting composetest_redis_1...
Starting composetest_web_1...

$ docker-compose ps

       Name                      Command               State           Ports         
-------------------------------------------------------------------------------------
composetest_redis_1   docker-entrypoint.sh redis ...   Up      6379/tcp              
composetest_web_1     flask run                        Up      0.0.0.0:5000->5000/tcp

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

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

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

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

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

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

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

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

小结


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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

静·无羡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值