创建dockerfile(Dockerfile-web),通过dockerfile构建nginx镜像

FROM nginx:stable-alpine
COPY nginx.conf /etc/nginx/nginx.conf
ADD dist.tar.gz /usr/share/nginx/html/
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

dockerfile是一个描述如何构造和启动镜像的文件,像上面这个

1.我们从 nginx:stable-alpine 拉取镜像作为基座,nginx版本是,1.22.1;

2.拷贝当前目录下的nginx.conf 到 镜像里面的/etc/nginx/nginx.conf,其实就是替换,nginx的配置

3.把当前目录下的dist.tar.gz的压缩文件,解压到镜像的/usr/share/nginx/html/

ps: 压缩命令:cd 到dist目录执行 tar -zcvf dist.tar.gz ./ 

4.声明该镜像服务跟外界通讯的端口是80

5.启动程序在后台执行

下面的操作都是在安装有docker的服务器运行

执行命令构建镜像

docker build -t myNginx:v1 . -f ./Dockerfile-web

查看镜像 

docker images

使用镜像myNginx:v1创建容器myNginxV1实例,并映射宿主85端口到容器的80端口

docker run -d -p 85:80 --name myNginxV1 myNginx:v1               ## 使用新镜像创建容器 

启动容器

docker start myNginxV1

查看容器状态
docker ps

停止容器

docker stop myNginxV1

删除容器

docker rm myNginxV1

进入容器

docker exec -it myNginxV1  /bin/sh

ps:进入容器要看容器的基座是基于什么方式进行交互,有的是/bin/bash有的是/bin/sh

退出容器

请按Ctrl+P+Q进行退出容器

部署到k8s

1.如果有部署自己公共的镜像服务器管理平台,如Harbor,则将上述创建好的镜像文件push到管理平台,执行

docker tag myNginx:v1 xxx.xxx.xxx.xxx/myNginx:v1
docker push xxx.xxx.xxx.xxx/myNginx:v1

2.编写yaml文件(myNginx.yaml)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myNginx
  labels:
    name: myNginx
spec:
  replicas: 3 # 启动3个容器实例
  selector:
    matchLabels:
      app: myNginx
  template:
    metadata:
      labels:
        app: myNginx
    spec:
      containers:
        - name: moanginx
          image: xxx.xxx.xxx.xxx/myNginx:v1
          imagePullPolicy: Always # 始终拉取
          ports:
            - containerPort: 80 # 容器对外端口

---

apiVersion: v1
kind: Service
metadata:
  name: myNginx
  labels:
    app: myNginx
spec:
  type: NodePort
  ports:
    - port: 80 # 容器端口
      targetPort: 80 # 容器端口
      nodePort: 30005 # 对外服务端口
  selector:
    app: myNginx

这个yaml文件是告诉k8s如何部署镜像,服务。

ps:yaml的语法,跟json差不多,少了{},层级靠空格区分(空格个数不限制,相同空格数的在同一级),“-”表示父元素是个数组,这是一个数组项;“---”表示另外要一个yaml文件,不想分多个文件想在一个文件里面描述的就使用---隔开

上面yaml定义2个类型的Deployment,Service的对象,Deployment简单理解管理容器的一套程序,配置这个类型,告诉k8s,容器从哪里拉镜像,启动多少容器实例等等;Service简单理解容器运行后从集群角度对外怎样提供服务,通过配置对外服务是30005端口,外部的程序就可以通过30005端口进入集群访问容器提供的服务,负载均衡啥的应该就都是Service内部自己调度

下面的命令需要在部署了k8s的服务器上运行

执行部署命令

kubectl apply -f myNginx.yaml 

执行后,如果没有什么问题,通过 kubectl get pods 可以看到3个myNginx的实例在运行,再通过http://xxx.xxx.xxx.xxx:30005,在浏览器就可以访问容器内nginx提供的web内容

停掉这个部署可以使用下面命令

kubectl delete -f myNginx.yaml

执行后,再用kubectl get pods,可以看到myNginx会逐步停掉至消失