condtainerd 的使用构建镜像
[root@localhost ~]# nerdctl run -d -p nginx:1.21
启动一个容器
-d: 在后台运行
-p: 指定端口映射,可以多次出现,映射多个端口
-i: 交互式执行
-t: 为容器分配一个tty
--dns: 为容器分配dns
--name: 为容器指定名称
-e: 在容器启动时传递环境变量,可多次出现
--workdir: 指定工作目录
--restart: 容器异常退出时是否重启
--rm: 容器退出时自动删除
-m: 指定内存限制
-c: 指定cpu限制: cpu是基于时间分片的,单位时间内cpu执行的时长。cpu限制只在繁忙时使用。
进入容器
nerdctl exec -it [容器id] /bin/bash
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AKYEyVV2-1669692080257)(C:\Users\杨其海\Pictures\9b64513c5b17cd791a131f4123202308.png)]
容器的生命周期
1. 容器的启动
nerdctl start containerd_id
2. 容器的运行
nerdctl run
3. 容器的停止
nerdctl stop containerd_id # 正常退出
nerdctl kill containerd_id #异常退出
4. 暂停容器
nerdctl pause containerd_id
5. 恢复暂停
nerdctl unpause containerd_id
6. 删除容器
nerdctl rm containerd_id
-f :强制
7. 删除所有容器
nerdctl ps -aq | xargs nerdctl rm -f
查看容器日志
nerdctl logs [containerd_id]
查看容器详情
nerdctl inspect [containerd_id]
查看容器列表
nerdctl ps
-a :包括已停止容器
-q :只打印容器id
容器存储和网络
nerdctl run -d -p 8080:80 -v /var/html/:/usr/share/nginx/html:ro nginx:1.21
-v: 将宿主机的指定目录挂在到容器目录,会覆盖容器中目录的内容,可以多次指定,挂载多个路径,除了可以挂在目录外,还可以挂载文件;同时可以指定挂载的目录或文件的权限。
列出容器网络
[root@localhost ~]# nerdctl network ls
NETWORK ID NAME FILE
containerd-net /etc/cni/net.d/10-containerd-net.conflist
17f29b073143 bridge /etc/cni/net.d/nerdctl-bridge.conflist
host
none
显示容器网络详细信息
[root@localhost ~]# nerdctl network inspect bridge
[
{
"Name": "bridge",
"Id": "17f29b073143d8cd97b5bbe492bdeffec1c5fee55cc1fe2112c8b9335f8b6121",
"IPAM": {
"Config": [
{
"Subnet": "10.4.0.0/24",
"Gateway": "10.4.0.1"
}
]
},
"Labels": {}
}
]
容器网络:
- briage :基于iptables实现snat和dnat
- host:不为容器分配ip地址,而直接将宿主机ip绑定至容器;相较于briage有较好的性能。
- none:不为容器分配ip,也不绑定宿主机ip。
- 自定义网络:为容器分配ip地址,跨网络通信
##容器镜像制作
镜像构建工具 buildkit https://github.com/moby/buildkit
下载构建工具 https://github.com/moby/buildkit/releases/tag/v0.10.5
解压到
tar -xf buildkit-v0.10.5.linux-amd64.tar.gz /usr/local/
官方示例
# vi /etc/systemd/system/buildkit.service
[Unit]
Description=BuildKit
Requires=buildkit.socket
After=buildkit.socket
Documentation=https://github.com/moby/buildkit
[Service]
Type=notify
ExecStart=/usr/local/bin/buildkitd --addr fd://
[Install]
WantedBy=multi-user.target
我们使用
[Unit]
Description=BuildKit
Documentation=https://github.com/moby/buildkit
[Service]
ExecStart=/usr/local/bin/buildkitd --oci-worker=false --containerd-worker=true --addr tcp://localhost:1234
#--oci-worker=false 和 --containerd-worker=true 表示使用 containerd 作为 buildkit 的后端 worker
#--addr tcp://localhost:1234 表示监听 localhost:1234 端口和客户端通信
[Install]
WantedBy=multi-user.target
# vi /etc/systemd/system/buildkit.socket
[Unit]
Description=BuildKit
Documentation=https://github.com/moby/buildkit
[Socket]
ListenStream=%t/buildkit/buildkitd.sock
SocketMode=0660
[Install]
WantedBy=sockets.target
Building a Dockerfile with buildctl
buildctl build \
--frontend=dockerfile.v0 \
--local context=. \
--local dockerfile=.
# or
buildctl build \
--frontend=dockerfile.v0 \
--local context=. \
--local dockerfile=. \
--opt target=foo \
--opt build-arg:foo=bar
--local
exposes local source files from client to the builder. context
and dockerfile
are the names Dockerfile frontend looks for build context and Dockerfile location.
If the Dockerfile has a different filename it can be specified with --opt filename=./Dockerfile-alternative
.
Building a Dockerfile using external frontend
External versions of the Dockerfile frontend are pushed to https://hub.docker.com/r/docker/dockerfile-upstream and https://hub.docker.com/r/docker/dockerfile and can be used with the gateway frontend. The source for the external frontend is currently located in ./frontend/dockerfile/cmd/dockerfile-frontend
but will move out of this repository in the future (#163). For automatic build from master branch of this repository docker/dockerfile-upstream:master
or docker/dockerfile-upstream:master-labs
image can be used.
buildctl build \
--frontend gateway.v0 \
--opt source=docker/dockerfile \
--local context=. \
--local dockerfile=.
buildctl build \
--frontend gateway.v0 \
--opt source=docker/dockerfile \
--opt context=https://github.com/moby/moby.git \
--opt build-arg:APT_MIRROR=cdn-fastly.deb.debian.org
镜像的分层架构
-
镜像不可修改
-
支持镜像分层的文件系统:UnionFS 可以参考(https://blog.csdn.net/weixin_45880055/article/details/118057568)
Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。
支持unionfs的文件系统
overlayfs
devicemapper
aufs
开始构建镜像,需在含有Dockerfile 的目录构建
buildctl build --frontend=dockerfile.v0 --local context=. --local dockerfile=. --output type=image,name=nginx:123
可以用 nerdctl -n buildkit images 查看镜像
也可以使用
[root@localhost ~]# nerdctl build -t nginx:333 .
这个默认保存在 docker.io/library 中
Dockefile语法
#引用基础镜像层
#FROM seratch 引用空白镜像,从零构建
FROM centos:7
# LABEL 添加一些注解信息
LABEL Author natasha<natasha@example.com> \
Time 20221103\
function ngnix-demo
ADD repos.tar.gz /etc/yum.repos.d/
RUN yum -y install nginx && \
rm -rf /usr/share/nginx/html/* && \的参数;
echo "hello word" > /usr/share/nginx/html/index.html
#镜像启动时执行的命令
CMD ["nginx","-g","daemon off"]
构建镜像(add 压缩包可以自动解压,除zip外,也可以用copy一个个文件放进去)
#WORKDIR /etc/yum.repos.d/ 切换工作目录,不会导致新层的出现。
#USER 切换工作用户
#ENV 引入环境变量
ENV my_sqlhost 192.168.1.2
CONTENT "hello word"
EXPOSE 用于声明镜像启动为容器监听的端口
#VOLUME 会在容器启动的时候将宿容器的目录直接挂载给宿主机
VOLUME /usr/share/nginx/html /etc/nginx 确保数据持久化
#ENTRYPOINT 在容器启动时执行的指令,ENTRYPOINT所执行的智利是无法覆盖的,如果同时定了了ENTRYPOINT和cmd,则cmd会作为ENTRYPOINT的参数;ENTRYPOINT通常是一个脚本,用在容器启动时执行必要的初始化操作。如
* 修改配置文件
* 创建数据库
于声明镜像启动为容器监听的端口
#VOLUME 会在容器启动的时候将宿容器的目录直接挂载给宿主机
VOLUME /usr/share/nginx/html /etc/nginx 确保数据持久化
#ENTRYPOINT 在容器启动时执行的指令,ENTRYPOINT所执行的智利是无法覆盖的,如果同时定了了ENTRYPOINT和cmd,则cmd会作为ENTRYPOINT的参数;ENTRYPOINT通常是一个脚本,用在容器启动时执行必要的初始化操作。如
- 修改配置文件
- 创建数据库