1、容器技术在AI领域的使用场景、人工智能应用程序的运行环境初始化、GPU等资源对象的限制方法
2、Containerd简介及对比Docker的优势、Containerd安装方法、配置文件简介、客户端ctr、critl、nerdctl的对比及使用;
1、安装containerd及CNI组件
root@containerd-server1:/usr/local/src# tar xvf containerd-1.7.2-linux-amd64.tar.gzbin/bin/containerd-shimbin/containerd-shim-runc-v1bin/containerd-stress bin/containerdbin/ctr bin/containerd-shim-runc-v2#copy⼆进制root@containerd-server1:/usr/local/src# cp bin/* /usr/local/bin/#验证containerd执⾏结果root@containerd-server1:/usr/local/src# containerd -v containerd github.com/containerd/containerd v1.6.20 2806fc1057397dbaeefbea0e4e17bddfbd388f38#创建service⽂件root@containerd-server1:/usr/local/src# vim /lib/systemd/system/containerd.service[Unit]Description=containerd container runtimeDocumentation=https://containerd.ioAfter=network.target local-fs.target[Service]ExecStartPre=-/usr/sbin/modprobe overlayExecStart=/usr/local/bin/containerd Type=notifyDelegate=yes KillMode=process Restart=alwaysRestartSec=5# Having non-zero Limit*s causes performance problems due to accounting overhead# in the kernel. We recommend using cgroups to do container-local accounting. LimitNPROC=infinityLimitCORE=infinityLimitNOFILE=infinity# Comment TasksMax if your systemd version does not supports it.# Only systemd 226 and above support this version.TasksMax=infinityOOMScoreAdjust=-999[Install]WantedBy=multi-user.target
root@containerd-server1:~ # mkdir /etc/containerdroot@containerd-server1:~ # containerd config default > /etc/containerd/config.tomlroot@containerd-server1:~ # vim /etc/containerd/config.tomlsandbox_image = "registry.aliyuncs.com/google_containers/pause:3.7" #61设置基础镜像下载地址config_path=""[plugins."io.containerd.grpc.v1.cri".registry.auths]
[plugins."io.containerd.grpc.v1.cri".registry.configs]
[plugins."io.containerd.grpc.v1.cri".registry.headers]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins. "io.containerd.grpc.v1.cri" .registry.mirrors] #设置镜像加速[plugins. "io.containerd.grpc.v1.cri" .registry.mirrors. "docker.io" ]endpoint = [ "https://9916w1ow.mirror.aliyuncs.com" ]root@containerd-server1:~# systemctl restart containerd && systemctl enable containerd
root@containerd-server1:~# wget https://github.com/opencontainers/runc/releases/download/v1.1.5/runc.amd64root@containerd-server1:~# chmod a+x runc.amd64root@containerd-server1:~# mv runc.amd64 /usr/bin/runc
root@containerd-server1:~# ctr images pull docker.io/library/alpine:latestroot@containerd-server1:~# ctr images lsroot@containerd-server1:~# ctr -n k8s.io images ls #指定namespaces
root@containerd-server1:~# wget https://github.com/containernetworking/plugins/releases/download/v1.3.0/cni-pluginslinux-amd64-v1.3.0.tgzroot@containerd-server1:~# mkdir /opt/cni/bin -p #保存cni插件的路径root@containerd-server1:~# tar xvf cni-plugins-linux-amd64-v1.2.0.tgz -C /opt/cni/bin/././loopback./bandwidth./ptp./vlan./host-device./tuning./vrf./sbr./dhcp./static./firewall./macvlan./dummy./bridge./ipvlan./portmap./host-local
3、使用nerdctl命令行客户端实现容器的创建、删除及对历史镜像的管理;
2、使用基于nerdctl创建并管理容器
2.2.1:安装nerdctl:
root@containerd-server1:~# wget https://github.com/containerd/nerdctl/releases/download/v1.4.0/nerdctl-1.4.0-linux-amd64.tar.gz
root@containerd-server1:~# tar xvf nerdctl-1.3.0-linux-amd64.tar.gz -C /usr/local/bin/
root@containerd-server1:~# nerdctl version
2.2.2:nerdctl配置⽂件:
root@containerd-server1:~# mkdir /etc/nerdctl/
root@containerd-server1:~# vim /etc/nerdctl/nerdctl.toml
namespace = "k8s.io"
debug = false
debug_full = false
insecure_registry = true
2.2.3:创建Nginx测试容器并指定端⼝:
创建容器并制定端⼝
root@containerd-server1:~# nerdctl run -d -p 80:80 --name=nginx-web1 --restart=always nginx root@containerd-server1:~# nerdctl ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 936a48ea2c54 docker.io/library/nginx:latest "/docker-entrypoint.…" 36 seconds ago Up 0.0.0.0:80->80/tcp nginx-web1
root@containerd-server1:~# nerdctl exec -it 936a48ea2c54 bash
root@936a48ea2c54:/#
2.2.4:创建Tomcat测试容器并指定端⼝:
root@containerd-server1:~# nerdctl run -d -p 8080:8080 --name=tomcat-web1 -- restart=always tomcat:7.0.88-alpine
2.2.5:创建MySQL测试容器并指定端⼝:
root@containerd-server1:~# nerdctl run -t -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=MySQL127336 -d mysql:5.6.39 29d6e0d997658c3390859a3a385da61dbeebd6d72f4274a0ccbb7aa28ec2df5e
测试远程连接MySQL:
root@containerd-server2:~# apt install mariadb-client
root@containerd-server2:~# mysql -uroot -pMySQL127336 -h172.31.6.201
4、部署自签发证书https的Harbor镜像仓库并实现镜像统一分发
1.1:安装 docker: root@docker-harbor2:~# cd /usr/local/src/ root@docker-harbor2:/usr/local/src# tar xvf docker-20.10.18-binary-install.tar.gz root@docker-harbor2:/usr/local/src# bash docker-install.sh root@docker-harbor2:/usr/local/src# docker version
生成证书颁发机构证书
在生产环境中,应从 CA 获取证书。在测试或开发环境中,您可以生成自己的 CA。若要生成 CA 证书,请运行以下命令。
-
生成 CA 证书私钥。
openssl genrsa -out ca.key 4096
-
生成 CA 证书。
调整选项中的值以反映您的组织。如果使用 FQDN 连接 Harbor 主机,则必须将其指定为公用名 () 属性。
-subj
CN
openssl req -x509 -new -nodes -sha512 -days 3650 \ -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=yourdomain.com" \ -key ca.key \ -out ca.crt
生成服务器证书
证书通常包以下文件
.crt
.key
yourdomain.com.crt
yourdomain.com.key
-
生成私钥。
openssl genrsa -out yourdomain.com.key 4096
-
生成证书签名请求 (CSR)。
调整选项中的值以反映您的组织。如果使用 FQDN 连接 Harbor 主机,则必须将其指定为公用名 () 属性,并在密钥和 CSR 文件名中使用它。
-subj
CN
openssl req -sha512 -new \ -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=yourdomain.com" \ -key yourdomain.com.key \ -out yourdomain.com.csr
-
生成 x509 v3 扩展文件。
无论使用 FQDN 还是 IP 地址连接到 Harbor 主机,都必须创建此文件,以便可以为 Harbor 主机生成符合使用者备用名称 (SAN) 和 x509 v3 扩展要求的证书。替换条目以反映您的域。
DNS
cat > v3.ext <<-EOF authorityKeyIdentifier=keyid,issuer basicConstraints=CA:FALSE keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment extendedKeyUsage = serverAuth subjectAltName = @alt_names [alt_names] DNS.1=yourdomain.com DNS.2=yourdomain DNS.3=hostname EOF
-
使用该文件为 Harbor 主机生成证书。
v3.ext
将 CRS 和 CRT 文件名中的 替换为 Harbor 主机名。
yourdomain.com
openssl x509 -req -sha512 -days 3650 \ -extfile v3.ext \ -CA ca.crt -CAkey ca.key -CAcreateserial \ -in yourdomain.com.csr \ -out yourdomain.com.crt
部署或重新配置Harbor
如果尚未部署 Harbor,请参阅配置 Harbor YML 文件,了解有关如何通过在 harbor.yml
中指定 hostname
和https
属性来配置 Harbor 以使用证书的信息。
如果您已经使用 HTTP 部署了 Harbor,并希望将其重新配置为使用 HTTPS,请执行以下步骤。
-
运行脚本以启用 HTTPS。
prepare
Harbor 使用
nginx
实例作为所有服务的反向代理。您可以使用prepare
脚本配置为nginx
使用 HTTPS。prepare
位于 Harbor 安装程序捆绑包中,与install.sh
脚本处于同一级别。./prepare
-
如果 Harbor 正在运行,请停止并删除现有实例。
您的图像数据保留在文件系统中,因此不会丢失任何数据。
docker-compose down -v
-
重新启动Harbor:
docker-compose up -d
将公钥分发给客户端 docker 主机:
root@docker-server2:~# mkdir -p /etc/docker/certs.d/harbor.magedu.net/
root@docker-harbor2:/apps/harbor/certs# scp magedu.net.crt 172.31.6.202:/etc/docker/certs.d/harbor.magedu.net/
配置域名解析:
root@docker-server2:~# vim /etc/hosts
172.31.6.205 harbor.magedu.net
验证 HTTPS 连接
为 Harbor 设置 HTTPS 后,您可以通过执行以下步骤来验证 HTTPS 连接。
-
打开浏览器并输入 https://yourdomain.com。它应该显示 Harbor 界面。
某些浏览器可能会显示一条警告,指出证书颁发机构 (CA) 未知。当使用不是来自受信任的第三方 CA 的自签名 CA 时,会发生这种情况。您可以将 CA 导入浏览器以删除警告。
-
在运行 Docker 守护程序的计算机上,检查该文件以确保未为 https://yourdomain.com 设置该选项。
/etc/docker/daemon.json
-insecure-registry
-
从 Docker 客户端登录 Harbor。
docker login yourdomain.com
如果已将 443 端口映射到其他端口,请在命令中添加该端口。
nginx
login
docker login yourdomain.com:port
5、基于Alpine和Ubuntu作为基础镜像实现的业务镜像构建
基于Alpine构建镜像
上传配置文件与业务代码
编写Dockerfile
vim Dockerfile
FROM alpine:3.18.2
MAINTAINER zhangshijie 2973707860@qq.com
COPY repositories /etc/apk/repositories
RUN apk update && apk add vim iotop gcc libgcc libc-dev libcurl libc-utils gzip zlib zlib-dev libnfs make pcre pcre2 pcre-dev zip unzip net-tools pstree wget libevent libevent-dev iproute2ARG VER=1.24.0
ADD nginx-${VER}.tar.gz /opt
RUN cd /opt/nginx-${VER} && ./configure --prefix=/apps/nginx && make && make install && ln -sv /apps/nginx/sbin/nginx /usr/binRUN addgroup -g 2088 -S nginx
RUN adduser nginx -u 2088 -D -S /bin/sh -G nginx
RUN echo -e "123456\n123456" | passwd nginx
RUN mkdir /data/nginx/html/ -pvADD nginx.conf /apps/nginx/conf/nginx.conf
ADD frontend.tar.gz /apps/nginx/html/RUN chown nginx.nginx -R /data/nginx/ /apps/nginx/
EXPOSE 80 443
CMD ["nginx"]
构建并上传镜像
docker build -t harbor.magedu.net/myserver/nginx:alpine-v1 .
docker push harbor.magedu.net/myserver/nginx:alpine-v1
基于Ubuntu构建镜像
上传配置文件与业务代码
编写Dockerfile
vim Dockerfile
FROM ubuntu:22.04
MAINTAINER "jack 2973707860@qq.com"#ADD sources.list /etc/apt/sources.list
RUN apt update && apt install -y iproute2 ntpdate tcpdump telnet traceroute nfs-kernel-server nfs-common lrzsz tree openssl libssl-dev libpcre3 libpcre3-dev zlib1g-dev ntpdate tcpdump telnet traceroute gcc openssh-server lrzsz tree openssl libssl-dev libpcre3 libpcre3-dev zlib1g-dev ntpdate tcpdump telnet traceroute iotop unzip zip make
ADD nginx-1.22.0.tar.gz /usr/local/src/
RUN cd /usr/local/src/nginx-1.22.0 && ./configure --prefix=/apps/nginx && make && make install && ln -sv /apps/nginx/sbin/nginx /usr/bin
RUN groupadd -g 2088 nginx && useradd -g nginx -s /usr/sbin/nologin -u 2088 nginx && chown -R nginx.nginx /apps/nginx
ADD nginx.conf /apps/nginx/conf/
ADD frontend.tar.gz /apps/nginx/html/EXPOSE 80 443
#ENTRYPOINT ["nginx"]
CMD ["nginx","-g","daemon off;"]
构建并上传镜像
docker build -t harbor.magedu.net/myserver/nginx:ubuntu-v1 .
docker push harbor.magedu.net/myserver/nginx:ubuntu-v1
6、Docker-Compose功能特性及工作原理,Docker-Compose配置文件语法介绍
7、基于docker-compose单机编排运行Nginx+Java APP+MySQL服务
编写docker-compose配置文件
vim docker-compose.yml
version: '3.8'
services:
nginx-server:
image: nginx:1.22.0-alpine
container_name: nginx-web1
# network_mode: bridge #网络1,使用docker安装后的默认网桥
expose:
- 80
- 443
ports:
- "80:80"
- "443:443"
networks: #网络2,使用自定义的网络,如果网络不存在则会自动创建该网络并分配子网,并且容器会有两块网卡
- front
- backend
links:
- tomcat-servertomcat-server:
#image: tomcat:7.0.93-alpine
image: registry.cn-hangzhou.aliyuncs.com/zhangshijie/tomcat-myapp:v1
container_name: tomcat-app1
##network_mode: bridge #网络1,使用docker安装后的默认网桥
#expose:
# - 8080
#ports:
# - "8080:8080"
networks: #网络2,使用自定义的网络,如果网络不存在则会自动创建该网络并分配子网,并且容器会有一块网卡
- backend
links:
- mysql-servermysql-server:
image: mysql:5.6.48
container_name: mysql-container
# network_mode: bridge #网络1,使用docker安装后的默认网桥
volumes:
- /data/mysql:/var/lib/mysql
#- /etc/mysql/conf/my.cnf:/etc/my.cnf:ro
environment:
- "MYSQL_ROOT_PASSWORD=12345678"
- "TZ=Asia/Shanghai"
expose:
- 3306
ports:
- "3306:3306"
networks: #网络2,使用自定义的网络,如果网络不存在则会自动创建该网络并分配子网,并且容器会有一块网卡
- backendnetworks:
front: #自定义前端服务网络,需要docker-compose创建
driver: bridge
backend: #自定义后端服务的网络,要docker-compose创建
driver: bridge
default: #使用已经存在的docker0默认172.17.0.1/16的网络
external:
name: bridge
运行并验证容器状态
docker-compose up -d
docker-compose ps
扩展:
1、对GPU服务器安装驱动、nvidia-container-toolkit
2、创建容器并验证对GPU的资源限制
3、基于nginx反代harbor并实现https