20230723作业-docker3

1、容器技术在AI领域的使用场景、人工智能应用程序的运行环境初始化、GPU等资源对象的限制方法

2、Containerd简介及对比Docker的优势、Containerd安装方法、配置文件简介、客户端ctr、critl、nerdctl的对比及使用;

1、安装containerd及CNI组件

⼆进制安装 containerd:
通过官⽅⼆进制安装 containerd runc CNI。kubernetes v1.24.0 开始默认使⽤ containerd 作为容器运⾏时,因此需要提前安装好containerd 之后在安装 v1.24 或更⾼版本的 kubernetes( 如果要继续使⽤ docker ,则需要单独安装 docker及 cri-dockerd https://github.com/Mirantis/cri-dockerd )
1.3.1:下载containerd⼆进制并创建service⽂件:
下载安装包
root@containerd-server1:/usr/local/src# tar xvf containerd-1.7.2-linux-amd64.tar.gz
bin/
bin/containerd-shim
bin/containerd-shim-runc-v1
bin/containerd-stress bin/containerd
bin/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 runtime
Documentation=https://containerd.io
After=network.target local-fs.target
[Service]
ExecStartPre=-/usr/sbin/modprobe overlay
ExecStart=/usr/local/bin/containerd Type=notify
Delegate=yes KillMode=process Restart=always
RestartSec=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=infinity
LimitCORE=infinity
LimitNOFILE=infinity
# Comment TasksMax if your systemd version does not supports it.
# Only systemd 226 and above support this version.
TasksMax=infinity
OOMScoreAdjust=-999
[Install]
WantedBy=multi-user.target
1.3.2 :编辑配置⽂件:
root@containerd-server1:~ # mkdir /etc/containerd
root@containerd-server1:~ # containerd config default > /etc/containerd/config.toml
root@containerd-server1:~ # vim /etc/containerd/config.toml
sandbox_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
1.3.3:部署runc:
root@containerd-server1:~# wget https://github.com/opencontainers/runc/releases/download/v1.1.5/runc.amd64
root@containerd-server1:~# chmod a+x runc.amd64
root@containerd-server1:~# mv runc.amd64 /usr/bin/runc
1.3.4:下载测试镜像并验证:
root@containerd-server1:~# ctr images pull docker.io/library/alpine:latest
root@containerd-server1:~# ctr images ls
root@containerd-server1:~# ctr -n k8s.io images ls #指定namespaces
安装CNI:
root@containerd-server1:~# wget https://github.com/containernetworking/plugins/releases/download/v1.3.0/cni-pluginslinux-amd64-v1.3.0.tgz
root@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 证书,请运行以下命令。

  1. 生成 CA 证书私钥。

    openssl genrsa -out ca.key 4096
    
  2. 生成 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.keyyourdomain.com.crtyourdomain.com.key

  1. 生成私钥。

    openssl genrsa -out yourdomain.com.key 4096
    
  2. 生成证书签名请求 (CSR)。

    调整选项中的值以反映您的组织。如果使用 FQDN 连接 Harbor 主机,则必须将其指定为公用名 () 属性,并在密钥和 CSR 文件名中使用它。-subjCN

    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
    
  3. 生成 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
    
  4. 使用该文件为 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中指定 hostnamehttps 属性来配置 Harbor 以使用证书的信息。

如果您已经使用 HTTP 部署了 Harbor,并希望将其重新配置为使用 HTTPS,请执行以下步骤。

  1. 运行脚本以启用 HTTPS。prepare

    Harbor 使用nginx实例作为所有服务的反向代理。您可以使用prepare脚本配置为nginx使用 HTTPS。prepare位于 Harbor 安装程序捆绑包中,与install.sh脚本处于同一级别。​​​​​​​

    ./prepare
    
  2. 如果 Harbor 正在运行,请停止并删除现有实例。

    您的图像数据保留在文件系统中,因此不会丢失任何数据。

    docker-compose down -v
    
  3. 重新启动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 端口映射到其他端口,请在命令中添加该端口。nginxlogin

    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 iproute2

ARG 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/bin 

RUN 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/ -pv

ADD 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-server

  tomcat-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-server

  mysql-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,使用自定义的网络,如果网络不存在则会自动创建该网络并分配子网,并且容器会有一块网卡
      - backend

networks:
  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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值