Podman 使用指南

2023-05-16

原文链接:Podman 使用指南

Podman 原来是 CRI-O 项目的一部分,后来被分离成一个单独的项目叫 libpod。Podman 的使用体验和 Docker 类似,不同的是 Podman 没有 daemon。以前使用 Docker CLI 的时候,Docker CLI 会通过 gRPC API 去跟 Docker Engine 说「我要启动一个容器」,然后 Docker Engine 才会通过 OCI Container runtime(默认是 runc)来启动一个容器。这就意味着容器的进程不可能是 Docker CLI 的子进程,而是 Docker Engine 的子进程。

Podman 比较简单粗暴,它不使用 Daemon,而是直接通过 OCI runtime(默认也是 runc)来启动容器,所以容器的进程是 podman 的子进程。这比较像 Linux 的 fork/exec 模型,而 Docker 采用的是 C/S(客户端/服务器)模型。与 C/S 模型相比,fork/exec 模型有很多优势,比如:

  • 系统管理员可以知道某个容器进程到底是谁启动的。
  • 如果利用 cgroup 对 podman 做一些限制,那么所有创建的容器都会被限制。
  • SD_NOTIFY : 如果将 podman 命令放入 systemd 单元文件中,容器进程可以通过 podman 返回通知,表明服务已准备好接收任务。
  • socket 激活 : 可以将连接的 socket 从 systemd 传递到 podman,并传递到容器进程以便使用它们。

废话不多说,下面我们直接进入实战环节,本文将手把手教你如何用 podman 来部署静态博客,并通过 Sidecar 模式将博客所在的容器加入到 Envoy mesh 之中。

1. 方案架构

我的部署方案涉及到两层 Envoy:

  • 首先会有一个前端代理单独跑一个容器。前端代理的工作是给访问者提供一个入口,将来自外部的访问请求转发到具体的后端服务。
  • 其次,博客静态页面由 nginx 提供,同时以 Sidecar 模式运行一个 Envoy 容器,它与 nginx 共享 network nemspace
  • 所有的 Envoy 形成一个 mesh,然后在他们之间共享路由信息。

我之前写过一篇用 Docker 部署 hugo 静态博客并配置 HTTPS 证书的文章,本文采用的是相同的方案,只是将 docker 换成了 podman,具体参考为 Envoy 开启 TLS 验证实战。

2. 部署 hugo 和 sidecar proxy

我的博客是通过 hugo 生成的静态页面,可以将其放到 nginx 中,其他静态网站工具类似(比如 hexo 等),都可以这么做。现在我要做的是让 nginx 容器和 envoy 容器共享同一个 network namespace,同时还要让前端代理能够通过域名来进行服务发现。以前用 docker 很简单,直接用 docker-compose 就搞定了,podman 就比较麻烦了,它又不能用 docker-compose,服务发现看来是搞不定了。

好不容易在 Github 上发现了一个项目叫 podman-compose,以为有救了,试用了一下发现还是不行,podman-compose 创建容器时会将字段 network_mode: "service:hugo" 转化为 podman CLI 的参数 --network service:hugo(真脑残),导致容器创建失败,报错信息为 CNI network "service:hugo" not found。将该字段值改为 network_mode: "container:hugo_hugo_1" 可以启动成功,然而又引来了另一个问题:podman-compose 的做法是为每一个 service 创建一个 pod(pod 的名字为 docker-compose.yml 所在目录名称),然后往这个 pod 中添加容器。我总不能将前端代理和后端服务塞进同一个 pod 中吧?只能分别为前端代理和 hugo 创建两个目录,然后分别创建 docker-compose.yml。这个问题解决了,下个问题又来了,podman-compose 不支持通过 service name 进行服务发现,扒了一圈发现支持 links(其实就是加个参数 --add-host),然而 links 只在同一个 pod 下才生效,我都拆分成两个 pod 了,links 鞭长莫及啊,还是没什么卵用。我能怎么办,现在唯一的办法就是手撸命令行了。

上面我提到了一个新名词叫 pod,这里花 30 秒的时间给大家简单介绍一下,如果你是 Kubernetes 的重度使用者,对这个词应该不陌生,但这里确实说的是 podman 的 pod,意思还是一样的,先创建一个 pause 容器,然后再创建业务容器,业务容器共享 pause 容器的各种 linux namespace,因此同一个 pod 中的容器之间可以通过 localhost 轻松地相互通信。不仅如此,podman 还可以将 pod 导出为 Kubernetes 的声明式资源定义,举个栗子:

先创建一个 pod:

$ podman pod create --name hugo

查看 pod:

$ podman pod ls

POD ID         NAME   STATUS    CREATED         # OF CONTAINERS   INFRA ID
88226423c4d2   hugo   Running   2 minutes ago   2                 7e030ef2e7ca

在这个 pod 中启动一个 hugo 容器:

$ podman run -d --pod hugo nginx:alpine

查看容器:

$ podman ps

CONTAINER ID  IMAGE                           COMMAND               CREATED        STATUS            PORTS  NAMES
3c91cab1e99d  docker.io/library/nginx:alpine  nginx -g daemon o...  3 minutes ago  Up 3 minutes ago         reverent_kirch

查看所有容器,包括 pause 容器:

$ podman ps -a

CONTAINER ID  IMAGE                           COMMAND               CREATED        STATUS            PORTS  NAMES
3c91cab1e99d  docker.io/library/nginx:alpine  nginx -g daemon o...  4 minutes ago  Up 4 minutes ago         reverent_kirch
7e030ef2e7ca  k8s.gcr.io/pause:3.1                                  6 minutes ago  Up 6 minutes ago         88226423c4d2-infra

查看所有容器,包括 pause 容器,并显示容器所属的 pod id:

$ podman ps -ap

CONTAINER ID  IMAGE                           COMMAND               CREATED        STATUS            PORTS  NAMES               POD
3c91cab1e99d  docker.io/library/nginx:alpine  nginx -g daemon o...  4 minutes ago  Up 4 minutes ago         reverent_kirch      88226423c4d2
7e030ef2e7ca  k8s.gcr.io/pause:3.1                                  6 minutes ago  Up 6 minutes ago         88226423c4d2-infra  88226423c4d2

查看 pod 中进程的资源使用情况:

$ podman pod top hugo

USER    PID   PPID   %CPU    ELAPSED           TTY   TIME   COMMAND
root    1     0      0.000   8m5.045493912s    ?     0s     nginx: master process nginx -g daemon off;
nginx   6     1      0.000   8m5.045600833s    ?     0s     nginx: worker process
nginx   7     1      0.000   8m5.045638877s    ?     0s     nginx: worker process
0       1     0      0.000   9m41.051039367s   ?     0s     /pause

将 pod 导出为声明式部署清单:

$ podman generate kube hugo > hugo.yaml

查看部署清单内容:

$ cat hugo.yaml

# Generation of Kubernetes YAML is still under development!
#
# Save the output of this file and use kubectl create -f to import
# it into Kubernetes.
#
# Created with podman-1.0.2-dev
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: 2019-10-17T04:17:40Z
  labels:
    app: hugo
  name: hugo
spec:
  containers:
  - command:
    - nginx
    - -g
    - daemon off;
    env:
    - name: PATH
      value: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    - name: TERM
      value: xterm
    - name: HOSTNAME
    - name: container
      value: podman
    - name: NGINX_VERSION
      value: 1.17.4
    - name: NJS_VERSION
      value: 0.3.5
    - name: PKG_RELEASE
      value: "1"
    image: docker.io/library/nginx:alpine
    name: reverentkirch
    resources: {}
    securityContext:
      allowPrivilegeEscalation: true
      capabilities: {}
      privileged: false
      readOnlyRootFilesystem: false
    workingDir: /
status: {}

怎么样,是不是有种熟悉的味道?这是一个兼容 kubernetes 的 pod 定义,你可以直接通过 kubectl apply -f hugo.yaml 将其部署在 Kubernetes 集群中,也可以直接通过 podman 部署,步骤大致是这样的:

先删除之前创建的 pod:

$ podman pod rm -f hugo

然后通过部署清单创建 pod:

$ podman play kube hugo.yaml

回到之前的问题,如果通过声明式定义来创建 pod,还是无法解决服务发现的问题,除非换个支持静态 IP 的 CNI 插件,而支持静态 IP 的这些 CNI 插件又需要 etcd 作为数据库,我就这么点资源,可不想再加个 etcd,还是手撸命令行吧。

首先我要创建一个 hugo 容器,并指定容器的 IP:

$ podman run -d --name hugo \
  --ip=10.88.0.10 \
  -v /opt/hugo/public:/usr/share/nginx/html \
  -v /etc/localtime:/etc/localtime \
  nginx:alpine

再创建一个 envoy 容器,与 hugo 容器共享 network namespace:

$ podman run -d --name hugo-envoy \
  -v /opt/hugo/service-envoy.yaml:/etc/envoy/envoy.yaml \
  -v /etc/localtime:/etc/localtime \
  --net=container:hugo envoyproxy/envoy-alpine:latest

service-envoy.yaml 的内容如下:

static_resources:
  listeners:
  - address:
      socket_address:
        address: 0.0.0.0
        port_value: 8080
    filter_chains:
    - filters:
      - name: envoy.http_connection_manager
        config:
          codec_type: auto
          stat_prefix: ingress_http
          access_log:
          - name: envoy.file_access_log
            config:
              path: "/dev/stdout"
          route_config:
            name: local_route
            virtual_hosts:
            - name: service
              domains:
              - "*"
              routes:
              - match:
                  prefix: "/"
                route:
                  cluster: local_service
          http_filters:
          - name: envoy.router
            config: {}
  clusters:
  - name: local_service
    connect_timeout: 0.25s
    type: strict_dns
    lb_policy: round_robin
    hosts:
    - socket_address:
        address: 127.0.0.1
        port_value: 80
admin:
  access_log_path: "/dev/null"
  address:
    socket_address:
      address: 0.0.0.0
      port_value: 8081

具体的含义请参考为 Envoy 开启 TLS 验证实战。

本文开头提到 podman 创建的容器是 podman 的子进程,这个表述可能比较模糊,实际上 podman 由两部分组成,一个是 podman CLI,还有一个是 container runtime,container runtime 由 conmon 来负责,主要包括监控、日志、TTY 分配以及类似 out-of-memory 情况的杂事。也就是说,conmon 是所有容器的父进程。

conmon 需要去做所有 systemd 不做或者不想做的事情。即使 CRI-O 不直接使用 systemd 来管理容器,它也将容器分配到 sytemd 兼容的 cgroup 中,这样常规的 systemd 工具比如 systemctl 就可以看见容器资源使用情况了。

$ podman ps

CONTAINER ID  IMAGE                                     COMMAND               CREATED             STATUS                 PORTS  NAMES
42762bf7d37a  docker.io/envoyproxy/envoy-alpine:latest  /docker-entrypoin...  About a minute ago  Up About a minute ago         hugo-envoy
f0204fdc9524  docker.io/library/nginx:alpine            nginx -g daemon o...  2 minutes ago       Up 2 minutes ago              hugo

对 cgroup 不熟的同学,可以参考下面这个系列:

  • 深入理解 Linux Cgroup 系列(一):基本概念
  • 深入理解 Linux Cgroup 系列(二):玩转 CPU
  • 深入理解 Linux Cgroup 系列(三):内存
  • 深入理解 Kubernetes 资源限制:CPU
  • Kubernetes 内存资源限制实战
  • Kubernetes Pod 驱逐详解

零基础的同学建议按照上面的目录从上到下打怪升级,祝你好运!

3. 部署前端代理

这个很简单,直接创建容器就好了:

$ podman run -d --name front-envoy \
--add-host=hugo:10.88.0.10 \
-v /opt/hugo/front-envoy.yaml:/etc/envoy/envoy.yaml \
-v /etc/localtime:/etc/localtime \
-v /root/.acme.sh/yangcs.net:/root/.acme.sh/yangcs.net \
--net host envoyproxy/envoy

由于没办法自动服务发现,需要通过参数 --add-host 手动添加 hosts 到容器中。envoy 的配置文件中是通过域名来添加 cluster 的,front-envoy.yaml 内容如下:

static_resources:
  listeners:
  - address:
      socket_address:
        address: 0.0.0.0
        port_value: 80
    filter_chains:
    - filters:
      - name: envoy.http_connection_manager
        config:
          codec_type: auto
          stat_prefix: ingress_http
          access_log:
          - name: envoy.file_access_log
            config:
              path: "/dev/stdout"
          route_config:
            virtual_hosts:
            - name: backend
              domains:
              - "*"
              routes:
              - match:
                  prefix: "/"
                redirect:
                  https_redirect: true
                  response_code: "FOUND"
          http_filters:
          - name: envoy.router
            config: {}
  - address:
      socket_address:
        address: 0.0.0.0
        port_value: 443
    filter_chains:
    - filter_chain_match:
        server_names: ["yangcs.net", "www.yangcs.net"]
      tls_context:
        common_tls_context:
          alpn_protocols: h2
          tls_params:
            tls_maximum_protocol_version: TLSv1_3
          tls_certificates:
            - certificate_chain:
                filename: "/root/.acme.sh/yangcs.net/fullchain.cer"
              private_key:
                filename: "/root/.acme.sh/yangcs.net/yangcs.net.key"
      filters:
      - name: envoy.http_connection_manager
        config:
          codec_type: auto
          stat_prefix: ingress_http
          route_config:
            name: local_route
            virtual_hosts:
            - name: backend
              domains:
              - "yangcs.net"
              - "www.yangcs.net"
              routes:
              - match:
                  prefix: "/admin"
                route:
                  prefix_rewrite: "/"
                  cluster: envoy-ui
              - match:
                  prefix: "/"
                route:
                  cluster: hugo
                  response_headers_to_add:
                    - header:
                        key: "Strict-Transport-Security"
                        value: "max-age=63072000; includeSubDomains; preload"
          http_filters:
          - name: envoy.router
            config: {}
  clusters:
  - name: hugo
    connect_timeout: 0.25s
    type: strict_dns
    lb_policy: round_robin
    http2_protocol_options: {}
    hosts:
    - socket_address:
        address: hugo
        port_value: 8080
admin:
  access_log_path: "/dev/null"
  address:
    socket_address:
      address: 0.0.0.0
      port_value: 8001

具体的含义请参考为 Envoy 开启 TLS 验证实战。

现在就可以通过公网域名访问博客网站了,如果后续还有其他应用,都可以参考第二节的步骤,然后重新创建前端代理,添加 --add-host 参数。以我的网站 https://www.yangcs.net 为例:

我好像透露了一些什么不得了的东西,就此打住,你也不要说,你也不要问。

4. 开机自启

由于 podman 不再使用 daemon 管理服务,--restart 参数被废弃了,要想实现开机自动启动容器,只能通过 systemd 来管理了。先创建 systemd 服务配置文件:

$ vim /etc/systemd/system/hugo_container.service

[Unit]
Description=Podman Hugo Service
After=network.target
After=network-online.target

[Service]
Type=simple
ExecStart=/usr/bin/podman start -a hugo
ExecStop=/usr/bin/podman stop -t 10 hugo
Restart=always

[Install]
WantedBy=multi-user.target

$ vim /etc/systemd/system/hugo-envoy_container.service

[Unit]
Description=Podman Hugo Sidecar Service
After=network.target
After=network-online.target
After=hugo_container.service

[Service]
Type=simple
ExecStart=/usr/bin/podman start -a hugo-envoy
ExecStop=/usr/bin/podman stop -t 10 hugo-envoy
Restart=always

[Install]
WantedBy=multi-user.target

$ vim /etc/systemd/system/front-envoy_container.service

[Unit]
Description=Podman Front Envoy Service
After=network.target
After=network-online.target
After=hugo_container.service hugo-envoy_container.service

[Service]
Type=simple
ExecStart=/usr/bin/podman start -a front-envoy
ExecStop=/usr/bin/podman stop -t 10 front-envoy
Restart=always

[Install]
WantedBy=multi-user.target

然后将之前停止之前创建的容器,注意:是停止,不是删除!

$ podman stop $(podman ps -aq)

最后通过 systemd 服务启动这些容器。

$ systemctl start hugo_container
$ systemctl start hugo-envoy_container
$ systemctl start front-envoy_container

设置开机自启。

$ systemctl enable hugo_container
$ systemctl enable hugo-envoy_container
$ systemctl enable front-envoy_container

之后每次系统重启后 systemd 都会自动启动这个服务所对应的容器。

4. 总结

以上就是将博客从 Docker 迁移到 Podman 的所有变更操作,总体看下来还是比较曲折,因为 Podman 是为 Kubernetes 而设计的,而我要求太高了,就一个资源紧张的 vps,即不想上 Kubernetes,也不想上 etcd,既想搞 sidecar,又想搞自动服务发现,我能怎么办,我也很绝望啊,这个事怨不得 podman,为了防止在大家心里留下 “podman 不好用” 的印象,特此声明一下。啥都不想要,只能自己想办法了~~

微信公众号

扫一扫下面的二维码关注微信公众号,在公众号中回复◉加群◉即可加入我们的云原生交流群,和孙宏亮、张馆长、阳明等大佬一起探讨云原生技术

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Podman 使用指南 的相关文章

  • 【Linux】Ubuntu 使用指南

    content 1 换清华源2 更新三步走3 1 换清华源 备份 Ubuntu 的软件源配置文件 etc apt sources list span class token function sudo span span class tok
  • mysql使用指南

    目录 一 SQL简述1 SQL的概述2 SQL的优点3 SQL的分类 二 数据库的三大范式三 数据库的数据类型1 整数类型2 浮点数类型和定点数类型3 字符串类型4 字符串类型5 日期与时间类型 四 数据库 数据表的基本操作1 数据库的基本
  • 七牛云存储 CDN 使用指南

    七牛cdn 使用指南 更新于2016 3 13 分为两种情况 xff1a 1 使用七牛存储 2 直接使用七牛cdn 一 使用七牛存储 xff08 七牛的存储默认使用cdn加速 xff09 静态资源存储到七牛后 xff0c 可以使用七牛提供的
  • ubuntu-desktop 设置为默认桌面_WSL 使用指南——05 自定义桌面环境

    WSL 使用指南 05 自定义桌面环境 当我们完成安装桌面环境后 xff0c 我们或许希望改变一成不变的桌面环境UI xff0c 不过在尝试通过系统设置美化UI时 xff0c 我们会发现这并不起作用 对于这个问题 xff0c 我们的解决方案
  • CentOS8.2中的Podman使用初探-以搭建LNMP-seafile-onlyoffice为情景

    CentOS8已经发布第3版了 xff0c 之前刚出来 xff0c 也试着用了一下 xff0c 发现对于老硬件的支持性不好 xff0c 而我的测试机正好在不支持的范围内 xff0c 也就没有折腾 1 测试机的lspci信息 xff1a 05
  • 七牛cdn 使用指南

    七牛cdn 使用指南 更新于2016 3 12 分为两种情况 xff1a 1 使用七牛存储 2 直接使用七牛cdn 一 使用七牛存储 xff08 七牛的存储默认使用cdn加速 xff09 静态资源存储到七牛后 xff0c 可以使用七牛提供的
  • 使用Formik轻松开发更高质量的React表单(二)使用指南

    一个基本的例子 设想你要开发一个可以编辑用户数据的表单 不过 xff0c 你的用户API端使用了具有类似下面的嵌套对象表达 xff1a id string email string social facebook string twitte
  • Github使用指南(持续更新中)

    一 简介 Github的网页端是www github com GitHub是一个面向开源及私有软件项目的托管平台 xff0c 因为只支持Git作为唯一的版本库格式进行托管 xff0c 故名GitHub GitHub于2008年4月10日正式
  • Idea使用指南

    安装 只选一个X64 xff0c 其余一路next 使用 xff1a
  • 通用环形缓冲区 LwRB 使用指南

    什么是 LwRB xff1f LwRB 是一个开源 通用环形缓冲区库 xff0c 为嵌入式系统进行了优化 源码点击这里 Github LwRB 特性 使用 ANSI C99 编写FIFO xff08 先进先出 xff09 无动态内存分配 x
  • 【MATLAB UAV Toolbox】使用指南(一)

    开始使用UAV Toolbox 设计 xff0c 仿真和部署无人机应用程序 UAV Toolbox给设计 仿真 测试和部署无人机应用程序提供了工具和参考应用 你能够设计自动飞行算法 无人机任务和飞行控制器 飞行日志分析仪应用程序可以让您交互
  • 【MATLAB UAV Toolbox】使用指南(二)

    可视化和回放MAVLink飞行日志 这个例子将展示如何将包含MAVLink包的遥测日志 xff08 TLOG xff09 加载进MATLAB 提取的详细信息用来绘图 然后再次仿真飞行 xff0c 这些消息通过MAVLink通信接口重新发布
  • STC-ISP使用指南

    该软件无需安装 xff0c 下载后打开直接用 本软件是专门给STC系列单片机下载烧录程序的 xff0c 并不能适用于ARM系列的单片机 界面介绍 xff1a 打开后的界面如下 xff1a 左边的部分一般是用来下载程序的 xff0c 右面一般
  • xsemaphoretake返回_FreeRTOS 使用指南

    http xilinx eetrend com article 7845 2014 繁星电子开发团队制作 作为一个轻量级的操作系统 xff0c FreeRTOS 提供的功能包括 xff1a 任务管理 时间管理 信号量 消息队列 内存管理 记
  • podman简介

    podman简介掌握docker 跟上云时代的步伐 Podman是一个开源项目 xff0c 可在大多数Linux平台上使用并开源在GitHub上 Podman是一个无守护进程的容器引擎 xff0c 用于在Linux系统上开发 xff0c 管
  • Podman 使用指南

    原文链接 xff1a Podman 使用指南 Podman 原来是 CRI O 项目的一部分 xff0c 后来被分离成一个单独的项目叫 libpod Podman 的使用体验和 Docker 类似 xff0c 不同的是 Podman 没有
  • JavaParser使用指南

    抱歉这个博客是很久以前写的 xff0c 现在我已经不用javaparser了 xff0c 这个包也一直在更新所以这篇博客参考意义不大 大家可以根据官网的例子去试试 JavaParser使用指南 前言入门 StartJavaParser Cl
  • 在没有 sudo 的情况下运行特权 podman(并且没有用户名空间)

    我在 RHEL 7 6 上安装了 podman 并且可以使用 sudo 运行正常的 docker 命令 sudo podman run hello world 有没有一种方法可以在不使用 sudo 的情况下运行它 而不使用用户名空间 类似于
  • 使用 Podman 通信不同的 pod

    我正在使用 podman compose 部署多个 Pod 为此 每个 pod 在 podman compose yaml 文件中都有自己的定义 我以无根模式执行该文件 因此 Pod 中的所有容器共存于同一主机 IP 中 但是 我希望 Po
  • 使用 Podman 连接到 VPN

    有了这个Dockerfile FROM fedora 30 ENV LANG C UTF 8 RUN dnf upgrade y dnf install y openssh clients openvpn slirp4netns dnf c

随机推荐

  • 远程桌面连接mstsc win10开启与配置

    开启服务 方法1 在设置 系统 远程桌面中 xff0c 打开启用远程桌面功能 方法2 在控制面板 系统 允许远程访问中 xff0c 远程桌面里打开允许远程连接到此计算机功能 允许多个远程桌面连接 win 43 r 输入gpedit msc
  • 决策树CART、ID3、C4.5原理梳理

    老饼讲解机器学习 http ml bbbdata com teach 108 目录 一 学习决策树原理的顺序 二 CART分类树 一 分类树模型结构 二 分类树构建过程 二 剪枝 防止过拟合 xff09 三 CART回归树模型 四 ID3算
  • 麻将胡牌判定方法-索引法

    麻将胡牌判定方法 xff08 查表法 xff0c 翻译自http hp vector co jp authors VA046927 mjscore mjalgorism html xff09 麻将高速判定胡牌方法说明使用索引法如何检查所有形
  • 基于msOS-stm32系统选择的想法

    由于换了家公司 xff0c 虽然都要从事底层代码开发 xff0c 但由于算是跨行业了 xff0c 很多东西都需要从新开始 xff0c 很是麻烦和头疼 xff0c 所以感觉轻易不要换行业 还好主要核心没有改变多大 xff0c 没多久就适应了
  • aop 使用案例

    1 主要使用场景 xff1a 数据比对 xff0c 本系统数据库内部数据和第三方数据比对是否一致 xff0c 差别 因为需要时间比较长 xff0c 避免用户短时间重复点击问题 aop 通过注解的方式 xff0c 根据请求地址和参数 xff0
  • 解决pom文件project标签爆红波浪线,一直提示:Could not find artifact xxx from xxx,格式不规范,从pdf资料中拷贝pom依赖各种却死活无法下载依赖且爆红

    解决了pom文件project标签爆红波浪线 一直提示 xff1a Could not find artifact xxx from xxx 格式不规范 从pdf资料中拷贝pom依赖各种却死活无法下载依赖且爆红等原因 样例1 spring
  • CentOS tomcat自启动

    CentOS tomcat自启动 在CentOS 7 操作系统上安装Tomcat xff0c 默认是不能进行服务自启动的 而对于Web应用而言 xff0c 服务器reboot后 xff0c 必须需要能够自动启动 在 usr lib syst
  • Java基础之爬虫

    文章目录 前言一 本地爬虫二 网络爬虫 前言 如下文本 xff0c 请按要求爬取数据 java自从95年问世以来 xff0c 经历了很多版本 xff0c 目前企业中用的最多的是java8和java11 xff0c 因为这两个是长期支持版本
  • Ubuntu远程SSH及x11vnc远程桌面连接

    一 连接SSH 1 开启ssh sudo apt update 更新源列表 sudo apt get install openssh server 安装ssh服务 sudo ps e grep ssh 查看ssh服务是否启动 如图则已开启
  • 配置编译带cuda版本并支持cudacodec硬编解码opencv库笔记

    写这个笔记主要是记录配置编译opencv 43 cuda 43 cudacodec的过程核经历 xff0c 这里面的坑实在太多 参考文章 xff1a https note youdao com ynoteshare1 index html
  • SSH登录CentOS服务器并在Docker中运行和显示GUI程序的方法

    SSH和Docker都是字符界面 xff0c 以前都是通过字符界面登录服务器并运行Docker中的程序 xff0c 将输出结果 xff08 视频或者图片 xff09 传回来进行结果查看和分析 xff0c 这样效率太低了 xff0c 于是周末
  • 字符数组及字符串 是否添加'\0'

    lt span style 61 34 font family Arial Helvetica sans serif background color rgb 255 255 255 34 gt lt span gt lt span sty
  • MapReduce编程(入门篇)

    一 MapReduce 编程模型 还是以一个经典的图片来说明问题 1 首先 我们能确定我们有一份输入 而且他的数据量会很大 2 通过split之后 他变成了若干的分片 每个分片交给一个Map处理 3 map处理完后 tasktracker会
  • 如何优雅的用 VScode 编写 C++ 大型项目?

    vscode远程开发配置 由于后面项目用到了epoll和splice xff0c 这些都是unix环境中才有的调用 xff0c 所以我们还是需要在linux环境中开发 xff0c 我选用的vscode连接linux进行远程开发 选用vsco
  • Ubuntu16.04安装常用开发软件

    xff08 1 xff09 gcc和g 43 43 sudo apt span class hljs attribute get span install build span class hljs attribute essential
  • 用python爬取电影名,演员,评分等并存入excel

    1在python环境下找到安装python的路径 2在这个文件名后cmd 43 enter进入黑框 3在黑框中安装jupyter notebook 黑框中也可以安装其他python编辑是需要用的包 4创建一个学习python的文件夹 xff
  • matlab cody学习笔记 day16

    这道题目如果要理逻辑其实还挺麻烦的 xff0c 所以打算好好理理这道题目 xff08 1 xff09 Find the longest sequence of 1 39 s in a binary sequence Given a stri
  • matlab GUI学习笔记1 如何生成一个GUI文件,及如何修改保存后的.fig文件

    最近需要做一个项目的小软件 xff0c 学习如何用matlab GUI生成一个小软件 xff0c 带对话框等等 所以这几天对matlab GUI的分步学习进行记录 我的matlab版本是R2017a 首先是如何在matlab中生成一个GUI
  • SDN相关题目

    1 判断题知识点 xff1a OpenDaylight 难度 xff1a 初级 科目 xff1a SDN Maven是一个采用纯Java编写的开源项目管理工具 对 错 回答错误正确答案 xff1a 对 解析 xff1a Maven是JAVA
  • Podman 使用指南

    原文链接 xff1a Podman 使用指南 Podman 原来是 CRI O 项目的一部分 xff0c 后来被分离成一个单独的项目叫 libpod Podman 的使用体验和 Docker 类似 xff0c 不同的是 Podman 没有