Docker-py 的使用

简介:

Docker SDK for Python

A Python library for the Docker Engine API
具体文档这里,https://docker-py.readthedocs.io/en/stable/index.html

先说明一下,需求是通过python 调用docker daemon,做到启动一个人服务或者容器,去运行一个程序。
话不多说,先贴上使用容器部分的代码

import docker

cli = docker.from_env()  # 使用本地的docker deamon
py_container = cli.containers.run(  #运行一个容器
        image='python:3',
        command='python hello.py',
        volumes={'/opt/':{'bind':'/opt','mode':'rw'}},
        name='helloworld-dockerpy1',
        working_dir='/opt',
        detach=True,
        stdout=True,
        stderr=True,
        user='root',
        remove=False
)
def wait_container():  #判断容器退出后,提取log
        if py_container in cli.containers.list(filters={'status':'exited'}):
                with open('/tmp/py_log.txt', 'a') as f:
                        f.write(str(py_container.logs()))
        else:
                wait_container()

wait_container()
print(str(py_container.logs()))
py_container.remove()
下面是使用服务的部分代码

还没有解决判断service中容器状态的参数,还在学习APIClient这个调用本地docker daemon的方法。如有大神,请留言教导我。

import docker

cli = docker.from_env()

py_service = cli.services.create(
        image='python:3',
        name='py_service1',
        command='python hello.py',
        mounts={'/opt:/opt:rw'},
        workdir='/opt',
        user='root'
)
time.sleep(30)
logs = py_service.logs(stdout='True')
for l in logs:
        len1 = len(l)
        if len1 == 0:
                print('null')
        else:
                print(len1)
                print(str(l,encoding='utf-8'))
py_service.remove()

下面这段是从本地的docker日志存放目录中提取日志,相对于上一种,这种方法很大弊端在于使用service的使用,容器是运行在swarm中的,不一定就运行在本地的swarm节点上。这样就无法提取日志了。

import docker
import time

cli = docker.from_env()
py_service2 = cli.services.create(
        image='python:3',
        name='py_service2',
        command='python hello.py',
        mounts={'python_test:/opt:rw'},
        workdir='/opt',
        user='root'
)

time.sleep(10)
def service_log():
        attempts = 100
        while True:
                if attempts == 0:
                        print('No service logs produced by endpoint')
                        return
                logs = py_service2.logs(stdout='True')
                try:
                        log_line = next(logs)
                except StopIteration:
                        attempts -= 1
                        time.sleep(0,1)
                        continue
                else:
                        break
def print_log():
        i = 0
        while i < 2:
                i+=1
                list = py_service2.tasks(filters={'desired-state':'shutdown','name':'py_service2'})
                logs = py_service2.logs(stdout='True')
                time.sleep(5)
        container_id = list[0]['Status']['ContainerStatus']['ContainerID']
        print(container_id)
        container_log = '/var/lib/docker/containers/'+ container_id +'/'+container_id + '-json.log'
        all_the_text = open(container_log).read()
        print(all_the_text)

print_log()
py_service2.remove()
目录
相关文章
|
2天前
|
存储 Docker 容器
docker中挂载数据卷到容器
【10月更文挑战第12天】
14 5
|
7天前
|
存储 运维 云计算
探索Docker容器化:从入门到实践
在这个快速发展的云计算时代,Docker容器化技术正在改变应用的开发、部署和管理方式。本文旨在为初学者提供一个关于Docker的全面入门指南,并通过实践案例展示Docker在实际开发中的应用。我们将一起了解Docker的核心概念、基本操作、网络和存储,以及如何构建和部署一个简单的Web应用。无论你是开发者还是运维人员,本文都会帮助你快速掌握Docker的核心技能。
|
3天前
|
存储 测试技术 开发者
docker中将数据卷挂载到容器
【10月更文挑战第11天】
15 3
|
3天前
|
存储 应用服务中间件 云计算
深入解析:云计算中的容器化技术——Docker实战指南
【10月更文挑战第14天】深入解析:云计算中的容器化技术——Docker实战指南
16 1
|
8天前
|
运维 JavaScript 虚拟化
探索容器化技术:Docker的实践与应用
【10月更文挑战第9天】探索容器化技术:Docker的实践与应用
33 3
|
9天前
|
安全 Cloud Native Shell
云上攻防:云原生篇&Docker容器逃逸
本文介绍了Docker的基本概念及其对渗透测试的影响,重点讲解了容器逃逸的方法。Docker是一种轻量级的容器技术,与虚拟机相比,具有更高的便携性和资源利用率。然而,这也带来了安全风险,特别是容器逃逸问题。文章详细描述了三种常见的容器逃逸方法:不安全的配置、相关程序漏洞和内核漏洞,并提供了具体的检测和利用方法。此外,还介绍了几种特定的漏洞(如CVE-2019-5736和CVE-2020-15257)及其复现步骤,帮助读者更好地理解和应对这些安全威胁。
云上攻防:云原生篇&Docker容器逃逸
|
12天前
|
网络协议 网络安全 Docker
docker容器间无法通信
【10月更文挑战第4天】
27 3
|
11天前
|
Docker 容器
docker中检查容器的网络模式
【10月更文挑战第5天】
21 1
|
12天前
|
网络协议 Shell 网络安全
docker容器网络问题
【10月更文挑战第4天】
26 2
|
13天前
|
存储 持续交付 开发者
掌握Docker容器化:提升开发效率与应用部署
【10月更文挑战第4天】在现代软件开发中,Docker容器化技术因其轻量级、可移植和快速部署的特点,成为提升开发效率和简化部署流程的关键工具。本文介绍了Docker的基本概念、核心组件及其优势,并探讨了如何在开发环境中搭建、微服务架构及CI/CD流程中有效利用Docker,助力软件开发更加高效便捷。