返回顶部
首页 > 资讯 > 后端开发 > Python >Docker-client for python是怎么使用的
  • 189
分享到

Docker-client for python是怎么使用的

2023-06-19 10:06:18 189人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

本篇文章为大家展示了Docker-client for python是怎么使用的,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Docker-client for Python使用:客户端初始化的三种

本篇文章为大家展示了Docker-client for python是怎么使用的,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

Docker-client for Python使用:

客户端初始化的三种方法

import dockerdocker.api()docker.APIClient()docker.client()docker.DockerClient() 其实也是docker.client()的一个子集docker.from_env() 其实就是docker.client()的一个子集

一、初始化客户端

1.Docker客户端的初始化工作

>>> import docker>>> client = docker.APIClient(base_url='unix://var/run/docker.sock’,version='1.21',timeout=5)>>> client.version(){u'ApiVersion': u'1.21’, u'Arch': u'amd64', u'BuildTime': u'2016-09-27T23:38:15.810178467+00:00', u'Experimental': True, u'gitCommit': u'45bed2c', u'GoVersion': u'go1.6.3', u'KernelVersion': u'4.4.22-moby', u'Os': u'linux', u'Version': u'1.12.2-rc1'}
   Args:      base_url (str): 指定链接路径,可以通过Socket或者tcp方式链接          ``unix:///var/run/docker.sock`` or ``tcp://127.0.0.1:1234``.      version (str): 指定API使用的版本(docker=2.0.0默认的api版本是1.24,最低支持1.21,docker1.9+的api是1.21),因此在使用python的docker模块时一定要注意docker的api以及docker模块的api是否兼容。当然如果设置为 ``auto`` 降回去自动检测server的版本      timeout (int): 使用API调用的默认超时时间,默认单位为秒      tls (bool or :py:class:`~docker.tls.TLSConfig`): Enable TLS. Pass          ``True`` to enable it with default options, or pass a          :py:class:`~docker.tls.TLSConfig` object to use custom          configuration.

查看docker引擎当前版本:

$ sudo docker versionClient: Version:      1.9.1 API version:  1.21 Go version:   go1.4.3 Git commit:   a34a1d5-dirty Built:        Tue Mar 28 15:39:19 UTC 2017 OS/Arch:      linux/amd64Server: Version:      1.9.1 API version:  1.21 Go version:   go1.4.3 Git commit:   a34a1d5-dirty Built:        Tue Mar 28 15:39:19 UTC 2017 OS/Arch:      linux/amd64

The sdk of docker for python--docker==2.0.0:

1.丢弃了python2.6的支持2.最低支持API版本为1.12(Engine version 1.9.0+)3.`docker.Client`被替换成`docker.APIClient`4.`docker.from_env`初始化一个docker客户端实例代替了`APIClient `实例 5.从`APIClient.start`中移除了HostConfig参数6.开始由之前的docker-py模块变为docker7.`docker.ssladapter`替换为`docker.transport.ssladapter`

2.Docker客户端的具体方法

import dockerC  = docker.DockerClient(base_url='unix://var/run/docker.sock',version='auto',timeout=10)##docker相关的方法使用使用DockerClient对象,会有以下方法:C.api,C.containers,C.events,C.from_env,C.images,C.info,C.login,C.networks,C.nodes,C.ping,C.services,C.swarm,C.version,C.volumes,#输出docker的相关信息,相当于docker infoC.info()

二、api方法使用示例

1. login方法定义

C.login()login(*args, **kwargs) method of docker.client.DockerClient instance    Authenticate with a reGIStry. Similar to the ``docker login`` command.        Args:        username (str): The registry username        passWord (str): The plaintext password        email (str): The email for the registry account        registry (str): URL to the registry.  E.g.            ``https://index.docker.io/v1/``        reauth (bool): Whether refresh existing authentication on the            Docker server.        dockercfg_path (str): Use a custom path for the ``.dockercfg`` file    (default ``$HOME/.dockercfg``)        Returns:返回的错误日志信息        (dict): The response from the login request          Raises:        :py:class:`docker.errors.APIError`            If the server returns an error.##使用login方法登录C.login('xxbandy123','nslalla')

2.images 类定义:

build方法get方法:get(self, name)    Gets an image.        Args:        name (str): The name of the image.        Returns:        (:py:class:`Image`): The image.        Raises:        :py:class:`docker.errors.ImageNotFound` If the image does not        exist.        :py:class:`docker.errors.APIError`            If the server returns an error.list方法:   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.

示例:

查看默认所有的镜像文件,以image-id进行区分In [34]: C.images.list()Out[34]: [<Image: 'busybox:latest'>, <Image: '172.24.254.235:5010/rancher-server:latest', 'rancher/server:latest'>, <Image: '172.24.254.235:5010/jdsingleuser:latest'>, <Image: 'registry:2'>, <Image: '172.24.254.235:5010/rancher-agent:latest', 'rancher/agent:v1.0.2'>]
load方法:相当于docker loadpull方法:下载镜像文件 pull(self, name, **kwargs)    Pull an image of the given name and return it. Similar to the    ``docker pull`` command.        If you want to get the raw pull output, use the    :py:meth:`~docker.api.image.ImageApiMixin.pull` method in the    low-level API.        Args:        repository (str): The repository to pull        tag (str): The tag to pull        insecure_registry (bool): Use an insecure registry        auth_config (dict): Override the credentials that            :py:meth:`~docker.client.DockerClient.login` has set for            this request. ``auth_config`` should contain the ``username``            and ``password`` keys to be valid.        Returns:        (:py:class:`Image`): The image that has been pulled.需要注意的是:使用pull的时候,会弱匹配所有的tag标签push方法:上传镜像文件push(self, repository, tag=None, **kwargs)    Push an image or a repository to the registry. Similar to the ``docker    push`` command.        Args:        repository (str): The repository to push to        tag (str): An optional tag to push        stream (bool): Stream the output as a blocking generator        insecure_registry (bool): Use ``Http://`` to connect to the            registry        auth_config (dict): Override the credentials that            :py:meth:`~docker.api.daemon.DaemonApiMixin.login` has set for            this request. ``auth_config`` should contain the ``username``            and ``password`` keys to be valid.        Returns:        (generator or str): The output from the server.        Raises:        :py:class:`docker.errors.APIError`remove方法:docker rmi  remove(self, *args, **kwargs)    Remove an image. Similar to the ``docker rmi`` command.        Args:        image (str): The image to remove        force (bool): Force removal of the image        noprune (bool): Do not delete untagged parentssearch方法:search(self, *args, **kwargs)    Search for images on Docker Hub. Similar to the ``docker search``    command.        Args:        term (str): A term to search for.        Returns:        (list of dicts): The response of the search.

3.docker管理容器相关

C.containers类,下面有相关的方法:

client,create,get,list,model,run

列出当前存活的容器:

C.containers.list()

列出指定容器:

C.containers.get('')

创建容器:

C.containers.createcreate(image, command=None, **kwargs) method of docker.models.containers.ContainerCollection instance    Create a container without starting it. Similar to ``docker create``.        Takes the same arguments as :py:meth:`run`, except for ``stdout``,    ``stderr``, and ``remove``.        Returns:        A :py:class:`Container` object.        Raises:        :py:class:`docker.errors.ImageNotFound`            If the specified image does not exist.        :py:class:`docker.errors.APIError`            If the server returns an error.run一个容器:类似于命令行的docker run方法run(image, command=None, stdout=True, stderr=False, remove=False, **kwargs) method of docker.models.containers.ContainerCollection instance    Run a container. By default, it will wait for the container to finish    and return its logs, similar to ``docker run``.        如果'detach'参数设置为'True',他将立即返回一个Container对象,类似于'docker run -d'        实例:        运行一个容器并获取输出。            >>> import docker        >>> client = docker.from_env()        >>> client.containers.run('alpine', 'echo hello world')        b'hello world\n'            后台运行一个容器:        >>> container = client.containers.run('bfirsh/reticulate-splines',                                              detach=True)        获取该容器的日志信息        >>> container.logs()        'Reticulating spline 1...\nReticulating spline 2...\n'   参数介绍:        image (str): run一个容器所需要的镜像(str类型)        command (str or list): 容器启动默认运行的命令(字符串或者列表类型).        blkio_weight_device: 设置设备Block IO 权重:``[{"Path": "device_path", "Weight": weight}]``.        blkio_weight: 设置block IO 的权重 范围10-1000.        cap_add (list of str): 增加内核特性 比如:``["SYS_ADMIN", "MKNOD"]``.        cap_drop (list of str): 删除内核特性        cpu_group (int): 每颗cpu的长度        cpu_period (int): 容器在每一个cpu的时间周期内可以得到多少的的cpu时间(ms)        cpu_shares (int): 共享cpu权重CPU 相对权重        cpuset_cpus (str): 绑定cpu的执行 (``0-3``,``0,1``).        detach (bool): 后台运行一个容器,布尔类型值.相当于docker run -d选项        device_read_bps: 从一个设备上限制读速率(bytes/s) `[{"Path": "device_path", "Rate": rate}]`        device_read_iops: 从一个设备中限制读取速率(IO/s)        device_write_bps: 从一个设备上限制写速率(bytes/s)        device_write_iops: 从一个设备中限制读取速率(IO/s)        devices (list): 映射主机的设备到容器中``<path_on_host>:<path_in_container>:<cgroup_permissions>``.        dns (list): 配置当前的dns-server        dns_opt (list): 添加额外的dns参数选项到容器内部,比如resolv.conf文件        dns_search (list): 设置dns搜索域        domainname (str or list): 设置当前dns搜索域名        entrypoint (str or list): 为容器设置入口,覆盖镜像中的entrypoint        environment (dict or list): 内部环境变量["SOMEVARIABLE=xxx"]``        extra_hosts (dict): 在容器内部添加额外的主机名解析(本地hosts文件)        group_add (list): 设置容器内部进程运行时额外的组名(gid)        hostname (str): 容器设置额外的主机名.相当于docker run -h/--hostname 选项        ipc_mode (str): 为容器设置ipc模式        isolation (str): 隔离技术的使用Default: `None`.        labels (dict or list): 一个k/v类型的标签存储``{"label1": "value1", "label2": "value2"}``)或一个列表类型的k/v存储``["label1", "label2"]``        links (dict or list of tuples): 为容器映射一个别名``(name, alias)``         log_config (dict): 容器的日志配置。            keys:            - ``type`` The logging driver name.            - ``config`` A dictionary of configuration for the logging              driver.        Mac_address (str): 绑定mac地址.        mem_limit (float or str): 内存限制,允许浮点型数据或单位区分的字符串(``100000b``, ``1000k``, ``128m``, ``1g``). 如果一个字符串没有指定单位,默认会使用字节(bytes)        mem_limit (str or int): 容器可以使用的最大内存数量(e.g. ``1G``).        mem_swappiness (int): 调整容器内存的swappiness行为状态,允许的数值为0-100         memswap_limit (str or int): 最大内存限制,容器可用的内存为(memory+swap)        networks (list): 设置连接到该容器网络的名称        name (str): 为容器设置名字        network_disabled (bool): 禁用容器网络        network_mode (str): 网络模式 相当于docker run --net='none'                - ``bridge`` 默认使用桥接模式            - ``none`` 无网络模式            - ``container:<name|id>`` 重用另外一个容器的网络            - ``host`` 使用本机的网络栈        oom_kill_disable (bool): 是否启用OOM        oom_score_adj (int): 一个整数,以调整OOM的整体性能.        pid_mode (str): pid模式,如果设置为'host',在容器内部将会使用宿主机的host pid        pids_limit (int): 调整容器的pid的限制。'-1'表示不限制        ports (dict): 为容器内部绑定端口 相当于docker run -p     实例:              ``{'2222/tcp': 3333}`` 暴露容器内部的2222端口到本机的3333端              ``{'2222/tcp': None}`` 将容器内部的2222随机映射到本机              ``{'1111/tcp': ('127.0.0.1', 1111)}``.              ``{'1111/tcp': [1234, 4567]}`` 绑定多个端口privileged (bool): 给容器额外的特权        publish_all_ports (bool): 开放所有的端口到本机上 相当于docker run -P         read_only (bool): 以只读方式挂载容器的根文件系统        remove (bool): 当容器退出的时候删除,默认是'False'        restart_policy (dict): 当容器退出时重启容器            配置参数如下:            - ``Name`` One of ``on-failure``, or ``always``.            - ``MaximumRetryCount`` 容器失败多少次后进行重启            实例:            ``{"Name": "on-failure", "MaximumRetryCount": 5}``            security_opt (list): 设置安全标签,类似于selinux        shm_size (str or int): /dev/shm 的大小(e.g. ``1G``).        stdin_open (bool): 保持 ``STDIN`` 打开即使没有attach到容器内部相当于docker run -i        stdout (bool): 当detach=False的时候,从'STDOUT'返回日志。默认为True        stdout (bool): 当detach=False的时候,从'STDERR'返回日志,默认为False        stop_signal (str): 设置用于停止容器的信号。(e.g. ``SIGINT``).        sysctls (dict): 容器内部设置内核参数        tmpfs (dict): 挂载临时文件系统                         .. code-block:: python                    {                    '/mnt/vol2': '',                    '/mnt/vol1': 'size=3G,uid=1000'                }            tty (bool): 分配一个tty 相当于docker run -t        ulimits (list): 在容器内部设置ulimits值,一个字典类型的列表        user (str or int): 设置容器启动的用户名以及id        userns_mode (str): 为容器设置用户的命名空间模式,当用户的namespace的remapping参数被启用的时候,支持参数有'host'            values are: ``host``        volume_driver (str): 数据卷挂载驱动名        volumes (dict or list): 一个字典配置,将外部数据卷挂载到容器内部,key是主机或者数据卷的名字,value是带有key的字典:        实例:                {'/home/user1/': {'bind': '/mnt/vol2', 'mode': 'rw'},                 '/var/www': {'bind': '/mnt/vol1', 'mode': 'ro'}}            volumes_from (list): 获取容器名或者id标识。        working_dir (str): 容器默认的工作目录        返回参数:        容器的日志,包含 ``STDOUT``, ``STDERR``        If ``detach`` is ``True``, a :py:class:`Container` object is        returned instead.        异常信息:    如果容器以非0状态退出,或者`detach`参数为`False`        :py:class:`docker.errors.ContainerError`        如果指定的镜像不存在        :py:class:`docker.errors.ImageNotFound`        如果是服务返回一个错误        :py:class:`docker.errors.APIError`            If the server returns an error.

示例: 一个完成的创建容器的基本粒子:

Command line:$ docker run -itd -P --cpuset_cpus='0,1' --cpu_shares=2 --cpu_period=10000 --hostname=xxbandy --mem_limit=512m --net=none --oom_kill_disable=True -P -u admin busybox /bin/shPython API:c1 = C.containers.run('busybox',command='/bin/sh',name='xxb-test',detach=True,tty=True,stdin_open=True,cpuset_cpus='0,1',cpu_shares=2,cpu_period=10000,hostname='xxbandy',mem_limit='512m',network_mode='none',oom_kill_disable=True,publish_all_ports=True,user='root')查看容器相关信息:容器id,64位的字符In [20]: c1.idOut[20]: '499db0824206d61d09db2f36c70aa84bdb1a4b6d508b001a618d2010a23fea7e'c1.logs c1.name      获取容器名信息c1.reloadc1.remove    删除容器信息,相当于docker rm 参数:c1.remove(v=True,link=True,force=True)c2.rename 重命名容器名,相当于docker renmame oldname newnamec1.resize 设置tty session信息c1.restart   重启容器信息c1.start     启动容器信息c1.stats     容器状态c1.update    动态调整容器内部信息(blkio_weight,cpu_period,cpu_quota,cpu_shares,cpuset_cpus,cpuset_mems,mem_limit,mem_reservation)    Args:        blkio_weight (int): 块IO权重比例(10-100)        cpu_period (int): 限制cpu公平调度周期        cpu_quota (int): 限制cpu公平调度配额        cpu_shares (int): 设置cpu共享权重        cpuset_cpus (str): 指定cpu执行(0-3, 0,1)        cpuset_mems (str): 指定cpu内存的执行(0-3, 0,1)        mem_limit (int or str): 内存限制        mem_reservation (int or str): 内存软限制        memswap_limit (int or str): swap限制总的可使用内存限制(memory + swap),-1表示关闭swap        kernel_memory (int or str): 内核内存限制        restart_policy (dict): 重启策略

注意:update方法在docker1.10之后才增加了改功能

查看容器相关信息:容器id,64位的字符In [20]: c1.idOut[20]: '499db0824206d61d09db2f36c70aa84bdb1a4b6d508b001a618d2010a23fea7e'可以在/sys/fs/cgroup/memory/docker目录下面查看到每个容器的相关cgroup配置信息。查看内存信息:# grep hierarchical memory.stat     分别显示容器的内存限制和swap限制hierarchical_memory_limit 536870912hierarchical_memsw_limit 1073741824#cat memory.limit_in_bytes536870912可以在/sys/fs/cgroup/cpuset/docker目录下面查看到容器cpu的相关配置# cat cpuset.cpus       显示当前绑定的cpu信息0-1使用docker update动态调整内存信息:docker update -m 1024M xuxuebiao-test# cat memory.limit_in_bytes 1073741824# grep hierarchical_memory_limit memory.stat hierarchical_memory_limit 1073741824

上述内容就是Docker-client for python是怎么使用的,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注编程网Python频道。

--结束END--

本文标题: Docker-client for python是怎么使用的

本文链接: https://lsjlt.com/news/295394.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Docker-client for python是怎么使用的
    本篇文章为大家展示了Docker-client for python是怎么使用的,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Docker-client for python使用:客户端初始化的三种...
    99+
    2023-06-19
  • redis中client的使用方法是什么
    在Redis中使用client可以通过Redis客户端或者Redis命令行进行操作。下面是一些常见的Redis客户端和命令行使用方法...
    99+
    2024-04-09
    redis
  • HTTP Client怎么在IDEA中使用
    今天就跟大家聊聊有关HTTP Client怎么在IDEA中使用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。介绍IDEA RESTful WebServices是一个类似jmeter...
    99+
    2023-06-06
  • elasticsearch Client怎么在golang中使用
    今天就跟大家聊聊有关elasticsearch Client怎么在golang中使用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。什么是golanggolang 是Google开发的...
    99+
    2023-06-14
  • Python全栈的for循环怎么使用
    这篇文章主要介绍“Python全栈的for循环怎么使用”,在日常操作中,相信很多人在Python全栈的for循环怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python全栈的for循环怎么使用”的疑...
    99+
    2023-06-21
  • redis中client的作用是什么
    在 Redis 中,client 是指与 Redis 服务器建立连接并与之通信的实体。客户端可以是由 Redis 客户端库创建的应用...
    99+
    2024-03-15
    redis
  • Docker容器使用过程是怎么样的
    今天就跟大家聊聊有关Docker容器使用过程是怎么样的,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Docker 容器使用Docker 客户端docker 客户端非常简单 ,我们可以...
    99+
    2023-06-06
  • Docker for Windows 使用 VMware WorkStation的详细教程
    目录一.前言二.安装Docker for Windows1.下载Docker for Windows2.安装以后的准备三.准备工作1.下载boot2docker.iso2.下载 VM...
    99+
    2024-04-02
  • 怎么在python中使用for…in循环
    这期内容当中小编将会给大家带来有关怎么在python中使用for…in循环,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。python可以做什么Python是一种编程语言,内置了许多有效的工具,Python...
    99+
    2023-06-14
  • python中append怎么在for循环使用
    在Python中,可以通过使用append()方法将元素添加到列表中。在for循环中使用append()方法的一种常见方法是将循环变...
    99+
    2023-10-18
    python
  • 怎么使用Docker UI
    这篇文章主要为大家展示了“怎么使用Docker UI”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“怎么使用Docker UI”这篇文章吧。Docker提供一个平台来把应用程序当作容器来打包、分发...
    99+
    2023-06-04
  • docker compose怎么使用
    这篇文章主要介绍“docker compose怎么使用”,在日常操作中,相信很多人在docker compose怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”docker ...
    99+
    2023-06-30
  • 怎么在Docker中使用Docker命令
    这篇文章主要介绍“怎么在Docker中使用Docker命令”,在日常操作中,相信很多人在怎么在Docker中使用Docker命令问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么在Docker中使用Docke...
    99+
    2023-06-15
  • python for循环怎么用
    for 循环是一种用于遍历序列中每个元素的迭代结构。它的语法为:for variable in sequence:循环体(在每次迭代中执行)如果未被终止,则执行 else 子句(可选) ...
    99+
    2024-05-22
    python 可迭代对象
  • Python for循环的使用(三)
    Python for循环的使用 (一)for循环的使用场景 1.如果我们想要某件事情重复执行具体次数的时候可以使用for循环。 2.for循环主要用来遍历、循环、序列、集合、字典,文件、甚至是自定义类或函数。 (二)f...
    99+
    2023-01-31
    Python
  • docker的常用命令怎么使用
    这篇文章主要介绍“docker的常用命令怎么使用”,在日常操作中,相信很多人在docker的常用命令怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”docker的常用命令怎么使用”的疑惑有所帮助!接下来...
    99+
    2023-07-06
  • Linux的docker命令怎么使用
    这篇文章主要介绍“Linux的docker命令怎么使用”,在日常操作中,相信很多人在Linux的docker命令怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux的docker命令怎么使用”的疑...
    99+
    2023-06-28
  • Docker的基本使用方法是什么
    这篇文章主要介绍“Docker的基本使用方法是什么”,在日常操作中,相信很多人在Docker的基本使用方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Docker的基本使用方法是什么”的疑惑有所帮助!...
    99+
    2023-06-27
  • 怎么使用Java的For循环
    这篇文章主要介绍“怎么使用Java的For循环”,在日常操作中,相信很多人在怎么使用Java的For循环问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么使用Java的For...
    99+
    2024-04-02
  • C++中的for auto怎么使用
    本篇内容主要讲解“C++中的for auto怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++中的for auto怎么使用”吧!C++中for auto的用法for...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作