GVKun编程网logo

「Docker Context」- 使用单个客户端管理多个服务端节点 @20210221(一个docker 多个服务)

15

在本文中,我们将带你了解「DockerContext」-使用单个客户端管理多个服务端节点@20210221在这篇文章中,我们将为您详细介绍「DockerContext」-使用单个客户端管理多个服务端节

在本文中,我们将带你了解「Docker Context」- 使用单个客户端管理多个服务端节点 @20210221在这篇文章中,我们将为您详细介绍「Docker Context」- 使用单个客户端管理多个服务端节点 @20210221的方方面面,并解答一个docker 多个服务常见的疑惑,同时我们还将给您一些技巧,以帮助您实现更有效的20202216 2020-2021-2 《Python程序设计》实验四报告、20202421 2020-2021-2 《Python程序设计》期末实验报告、2021 docker安装宝塔面板、2021-04-06-初识Docker

本文目录一览:

「Docker Context」- 使用单个客户端管理多个服务端节点 @20210221(一个docker 多个服务)

「Docker Context」- 使用单个客户端管理多个服务端节点 @20210221(一个docker 多个服务)

问题描述

在 Docker 中,通过 Docker Context 特性,可以实现:使用本地 docker 命令,管理多个远程的 Docker 节点。而且不仅如此,还可以管理 Swarm 集群、Kubernetes 集群。当然,由于 Docker Context 在 Swarm 与 Kubernetes 中的应用较少,所以我们内容的重点也放在使用 Docker Context 管理多个 Docker 节点。

该笔记将记录:如何使用 docker context 管理其他 Docker 节点,以及常见问题处理。

# 02/19/2021 注意事项,虽然我们在这里演示使用 Docker Context 管理多个 Docker 节点,但是这只是为了让我们熟悉 Docker Context 的使用方法。而 Docker Context 具有很多其他的实际应用。比如在 Docker Buildx 中,通过 Docker Context 来选择构建节点。因此,不要局限于使用 Docker Context 在多个远程 Docker 节点中执行命令。本质上,它提供了一种连接和管理远程 Docker 服务的方法。

解决方案

首先,我们要检查本地 docker 客户端是否 Docker Context 命令。执行 docker context 命令,产生如下输出表示支持:

# docker context

Usage:  docker context COMMAND

Manage contexts

Commands:
  create      Create a context
  export      Export a context to a tar or kubeconfig file
  import      Import a context from a tar or zip file
  inspect     display detailed information on one or more contexts
  ls          List contexts
  rm          Remove one or more contexts
  update      Update a context
  use         Set the current docker context

Run 'docker context COMMAND --help' for more information on a command.

在实验环境中,有三台主机:
1)192.168.39.1 => 本地主机,laptop,运行 docker 命令的主机
2)192.168.122.59 => 实验主机,desktop-ubuntu-18-gnome
3)192.168.122.176 => 实验主机,desktop-debian-10-gnome

并且,两台实验主机都开启 TCP 监听(参考 Listen on Port 笔记),以允许远程主机访问。

现在,我们在本地主机中,顺序执行如下命令:

// 将 desktop-ubuntu-18-gnome 添加到 Context 中

# docker context create desktop-ubuntu-18-gnome --docker "host=tcp://192.168.122.59:2375"
desktop-ubuntu-18-gnome
Successfully created context "desktop-ubuntu-18-gnome"

// 将 desktop-debian-10-gnome 添加到 Context 中

# docker context create desktop-debian-10-gnome --docker "host=tcp://192.168.122.176:2375"
desktop-debian-10-gnome
Successfully created context "desktop-debian-10-gnome"

// 查看 Context 中的全部节点。其中星号(default *)表示当前 docker 客户端使用 defualt 节点,即当前主机的 Docker 服务 

# docker context ls
NAME                      DESCRIPTION                               DOCKER ENDPOINT               KUBERNETES ENDPOINT   orchestraTOR
default *                 Current DOCKER_HOST based configuration   unix:///var/run/docker.sock                         swarm
desktop-debian-10-gnome                                             tcp://192.168.122.176:2375                               
desktop-ubuntu-18-gnome                                             tcp://192.168.122.59:2375

// 切换到 desktop-debian-10-gnome 节点

# docker context use desktop-debian-10-gnome
desktop-debian-10-gnome
Current context is Now "desktop-debian-10-gnome"

// 再次查看 Context 中的全部节点,此时 desktop-debian-10-gnome * 为当前节点

# docker context ls
NAME                        DESCRIPTION                               DOCKER ENDPOINT               KUBERNETES ENDPOINT   orchestraTOR
default                     Current DOCKER_HOST based configuration   unix:///var/run/docker.sock                         swarm
desktop-debian-10-gnome *                                             tcp://192.168.122.176:2375                          
desktop-ubuntu-18-gnome                                               tcp://192.168.122.59:2375

// 接下来,我们通过 docker 中查看宿主机的主机名
// 此时,显示的主机名为 desktop-debian-10-gnome 而不是本地 laptop 主机名

# docker run --rm -t --network host alpine hostname
desktop-debian-10-gnome

使用 SSH 连接

在有些情况下,比如出于安全考虑,我们不希望暴露 Docker TCP 端口、或者不想修改 docker.service 配置。此时,可以使用 SSH 连接:

# docker context create desktop-ubuntu-18-gnome --docker "host=ssh://192.168.122.59"       
desktop-ubuntu-18-gnome                                                      
Successfully created context "desktop-ubuntu-18-gnome" 

但是,使用该方法需要完成以下准备:
1)向目标主机分发公钥:ssh-copy-id -i ~/.ssh/id_ras.pub root@192.168.122.59
2)向 SSH Agent 中,添加私钥:ssh-add ~/.ssh/id_ras,因为 docker 命令只会从 ssh-agent 中读取密钥。

相关文章

「Docker」- 镜像与仓库
「Docker」- 配置网络
「Docker」- 借助工具,以树形图的形式,查看镜像层
「Docker」- 构建镜像
「Docker」- ...dial unix /var/run/docker.sock: connect: permission denied...
「Docker Container」- 查看容器资源,限制容器资源
「Docker Buildx」- 构建“跨平台”镜像(学习笔记)
「Docker」- 清理镜像(Prune images)

参考文献

Docker Context | Docker Documentation
docker context | Docker Documentation
Using SSH Connections in Docker Contexts – mikesir87's blog

20202216 2020-2021-2 《Python程序设计》实验四报告

20202216 2020-2021-2 《Python程序设计》实验四报告

20202216 2020-2021-2 《Python程序设计》实验四报告

课程:《Python程序设计》
班级: 2022
姓名: 邓童丹
学号:20202216
实验教师:王志强
实验日期:2021年6月14日
必修/选修: 公选课

  • 实验内容
    Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。
    课代表和各小组负责人收集作业(源代码、视频、综合实践报告)

批阅:注意本次实验不算做实验总分,前三个实验每个实验10分,累计30分。本次实践算入综合实践,打分为25分。
评分标准:
(1)程序能运行,功能丰富。(需求提交源代码,并建议录制程序运行的视频)10分
(2)综合实践报告,要体现实验分析、设计、实现过程、结果等信息,格式规范,逻辑清晰,结构合理。10分。
(3)在实践报告中,需要对全课进行总结,并写课程感想体会、意见和建议等。5分

  • 实验过程及结果
    平常喜欢上微博,看到一些好看的图片就想保存下来,但是一张一张的保存会很麻烦,所以想到了用Python爬虫直接爬取保存到本地,非常方便,本次实验参考了网上教程和课堂内容实现。
    找到自己想要爬取的博主的微博,因为移动端微博爬取的难度较小,所以在Chrome浏览器上打开微博移动端的网页


    网页url那里/u/后面的那串数字就是博主的微博id,在爬虫中需要用到

右键选择检查,打开浏览器的调试功能,选择 Network 菜单,Ctrl+R刷新获取数据

注意到Name栏里的倒数第二行,复制它的link address下来后是这样的


这是微博移动端api,可以在此进行json数据的获取和提取


cardlistInfo是列表信息
cards是当前页面的编号
用户的特定containerId等于107603+UID
total是总微博数
card_type正常为9
ok: 1就表明获取页面信息成功

pic是我要找的图片信息,这在mblog下,我主要需要获取图片的id和url

大概知道要爬取的内容和信息位置后,开始写代码
构建请求头,并随便找个移动端设备的用户代理

host = 'm.weibo.cn'
base_url = 'https://%s/api/container/getIndex?' % host
user_agent = 'User-Agent: Mozilla/5.0 (iPhone; cpu iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1 wechatdevtools/0.7.0 MicroMessenger/6.3.9 Language/zh_CN webview/0'  # 在网上随便找个user_agent

user_id = str(5886339293)  # 这里填写用户id
headers = {
    'Host': host,
    'Referer': 'https://m.weibo.cn/u/%s' % user_id,
    'User-Agent': user_agent
}

导入模块,有些模块没有安装,还需要先安装好

import requests
import urllib.request
import time
import os
from tqdm import tqdm
from urllib.parse import urlencode

编写一个函数用于对网页进行请求

def get_single_page(page):
    params = {
        'type': 'uid',
        'value': 1665372775,
        'containerid': int('107603' + user_id), 
        'page': page
    }
    url = base_url + urlencode(params)
    try:
        response = requests.get(url, headers=headers)
        if response.status_code == 200:
            return response.json()
    except requests.ConnectionError as e:
        print('爬取失败', e.args)

此函数解析页面返回的json数据

def analysis_page(json, pic_filebagPath): 
    items = json.get('data').get('cards')
    for item in items:
        item = item.get('mblog')
        if item:
            if pic_choice == 'y': 
                pics = item.get('pics')
                if pics:
                    for pic in pics:
                        picture_url = pic.get('large').get('url')  # 得到原图地址
                        pid = pic.get('pid')  # 图片id
                        pic_name = pid[25:]
                        download_pics(picture_url, pic_name, pic_filebagPath) 

此函数用于保存图片到本地

def download_pics(pic_url, pic_name, pic_filebagPath): 
    pic_filePath = pic_filebagPath + '\\'
    try:
        f = open(pic_filePath + str(pic_name) + ".jpg", 'wb')
        response = urllib.request.urlopen(pic_url)
        f.write(response.read())
        f.close()
    except Exception as e:
        print(pic_name + " error", e)
    time.sleep(0.1) 

主函数部分

if __name__ == '__main__':
    base_data = {}
    page = input('输入要爬取的页数')  # 输入爬取页数,输入‘all’即爬取所有微博
    pic_choice = input('是否开始存储图片?y/n') 
    time_start = time.time()
    try:
        json = get_single_page(1)
        screen_name = json.get('data').get('cards')[0].get('mblog').get('user').get('screen_name') 
        total = json.get('data').get('cardlistInfo').get('total') 
        if pic_choice == 'y': 
            pic_filebagPath = 'D:\\weibopachong\\%s_picture' % screen_name
            os.makedirs(pic_filebagPath)  # 建立文件夹
        else:
            pic_filebagPath = None 
        if page == 'all': 
            page = total // 10
            while get_single_page(page).get('ok') == 1:
                page = page + 1
            print('总页数为:%s' % page)

        page = int(page) + 1
        for page in tqdm(range(1, page)):  # 抓取数据
            json = get_single_page(page)
            analysis_page(json, pic_filebagPath)
    except Exception as e:
        print('error:', e)
    finally:
        time_end = time.time()
        print('\n total cost', time_end - time_start)

运行结果

图片保存到本地后

源码放到码云

  • 实验过程中遇到的问题和解决过程
  • 问题1:一开始用了老师上课时给的请求头,结果爬取失败。
  • 问题1解决方案:因为用的是移动端网页,所以要用移动端设备的请求头,在网上重新找了一个。
  • 问题2:第一次运行时没有得到图片。
  • 问题2解决方案:通过查阅网上的资料和分析Network标签页下的信息,找到了所需图片内容的正确标识。
  • 课程感悟:
    在这一学期,我结识了python这一神奇的程序设计语言,python一门开源免费、通用型的脚本编程语言,它上手简单,功能强大,坚持「极简主义」。它有非常多的优点,如具有极其丰富类库,这使得 Python 几乎无所不能,不管是传统的 Web 开发、PC 软件开发、Linux 运维,还是当下火热的机器学习、大数据分析、网络爬虫,Python 都能胜任。python还提供了高效的高级数据结构,还能简单有效地面向对象编程。Python语法和动态类型,以及解释型语言的本质,使它成为多数平台上写脚本和快速开发应用的编程语言,随着版本的不断更新和语言新功能的添加,逐渐被用于独立的、大型项目的开发。
    在课上,我学习到了python的基本输入输出,数据类型,基础语法,有关字符串的操作,了解了许多字符串处理函数,索引和切片,正则表达式,各种序列,函数、面向对象的设计、模块,异常处理,还用python进行数据库,socket库的编程,文件操作以及网络爬虫。同样的我还认识到python的选择,循环语句与C语言的异同和它更具优势的地方。总而言之,关于python还有很多可学的方面,尤其是它庞大的第三方库资源。或许我现在认识的只是其中的冰山一角,在以后我还会继续探索。感谢王志强老师带领我走入python的世界,能让我在课堂上由浅入深的学习python,虽然对于我而言,还是有一些地方并没有弄明白,但我有信心在未来继续学习的过程中能够逐渐理解。
    还有王志强老师让我们以博客的形式提交实验报告的这一点让我受益匪浅,这培养了我写博客的习惯,还让我看到了许多大佬的文章,还有在gitee上注册账号和对git的使用,这对以后的计算机学习是非常有利的。
    最后,感谢王志强老师这一学期的教导,希望以后也有机会于老师探讨更多计算机相关的问题。

20202421 2020-2021-2 《Python程序设计》期末实验报告

20202421 2020-2021-2 《Python程序设计》期末实验报告

课程:《Python程序设计》
班级: 2024
姓名: 秦朗
学号:20202421
实验教师:王志强
实验日期:2021年6月30日
必修/选修: 公选课

一、实验内容
Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等

本次期末实验我选择制作一个简单的flappy bird小游戏。

二、实验过程

首先分析游戏原理,整个游戏基于二维平面,游戏过程中,小鸟的x值不改变,只在垂直方向上更改y值,小鸟往上飞,y值减小,往下降落,y值增大。不做任何操作的情况下小鸟下落,下落速度越来越快,也就是小鸟坐标y值越来越大。点击屏幕,小鸟上升,上升速度越来越慢,直到上升速度为0,小鸟开始下落。通过更改管道的x坐标。初始管道坐标在屏幕右侧生成,减少管道的x坐标值,管道模拟往左移动,来模拟小鸟往前飞的效果。同时,管道位置通过将管道分为一上一下为一组,在画布中就是上下两个矩形,往左移动时,同时改变两个矩形的x值,使其x值保持一致。定义好中间的空隙的高度H,更改上下两个矩形的高度,就可以造成管道错落放置的效果。小鸟类和管道类继承pygame.sprite.Sprite 的精灵类即可。

 

 实验代码:https://gitee.com/menethilii/ProjectX/blob/master/%E6%9C%9F%E6%9C%AB.py

三、实验体会

本学期通过学习python使我了解到了许多编程语言中十分重要的概念,如类,列表等。通过使用python也锻炼了我使用网络上许多现有资源的能力。对于我的专业来说,python与爬虫等网络安全中重要的工具也息息相关,同样可以为我提供许多帮助。总之,在本学期学习python是一次宝贵的经历,相信这份经验将为我未来的学习经历铺平道路。

2021 docker安装宝塔面板

2021 docker安装宝塔面板

拉取CentOS镜像

docker pull centos

创建 docker 容器

启动镜像,映射主机与容器内8888(宝塔面板)、888(PHPMYADMIN)端口

-v 挂在目录

为了能够保存(持久化)数据以及共享容器间的数据,docker一定使用 -v 挂载主机目录到容器,比如上面启动容器的 docker -v 参数。

docker run -i -t -d --name baota -p 20:20 -p 21:21 -p 80:80 -p 443:443 -p 888:888 -p 8888:8888 --privileged=true -v /home/orginly/www:/www centos

上面命令的意思是创建一个docker容易命名为baota(名称大家自定义)让他后台运行,
然后将宿主机的20,21,80,443,888,8888这五个端口映射到docker容器中去。
并且将宿主机的/home/orginly/www文件夹映射到docker容器的/www上去
(注意:文件目录如果不存在。宿主机和容器会自己创建,无需手动创建)。
privileged表示在运行容器的时候,给容器加特权,设置容器有写文件的权限。

进入容器

docker ps -a // 查看容器
docker exec -it 容器id bash

image

安装宝塔面板

yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh

image

若无法访问面板,请检查防火墙/安全组是否有放行面板[8888]端口

补充

宝塔默认密码使用 : bt default 查看,登录进去修改即可。如果上面安装的不是最新宝塔,可以再容器里面执行下面命令升级到最新:

curl http://download.bt.cn/install/update_to_6.sh|bash

2021-04-06-初识Docker

2021-04-06-初识Docker

什么是Docker(虚拟化的技术)

  • Docker时Docker.Lnc公司开源的一个基于LXC(Linux Container容器是一种内核虚拟化技术)技术之上搭建的Container容器引擎,源代码托管在Github上,基于Go语言并遵从Apache2.0协议开源。
  • Docker将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了Docker,就不用担心环境问题。
  • 总体来说,Docker的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样

为什么要用Docker

  • 介绍为什么前先介绍几个概念
1.虚拟机
  • 虚拟机(virtual machine)就是带环境安装的一种解决方案。它可以在一种操作系统里面运行另一种操作系统,比如在Windows系统里面运行Linux系统。应用程序对此毫无感知,因为虚拟机看上去跟真丝系统一模一样,而对于底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其它部分毫无影响。
  • 虚拟机的缺点:
    资源占用多:虚拟机会独占一部分内存和硬盘空间。它运行的时候,其他程序就不能使用这些资源了。哪怕虚拟机里面的应用程序,真正使用的内存只有1M,虚拟机依然需要几百MB的内容才能运行。
    启动慢:启动操作系统需要多久,启动虚拟机就需要多久。可能要等几分钟,应用程序才能真正运行。
2.Linux容器
  • 由于虚拟机存在这个缺点,Linux发展出了另一种虚拟化技术:Linux容器(Linux Containers,缩写为LXC)。Linux容器不是模拟一个完整的操作系统,而是对进程进行隔离。或者说,在正常进程的外面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。由于容器是进程级别的,相比虚拟机又很多优势。
  • Docker在一定程度上是LXC的增强版
    (1)启动快
    启动容器相当于启动本机的一个进程,而不是启动一个操作系统,速度就快很多。
    (2)资源占用少
    容器只占用需要的资源,不占用那些没有用到的资源;虚拟机由于是完整的操作系统,不可避免要占用所有资源。
    (3)体积小
    容器只要包含用到的组件即可,而虚拟机是整个操作系统的打包,所以容器文件比虚拟机文件要小很多。
    总之,容器有点像轻量级的虚拟机,能够提供虚拟化的环境,但是成本开销小得多。
3.Docker与传统虚拟机的区别
  • docker直接构建在Linux操作系统之上,其使用的内核为当前宿主机的内核;虚拟机一般构建在虚拟机管理软件之上,拥有独立的内核
  • 由于docker直接使用宿主机内核所以其性能接近宿主机性能;虚拟机使用自己的内核,但是其内核也是虚拟出来的所以需要进行两级调度性能相对较差。
  • docker相对虚拟机更加轻量,其他和部署更加方便快捷。

Docker术语

  • 镜像(Image):只读模板,Docker 镜像是用于创建 Docker 容器的模板。
  • 容器(Container):实例化的镜像,在只读层上增加了一层可写层,容器可以启动,停止, 删除和修改每个容器都是相互隔离的
  • 仓库(Repository):集中存放镜像的地方,仓库分为公开仓库(Public)和私有仓库(Private) 两种形式,世界上最大的公开仓库是Docker Hub,国内的公开仓库Docker Pool等。

我们今天的关于「Docker Context」- 使用单个客户端管理多个服务端节点 @20210221一个docker 多个服务的分享已经告一段落,感谢您的关注,如果您想了解更多关于20202216 2020-2021-2 《Python程序设计》实验四报告、20202421 2020-2021-2 《Python程序设计》期末实验报告、2021 docker安装宝塔面板、2021-04-06-初识Docker的相关信息,请在本站查询。

本文标签: