前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何在Ubuntu 18.04上使用Traefik作为Docker容器的反向代理

如何在Ubuntu 18.04上使用Traefik作为Docker容器的反向代理

原创
作者头像
风研雨墨
修改于 2018-11-15 07:32:29
修改于 2018-11-15 07:32:29
2.3K00
代码可运行
举报
运行总次数:0
代码可运行

介绍

Docker可以是在生产中运行Web应用程序的有效方法,但您可能希望在同一个Docker主机上运行多个应用程序。在这种情况下,您需要设置反向代理,因为您只想公开端口80443

Traefik是一个支持Docker的反向代理,包括自己的监控仪表板。在本教程中,您将使用Traefik将请求路由到两个不同的Web应用程序容器Wordpress容器和Adminer容器,每个容器都与MySQL数据库通信。您将使用Let的加密将Traefik配置为通过HTTPS提供所有内容。

先决条件

要继续学习本教程,您需要具备以下条件:

  • 一个Ubuntu 18.04服务器,包括一个具有sudo权限的非root用户和防火墙。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器
  • 在您的服务器上安装Docker。
  • 安装Docker Compose,您可以通过如何在Ubuntu 18.04上安装Docker Compose的说明的教程来安装。
  • 域和三个A记录, db-adminblog并且monitor,每一个点到你的服务器的IP地址。在本教程中,请在配置文件和示例中使用your_domain替换您的域。

第1步 - 配置和运行Traefik

Traefik项目有一个官方Docker镜像,因此我们将使用它在Docker容器中运行Traefik。

但在我们启动并运行Traefik容器之前,我们需要创建配置文件并设置加密密码,以便我们可以访问监控仪表板。

我们将使用该htpasswd实用程序创建此加密密码。首先,安装apache2-utils包中包含的实用程序:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sudo apt-get install apache2-utils

然后使用htpasswd生成密码。用您想要用于Traefik管理员用户的密码替换secure_password

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
htpasswd -nb admin secure_password

程序的输出如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
admin:$apr1$ruca84Hq$mbjdMZBAG.KWn7vfN/SNK/

您将在Traefik配置文件中使用此输出为Traefik运行状况检查和监视仪表板设置HTTP基本身份验证。复制整个输出行,以便稍后粘贴。

要配置Traefik服务器,我们将创建一个名叫traefik.toml的新配置文件。该文件使用TOML格式。TOML是一种类似于INI文件的配置语言,但标准化。该文件允许我们配置Traefik服务器以及我们想要使用的各种集成或提供程序。在本教程中,我们将使用Traefik的三个可用的提供商:apidocker,和acme,这是用于支持TLS使用让我们加密。

nano或您喜欢的文本编辑器中打开您的新文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
nano traefik.toml

首先,添加两个命名的入口点,httphttps,这样的话,在默认情况下所有后端都可以访问:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
defaultEntryPoints = ["http", "https"]

我们稍后将在此文件中配置httphttps输入点。

接下来,配置api提供程序,使您可以访问仪表板界面。您可以在此处粘贴htpasswd命令的输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
...
[entryPoints]
  [entryPoints.dashboard]
    address = ":8080"
    [entryPoints.dashboard.auth]
      [entryPoints.dashboard.auth.basic]
        users = ["admin:your_encrypted_password"][api]
entrypoint="dashboard"

仪表板是一个单独的Web应用程序,将在Traefik容器中运行。我们将仪表板设置为在端口8080上运行。

entrypoints.dashboard部分配置了我们将如何与api提供者连接,该entrypoints.dashboard.auth.basic部分为仪表板配置HTTP基本身份验证。使用您刚刚运行的htpasswd命令的输出作为users条目的值。您可以通过用逗号分隔来指定其他登录。

我们已经定义了第一个entryPoint,但是我们需要为标准HTTP和HTTPS通信定义其他不是针对api提供者的。该entryPoints部分配置Traefik和代理容器可以侦听的地址。将这些行添加到entryPoints标题下方的文件中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
...
  [entryPoints.http]
    address = ":80"
      [entryPoints.http.redirect]
        entryPoint = "https"
  [entryPoints.https]
    address = ":443"
      [entryPoints.https.tls]
...

http入口点处理端口80,而 https入口点使用的端口443为TLS / SSL。我们自动将端口80上的所有流量重定向到https入口点,以强制所有请求的安全连接。

接下来,添加此部分以配置Traefik的Let's Encrypt证书支持:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
...
[acme]
email = "your_email@your_domain"
storage = "acme.json"
entryPoint = "https"
onHostRule = true
  [acme.httpChallenge]
  entryPoint = "http"

此部分名叫acme因为ACME是用于与Let的加密进行通信以管理证书的协议的名称。Let's Encrypt服务需要使用有效的电子邮件地址进行注册,因此为了让Traefik为我们的主机生成证书,请将email密钥设置为您的电子邮件地址。然后,我们指定将把我们将从Let's Encrypt接收的信息存储在一个名为acme.jsonJSON文件中。该entryPoint密钥的需要在端口443指向切入点,这在我们的案例中来说,https切入点。

密钥onHostRule决定了Traefik应该如何生成证书。我们希望在创建具有指定主机名的容器后立即获取证书,这就是onHostRule设置的作用。

acme.httpChallenge部分允许我们指定Let的加密如何验证应该生成证书。我们将其配置为通过http入口点作为挑战的一部分来提供文件。

最后,让我们通过将以下行添加到文件来配置docker提供程序:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
...
[docker]
domain = "your_domain"
watch = true
network = "web"

docker提供程序使Traefik能够在Docker容器前充当代理。我们已经将提供程序配置为在web网络上的watch的新容器(我们很快就会创建)并将它们作为your_domain的子域进行公开。

此时,traefik.toml应具备以下内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
defaultEntryPoints = ["http", "https"][entryPoints]
  [entryPoints.dashboard]
    address = ":8080"
    [entryPoints.dashboard.auth]
      [entryPoints.dashboard.auth.basic]
        users = ["admin:your_encrypted_password"]
  [entryPoints.http]
    address = ":80"
      [entryPoints.http.redirect]
        entryPoint = "https"
  [entryPoints.https]
    address = ":443"
      [entryPoints.https.tls][api]
entrypoint="dashboard"[acme]
email = "your_email@your_domain"
storage = "acme.json"
entryPoint = "https"
onHostRule = true
  [acme.httpChallenge]
  entryPoint = "http"[docker]
domain = "your_domain"
watch = true
network = "web"

保存文件并退出编辑器。有了所有这些配置,我们就可以启动Traefik了。

第2步 - 运行Traefik容器

接下来,为代理创建一个Docker网络以与容器共享。Docker网络是必需的,以便我们可以将它与使用Docker Compose运行的应用程序一起使用。我们打电话给这个web网络。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker network create web

当Traefik容器启动时,我们会将其添加到此网络中。然后,我们可以稍后向此网络添加其他容器,以便Traefik代理。

接下来,创建一个空文件,它将保存我们的Let的加密信息。我们将这个分享到容器中,以便Traefik可以使用它:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
touch acme.json

如果容器内的root用户具有唯一的读写访问权限,Traefik将只能使用此文件。为此,请在acme.json上锁定权限,以便只有文件所有者具有读写权限。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
chmod 600 acme.json

文件传递给Docker后,所有者将自动更改为容器内的root用户。

最后,使用以下命令创建Traefik容器:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker run -d \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v $PWD/traefik.toml:/traefik.toml \
  -v $PWD/acme.json:/acme.json \
  -p 80:80 \
  -p 443:443 \
  -l traefik.frontend.rule=Host:monitor.your_domain \
  -l traefik.port=8080 \
  --network web \
  --name traefik \
  traefik:1.7.2-alpine

命令有点长,让我们分解它。

我们使用该-d标志在后台运行容器作为守护进程。然后,我们将docker.sock文件共享到容器中,以便Traefik进程可以监听容器的更改。我们还将配置文件traefik.toml和我们创建的acme.json文件共享到容器中。

接下来,我们将Docker主机上的端口:80:443映射到Traefik容器中的相同端口,以便Traefik接收到服务器的所有HTTP和HTTPS流量。

然后我们设置两个Docker标签,告诉Traefik将流量引导到Traefik容器内的端口:8080的主机名monitor.your_domain,从而暴露监控仪表板。

我们将容器的网络设置为web,并将容器命名为traefik

最后,我们使用traefik:1.7.2-alpine此容器的图像,因为它很小。

Docker镜像ENTRYPOINT是一个始终在从图像创建容器时运行的命令。在这种情况下,该命令是traefik容器内的二进制文件。您可以在启动容器时将其他参数传递给该命令,但我们已在traefik.toml文件中配置了所有设置。

启动容器后,您现在可以访问仪表板以查看容器的运行状况。您还可以使用此仪表板显示Traefik已注册的前端和后端。通过将您的浏览器指向https://monitor.your_domain访问监控仪表板。系统将提示您输入用户名和密码,即管理员和您在步骤1中配置的密码。

登录后,您将看到类似于此的界面:

目前还没有太多东西可以看,但是打开这个窗口,当你为Traefik添加容器时,你会看到内容发生了变化。

我们现在运行Traefik代理,配置为与Docker一起使用,并准备监视其他Docker容器。让我们为Traefik开始一些容器作为代理。

第3步 - 使用Traefik注册容器

运行Traefik容器后,您就可以在其后面运行应用程序了。让我们在Traefik后面推出以下cotainers:

  1. 使用官方Wordpress图像的博客。
  2. 使用官方Adminer映像的数据库管理服务器。

我们将使用Docker Compose使用docker-compose.yml文件管理这两个应用程序。在编辑器中打开docker-compose.yml文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
nano docker-compose.yml

将以下行添加到文件中以指定我们将使用的版本和网络:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
version: "3"networks:
  web:
    external: true
  internal:
    external: false

我们使用Docker Compose版本3,因为它是Compose文件格式的最新主要版本。

对于Traefik来识别我们的应用程序,它们必须是同一网络的一部分,并且由于我们手动创建了网络,我们通过指定网络名称web和设置external来将其拉入true。然后我们定义另一个网络,以便我们可以将我们公开的容器连接到我们不会通过Traefik公开的数据库容器。我们称之为网络internal

接下来,我们将定义每一个services。让我们从blog容器开始,我们将基于官方的WordPress图像。将此配置添加到文件中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
version: "3"
...services:
  blog:
    image: wordpress:4.9.8-apache
    environment:
      WORDPRESS_DB_PASSWORD:
    labels:
      - traefik.backend=blog
      - traefik.frontend.rule=Host:blog.your_domain
      - traefik.docker.network=web
      - traefik.port=80
    networks:
      - internal
      - web
    depends_on:
      - mysql

environment键允许您指定将在容器内设置的环境变量。通过不为WORDPRESS_DB_PASSWORD设置值,我们告诉Docker Compose从我们的shell获取值并在创建容器时传递它。我们将在启动容器之前在shell中定义此环境变量。这样我们就不会将密码硬编码到配置文件中。

labels部分是您为Traefik指定配置值的部分。Docker标签本身不做任何事情,但Traefik会读取这些内容,因此它知道如何处理容器。以下是每个标签的作用:

  • traefik.backend指定Traefik中后端服务的名称(指向实际blog容器)。
  • traefik.frontend.rule=Host:blog.your_domain告诉Traefik检查所请求的主机,如果它匹配blog.your_domain``blog的模式,则应该将流量路由到容器。
  • traefik.docker.network=web指定Traefik查找哪个网络以查找此容器的内部IP。由于我们的Traefik容器可以访问所有Docker信息,如果我们没有指定它,它可能会占用internal网络的IP 。
  • traefik.port 指定Traefik用于将流量路由到此容器的公开端口。

使用此配置,发送到Docker主机端口80的所有流量都将路由到blog容器。

我们将此容器分配给两个不同的网络,以便Traefik可以通过web网络找到它,并且可以通过internal网络与数据库容器进行通信。

最后,该depends_on密钥告诉Docker Compose该容器需要其依赖项运行启动。由于WordPress需要运行数据库,因此我们必须在启动blog容器之前运行我们的mysql容器。

接下来,通过将此配置添加到您的文件来配置MySQL服务:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
services:
...
  mysql:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD:
    networks:
      - internal
    labels:
      - traefik.enable=false

我们正在使用这个容器的官方MySQL 5.7映像。您会注意到我们再次使用没有值的environment项目。该MYSQL_ROOT_PASSWORDWORDPRESS_DB_PASSWORD变量需要被设置为相同的值,以确保我们的WordPress的容器可以与MySQL进行通信。我们不希望将mysql容器暴露给Traefik或外部世界,因此我们只将此容器分配给internal网络。由于Traefik可以访问Docker套接字,因此默认情况下该进程仍会暴露mysql容器的前端,因此我们将添加标签traefik.enable=false以指定Traefik不应公开此容器。

最后,添加此配置以定义Adminer容器:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
services:
...
  adminer:
    image: adminer:4.6.3-standalone
    labels:
      - traefik.backend=adminer
      - traefik.frontend.rule=Host:db-admin.your_domain
      - traefik.docker.network=web
      - traefik.port=8080
    networks:
      - internal
      - web
    depends_on:
      - mysql

此容器基于官方Adminer图像。此容器的networkdepends_on配置完全符合我们使用的blog容器。

但是,由于我们将所有流量直接导向Docker主机上的端口80blog容器,因此我们需要以不同方式配置此容器,以便将流量传输到adminer容器。该traefik.frontend.rule=Host:db-admin.your_domain行告诉Traefik检查所请求的主机。如果它与db-admin.your_domain``adminer模式匹配,Traefik会将流量路由到容器。

此时,docker-compose.yml应具备以下内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
version: "3"networks:
  web:
    external: true
  internal:
    external: falseservices:
  blog:
    image: wordpress:4.9.8-apache
    environment:
      WORDPRESS_DB_PASSWORD:
    labels:
      - traefik.backend=blog
      - traefik.frontend.rule=Host:blog.your_domain
      - traefik.docker.network=web
      - traefik.port=80
    networks:
      - internal
      - web
    depends_on:
      - mysql
  mysql:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD:
    networks:
      - internal
    labels:
      - traefik.enable=false
  adminer:
    image: adminer:4.6.3-standalone
    labels:
      - traefik.backend=adminer
      - traefik.frontend.rule=Host:db-admin.your_domain
      - traefik.docker.network=web
      - traefik.port=8080
    networks:
      - internal
      - web
    depends_on:
      - mysql

保存文件并退出文本编辑器。

接下来,在启动容器之前,在shell中为WORDPRESS_DB_PASSWORDMYSQL_ROOT_PASSWORD变量设置值:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
export WORDPRESS_DB_PASSWORD=secure_database_password
export MYSQL_ROOT_PASSWORD=secure_database_password

用您想要的数据库密码替换secure_database_password。请记住,为WORDPRESS_DB_PASSWORDMYSQL_ROOT_PASSWORD使用相同的密码。

设置这些变量后,使用docker-compose命令运行容器:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker-compose up -d

现在再看一下Traefik管理仪表板。你会看到现在有一个backend和一个frontend服务于这两个已暴露的服务器:

导航到blog.your_domain,用您的域名替换your_domain。您将被重定向到TLS连接,现在可以完成Wordpress设置:

现在通过在浏览器中访问db-admin.your_domain来访问Adminer ,再次使用您的域名替换your_domain。该mysql容器未暴露于外界,但adminer容器可以通过internalDocker网访问它,他们在分享该internalDocker网时,使用mysql容器名称作为主机名。

在Adminer登录屏幕上,使用用户名root,将mysql用于服务器,并使用您为MYSQL_ROOT_PASSWORD设置的值来设置为密码的值。登录后,您将看到Adminer用户界面:

这两个站点现在都在工作,您可以在monitor.your_domain上使用仪表板来监视您的应用程序。

结论

在本教程中,您将Traefik配置为将请求代理到Docker容器中的其他应用程序。

Traefik在应用程序容器级别的声明性配置使得配置更多服务变得容易,并且在向代理流量添加新应用程序时无需重新启动traefik容器,因为Traefik通过它正在监视的Docker套接字文件立即注意到更改。

要了解有关Traefik可以做些什么的更多信息,请访问Traefik官方文档

更多Ubuntu教程请前往腾讯云+社区学习更多知识。


参考文献:《How to Use Traefik as a Reverse Proxy for Docker Containers on Ubuntu 18.04》

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
多台电脑共享一套鼠标键盘的免费方法
本文转载:http://www.cnblogs.com/fangpage/archive/2011/07/22/inputdirector.html
跟着阿笨一起玩NET
2018/09/19
6.1K0
多台电脑共享一套鼠标键盘的免费方法
mac键位的键盘_键盘键位图高清126键
mac和Windows在键盘上还是有一些差距的,在习惯了Windows的键位之后还是很难第一时间转换到mac的键位上,为大家整理了一下mac的键位分布,和常用的快捷键。
全栈程序员站长
2022/11/17
3.3K0
mac键位的键盘_键盘键位图高清126键
多台电脑共用鼠标键盘(局域网内)
Synergy是一款跨平台的键盘鼠标共享软件,现在有Synergy 和Synergy 64位的Win版本、Synergy Mac版,Synergy 能够让使用者仅用一套键盘鼠标,就同时操控多部计算机的免费工具软件。使用者能够在包括 Windows 、 Linux 、 Mac OS 等不同的系统上安装它,并且在设定好主从关系后,就能够透过一组键盘鼠标来进行多部计算机的操控。
逍遥子大表哥
2021/12/17
2.8K0
多台电脑共用鼠标键盘(局域网内)
一套键盘鼠标跨电脑切换使用「建议收藏」
身为一名涉猎领域广泛的码农,工作间中往往会出现同时使用超过一台电脑的场景,笔记本+台式机基本是常态,甚至会出现Win+MAC或者Win+LINUX这样的跨平台同时操作需求。那么最令人烦恼的莫过于切换使用电脑时需要来回切换键鼠,如果可以用桌面上的一套键鼠,实现对多台电脑的无缝操作切换,岂不是美滋滋。
全栈程序员站长
2022/11/07
4.5K0
Mac 键盘上的 Windows 按键映射
Mac 键盘上很多按键的功能与 Windows 键盘按键的功能相同。以下是其中的一些按键:
云深无际
2021/04/14
3K0
Mac 键盘上的 Windows 按键映射
在多台电脑设备间共享一套鼠标键与盘
在办公和家中场景中,有时候需要同时操作多个电脑设备,如果每套电脑用一套键盘鼠标比较占有空间不方便,所以会考虑如何在设备之间共享一套键盘鼠标设备。
糖果
2020/05/14
2.2K0
你的下一台电脑何必是电脑,探索不一样的远程操作
最近全国各地都在迎战疫情,远程办公逐渐变成一种常态被大家所接受,作为程序员我们每天唯一离不开的就是电脑,虽然各种远程软件层出,但是在移动端的体验一直不佳,所以我们每天不得不背着沉重的笔记本东奔西跑。
石臻臻的杂货铺[同名公众号]
2022/06/12
6490
你的下一台电脑何必是电脑,探索不一样的远程操作
Windows常用快捷键
老猫-Leo
2023/12/11
2970
你的下一台电脑何必是电脑,探索不一样的远程操作
最近全国各地都在迎战疫情,远程办公逐渐变成一种常态被大家所接受,作为程序员我们每天唯一离不开的就是电脑,虽然各种远程软件层出,但是在移动端的体验一直不佳,所以我们每天不得不背着沉重的笔记本东奔西跑。
石臻臻的杂货铺[同名公众号]
2022/06/10
6160
打造前端MAC工作站(一)简单系统配置
在上一个系列的打造黑苹果的系列博文中,我讲解了如何组装以及安装黑苹果系统。有了苹果系统之后,我们就需要进行各方面的设置,来将我们的MAC打造成我们前端专用的工作站。
FungLeo
2022/05/05
8950
打造前端MAC工作站(一)简单系统配置
开发者的如何优雅的使用OSX
Mac对于IT开发者来说是最好的开发工具,没有之一。
老马
2018/02/18
1.4K0
开发者的如何优雅的使用OSX
12.1 使用键盘鼠标监控钩子
本节将介绍如何使用Windows API中的SetWindowsHookEx和RegisterHotKey函数来实现键盘鼠标的监控。这些函数可以用来设置全局钩子,通过对特定热键挂钩实现监控的效果,两者的区别在于SetWindowsHookEx函数可以对所有线程进行监控,包括其他进程中的线程,而RegisterHotKey函数只能对当前线程进行监控。
王瑞MVP
2023/10/07
4910
12.1 使用键盘鼠标监控钩子
电脑键盘功能基础知识汇总
电脑键盘是我们平时使用电脑时最常用的输入设备之一,了解键盘的基本功能,不见能提升工作效率,还能让我们在使用电脑时更加得心应手。今天要和大家探讨一下电脑键盘的基础功能,并介绍一些小技巧,帮助大家更好的利用这个工具。
用户7704932
2024/09/11
4120
电脑键盘功能基础知识汇总
电脑外设(I/O)简介:键盘鼠标
电脑外设:是除主机外的大部分硬件设备都可称作外部设备,或叫外围设备,简称外设。计算机系统没有输入输出设备,就如计算机系统没有软件一样,是毫无意义的。
用户5410712
2022/06/01
1.4K0
电脑外设(I/O)简介:键盘鼠标
Mac三分之一 系统初尝
https://www.apple.com/cn/shop/product/FPXT2CH/A
acc8226
2022/05/17
1.3K0
Mac三分之一 系统初尝
IDEA-从 Windows 过度到 Mac 必备快捷键对照表
从 Windows 过度到 Mac 必备快捷键对照表 Mac 键盘符号说明 ⌘ == Command ⇧ == Shift ⇪ == Caps Lock ⌥ == Option ⌃ == Control ↩ == Return/Enter ⌫ == Delete ⌦ == 向前删除键(Fn+Delete) ↑ == 上箭头 ↓ == 下箭头 ← == 左箭头 → == 右箭头 ⇞ == Page Up(Fn+↑) ⇟ == Page Down(Fn+↓) Home == Fn + ← End == Fn +
cwl_java
2020/02/19
6.4K0
linux连接蓝牙键盘_双系统蓝牙键盘切换
后记: 写完这篇文章后又先后重新连接过两次, 每次都会下意识担心, 完了完了这次可能再也连不上了(想起当初一直连不上双系统,被蓝牙键盘支配的日日夜夜), 结果我按着自己写的这篇文章来搞, 还不是每次都成功了hh.
全栈程序员站长
2022/11/19
11K0
linux连接蓝牙键盘_双系统蓝牙键盘切换
安卓蓝牙键盘鼠标映射_蓝牙鼠标模拟器
本文源码下载地址:《仅通过蓝牙HID将安卓手机模拟成鼠标和键盘》源码 多文源码打包下载: 《仅通过蓝牙HID将安卓手机模拟成鼠标和键盘》+《蓝牙HID TouchScreen协议让你的安卓手机变成触摸屏》两份源码打包下载 《仅通过蓝牙HID将安卓手机模拟成鼠标和键盘》+《蓝牙HID TouchScreen协议让你的安卓手机变成触摸屏》+《通过蓝牙将安卓手机模拟成游戏方向盘-支持旋转轮胎》三份源码打包下载
全栈程序员站长
2022/11/01
5.9K0
安卓蓝牙键盘鼠标映射_蓝牙鼠标模拟器
Windows中的键盘快捷方式大全
Windows有很多键盘快捷方式,使用键盘快捷方式能够大大提高使用windows的效率,同时还能提升自己的逼格,背熟几个快捷方式,操作起来行云流水犹如大神一般!
用户7657330
2020/08/14
6K0
Mac下键盘使用
要使用键盘快捷键,请按住一个或多个修饰键,同时按快捷键的最后一个键。例如,要使用快捷键 Command-C(拷贝),请按住 Command 键并按 C 键,然后同时松开这两个键。Mac 菜单和键盘通常使用 [某些按键的符号],其中包括以下修饰键: Command ⌘ Shift ⇧ Option ⌥ Control ⌃ Caps Lock ⇪ Fn 如果您使用的是 Windows PC 专用键盘,请用 Alt 键代替 Option 键,用 Windows 标志键代替 Command 键。有些
98k
2018/04/12
2.9K0
Mac下键盘使用
相关推荐
多台电脑共享一套鼠标键盘的免费方法
更多 >
LV.2
美团客户端研发工程师
目录
  • 介绍
  • 先决条件
  • 第1步 - 配置和运行Traefik
  • 第2步 - 运行Traefik容器
  • 第3步 - 使用Traefik注册容器
  • 结论
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档