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()
目录
相关文章
|
21天前
|
Docker 容器
进入Docker容器中
进入Docker容器中
34 2
|
1月前
|
Java Go 开发者
Docker容器技术简介及其与Go语言的结合点
【2月更文挑战第23天】本文首先概述了Docker容器技术的核心概念和优势,接着探讨了Go语言与Docker容器技术的结合点。通过阐述Docker的轻量级、可移植性和版本控制等特性,以及Go语言在容器化应用中的优势,本文旨在说明两者结合能够实现更高效、灵活的应用开发和部署。
|
1月前
|
Oracle 关系型数据库 数据库
|
1天前
|
存储 运维 监控
构建高效稳定的Docker容器监控体系
【4月更文挑战第18天】 在现代微服务架构中,Docker容器已成为部署和运行应用的标准环境。随之而来的挑战是如何有效监控这些容器的性能与健康状况,确保系统的稳定性和可靠性。本文将探讨构建一个高效稳定的Docker容器监控体系的关键技术和方法,包括日志管理、性能指标收集以及异常检测机制,旨在为运维人员提供实用的指导和建议。
7 0
|
10天前
|
Linux Docker 容器
docker 容器常用命令
docker 容器常用命令
12 0
|
10天前
|
Linux Shell 虚拟化
linux 部署docker容器虚拟化平台(二)--------docker 镜像制作方法
linux 部署docker容器虚拟化平台(二)--------docker 镜像制作方法
15 0
|
10天前
|
存储 Linux Shell
centos 部署docker容器 安装 、基本使用方法(一)
centos 部署docker容器 安装 、基本使用方法(一)
19 0
|
18天前
|
Kubernetes 网络协议 Docker
Docker 容器的DNS
Docker 容器的DNS
23 1
|
21天前
|
关系型数据库 MySQL Nacos
【深入浅出Nacos原理及调优】「实战开发专题」采用Docker容器进行部署和搭建Nacos服务以及“坑点”
【深入浅出Nacos原理及调优】「实战开发专题」采用Docker容器进行部署和搭建Nacos服务以及“坑点”
45 1
|
22天前
|
NoSQL 关系型数据库 MySQL
安装Docker&镜像容器操作&使用Docker安装部署MySQL,Redis,RabbitMQ,Nacos,Seata,Minio
安装Docker&镜像容器操作&使用Docker安装部署MySQL,Redis,RabbitMQ,Nacos,Seata,Minio
102 1