[轉]Docker 大勢已去,Podman 即將崛起

Podman

什么是Podman?

在這里插入圖片描述

Podman 是一個開源的容器運行時項目,可在大多數 Linux 平臺上使用。Podman 提供與 Docker 非常相似的功能。正如前面提到的那樣,它不需要在你的系統上運行任何守護進程,并且它也可以在沒有 root 權限的情況下運行。

Podman 可以管理和運行任何符合 OCI(Open Container Initiative)規范的容器和容器鏡像。Podman 提供了一個與 Docker 兼容的命令行前端來管理 Docker 鏡像。

Podman 官網地址:https://podman.io/

Podman和Docker的主要區別是什么?

  • dockers在實現CRI的時候,它需要一個守護進程,其次需要以root運行,因此這也帶來了安全隱患。
  • podman不需要守護程序,也不需要root用戶運行,從邏輯架構上,比docker更加合理。
  • 在docker的運行體系中,需要多個daemon才能調用到OCI的實現RunC。
  • 在容器管理的鏈路中,Docker Engine的實現就是dockerd
  • daemon,它在linux中需要以root運行,dockerd調用containerd,containerd調用containerd-shim,然后才能調用runC。顧名思義shim起的作用也就是“墊片”,避免父進程退出影響容器的運訓
  • podman直接調用OCI,runtime(runC),通過common作為容器進程的管理工具,但不需要dockerd這種以root身份運行的守護進程。
  • 在podman體系中,有個稱之為common的守護進程,其運行路徑通常是/usr/libexec/podman/conmon,它是各個容器進程的父進程,每個容器各有一個,common的父則通常是1號進程。podman中的common其實相當于docker體系中的containerd-shim。
    在這里插入圖片描述
    圖中所體現的事情是,podman不需要守護進程,而dorker需要守護進程。在這個圖的示意中,dorcker的containerd-shim與podman的common被歸在Container一層。

Podman的使用與docker有什么區別?

podman的定位也是與docker兼容,因此在使用上面盡量靠近docker。在使用方面,可以分成兩個方面來說,一是系統構建者的角度,二是使用者的角度。
在系統構建者方面,用podman的默認軟件,與docker的區別不大,只是在進程模型、進程關系方面有所區別。如果習慣了docker幾個關聯進程的調試方法,在podman中則需要適應。可以通過pstree命令查看進程的樹狀結構。總體來看,podman比docker要簡單。由于podman比docker少了一層daemon,因此重啟的機制也就不同了。
在使用者方面,podman與docker的命令基本兼容,都包括容器運行時(run/start/kill/ps/inspect),本地鏡像(images/rmi/build)、鏡像倉庫(login/pull/push)等幾個方面。因此podman的命令行工具與docker類似,比如構建鏡像、啟停容器等。甚至可以通過alias
docker=podman可以進行替換。因此,即便使用了podman,仍然可以使用docker.io作為鏡像倉庫,這也是兼容性最關鍵的部分。

Podman 常用命令

容器

podman run           創建并啟動容器
podman start         啟動容器
podman ps            查看容器
podman stop          終止容器
podman restart       重啟容器
podman attach        進入容器
podman exec          進入容器
podman export        導出容器
podman import        導入容器快照
podman rm            刪除容器
podman logs          查看日志

鏡像

podman search                檢索鏡像
podman pull                  獲取鏡像
podman images                列出鏡像
podman image Is              列出鏡像
podman rmi                   刪除鏡像
podman image rm              刪除鏡像
podman save                  導出鏡像
podman load                  導入鏡像
podmanfile                   定制鏡像(三個)podman build             構建鏡像podman run               運行鏡像podmanfile               常用指令(四個)COPY                 復制文件ADD                  高級復制CMD                  容器啟動命令ENV                  環境變量EXPOSE               暴露端口

部署 Podman

//安裝podman
[root@localhost ~]# yum -y install podman

Podman 加速器

版本7配置加速器

//倉庫配置
[root@localhost ~]# vim /etc/containers/registries.conf
[registries.search]
#registries = ["registry.access.redhat.com", "registry.redhat.io", "docker.io"]	 #這個是查找,從這三個地方查找registries = ["docker.io"]		#如果只留一個,則只在一個源里查找
[[docker.io]]
location="j3m2itm3.mirror.aliyuncs.com"

版本8配置加速器

#unqualified-search-registries = ["registry.fedoraproject.org", "registry.access.redhat.com", "registry.centos.org", "docker.io"] 		#直接注釋掉
unqualified-search-registries = ["docker.io"]		#添加一個docker.io
[[registry]]
prefix = "docker.io"
location = "j3m2itm3.mirror.aliyuncs.com" (不用加https://  直接加地址)

使用 Podman

使用 Podman 非常的簡單,Podman 的指令跟 Docker 大多數都是相同的。下面我們來看幾個常用的例子:

運行一個容器

[root@localhost ~]# podman run -d --name httpd docker.io/library/httpd
Trying to pull docker.io/library/httpd...
Getting image source signatures
Copying blob e5ae68f74026 done  
Copying blob d3576f2b6317 done  
Copying blob bc36ee1127ec done  
Copying blob f1aa5f54b226 done  
Copying blob aa379c0cedc2 done  
Copying config ea28e1b82f done  
Writing manifest to image destination
Storing signatures
0492e405b9ecb05e6e6be1fec0ac1a8b6ba3ff949df259b45146037b5f355035//查看鏡像
[root@localhost ~]# podman images
REPOSITORY                  TAG      IMAGE ID       CREATED       SIZE
docker.io/library/httpd     latest   ea28e1b82f31   11 days ago   148 MB

列出運行的容器

[root@localhost ~]# podman ps
CONTAINER ID  IMAGE                             COMMAND           CREATED             STATUS                 PORTS  NAMES
0492e405b9ec  docker.io/library/httpd:latest    httpd-foreground  About a minute ago  Up About a minute ago         httpd

注意:如果在ps命令中添加-a,Podman 將顯示所有容器。

檢查正在運行的容器

您可以“檢查”正在運行的容器的元數據和有關其自身的詳細信息。我們甚至可以使用 inspect 子命令查看分配給容器的 IP 地址。由于容器以無根模式運行,因此未分配 IP 地址,并且該值將在檢查的輸出中列為“無”。

[root@localhost ~]# podman inspect -l | grep IPAddress\": "SecondaryIPAddresses": null, "IPAddress": "10.88.0.5",[root@localhost ~]# curl 10.88.0.5
<html><body><h1>It works!</h1></body></html>

注意: -l 是最新容器的便利參數。您還可以使用容器的 ID 代替 -l。

查看一個運行中容器的日志

選項--latest		#最近的[root@localhost ~]# podman logs --latest
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 10.88.0.5. Set the 'ServerName' directive globally to suppress this message
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 10.88.0.5. Set the 'ServerName' directive globally to suppress this message
[Mon Dec 13 15:17:53.690844 2021] [mpm_event:notice] [pid 1:tid 140665160166720] AH00489: Apache/2.4.51 (Unix) configured -- resuming normal operations
[Mon Dec 13 15:17:53.690946 2021] [core:notice] [pid 1:tid 140665160166720] AH00094: Command line: 'httpd -D FOREGROUND'
10.88.0.1 - - [13/Dec/2021:15:19:48 +0000] "GET / HTTP/1.1" 200 45
10.88.0.1 - - [13/Dec/2021:15:20:47 +0000] "GET / HTTP/1.1" 200 45

查看一個運行容器中的進程資源使用情況

可以使用top觀察容器中的 nginx pid

語法:podman top <container_id>  [root@localhost ~]# podman top httpd
USER       PID   PPID   %CPU    ELAPSED            TTY   TIME   COMMAND
root       1     0      0.000   15m38.599711321s   ?     0s     httpd -DFOREGROUND 
www-data   7     1      0.000   15m38.599783256s   ?     0s     httpd -DFOREGROUND 
www-data   8     1      0.000   15m38.599845342s   ?     0s     httpd -DFOREGROUND 
www-data   9     1      0.000   15m38.599880444s   ?     0s     httpd -DFOREGROUND 

停止一個運行中的容器

[root@localhost ~]# podman stop --latest
2f3edf712621d3a41e03fa8c7f6a5cdba56fbbad43a7a59ede26cc88f31006c4
[root@localhost ~]# podman ps
CONTAINER ID  IMAGE  COMMAND  CREATED  STATUS  PORTS  NAMES

刪除一個容器

[root@localhost ~]# podman rm --latest
2f3edf712621d3a41e03fa8c7f6a5cdba56fbbad43a7a59ede26cc88f31006c4
[root@localhost ~]# podman ps -a
CONTAINER ID  IMAGE  COMMAND  CREATED  STATUS  PORTS  NAMES

以上這些特性基本上都和 Docker 一樣,Podman 除了兼容這些特性外,還支持了一些新的特性。

上傳鏡像

例如,如果我們想在 docker.io 上分享我們新建的 Nginx 容器鏡像,這很容易。首先登錄碼頭:

[root@localhost nginx]# tree 
.
├── Dockerfile
└── files└── nginx-1.20.1.tar.gz[root@localhost nginx]# cat Dockerfile 
FROM docker.io/library/centosENV PATH /usr/local/nginx/sbin:$PATH
ADD files/nginx-1.20.1.tar.gz /usr/src
RUN useradd -r -M -s /sbin/nologin nginx && \yum -y install pcre-devel openssl openssl-devel gd-devel gcc gcc-c++ make && \mkdir -p /var/log/nginx && \cd /usr/src/nginx-1.20.1 && \./configure \--prefix=/usr/local/nginx \--user=nginx \--group=nginx \--with-debug \--with-http_ssl_module \--with-http_realip_module \--with-http_image_filter_module \--with-http_gunzip_module \--with-http_gzip_static_module \--with-http_stub_status_module \--http-log-path=/var/log/nginx/access.log \--error-log-path=/var/log/nginx/error.log && \make && make installCMD ["nginx","-g","daemon off"]
[root@localhost nginx]# podman build -t nginx .// 修改鏡像名[root@localhost ~]# podman tag docker.io/library/nginx:latest docker.io/1314444/test:latest// 登錄并上傳鏡像
[root@localhost ~]# podman login docker.io // 需要告訴其要登錄到docker倉庫
[root@localhost ~]# podman login docker.io
Username: 1314444		#賬戶
Password: ********		#密碼
Login Succeeded![root@localhost nginx]# podman push docker.io/1314444/test:latest  //上傳鏡像
Getting image source signatures
Copying blob 38c40d6c2c85 done
Copying blob fee76a531659 done
Copying blob c2adabaecedb done
Copying config 7f3589c0b8 done
Writing manifest to image destination
Copying config 7f3589c0b8 done
Writing manifest to image destination
Storing signatures//請注意,我們將四層推送到我們的注冊表,現在可供其他人共享。快速瀏覽一下:
[root@localhost ~]# podman inspect 1314444/test:nginx
//輸出:
[{"Id": "7f3589c0b8849a9e1ff52ceb0fcea2390e2731db9d1a7358c2f5fad216a48263","Digest": "sha256:7822b5ba4c2eaabdd0ff3812277cfafa8a25527d1e234be028ed381a43ad5498","RepoTags": ["docker.io/1314444/test:nginx",......

總而言之,Podman 使查找、運行、構建和共享容器變得容易。

配置別名

如果習慣了使用 Docker 命令,可以直接給 Podman 配置一個別名來實現無縫轉移。你只需要在 .bashrc 下加入以下行內容即可:

[root@localhost ~]# echo "alias docker=podman" >> .bashrc
source .bashrc
[root@localhost ~]# alias
alias cp='cp -i'
alias docker='podman'
.......

用戶操作

在允許沒有root特權的用戶運行Podman之前,管理員必須安裝或構建Podman并完成以下配置
cgroup V2Linux內核功能允許用戶限制普通用戶容器可以使用的資源,如果使用cgroupV2啟用了運行Podman的Linux發行版,則可能需要更改默認的OCI運行時。某些較舊的版本runc不適用于cgroupV2,必須切換到備用OCI運行時crun。

[root@localhost ~]# yum -y install crun     //centos8系統自帶[root@localhost ~]# vi /usr/share/containers/containers.conf 446 # Default OCI runtime447 # 448 runtime = "crun"      //取消注釋并將runc改為crun[root@localhost ~]# podman run -d --name web -p 80:80 docker.io/library/nginx
c8664d2e43c872e1e5219f82d41f63048ed3a5ed4fb6259c225a14d6c243677f[root@localhost ~]# podman inspect web | grep crun"OCIRuntime": "crun","crun",

安裝slirp4netns和fuse-overlayfs

在普通用戶環境中使用Podman時,建議使用fuse-overlayfs而不是VFS文件系統,至少需要版本0.7.6。現在新版本默認就是了。

[root@localhost ~]# yum -y install slirp4netns[root@localhost ~]# yum -y install fuse-overlayfs
[root@localhost ~]# vi /etc/containers/storage.conf
77 mount_program = "/usr/bin/fuse-overlayfs"     //取消注釋

/ etc / subuid和/ etc / subgid配置

Podman要求運行它的用戶在/ etc / subuid和/ etc / subgid文件中列出一系列UID,shadow-utils或newuid包提供這些文件

[root@localhost ~]# yum -y install shadow-utils可以在/ etc / subuid和/ etc / subgid查看,每個用戶的值必須唯一且沒有任何重疊。[root@localhost ~]# useradd zz
[root@localhost ~]# cat /etc/subuid
zz:100000:65536
[root@localhost ~]# cat /etc/subgid
zz:100000:65536// 啟動非特權ping 
[root@localhost ~]# sysctl -w "net.ipv4.ping_group_range=0 200000" //大于100000這個就表示tom可以操作podman
net.ipv4.ping_group_range = 0 200000

  • 這個文件的格式是 USERNAME:UID:RANGE

    • 中/etc/passwd或輸出中列出的用戶名getpwent。
    • 為用戶分配的初始 UID。
    • 為用戶分配的 UID 范圍的大小。

該usermod程序可用于為用戶分配 UID 和 GID,而不是直接更新文件。

[root@localhost ~]# usermod --add-subuids 200000-201000 --add-subgids 200000-201000 hh
grep hh /etc/subuid /etc/subgid
/etc/subuid:hh:200000:1001
/etc/subgid:hh:200000:1001

用戶配置文件

三個主要的配置文件是container.confstorage.confregistries.conf。用戶可以根據需要修改這些文件。
container.conf

// 用戶配置文件
[root@localhost ~]# cat /usr/share/containers/containers.conf
[root@localhost ~]# cat /etc/containers/containers.conf
[root@localhost ~]# cat ~/.config/containers/containers.conf  //優先級最高

如果它們以該順序存在。每個文件都可以覆蓋特定字段的前一個文件。

配置storage.conf文件

1./etc/containers/storage.conf
2.$HOME/.config/containers/storage.conf

在普通用戶中/etc/containers/storage.conf的一些字段將被忽略

[root@localhost ~]#  vi /etc/containers/storage.conf
[storage]# Default Storage Driver, Must be set for proper operation.
driver = "overlay"		#此處改為overlay
.......
mount_program = "/usr/bin/fuse-overlayfs"		#取消注釋[root@localhost ~]# sysctl user.max_user_namespaces=15000  #如果版本為8以下,則需要做以下操作:

在普通用戶中這些字段默認

graphroot="$HOME/.local/share/containers/storage"
runroot="$XDG_RUNTIME_DIR/containers"

registries.conf
配置按此順序讀入,這些文件不是默認創建的,可以從/usr/share/containers或復制文件/etc/containers并進行修改。

1./etc/containers/registries.conf
2./etc/containers/registries.d/*
3.HOME/.config/containers/registries.conf

授權文件
此文件里面寫了docker賬號的密碼,以加密方式顯示

[root@localhost ~]# podman login
Username: 1314444
Password: 
Login Succeeded!
[root@localhost ~]# cat /run/user/0/containers/auth.json 
{"auths": {"registry.fedoraproject.org": {"auth": "MTMxNDQ0NDpIMjAxNy0xOA=="}}
}

普通用戶是無法看見root用戶的鏡像的

//root用戶
[root@localhost ~]# podman images
REPOSITORY                  TAG      IMAGE ID       CREATED       SIZE
docker.io/library/httpd     latest   ea28e1b82f31   11 days ago   146 MB//普通用戶
[root@localhost ~]# su - zz
[zz@localhost ~]$ podman images
REPOSITORY  TAG         IMAGE ID    CREATED     SIZE

  • 容器與root用戶一起運行,則root容器中的用戶實際上就是主機上的用戶。
  • UID GID是在/etc/subuid和/etc/subgid等中用戶映射中指定的第一個UID GID。
  • 如果普通用戶的身份從主機目錄掛載到容器中,并在該目錄中以根用戶身份創建文件,則會看到它實際上是你的用戶在主機上擁有的。

使用卷

[root@localhost ~]# su - zz
[zz@localhost ~]$ pwd
/home/zz
[zz@localhost ~]$ mkdir /home/zz/data[zz@localhost ~]$ podman run -it -v "$(pwd)"/data:/data docker.io/library/busybox /bin/sh
Trying to pull docker.io/library/busybox:latest...
Getting image source signatures
Copying blob 3cb635b06aa2 done  
Copying config ffe9d497c3 done  
Writing manifest to image destination
Storing signatures
/ # ls
bin   data  dev   etc   home  proc  root  run   sys   tmp   usr   var
/ # cd data/
/data # ls
/data # touch 123
/data # ls -l
total 0
-rw-r--r--    1 root     root             0 Dec 13 00:17 123

在主機上查看

[zz@localhost ~]$ ll data/
總用量 0
-rw-r--r-- 1 zz zz 0 12月 13 00:17 123//寫入文件
[zz@localhost ~]$ echo "hell world" >> 123
[zz@localhost ~]$ cat 123
hell world

容器里查看

/data # cat 123
hell world//我們可以發現在容器里面的文件的屬主和屬組都屬于root,那么如何才能讓其屬于tom用戶呢?下面告訴你答案
/data # ls -l
total 4
-rw-rw-r--    1 root     root            12 Dec 13 00:20 123//只要在運行容器的時候加上一個--userns=keep-id即可。
[zz@localhost ~]$ podman run -it --name test -v "$(pwd)"/data:/data --userns=keep-id docker.io/library/busybox /bin/sh
~ $ cd data/
/data $ ls -l
total 4
-rw-r--r--    1 zz       zz              11 Dec 13 00:21 123

使用普通用戶映射容器端口時會報“ permission denied”的錯誤

[zz@localhost ~]$ podman run  -d -p 80:80 httpd
Error: rootlessport cannot expose privileged port 80, you can add 'net.ipv4.ip_unprivileged_port_start=80' to /etc/sysctl.conf (currently 1024), or choose a larger port number (>= 1024): listen tcp 0.0.0.0:80: bind: permission denied

普通用戶可以映射>= 1024的端口

[zz@localhost ~]$ podman run  -d -p 1024:80 httpd
58613a6bdc70d4d4f9f624583f795a62a610596d166f0873bdff8fb26aa15092
[zz@localhost ~]$ ss -anlt
State       Recv-Q      Send-Q           Local Address:Port           Peer Address:Port      Process      
LISTEN      0           128                    0.0.0.0:22                  0.0.0.0:*                      
LISTEN      0           128                          *:1024                      *:*                      
LISTEN      0           128                       [::]:22                     [::]:* 

配置echo ‘net.ipv4.ip_unprivileged_port_start=80’ >> /etc/sysctl.conf后可以映射大于等于80的端口

[root@localhost ~]# echo  'net.ipv4.ip_unprivileged_port_start=80'  >> /etc/sysctl.conf
[root@localhost ~]# sysctl -p
net.ipv4.ip_unprivileged_port_start = 80[zz@localhost ~]$ podman run -d -p 80:80 httpd
1215455a0c300d78e7bf6afaefc9873f818c6b0f26affeee4e2bc17954e72d8e
[zz@localhost ~]$ ss -anlt
State       Recv-Q      Send-Q           Local Address:Port           Peer Address:Port      Process      
LISTEN      0           128                    0.0.0.0:22                  0.0.0.0:*                      
LISTEN      0           128                          *:1024                      *:*                      
LISTEN      0           128                          *:80                        *:*                      
LISTEN      0           128                       [::]:22                     [::]:*  


---------------------
作者:1314444
來源:CSDN
原文:https://blog.csdn.net/qq_48289488/article/details/121905018
版權聲明:本文為作者原創文章,轉載請附上博文鏈接!
內容解析By:CSDN,CNBLOG博客文章一鍵轉載插件

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:
http://www.pswp.cn/news/284516.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/284516.shtml
英文地址,請注明出處:http://en.pswp.cn/news/284516.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于Kubernetes v1.24.0的集群搭建(一)

一、寫在前面 K8S 1.24作為一個很重要的版本更新&#xff0c;它為我們提供了很多重要功能。該版本涉及46項增強功能&#xff1a;其中14項已升級為穩定版&#xff0c;15項進入beta階段&#xff0c;13項則剛剛進入alpha階段。此外&#xff0c;另有2項功能被棄用、2項功能被刪除。…

mvc設計模式和mvc框架的區別

一組概念需要先理解&#xff0c;因為后面需要用&#xff1a; 架構&#xff1a;簡單的說架構就是一個藍圖&#xff0c;是一種設計方案&#xff0c;將客戶的不同需求抽象成為抽象組件&#xff0c;并且能夠描述這些抽象組件之間的通信和調用。 框架&#xff1a;軟件框架是項目軟件…

新型基礎測繪與實景三維中國建設技術文件【4】基礎地理實體數據元數據

基礎地理實體數據是新型基礎測繪產品體系中的核心成果&#xff0c;為實現該數據的規范化管理和使用&#xff0c;編制基礎地理實體數據元數據技術文件。本文件規定了基礎地理實體數據元數據的基本要求和元數據內容&#xff0c;適用于二維表達形式、三維表達形式基礎地理實體數據…

思科三層交換機充當路由器實現全網互通

轉載于:https://blog.51cto.com/13568840/2059797

劍指offer編程題Java實現——面試題3二維數組中的查找

題目描述 在一個二維數組中&#xff0c;每一行都按照從左到右遞增的順序排序&#xff0c;每一列都按照從上到下遞增的順序排序。請完成一個函數&#xff0c;輸入這樣的一個二維數組和一個整數&#xff0c;判斷數組中是否含有該整數。下面是我實現的代碼&#xff0c;修改下類名(…

mpvue開發小程序分享朋友圈無法自定義標題解決方法

在node_modules里面找到mpvue&#xff0c;手動修改一下mpvue這個包下的index.js文件 // 用戶點擊右上角分享 到朋友圈 onShareTimeline: rootVueVM.$options.onShareTimeline? function (options) { return callHook$1(rootVueVM, onShareTimeline, options); } : null,找到 L…

【ArcGIS Pro微課1000例】0020:ArcGIS Pro中河流(曲線)、湖泊(水體色)圖例制作案例教程

相關閱讀:【ArcGIS微課1000例】0032:ArcGIS中河流(曲線)、湖泊(水體色)圖例制作案例教程 河流、湖泊的樣式設置功能在ArcGIS Pro得到了延續,本文講解ArcGIS Pro中河流湖泊圖例的設置方法。 《ArcGIS Pro從入門到精通系列精品教程(微課版)》專欄包括完整的實驗數據包,…

swift學習選pizza項目

2019獨角獸企業重金招聘Python工程師標準>>> 原文: https://makeapppie.com/2014/09/18/swift-swift-implementing-picker-views/ 效果: 步驟: 新建iOS single view application 名字為SwiftPickerViewPizzaDemo, 打開main storyboard選中view controoler, 右上角, …

Windows 11 新版 25163 推送!任務欄全新菜單、應用商店更新、文件資源管理器大量修復...

面向 Dev 頻道的 Windows 預覽體驗成員&#xff0c;微軟現已推送 Windows 11 預覽版 Build 25163。主要變化1.微軟宣布為 Windows 11 任務欄引入全新溢出體驗&#xff0c;當任務欄上的應用程序圖標或窗口達到任務欄容量上限時&#xff0c;將啟用全新溢出菜單。2.微軟更新了 Mic…

shell中source與sh區別

shell中使用source conf.sh&#xff0c;是直接運行conf.sh的命令&#xff0c;不創建子shell&#xff0c;類似與html中include&#xff0c;而sh是則創建子shell&#xff0c;子shell里面 的變量父shell無法使用&#xff0c;對環境變量的修改也不影響父shell。父shell中的局部變量…

[轉]Web3 是去中心化的“騙局”?

作者 | InvisibleUp 譯者 | 彎月 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; Web3 不是去中心化。 雖然我覺得這一點很明顯&#xff0c;根本不需要通過一篇文章來說明&#xff0c;但我也是迫不得已&#xff0c;因為突然之間各大科技巨頭&#xff0c;比如 Redd…

實景三維建設背景下,三維GIS面臨哪些挑戰?

2021年8月26日&#xff0c;自然資源部印發《實景三維中國建設技術大綱&#xff08;2021版&#xff09;》&#xff0c;明確指出“實景三維中國建設是落實數字中國、平安中國、數字經濟戰略的重要舉措&#xff0c;是落實國家新型基礎設施建設的具體部署&#xff0c;是服務生態文明…

無需編碼,自動實現“異步 Request-Reply”模式

前言上次&#xff0c;我們雖然用代碼實現了“異步 Request-Reply 模式”&#xff0c;但是需要為每一個長時間操作 API 實現一個對應的 AsyncXXX 操作。其實&#xff0c;可以嘗試用 Source Generators 減少這種重復性勞動。實現思路Controller 類必須是partial,這樣才能為它額外…

Kotlin Weekly 中文周報

Kotlin Weekly 中文周報 —— 25 Kotlin 開發中文周報 文章 使用 Kotlin 中的 takeIf &#xff08;zhuanlan.zhihu.com&#xff09; 在 Kotlin 的標準函數中有個 takeIf 函數&#xff0c;你是否了解這個函數呢&#xff1f;它是否只是漂亮點的 if 語句呢&#xff1f; Kotlin 的…

第一次玩,試試手(標題)

Hello Blog&#xff01;&#xff01;轉載于:https://blog.51cto.com/10999994/1786094

【CASS精品教程】CASS9.1生成標準圖幅案例教程

在CASS中,可以很方便的生成標準圖幅,如50*50。本文演示cass中,根據測區范圍標準圖幅生成過程。 一、圖幅預覽: 二、圖幅生成 打開測區范圍,如下圖所示: 點擊【繪圖處理】→【批量分幅】→【格網建立】,如下圖所示: 選擇比例尺500,直接回車。 選擇圖幅50*50。 根據測區…

[轉]mpvue中的小程序調用系統自帶查看圖片的功能

mpvue中的小程序調用系統自帶查看圖片的功能 這里舉個栗子&#xff1a; <template><div class"keting"><div class"centsimg dja"><swiper:current"curr"display-multiple-items"1"next-margin"0rpx"c…

隱馬爾科夫

前向、后向算法解決的是一個評估問題&#xff0c;即給定一個模型&#xff0c;求某特定觀測序列的概率&#xff0c;用于評估該序列最匹配的模型。Baum-Welch算法解決的是一個模型訓練問題&#xff0c;即參數估計&#xff0c;是一種無監督的訓練方法&#xff0c;主要通過EM迭代實…

去創業公司不能有一夜暴富的僥幸,更不能指望掉餡餅

為了實現財務自由&#xff0c;去創業公司是一個不錯的選項&#xff0c;我自己也去過創業公司&#xff0c;身邊的朋友也有不少去過或正在創業公司里干&#xff0c;我就結合下我經歷過的和我看到的&#xff0c;說下我的感受。 1 該去哪種類型的創業公司 第一&#xff0c;這個公司…

分布式日志收集系統 - ExceptionLess的安裝、配置、使用

前言Exceptionless 是一個開源的實時的日志收集框架&#xff0c;它可以應用在基于 ASP.NET&#xff0c;ASP.NET Core&#xff0c;Web API&#xff0c;Web Forms&#xff0c;WPF&#xff0c;Console&#xff0c;ASP.NET MVC 等技術開發的應用程序中&#xff0c;并且提供了REST接…