dockerpy
本文最后更新于:2 年前
Docker-py
使用python第三方库docker-py操作docker
docker-py的地址:https://github.com/docker/docker-py
配置环境
1.安装docker-py
pip安装即可,安装最新版
pip install docker
2.配置docker
本文使用的是Docker Desktop,docker版本是20.10.12
docker开启远程访问
对于Docker Desktop来说,开启远程访问很简单,只需要再settings中选中如下配置项
对于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标准
查看当前版本:http://IP:2375/version
查看所有镜像信息:http://IP:2375/images/json
查看已启动容器信息:http://127.0.0.1:2375/containers/json
查看网卡信息: http://127.0.0.1:2375/networks/
遇到的问题
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"
]
}
docker配置软链接
由于Docker Desktop默认安装在C盘,所以下载的镜像也都保存在C盘,由于镜像文件一般很大,很容易爆盘,所以需要为保存镜像的文件夹创建一个软链接,将镜像保存到其他盘。参考
请务必先关闭docker 或者docker desktop
- 通过Everything或者资源管理器找到以.vhdx结尾的文件所在的位置,这些就是docker镜像路径:
- 将.vhdx复制到想要的路径下,本文路径为:
删除源文件夹,本文是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等操作
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)
get()
该函数只有一个参数name,镜像名称
获取指定名称的镜像
import docker
client = docker.from_env()
mysqlImage = client.images.get("mysql")
print(mysqlImage)
search()
与docker search 命令相同
searchList = client.images.search("nginx")
print(searchList)
pull()
作用等同于docker pull
client.images.pull("nginx")
container相关操作
容器相关的操作很多
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) # 获取容器的详细信息
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:
打包镜像
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
会导致启动容器后自动退出无法使用,原因可能如下
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 协议 ,转载请注明出处!