前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Containerd容器镜像管理

Containerd容器镜像管理

原创
作者头像
鱼找水需要时间
发布于 2023-08-06 13:48:26
发布于 2023-08-06 13:48:26
6.1K0
举报
文章被收录于专栏:SpringBoot教程SpringBoot教程

1、Containerd镜像管理

1.1 Containerd容器镜像管理命令

  • docker使用docker images命令管理镜像
  • 单机containerd使用ctr images命令管理镜像,containerd本身的CLI
  • k8s中containerd使用crictl images命令管理镜像,Kubernetes社区的专用CLI工具
代码语言:text
AI代码解释
复制
获取命令帮助
# ctr --help
NAME:
   ctr -
        __
  _____/ /______
 / ___/ __/ ___/
/ /__/ /_/ /
\___/\__/_/

......
代码语言:text
AI代码解释
复制
获取命令帮助
# ctr images
NAME:
   ctr images - manage images

USAGE:
   ctr images command [command options] [arguments...]

COMMANDS:
   check                    check existing images to ensure all content is available locally
   export                   export images
   import                   import images
   list, ls                 list images known to containerd
   mount                    mount an image to a target path
   unmount                  unmount the image from the target
   pull                     pull an image from a remote
   push                     push an image to a remote
   delete, del, remove, rm  remove one or more images by reference
   tag                      tag an image
   label                    set and clear labels for an image
   convert                  convert an image

OPTIONS:
   --help, -h  show help

1.2 查看镜像

代码语言:text
AI代码解释
复制
# ctr images ls
REF TYPE DIGEST SIZE PLATFORMS LABELS

1.3 下载镜像

containerd支持oci标准的镜像,所以可以直接使用docker官方或dockerfile构建的镜像

代码语言:text
AI代码解释
复制
# 镜像名不能简写,--all-platforms:所有平台,不加的话下载当前平台架构
# ctr images pull --all-platforms docker.io/library/nginx:alpine
# ctr images pull docker.io/library/nginx:latest

# uname -a
代码语言:text
AI代码解释
复制
说明:
这里ctr命令pull镜像时,不能直接把镜像名字写成`nginx:alpine`
代码语言:text
AI代码解释
复制
查看已下载容器镜像
# ctr images ls

REF

TYPE

DIGEST

docker.io/library/nginx:alpine

application/vnd.docker.distribution.manifest.list.v2+json

sha256:da9c94bec1da829ebd52431a84502ec471c8e548ffb2cedbf36260fd9bd1d4d3

SIZE

PLATFORMS

LABELS

9.7 MiB

linux/386,linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64/v8,linux/ppc64le,linux/s390x

代码语言:text
AI代码解释
复制
指定平台下载容器镜像
# ctr images pull --platform linux/amd64 docker.io/library/nginx:alpine

没有镜像是无法运行容器的。

1.4 镜像挂载

方便查看镜像中包含的内容。

代码语言:text
AI代码解释
复制
把已下载的容器镜像挂载至当前文件系统
# ctr images mount docker.io/library/nginx:alpine /mnt
sha256:af2fcce448e2e4451a5f4796a9bf9cb5c9b5f88e0d6d10029cada42fb9d268ac
/mnt
[root@localhost ~]# ls /mnt
bin  dev  docker-entrypoint.d  docker-entrypoint.sh  etc  home  lib  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
代码语言:text
AI代码解释
复制
卸载
# umount /mnt

1.5 镜像导出

代码语言:text
AI代码解释
复制
把容器镜像导出
# ctr i export --all-platforms nginx.img docker.io/library/nginx:alpine
代码语言:text
AI代码解释
复制
说明
--all-platforms,导出所有平台镜像,本版本为1.6版本,1.4版本不需要添加此选项。
代码语言:text
AI代码解释
复制
查看已导出容器镜像
# ls
nginx.img

# ls -lh
总用量 196M

-rw-r--r--  1 root root  73M 2月  18 14:48 nginx.img

1.6 镜像删除

代码语言:text
AI代码解释
复制
删除指定容器镜像
# ctr image rm docker.io/library/nginx:alpine
docker.io/library/nginx:alpine

再次查看容器镜像
[root@192 ~]# ctr images ls
REF TYPE DIGEST SIZE PLATFORMS LABELS

1.7 镜像导入

代码语言:text
AI代码解释
复制
导入容器镜像
# ctr images import nginx.img
unpacking docker.io/library/nginx:alpine (sha256:da9c94bec1da829ebd52431a84502ec471c8e548ffb2cedbf36260fd9bd1d4d3)...done

1.8 修改镜像tag

代码语言:text
AI代码解释
复制
# ctr images tag docker.io/library/nginx:alpine nginx:alpine
nginx:alpine

# 建议修改tag的名称为:镜像仓库地址/目录/镜像名
代码语言:text
AI代码解释
复制
说明:
把docker.io/library/nginx:alpine 修改为 nginx:alpine
代码语言:text
AI代码解释
复制
查看修改后的容器镜像
# ctr images ls
REF                            TYPE                                                      DIGEST                                                                  SIZE    PLATFORMS                                                                                LABELS
docker.io/library/nginx:alpine application/vnd.docker.distribution.manifest.list.v2+json sha256:da9c94bec1da829ebd52431a84502ec471c8e548ffb2cedbf36260fd9bd1d4d3 9.7 MiB linux/386,linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64/v8,linux/ppc64le,linux/s390x -
nginx:alpine                   application/vnd.docker.distribution.manifest.list.v2+json sha256:da9c94bec1da829ebd52431a84502ec471c8e548ffb2cedbf36260fd9bd1d4d3 9.7 MiB linux/386,linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64/v8,linux/ppc64le,linux/s390x -
代码语言:text
AI代码解释
复制
修改后对容器镜像做检查比对
# ctr images check
REF                            TYPE                                                      DIGEST                                                                  STATUS         SIZE            UNPACKED
docker.io/library/nginx:alpine application/vnd.docker.distribution.manifest.list.v2+json sha256:da9c94bec1da829ebd52431a84502ec471c8e548ffb2cedbf36260fd9bd1d4d3 complete (7/7) 9.7 MiB/9.7 MiB true

nginx:alpine                   application/vnd.docker.distribution.manifest.list.v2+json sha256:da9c94bec1da829ebd52431a84502ec471c8e548ffb2cedbf36260fd9bd1d4d3 complete (7/7) 9.7 MiB/9.7 MiB true

2、Containerd容器管理

2.1 获取命令帮助

2.1.1 获取ctr命令帮助

代码语言:text
AI代码解释
复制
[root@localhost ~]# ctr --help
NAME:
   ctr -
        __
  _____/ /______
 / ___/ __/ ___/
/ /__/ /_/ /
\___/\__/_/

containerd CLI


......

2.1.2 获取创建静态容器命令帮助

代码语言:text
AI代码解释
复制
# ctr container --help
NAME:
   ctr containers - manage containers

USAGE:
   ctr containers command [command options] [arguments...]

COMMANDS:
   create                   create container
   delete, del, remove, rm  delete one or more existing containers
   info                     get info about a container
   list, ls                 list containers
   label                    set and clear labels for a container
   checkpoint               checkpoint a container
   restore                  restore a container from checkpoint

OPTIONS:
   --help, -h  show help
代码语言:text
AI代码解释
复制
说明:

使用`ctr container create `命令创建容器后,容器并没有处于运行状态,其只是一个静态的容器。这个 container 对象只是包含了运行一个容器所需的资源及配置的数据结构,例如: namespaces、rootfs 和容器的配置都已经初始化成功了,只是用户进程(本案例为nginx)还没有启动。需要使用`ctr tasks`命令才能获取一个动态容器。

2.1.3 获取动态容器命令帮助

代码语言:text
AI代码解释
复制
# ctr run --help
NAME:
   ctr run - run a container

......
代码语言:text
AI代码解释
复制
说明:
使用`ctr run`命令可以创建一个静态容器并使其运行。一步到位运行容器。

2.2 查看容器

container表示静态容器,可用c缩写代表container

代码语言:text
AI代码解释
复制
# ctr container ls
CONTAINER    IMAGE    RUNTIME

代码语言:text
AI代码解释
复制
# ctr c ls
CONTAINER    IMAGE    RUNTIME

以上命令无法查看出来容器的静态的还是动态的

2.3 查看任务

task表示容器里跑的进程, 可用t缩写代表task

代码语言:text
AI代码解释
复制
# ctr task ls
TASK    PID    STATUS

代码语言:text
AI代码解释
复制
# ctr t ls
TASK    PID    STATUS

2.4 创建静态容器

代码语言:text
AI代码解释
复制
# ctr c create docker.io/library/nginx:alpine nginx1
代码语言:text
AI代码解释
复制
# ctr container ls
CONTAINER    IMAGE                             RUNTIME
nginx1       docker.io/library/nginx:alpine    io.containerd.runc.v2
代码语言:text
AI代码解释
复制
查看容器详细信息
# ctr container info nginx1

2.5 静态容器启动为动态容器

代码语言:text
AI代码解释
复制
复制containerd连接runC垫片工具至系统
# ls usr/local/bin/
containerd  containerd-shim  containerd-shim-runc-v1  containerd-shim-runc-v2  containerd-stress  crictl  critest  ctd-decoder  ctr
[root@localhost ~]# cp usr/local/bin/containerd-shim-runc-v2 /usr/bin/
代码语言:text
AI代码解释
复制
启动task,即表时在容器中运行了进程,即为动态容器。
# ctr task start -d nginx1
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
代码语言:text
AI代码解释
复制
说明:
-d表示daemon或者后台的意思,否则会卡住终端
代码语言:text
AI代码解释
复制
查看容器所在宿主机进程,是以宿主机进程的方式存在的。
# ctr task ls
TASK      PID     STATUS
nginx1    3395    RUNNING
代码语言:text
AI代码解释
复制
查看容器的进程(都是物理机的进程)
# ctr task ps nginx1
PID     INFO
3395    -
3434    -
代码语言:text
AI代码解释
复制
物理机查看到相应的进程
# ps -ef | grep 3395
root       3395   3375  0 19:16 ?        00:00:00 nginx: master process nginx -g daemon off;
101        3434   3395  0 19:16 ?        00:00:00 nginx: worker process

2.6 进入容器操作

代码语言:text
AI代码解释
复制
# ctr task exec --exec-id 1 nginx1 /bin/sh

# ifconfig 查看网卡信息

...

# curl 127.0.0.1 访问本地提供的web服务
...
代码语言:text
AI代码解释
复制
说明:
为exec进程设定一个id,可以随意输入,只要保证唯一即可,也可使用$RANDOM变量。

2.7 直接运行一个动态容器

代码语言:text
AI代码解释
复制
# ctr run -d --net-host docker.io/library/nginx:alpine nginx2
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
代码语言:text
AI代码解释
复制
说明:
* -d 代表dameon,后台运行
* --net-host 代表容器的IP就是宿主机的IP(相当于docker里的host类型网络)
代码语言:text
AI代码解释
复制
查看已运行容器
# ctr container ls
CONTAINER    IMAGE                             RUNTIME
nginx2       docker.io/library/nginx:alpine    io.containerd.runc.v2
代码语言:text
AI代码解释
复制
查看已运行容器中运行的进程,既tasks
# ctr tasks ls
TASK      PID     STATUS
nginx2    4061    RUNNING
代码语言:text
AI代码解释
复制
进入容器
# ctr task exec --exec-id 1 -t nginx2 /bin/sh
代码语言:text
AI代码解释
复制
/ # ifconfig 
ens33     Link encap:Ethernet  HWaddr 00:0C:29:B1:B6:1D
          inet addr:192.168.10.164  Bcast:192.168.10.255  Mask:255.255.255.0
          inet6 addr: fe80::2b33:40ed:9311:8812/64 Scope:Link
          inet6 addr: fe80::adf4:a8bc:a1c:a9f7/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:55360 errors:0 dropped:0 overruns:0 frame:0
          TX packets:30526 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:53511295 (51.0 MiB)  TX bytes:2735050 (2.6 MiB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:68 errors:0 dropped:0 overruns:0 frame:0
          TX packets:68 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:5916 (5.7 KiB)  TX bytes:5916 (5.7 KiB)

virbr0    Link encap:Ethernet  HWaddr 52:54:00:E9:51:82
          inet addr:192.168.122.1  Bcast:192.168.122.255  Mask:255.255.255.0
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
代码语言:text
AI代码解释
复制
为容器中运行的网站添加网站文件
/ # echo "nginx2" > /usr/share/nginx/html/index.html
/ # exit
代码语言:text
AI代码解释
复制
在宿主机上访问网站
[root@localhost ~]# curl 192.168.10.164
nginx2

2.8 暂停容器

代码语言:text
AI代码解释
复制
查看容器状态
# ctr tasks ls
TASK      PID     STATUS
nginx2    4061    RUNNING
代码语言:text
AI代码解释
复制
暂停容器
# ctr tasks pause nginx2
代码语言:text
AI代码解释
复制
再次查看容器状态,看到其状态为PAUSED,表示停止。
# ctr tasks ls
TASK      PID     STATUS
nginx2    4061    PAUSED
代码语言:text
AI代码解释
复制
[root@localhost ~]# curl http://192.168.10.164
在宿主机访问,发现不可以访问到网站

2.9 恢复容器

代码语言:text
AI代码解释
复制
使用resume命令恢复容器
# ctr tasks resume nginx2
代码语言:text
AI代码解释
复制
查看恢复后状态
# ctr tasks ls
TASK      PID     STATUS
nginx2    4061    RUNNING
代码语言:text
AI代码解释
复制
在宿主机上访问容器中提供的服务
# curl http://192.168.10.164
nginx2

2.10 停止容器

代码语言:text
AI代码解释
复制
# ctr tasks --help
......
代码语言:text
AI代码解释
复制
使用kill命令停止容器中运行的进程,既为停止容器
# ctr tasks kill nginx2
代码语言:text
AI代码解释
复制
查看容器停止后状态,STATUS为STOPPED
# ctr tasks ls
TASK      PID     STATUS
nginx1    3395    RUNNING
nginx2    4061    STOPPED

2.11 删除容器

代码语言:text
AI代码解释
复制
# ctr tasks delete nginx2
必须先删除task,再删除容器
代码语言:text
AI代码解释
复制
查看静态容器,确认其还存在于系统中
# ctr container ls
CONTAINER    IMAGE                             RUNTIME
nginx2       docker.io/library/nginx:alpine    io.containerd.runc.v2
代码语言:text
AI代码解释
复制
删除容器
# ctr container delete nginx2

3、Containerd使用私有容器镜像仓库 Harbor

3.1 Harbor准备

3.2 配置Containerd使用Harbor仓库

3.2.1 Harbor主机名解析

在所有安装containerd宿主机上添加此配置信息。

代码语言:text
AI代码解释
复制
# vim /etc/hosts
# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.10.165 harbor.kubemsb.com
代码语言:text
AI代码解释
复制
说明
* 192.168.10.165是harbor的IP

* harbor.kubemsb.com建议用FQDN形式,如果用类似harbor这种短名,后面下载镜像会出问题

3.2.2 修改Containerd配置文件

代码语言:text
AI代码解释
复制
此配置文件已提前替换过,仅修改本地容器镜像仓库地址即可。
# vim /etc/containerd/config.toml
# cat /etc/containerd/config.toml
root = "/var/lib/containerd"
state = "/run/containerd"
oom_score = -999

[grpc]
  address = "/run/containerd/containerd.sock"
  uid = 0
  gid = 0
  max_recv_message_size = 16777216
  max_send_message_size = 16777216

[debug]
  address = ""
  uid = 0
  gid = 0
  level = ""

[metrics]
  address = ""
  grpc_histogram = false

[cgroup]
  path = ""

[plugins]
  [plugins.cgroups]
    no_prometheus = false
  [plugins.cri]
    stream_server_address = "127.0.0.1"
    stream_server_port = "0"
    enable_selinux = false
    sandbox_image = "easzlab/pause-amd64:3.2"
    stats_collect_period = 10
    systemd_cgroup = false
    enable_tls_streaming = false
    max_container_log_line_size = 16384
    [plugins.cri.containerd]
      snapshotter = "overlayfs"
      no_pivot = false
      [plugins.cri.containerd.default_runtime]
        runtime_type = "io.containerd.runtime.v1.linux"
        runtime_engine = ""
        runtime_root = ""
      [plugins.cri.containerd.untrusted_workload_runtime]
        runtime_type = ""
        runtime_engine = ""
        runtime_root = ""
    [plugins.cri.cni]
      bin_dir = "/opt/kube/bin"
      conf_dir = "/etc/cni/net.d"
      conf_template = "/etc/cni/net.d/10-default.conf"
    [plugins.cri.registry]
      [plugins.cri.registry.mirrors]
        [plugins.cri.registry.mirrors."docker.io"]
          endpoint = [
            "https://docker.mirrors.ustc.edu.cn",
            "http://hub-mirror.c.163.com"
          ]
        [plugins.cri.registry.mirrors."gcr.io"]
          endpoint = [
            "https://gcr.mirrors.ustc.edu.cn"
          ]
        [plugins.cri.registry.mirrors."k8s.gcr.io"]
          endpoint = [
            "https://gcr.mirrors.ustc.edu.cn/google-containers/"
          ]
        [plugins.cri.registry.mirrors."quay.io"]
          endpoint = [
            "https://quay.mirrors.ustc.edu.cn"
          ]
        [plugins.cri.registry.mirrors."harbor.kubemsb.com"]   在此处添加,在镜像加速器下面添加这一段
          endpoint = [
            "http://harbor.kubemsb.com"
          ]
    [plugins.cri.x509_key_pair_streaming]
      tls_cert_file = ""
      tls_key_file = ""
  [plugins.diff-service]
    default = ["walking"]
  [plugins.linux]
    shim = "containerd-shim"
    runtime = "runc"
    runtime_root = ""
    no_shim = false
    shim_debug = false
  [plugins.opt]
    path = "/opt/containerd"
  [plugins.restart]
    interval = "10s"
  [plugins.scheduler]
    pause_threshold = 0.02
    deletion_threshold = 0
    mutation_threshold = 100
    schedule_delay = "0s"
    startup_delay = "100ms"
代码语言:text
AI代码解释
复制
重启containerd,以便于重新加载配置文件。
# systemctl daemon-reload
# systemctl restart containerd

3.2.3 ctr下载镜像

代码语言:text
AI代码解释
复制
下载容器镜像
# ctr images pull --platform linux/amd64 docker.io/library/nginx:latest
代码语言:text
AI代码解释
复制
说明:
* --platform linux/amd64 指定系统平台,也可以使用--all-platforms指定所有平台镜像。
代码语言:text
AI代码解释
复制
查看已下载容器镜像
# ctr images ls
REF                              TYPE                                                      DIGEST                                                                  SIZE      PLATFORMS                                                                                                                          LABELS

docker.io/library/nginx:latest   application/vnd.docker.distribution.manifest.list.v2+json sha256:2834dc507516af02784808c5f48b7cbe38b8ed5d0f4837f16e78d00deb7e7767 54.1 MiB  linux/386,linux/amd64,linux/arm/v5,linux/arm/v7,linux/arm64/v8,linux/mips64le,linux/ppc64le,linux/s390x                            -

3.2.4 ctr上传镜像

上传到Harbor library公有项目

代码语言:text
AI代码解释
复制
重新生成新的tag
# ctr images tag docker.io/library/nginx:latest harbor.kubemsb.com/library/nginx:latest
harbor.kubemsb.com/library/nginx:latest
代码语言:text
AI代码解释
复制
查看已生成容器镜像
# ctr images ls
REF                                     TYPE                                                      DIGEST                                                                  SIZE      PLATFORMS                                                                                                                          LABELS
docker.io/library/nginx:latest          application/vnd.docker.distribution.manifest.list.v2+json sha256:2834dc507516af02784808c5f48b7cbe38b8ed5d0f4837f16e78d00deb7e7767 54.1 MiB  linux/386,linux/amd64,linux/arm/v5,linux/arm/v7,linux/arm64/v8,linux/mips64le,linux/ppc64le,linux/s390x                            -
harbor.kubemsb.com/library/nginx:latest application/vnd.docker.distribution.manifest.list.v2+json sha256:2834dc507516af02784808c5f48b7cbe38b8ed5d0f4837f16e78d00deb7e7767 54.1 MiB  linux/386,linux/amd64,linux/arm/v5,linux/arm/v7,linux/arm64/v8,linux/mips64le,linux/ppc64le,linux/s390x                            -
代码语言:text
AI代码解释
复制
推送容器镜像至Harbor
# ctr images push --platform linux/amd64 --plain-http -u admin:密码 harbor.kubemsb.com/library/nginx:latest
代码语言:text
AI代码解释
复制
说明:

* 先tag再push
* 因为我们harbor是http协议,不是https协议,所以需要加上`--plain-http`
* `--user admin:Harbor12345`指定harbor的用户名与密码
代码语言:text
AI代码解释
复制
输出:
manifest-sha256:0fd68ec4b64b8dbb2bef1f1a5de9d47b658afd3635dc9c45bf0cbeac46e72101: done           |++++++++++++++++++++++++++++++++++++++|
config-sha256:dd025cdfe837e1c6395365870a491cf16bae668218edb07d85c626928a60e478:   done           |++++++++++++++++++++++++++++++++++++++|
elapsed: 0.5 s                                                                    total:  9.3 Ki (18.1 KiB/s)
代码语言:text
AI代码解释
复制
下载已上传容器镜像
# ctr images pull --plain-http harbor.kubemsb.com/library/nginx:latest

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
ORM查询语言(OQL)简介--高级篇(续):庐山真貌
相关文章内容索引: ORM查询语言(OQL)简介--概念篇 ORM查询语言(OQL)简介--实例篇 ORM查询语言(OQL)简介--高级篇:脱胎换骨 ORM查询语言(OQL)简介--高级篇(续):庐山真貌    PDF.NET框架的OQL经过“脱胎换骨”般的重构之后,引来了它华丽丽的新篇章,将“对象化的SQL”特征发挥到极致,与至于我在Q群里面说这应该算是OQL的“收山之作”了。然而,我这么说有什么依据?它的设计哲学是什么?它究竟是何样?由于本文篇幅较长,请听本篇慢慢道来,叙说它的庐山真面目! [有图有真相
用户1177503
2018/02/27
2.3K0
ORM查询语言(OQL)简介--高级篇(续):庐山真貌
.NET ORM 的 “SOD蜜”--零基础入门篇
PDF.NET SOD框架不仅仅是一个ORM,但是它的ORM功能是独具特色的,我在博客中已经多次介绍,但都是原理性的,可能不少初学的朋友还是觉得复杂,其实,SOD的ORM是很简单的。下面我们就采用流行的 Code First的方式,一步步来了解下。 一、准备工作 1.1,添加SOD包引用 首先建立一个控制台项目(支持.NET2.0的项目),并使用程序包管理器添加PDF.NET SOD的程序引用: PM> Install-Package PDF.NET.SOD 更多详细使用信息说明,请参考nuget 网站说明
用户1177503
2018/02/27
1.2K0
.NET ORM 的 “SOD蜜”--零基础入门篇
使用操作符重载,生成ORM实体类的SQL条件语句
ORM框架的一个不可或缺的功能就是根据实体类,生成操作数据库的SQL语句,这其中,最难处理的就是那些复杂的SQL条件比较语句。比如,有下面这样一个SQL语句: SELECT [id],[BankCode],[CityCode],[FundCode],[FundName],[FundReviews],[EndDagte],[addDate]  FROM [FundReviews]     WHERE  (               ([CityCode]=@CP1 OR [BankCode]=@CP2)  
用户1177503
2018/02/26
8180
左求值表达式,堆栈,调试陷阱与ORM查询语言的设计
1,表达式的求值顺序与堆栈结构 “表达式” 是程序语言一个很重要的术语,也是大家天天写的程序中很常见的东西,但是表达式的求值顺序一定是从左到右么? C/C++语言中没有明确规定表达式的运算顺序(从左到右,或是从右到左),这点与C#及Java语言都不同。不过可以确定的是,C#表达式的求值顺序一定是从左到右的。这个问题虽然对于大多数情况来说不重要,甚至很多普通C#,Java开发者都会忽略的问题,但是对于语言设计者,框架设计者,这是有可能需要考虑的问题。 堆栈是2种数据结构,“栈” 是一种后进先出的数据结构,也就
用户1177503
2018/02/27
8950
ORM查询语言(OQL)简介--高级篇:脱胎换骨
相关文章内容索引: ORM查询语言(OQL)简介--概念篇 ORM查询语言(OQL)简介--实例篇 ORM查询语言(OQL)简介--高级篇:脱胎换骨 ORM查询语言(OQL)简介--高级篇(续):庐山真貌     在写本文之前,一直在想文章的标题应怎么取。在写了《ORM查询语言(OQL)简介--概念篇》、《ORM查询语言(OQL)简介--实例篇》之后,觉得本篇文章应该是前2篇的延续,但又不是一般的延续,因为今天要写的这篇内容,是基于对框架OQL完全重构之后来写的,所以加上一个副标题:脱胎换骨! 一、OQL之
用户1177503
2018/02/27
2.7K0
ORM查询语言(OQL)简介--高级篇:脱胎换骨
打造轻量级的实体类数据容器
    这里有三个关键词:轻量级,实体类,数据容器,还有一个潜在的关键词:通用。这几个名词之间有什么联系呢?     一般来说,操作实体类往往伴随着一个实体类集合,而这些集合就是实体类的容器,在这里我将“容器”视作一个比集合更广泛的概念,例如Entity Framework做了一个重量级的容器ObjectContext,用于与作为对象(这些对象为 EDM 中定义的实体类型的实例)的数据进行交互。     实体类与容器没有必然关系,例如DataSet也是一个容器,它存储并操作DataTable,而DataTa
用户1177503
2018/02/26
7220
ORM查询语言(OQL)简介--概念篇
相关文章内容索引: ORM查询语言(OQL)简介--概念篇 ORM查询语言(OQL)简介--实例篇 ORM查询语言(OQL)简介--高级篇:脱胎换骨 ORM查询语言(OQL)简介--高级篇(续):庐山真貌 一、SQL与ORM   关系数据库(RDBMS)的查询有SQL(Structured Query Language)结构化查询语言,相比高级程序语言(命令式语言)而言,SQL主要描述想要做什么,而不是命令式语言的具体如何做,因此,SQL也被称为第四代语言(4GL),它为现代大多数的关系数据库系统所支持
用户1177503
2018/02/27
2.6K0
ORM查询语言(OQL)简介--概念篇
使用OQL“语言”构造ORM实体类的复杂查询条件
OQL”语言“ 是PDF.NET数据开发框架的实体对象查询语言,一直以来,ORM的复杂查询条件都是困扰ORM的问题,所以很多时候不得不舍弃ORM,直接手工拼接SQL。我们来看看OQL是怎么解决这些问题的,现在举一个今天同事遇到的问题: 有这样一个实体类 MyEntity,实体类的具体定义在此忽略,有兴趣的朋友请看我的博客。 MyEntity e=new MyEntity(); e.F1="1"; e.F2="2"; e.F3="a";//其它可选值 a,b,c..... e.F5="A";//其它可选值 A
用户1177503
2018/02/26
1.7K0
使用PDF.NET数据开发框架的实体操作语言OQL构造复杂查询条件
PDF.NET数据开发框架(Pwmis Data develop Framework,http://www.pwmis.com/sqlmap) 是一套借鉴iBatis、Hibernate、Linq等数据访问框架而来的轻量级数据开发框架,主要特点是具有iBatis特点的SQL-MAP功能和框架独特的实体对象查询语言--OQL,下面我们使用OQL来构造一个复杂的实体查询。 首先定义两个实体类:用户类和订单类,可以使用框架提供的实体类生成器生成,下面是详细代码: /*   本类由PWMIS 实体类生成工具(Ver
用户1177503
2018/02/26
1.7K0
PDF.NET数据开发框架操作MySQL实体类操作实例
在我们最近的项目中,SQL-MAP使用较多,但是实体类用的很少,实际上,“PDF.NET数据开发框架”的实体类相当强大,下面的测试程序是在MySQL中操作的实例。 1,首先在App.config文件中
用户1177503
2018/02/26
1K0
用事实说话,成熟的ORM性能不是瓶颈,灵活性不是问题:EF5.0、PDF.NET5.0、Dapper原理分析与测试手记
[本文篇幅较长,可以通过目录查看您感兴趣的内容,或者下载格式良好的PDF版本文件查看]  目录 一、ORM的"三国志"    2 1,PDF.NET诞生历程    2 2,Linq2Sql&EF:    3 3,微型ORM崛起    4 二、一决高下    4 2.1,ORM没有DataSet快?    4 2.1.1,ORM生成SQL的质量问题    4 2.1.2,DataReader没有DataSet快?    5 2,ORM的三个火枪手    6 2.1,委托+缓存    6 2.2,表达式树 
用户1177503
2018/02/27
4.2K0
用事实说话,成熟的ORM性能不是瓶颈,灵活性不是问题:EF5.0、PDF.NET5.0、Dapper原理分析与测试手记
PDF.NET数据开发框架实体类操作实例
本篇是 PDF.NET数据开发框架实体类操作实例(MySQL) 的姊妹篇,两者使用了同一个测试程序,不同的只是使用的类库和数据库不同,下面说说具体的使用过程。 1,首先在App.config文件中配置
用户1177503
2018/02/26
9990
PDF.NET数据开发框架实体类操作实例(for PostgreSQL,并且解决自增问题) PDF.NET数据开发框架实体类操作实例(MySQL)
本篇是 PDF.NET数据开发框架实体类操作实例(MySQL) 的姊妹篇,两者使用了同一个测试程序,不同的只是使用的类库和数据库不同,下面说说具体的使用过程。 1,首先在App.config文件中配置
用户1177503
2018/02/27
1.6K0
DataSet的灵活,实体类的方便,DTO的效率:SOD框架的数据容器,打造最适合DDD的ORM框架
引言:DDD的困惑 最近,我看到园子里面有位朋友的一篇博客 《领域驱动设计系列(一):为何要领域驱动设计? 》文章中有下面一段话,对DDD使用产生的疑问: •没有正确的使用ORM, 导致数据加载过多,导致系统性能很差。 •为了解决性能问题,就不加载一些导航属性,但是却把DB Entity返回上层,这样对象的一些属性为空,上层使用这个数据时根本不知道什么时间这个属性是有值的,这个是很丑陋的是不是? 博主说的第一个问题,是因为使用ORM的人把实体类的全部属性的数据查询出来了,相当于执行了 select * f
用户1177503
2018/02/27
2.7K0
DataSet的灵活,实体类的方便,DTO的效率:SOD框架的数据容器,打造最适合DDD的ORM框架
一行代码调用实现带字段选取+条件判断+排序+分页功能的增强ORM框架
问题:3行代码 PDF.NET 是一个开源的数据开发框架,它的特点是简单、轻量、快速,易上手,而且是一个注释完善的国产开发框架,受到不少朋友的欢迎,也在我们公司的项目中多次使用。但是,PDF.NET比起EF来,仍然有很大的劣势,主要就是用起来没有EF简单,这个问题饱受广大朋友的批评,但我很感谢这些朋友,他们的批评才是框架进步的动力,为此,之前我发表了《来一点反射和Emit,让ORM的使用极度简化》  这篇文章,使得不再需要定义实体类,只需要有接口即可访问数据库:     原文的代码:     static
用户1177503
2018/02/26
1.4K0
一行代码调用实现带字段选取+条件判断+排序+分页功能的增强ORM框架
Oracle 免费的数据库--Database 快捷版 11g 安装使用与"SOD框架"对Oracle的CodeFirst支持
一、Oracle XE 数据库与连接工具安装使用 Oracle数据库历来以价格昂贵出名,当然贵有贵的道理,成为一个Oracle DBA也是令人羡慕的事情,如果程序员熟悉Oracle使用也有机会接触到大型的项目,但是Oracle似乎对一般程序员不怎么友好,因为其繁琐的安装配置过程和对系统硬件的苛求,另一般人望而止步,我最早从Oracle 9i开始接触它,深有感受,特别是熟悉了SqlServer的开发人员,初次接触Oracle还是很不习惯的。比如它没有SqlServer数据“库”的概念,一个sa账号管理很多数据
用户1177503
2018/02/27
3K0
Oracle 免费的数据库--Database 快捷版 11g 安装使用与"SOD框架"对Oracle的CodeFirst支持
来一点反射和Emit,让ORM的使用极度简化
PDF.NET开发框架一直是号称“无需反射”的,因为它的ORM框架(PDF.NET不仅仅是一个ORM框架,详细请见官网)中实体类的设计很特别,不需要反射就能够获知映射的字段信息,我们用实际的例子来说明
用户1177503
2018/02/27
1K0
来一点反射和Emit,让ORM的使用极度简化
实体类的枚举属性--原来支持枚举类型这么简单,没有EF5.0也可以
    通常,我们都是在业务层和界面层使用枚举类型,这能够为我们编程带来便利,但在数据访问层,不使用枚举类型,因为很多数据库都不支持,比如我们现在用的SqlServer2008就不支持枚举类型的列,用的时候也是将枚举类型转换成int 类型,数据库存储的是int 类型的数据,在访问数据的时候进行枚举类型和int类型的转换,例如下面的例子: public enum RoleNames { User, Manager, Admin } 假设
用户1177503
2018/02/26
1.8K0
实体类的枚举属性--原来支持枚举类型这么简单,没有EF5.0也可以
如何用ORM支持SQL语句的CASE WHEN?
OQL如何支持CASE WHEN? 今天,一个朋友问我,OQL可否支持CASE WHEN语句?他给的示例SQL如下: select HName,case when IsEnable=1 then '启用' else '停用' from tb_User OQL是SOD框架的ORM查询语言,它类似Linq,但是它诞生的历史比Linq早,并且更加接近SQL语法。所以,对SOD框架而言,对应ORM如何支持CASE WHEN,就等于是问OQL如何支持CASE WHEN了。 这个问题已经不止这一个朋友来问我了,我想了下
用户1177503
2018/02/26
2.2K0
不使用反射,“一行代码”实现Web、WinForm窗体表单数据的填充、收集、清除,和到数据库的CRUD
问题篇:     昨天在CSDN看到这样一个帖子:“苦逼的三层代码”: 采用传统的三层架构写代码,每个数据表都要定义一个实体对象,编写后台的时候, Web层需要针对页面的用户输入逐个手动编写赋值到实体对象的各个属性,然后DAL层还要用SqlHelper 进行各个存储过程对应参数的实体赋值, 我的天呀,写几个表还好,多个表呢, 写的后台都没力气, 典型的苦逼代码工没营养,各位有啥好的处理方法或开发方式。。     看到跟帖,大部分都说使用ORM解决这个问题,但我觉得ORM还是没有解决贴主的几个问题: 每个
用户1177503
2018/02/27
2.8K0
不使用反射,“一行代码”实现Web、WinForm窗体表单数据的填充、收集、清除,和到数据库的CRUD
推荐阅读
ORM查询语言(OQL)简介--高级篇(续):庐山真貌
2.3K0
.NET ORM 的 “SOD蜜”--零基础入门篇
1.2K0
使用操作符重载,生成ORM实体类的SQL条件语句
8180
左求值表达式,堆栈,调试陷阱与ORM查询语言的设计
8950
ORM查询语言(OQL)简介--高级篇:脱胎换骨
2.7K0
打造轻量级的实体类数据容器
7220
ORM查询语言(OQL)简介--概念篇
2.6K0
使用OQL“语言”构造ORM实体类的复杂查询条件
1.7K0
使用PDF.NET数据开发框架的实体操作语言OQL构造复杂查询条件
1.7K0
PDF.NET数据开发框架操作MySQL实体类操作实例
1K0
用事实说话,成熟的ORM性能不是瓶颈,灵活性不是问题:EF5.0、PDF.NET5.0、Dapper原理分析与测试手记
4.2K0
PDF.NET数据开发框架实体类操作实例
9990
PDF.NET数据开发框架实体类操作实例(for PostgreSQL,并且解决自增问题) PDF.NET数据开发框架实体类操作实例(MySQL)
1.6K0
DataSet的灵活,实体类的方便,DTO的效率:SOD框架的数据容器,打造最适合DDD的ORM框架
2.7K0
一行代码调用实现带字段选取+条件判断+排序+分页功能的增强ORM框架
1.4K0
Oracle 免费的数据库--Database 快捷版 11g 安装使用与"SOD框架"对Oracle的CodeFirst支持
3K0
来一点反射和Emit,让ORM的使用极度简化
1K0
实体类的枚举属性--原来支持枚举类型这么简单,没有EF5.0也可以
1.8K0
如何用ORM支持SQL语句的CASE WHEN?
2.2K0
不使用反射,“一行代码”实现Web、WinForm窗体表单数据的填充、收集、清除,和到数据库的CRUD
2.8K0
相关推荐
ORM查询语言(OQL)简介--高级篇(续):庐山真貌
更多 >
LV.1
腾讯助理工程师
目录
  • 1、Containerd镜像管理
    • 1.1 Containerd容器镜像管理命令
    • 1.2 查看镜像
    • 1.3 下载镜像
    • 1.4 镜像挂载
    • 1.5 镜像导出
    • 1.6 镜像删除
    • 1.7 镜像导入
    • 1.8 修改镜像tag
  • 2、Containerd容器管理
    • 2.1 获取命令帮助
      • 2.1.1 获取ctr命令帮助
      • 2.1.2 获取创建静态容器命令帮助
      • 2.1.3 获取动态容器命令帮助
    • 2.2 查看容器
    • 2.3 查看任务
    • 2.4 创建静态容器
    • 2.5 静态容器启动为动态容器
    • 2.6 进入容器操作
    • 2.7 直接运行一个动态容器
    • 2.8 暂停容器
    • 2.9 恢复容器
    • 2.10 停止容器
    • 2.11 删除容器
  • 3、Containerd使用私有容器镜像仓库 Harbor
    • 3.1 Harbor准备
    • 3.2 配置Containerd使用Harbor仓库
      • 3.2.1 Harbor主机名解析
      • 3.2.2 修改Containerd配置文件
      • 3.2.3 ctr下载镜像
      • 3.2.4 ctr上传镜像
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档