dockerpy

本文最后更新于:2 年前

Docker-py

使用python第三方库docker-py操作docker

docker-py的地址:https://github.com/docker/docker-py

配置环境

1.安装docker-py

​ pip安装即可,安装最新版

pip install docker

image-20220515135319833

2.配置docker

本文使用的是Docker Desktop,docker版本是20.10.12

image-20220515135534992

docker开启远程访问

对于Docker Desktop来说,开启远程访问很简单,只需要再settings中选中如下配置项

image-20220515140305267

对于linux中配置远程访问就稍微麻烦一点

方法一

在/usr/lib/systemd/system/docker.service,配置远程访问。

主要是在[Service]这个部分,加上下面两个参数

# vim /usr/lib/systemd/system/docker.service
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock

重启

systemctl daemon-reload
systemctl restart docker

方法二

修改daemon.json的配置

vim /etc/docker/daemon.json

{
  "hosts": ["tcp://0.0.0.0:2375", "unix:///var/run/docker.sock"]
}

“unix:///var/run/docker.sock”:unix socket,本地客户端将通过这个来连接 Docker Daemon。
“tcp://0.0.0.0:2375”:tcp socket,表示允许任何远程客户端通过 2375 端口连接 Docker Daemon。

修改配置以后

然后让docker重新读取配置文件,并重启docker服务

systemctl daemon-reload
systemctl restart docker

查看docker进程:

[root@slaver2 ~]# ps -ef|grep docker
root      44221      1  1 18:16 ?        00:00:06 /usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock

Docker守护进程打开一个HTTP Socket,这样才能实现远程通信

当开启远程访问后,可以再浏览器中查看docker服务器上的相关信息,并且该API遵循RESTful API标准

遇到的问题

Docker Desktop与VM冲突

需要注意的是,安装Docker Desktop 后VM就无法使用,原因:

1、Device Guard或Credential Guard与Workstation不兼容。

2、Windows系统的Hyper-V不兼容导致

解决方法如https://blog.csdn.net/qq_36761831/article/details/81175736

开启和关闭Hyper-V

bcdedit /set hypervisorlaunchtype auto
bcdedit /set hypervisorlaunchtype off

当需要使用VM时,执行关闭Hyper-V命令即可

配置国内镜像源

settings=>Dokcer engine修改配置内容

{
  "builder": {
    "gc": {
      "defaultKeepStorage": "20GB",
      "enabled": true
    }
  },
  "experimental": false,
  "features": {
    "buildkit": true
  },
  "registry-mirrors": [
    "https://registry.docker-cn.com",
    "http://hub-mirror.c.163.com",
    "https://docker.mirrors.ustc.edu.cn"
  ]
}

image-20220515141737016

docker配置软链接

由于Docker Desktop默认安装在C盘,所以下载的镜像也都保存在C盘,由于镜像文件一般很大,很容易爆盘,所以需要为保存镜像的文件夹创建一个软链接,将镜像保存到其他盘。参考

请务必先关闭docker 或者docker desktop

  • 通过Everything或者资源管理器找到以.vhdx结尾的文件所在的位置,这些就是docker镜像路径:

img

  • 将.vhdx复制到想要的路径下,本文路径为:

img

  • 删除源文件夹,本文是data文件夹

  • 以管理员运行cmd并且使用以下命令创建链接:

    mklink /J C:\Users\admin\AppData\Local\Docker\wsl\data   D:\docker\data

    请大家自行替换路径,本文路径分别为源路径:C:\Users\admin\AppData\Local\Docker\wsl\data

    以及想要移动的路径:D:\docker\data此时可以在源路径看到新建出来的文件夹

使用dockerpy

官方给出了详细的说明文档说明文档,下面只给出几个常见的操作

image相关操作

进入docker库的imges.py中可以看到与镜像相关的所有操作,包括在shell中使用的build、pull、push、search等操作

image-20220515144118231

list()

查看源码,可知有三个可选参数

def list(self, name=None, all=False, filters=None):
    """
    List images on the server.

    Args:
        name (str): Only show images belonging to the repository ``name``
        all (bool): Show intermediate image layers. By default, these are
            filtered out.
        filters (dict): Filters to be processed on the image list.
            Available filters:
            - ``dangling`` (bool)
            - ``label`` (str): format either ``key`` or ``key=value``

    Returns:
        (list of :py:class:`Image`): The images.

    Raises:
        :py:class:`docker.errors.APIError`
            If the server returns an error.
    """
    resp = self.client.api.images(name=name, all=all, filters=filters)
    return [self.get(r["Id"]) for r in resp]
获取所有镜像
import docker

client = docker.from_env()
imagesList = client.images.list()
print(imagesList)

image-20220515143446882

get()

该函数只有一个参数name,镜像名称

获取指定名称的镜像

import docker
client = docker.from_env()
mysqlImage = client.images.get("mysql")
print(mysqlImage)

与docker search 命令相同

searchList = client.images.search("nginx")
print(searchList)

image-20220515153818793

pull()

作用等同于docker pull

client.images.pull("nginx")

container相关操作

容器相关的操作很多

image-20220515161345640

run()

官方注释

Run a container. By default, it will wait for the container to finish
and return its logs, similar to ``docker run``.
// 
If the ``detach`` argument is ``True``, it will start the container
and immediately return a :py:class:`Container` object, similar to
``docker run -d``.
port_dict = {'2222/tcp': 3333}
image_name = nginx
client.containers.run(image_name, ports=port_dict, detach=True)  # 以守护进程的方式创建容器,容器停止后不会删除

```
- The port number, as an integer. For example,
``{'2222/tcp': 3333}`` will expose port 2222 inside the
container as port 3333 on the host.
- ``None``, to assign a random host port. For example,
``{'2222/tcp': None}``.
- A tuple of ``(address, port)`` if you want to specify the
host interface. For example,
``{'1111/tcp': ('127.0.0.1', 1111)}``.
- A list of integers, if you want to bind multiple host ports
to a single container port. For example,
``{'1111/tcp': [1234, 4567]}``.
```

get()

获取容器对象

docker_container_id = "236efe761aeb"
container = client.containers.get(docker_container_id)
print(container.id)
print(container.attrs) # 获取容器的详细信息

image-20220515163148958

exec()

进入容器内部执行命令,与下面的命令作用相同

docker exec -it containerID bash
command = 'touch /tmp/flag' 
port_dict = {'2222/tcp': 3333}
image_name = nginx
container = client.containers.run(image_name, ports=port_dict, detach=True)  
container.exec_run(command)

network相关操作

create

使用默认参数,桥接模式创建网卡

client.networks.create("net1", driver="bridge")

使用自定义IPAM配置创建更高级的网络。例如,将子网设置为192.168.52.0/24和网关地址为192.168.52.254

ipam_pool = docker.types.IPAMPool(
    subnet='192.168.52.0/24',
    gateway='192.168.52.254'
)
ipam_config = docker.types.IPAMConfig(
    pool_configs=[ipam_pool]
)

client.networks.create(
    "network1",
    driver="bridge",
    ipam=ipam_config
)

创建kali攻击机镜像

下载镜像

docker pull kalilinux/kali-rolling

查看下载的镜像

docker images

启动容器

docker run -itd -p 3399:3389 kalilinux/kali-rolling /bin/bash

查看容器id

docker ps

进入容器

docker exec -it id bash

安装基础环境包

❗需要关闭防火墙或者打开3399端口,否则无法连接

首先安装vim

apt-get -y update && apt-get -y upgrade
apt-get update --fix-missing	
apt-get install vim

修改镜像源

vim /etc/apt/sources.list

添加内容
deb http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib
deb-src http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib

安装基础环境包

apt-get -y update && apt-get -y upgrade && \
   DEBIAN_FRONTEND=noninteractive apt-get install -y \
   kali-tools-top10 \
   pciutils \
   iputils-ping \
   bash-completion && \
   apt-get autoremove -y && \
   apt-get clean

生成新镜像

待上面的所有程序安装完成后,打包生成新镜像

docker commit f16618e0fda5 kali-2021

远程桌面环境安装

使用新镜像启动容器

docker run -itd -p 3399:3389 kali-2021

进入镜像

docker exec -it id bash

安装桌面服务

kali-desktop-xfce :安装远程桌面环境

xrdp :远程桌面服务

xorg:xorg是x11的一个实现,xorg提供X server

apt-get update

apt-get -y install kali-desktop-xfce xorg xrdp

配置xrdp实现远程连接图形界面:

sed -i 's/port=3399/port=3389/g' /etc/xrdp/xrdp.ini
service xrdp restart

修改root用户密码:

passwd root


echo root:root|chpasswd

再次登录XRDP:

image-20220304155750507

打包镜像

docker commit id docker-attack

编写Dockerfile

因为启动容器后需要运行

sed -i 's/port=3399/port=3389/g' /etc/xrdp/xrdp.ini
service xrdp restart

所有使用Dockerfile完成这两步操作

FROM kali-attack:latest
COPY run.sh /home/run.sh
RUN chmod +x /home/run.sh
CMD ["/bin/bash","-c","/home/run.sh && tail -f /dev/null"]

没有tail -f /dev/null会导致启动容器后自动退出无法使用,原因可能如下

image-20220305103247695

run.sh中的内容,为启动容器后需要执行的两条命令

#!/bin/bash

sed -i 's/port=3399/port=3389/g' /etc/xrdp/xrdp.ini
wait
service xrdp restart

使用

docker build -t kali-attack2 .

创建镜像,之后创建容器

docker run -itd -p 3399:3389 kali-attack2

这样就可以直接使用mstvc.exe连接kali桌面

username:root
password:root

docker访问宿主机网络资源

解决方案

本文使用的的windows docker版本大于18.03可以直接使用host.docker.internal访问宿主机网络资源

其他操作系统的可以参考

docker容器安装vim出错

报错信息如下

ncurses-base : Breaks: libtinfo5 (< 6.1) but 6.0+20161126-1+deb9u2 is to be installed
E: Error, pkgProblemResolver::Resolve generated breaks, this may be caused by held packages.
E: Unable to correct dependencies

直接使用apt安装此包即可

apt update
apt upgrade
apt install vim

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!

 目录

Copyright © 2020 my blog
载入天数... 载入时分秒...