Docker 大勢已去,Podman 即將崛起……

来源:https://www.cnblogs.com/javastack/archive/2022/04/28/16204014.html
-Advertisement-
Play Games

來源:https://blog.csdn.net/qq_48289488/article/details/121905018 Podman 簡介 什麼是Podman? Podman 是一個開源的容器運行時項目,可在大多數 Linux 平臺上使用。Podman 提供與 Docker 非常相似的功能。正 ...


來源:https://blog.csdn.net/qq_48289488/article/details/121905018

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             #檢索鏡像
docke 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

//倉庫配置
[root@localhost ~]# vim /etc/containers/registries.conf
[registries.search]
registries = ['registry.access.redhat.com', 'registry.redhat.io', 'docker.io'] //這個是查找,從這三個地方查找,如果只留一個,則只在一個源里查找
unqualified-search-registries = ["registry.fedoraproject.org", "registry.access.redhat.com", "registry.centos.org", "docker.io"] //這裡也要改為一個

[registries.insecure]
registries = [10.0.0.1]   //這裡寫那些http的倉庫,比如harbor

//配置加速器
[registries.search]
registries = ['https://l9h8fu9j.mirror.aliyuncs.com','docker.io']

使用 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/centos

ENV 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 install

CMD ["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 runtime
    447 #
    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.conf、storage.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                     [::]:*

近期熱文推薦:

1.1,000+ 道 Java面試題及答案整理(2022最新版)

2.勁爆!Java 協程要來了。。。

3.Spring Boot 2.x 教程,太全了!

4.別再寫滿屏的爆爆爆炸類了,試試裝飾器模式,這才是優雅的方式!!

5.《Java開發手冊(嵩山版)》最新發佈,速速下載!

覺得不錯,別忘了隨手點贊+轉發哦!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 大家好,我是半夏👴,一個剛剛開始寫文的沙雕程式員.如果喜歡我的文章,可以關註➕ 點贊 👍 加我微信:frontendpicker,一起學習交流前端,成為更優秀的工程師~關註公眾號:搞前端的半夏,瞭解更多前端知識! 點我探索新世界! 原文鏈接 ==>http://sylblog.xin/archi ...
  • 微服務概覽 微服務是圍繞業務領域建模可獨立發佈的服務。服務封裝了對應功能並可以通過網路被其他服務訪問。 從外部來看,單個微服務被視為一個黑盒子。它使用最合適的協議在一個或多個網路端點(例如,隊列或REST API)上承載業務功能。消費者,無論他們是其他微服務還是其他類型的程式,都通過這些聯網的端點來 ...
  • 在Java 18中,將UTF-8指定為標準Java API的預設字元集。有了這一更改,依賴於預設字元集的API將在所有實現、操作系統、區域設置和配置中保持一致。 做這一更改的主要目標: 當Java程式的代碼依賴於預設字元集時,使其更具可預測性和可移植性。 闡明標準Java API在哪裡使用預設字元集 ...
  • python 學習筆記 變數、運算符與數據類型 變數 在使用變數前,需要現對其賦值 變數名可以包括字母、數字、下劃線,但不能以字母開頭 python 變數名大小寫是敏感的 first = 2 second = 3 third = first + second print(third) # 5 運算符 ...
  • Spring Boot 1 Spring Boot入門 1.1 Spring Boot特性: 能夠快速創建基於 Spring 的應用程式 能夠直接使用 java main 方法啟動內嵌的 Tomcat 伺服器運行 Spring Boot 程式,不需 要部署 war 包文件 提供約定的 starter ...
  • R ggplot2 繪製 PCA 主成分分析圖,每個繪圖像素都自己掌控的感覺倍兒爽~ ...
  • java web 學習記錄一下 mvc結構實現mysql 連接 什麼是mvc MVC是模型(model)、視圖(view)、控制(controller)這三個單詞上的首字母組成。它是一種應用模型,它的目的是實現Web系統的職能分工。避免all in one 所有代碼全部寫在一個文件里的一種分工模型。 ...
  • 兄弟們,上一個系列大家多少有點不太喜歡,那今天上點不一樣的。 來吧,直接整活~ 先準備一下 首先咱們需要安裝一下這兩個第三方模塊 requests >>> # pip install requests parsel >>> # pip install parsel 不會安裝的小伙伴,鍵盤按住win+ ...
一周排行
    -Advertisement-
    Play Games
  • 基於.NET Framework 4.8 開發的深度學習模型部署測試平臺,提供了YOLO框架的主流系列模型,包括YOLOv8~v9,以及其系列下的Det、Seg、Pose、Obb、Cls等應用場景,同時支持圖像與視頻檢測。模型部署引擎使用的是OpenVINO™、TensorRT、ONNX runti... ...
  • 十年沉澱,重啟開發之路 十年前,我沉浸在開發的海洋中,每日與代碼為伍,與演算法共舞。那時的我,滿懷激情,對技術的追求近乎狂熱。然而,隨著歲月的流逝,生活的忙碌逐漸占據了我的大部分時間,讓我無暇顧及技術的沉澱與積累。 十年間,我經歷了職業生涯的起伏和變遷。從初出茅廬的菜鳥到逐漸嶄露頭角的開發者,我見證了 ...
  • C# 是一種簡單、現代、面向對象和類型安全的編程語言。.NET 是由 Microsoft 創建的開發平臺,平臺包含了語言規範、工具、運行,支持開發各種應用,如Web、移動、桌面等。.NET框架有多個實現,如.NET Framework、.NET Core(及後續的.NET 5+版本),以及社區版本M... ...
  • 前言 本文介紹瞭如何使用三菱提供的MX Component插件實現對三菱PLC軟元件數據的讀寫,記錄了使用電腦模擬,模擬PLC,直至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1. PLC開發編程環境GX Works2,GX Works2下載鏈接 https:// ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • 1、jQuery介紹 jQuery是什麼 jQuery是一個快速、簡潔的JavaScript框架,是繼Prototype之後又一個優秀的JavaScript代碼庫(或JavaScript框架)。jQuery設計的宗旨是“write Less,Do More”,即倡導寫更少的代碼,做更多的事情。它封裝 ...
  • 前言 之前的文章把js引擎(aardio封裝庫) 微軟開源的js引擎(ChakraCore))寫好了,這篇文章整點js代碼來測一下bug。測試網站:https://fanyi.youdao.com/index.html#/ 逆向思路 逆向思路可以看有道翻譯js逆向(MD5加密,AES加密)附完整源碼 ...
  • 引言 現代的操作系統(Windows,Linux,Mac OS)等都可以同時打開多個軟體(任務),這些軟體在我們的感知上是同時運行的,例如我們可以一邊瀏覽網頁,一邊聽音樂。而CPU執行代碼同一時間只能執行一條,但即使我們的電腦是單核CPU也可以同時運行多個任務,如下圖所示,這是因為我們的 CPU 的 ...
  • 掌握使用Python進行文本英文統計的基本方法,並瞭解如何進一步優化和擴展這些方法,以應對更複雜的文本分析任務。 ...
  • 背景 Redis多數據源常見的場景: 分區數據處理:當數據量增長時,單個Redis實例可能無法處理所有的數據。通過使用多個Redis數據源,可以將數據分區存儲在不同的實例中,使得數據處理更加高效。 多租戶應用程式:對於多租戶應用程式,每個租戶可以擁有自己的Redis數據源,以確保數據隔離和安全性。 ...