• 容器编排学习(三)端口映射与Harber镜像仓库介绍


    一  对外发布服务(端口映射)

    1  概述

    新创建容器的IP 地址是随机的

    容器在重启后每次 IP 都会发生变化

    容器服务只有宿主机才能访问

    如何才能使用容器对外提供稳定的服务?

    容器端口可以与宿主机的端口进行映射绑定

    从而把宿主机变成对应的服务,不用关心容器的IP地址

    每个端口都只能和一个容器绑定

    2  端口绑定

    • docker run -itd -p 宿主机端口:容器端口 镜像名称:标签
    1. # 宿主机绑定 apache
    2. [root@docker ~]# docker run -itd --name web -p 80:80 myos:httpd
    3. # 绑定后,直接访问宿主机的 IP 地址即可
    4. [root@docker ~]# curl http://192.168.1.31
    5. Welcome to The Apache.
    6. # 同一个端口不能同时绑定给多个容器
    7. # 如果想把 80 端口绑定给 nginx 容器需要把之前的 apache 容器关停
    8. [root@docker ~]# docker rm -f web
    9. [root@docker ~]# docker run -itd --name web -p 80:80 myos:nginx
    10. # 重新绑定后,访问验证
    11. [root@docker ~]# curl http://192.168.1.31
    12. Nginx is running !
    13. # 完成实验,删除容器
    14. [root@docker ~]# docker rm -f web

    二  容器卷

    1. 发布nginx-php 服务
    2. 创建容器 nginx和 php-fpm
    3. 配置 php 容器使用 nginx的网络名称空间
    4. 使用卷修改nginx的配置文件,使之能够解析 php
    5. 把容器服务发布出来,并访问验证

    1  概述

    Docker容器不适合保存任何数据

    重要数据在容器内不方便管理易丢失

    修改多个容器中的数据非常困难

    多容器之间有数据共享、同步需求

    数据文件与配置文件频繁更改

    以上问题都可以使用容器卷来解决

    Docker可以映射宿主机文件或目录到容器中

    • 目标对象不存在就自动创建
    • 目标对象存在就直接覆盖掉
    • 多个容器可以映射同一个目标对象来达到数据共享的目的

    启动容器时,使用 -v 映射参数(可有多个)
            docker run -itd -v 宿主机对象:容器内对象 镜像名称:标签

    2  映射卷

    使用卷共享网站数据目录,让 httpd 容器和nginx容器共享网站数据目录

    共享网页目录

    1. # 创建共享卷目录
    2. [root@docker ~]# mkdir /var/webroot
    3. # 添加测试页面
    4. [root@docker ~]# echo "hello world" >/var/webroot/index.html
    5. [root@docker ~]# cp info.php /var/webroot/
    6. # 创建 nginx 容器,并映射数据卷
    7. [root@docker ~]# docker run -itd --rm --name mynginx \
    8. -v /var/webroot:/usr/local/nginx/html myos:nginx
    9. # 创建 apache 容器,与 mynginx 映射同样的卷
    10. [root@docker ~]# docker run -itd --rm --name myhttpd \
    11. -v /var/webroot:/var/www/html myos:httpd
    12. # 查看容器 IP 地址,并访问验证
    13. [root@docker ~]# docker inspect mynginx |grep -i IPAddress
    14. [root@docker ~]# curl http://172.17.0.2
    15. hello world
    16. [root@docker ~]# docker inspect myhttpd |grep -i IPAddress
    17. [root@docker ~]# curl http://172.17.0.3
    18. hello world

    使用共享卷修改配置文件

    1. # 获取配置文件
    2. [root@docker ~]# mkdir /var/webconf
    3. [root@docker ~]# docker cp mynginx:/usr/local/nginx/conf/nginx.conf /var/webconf/
    4. # 编辑配置文件,添加 php 解析配置
    5. [root@docker ~]# vim /var/webconf/nginx.conf
    6. location ~ \.php$ {
    7. root html;
    8. fastcgi_pass 127.0.0.1:9000;
    9. fastcgi_index index.php;
    10. include fastcgi.conf;
    11. }
    12. # 使用卷映射配置文件,重建 nginx 容器
    13. [root@docker ~]# docker rm -f mynginx
    14. [root@docker ~]# docker run -itd --rm --name mynginx -p 80:80 \
    15. -v /var/webconf/nginx.conf:/usr/local/nginx/conf/nginx.conf \
    16. -v /var/webroot:/usr/local/nginx/html myos:nginx
    17. # 进入容器验证配置文件
    18. [root@docker ~]# docker exec -it mynginx /bin/bash
    19. [root@e440b53a860a html]# cat /usr/local/nginx/conf/nginx.conf

    三  容器网络通信

    1  概述

    docker 的网络通信模式

    bridge 模式,默认模式

    host 模式,与宿主机共享网络

    none 模式,无网络模式

    container 模式,共享其他容器的网络命名空间

    自定义网络,自由创建桥接网络或者overlay网络

    2  图例

    3  共享网络名称空间 

    使用网络名称空间共享网络: - 参数 --network=container:容器名称 | ID

    1. # 创建 php 容器,使用 nginx 的网络名称空间
    2. [root@docker ~]# docker run -itd --network=container:mynginx \
    3. -v /var/webroot:/usr/local/nginx/html \
    4. --rm --name myphp myos:php-fpm
    5. # 配置验证
    6. [root@docker ~]# docker exec -it mynginx ss -ltun
    7. Netid State Recv-Q Send-Q Local Address:Port
    8. tcp LISTEN 0 128 127.0.0.1:9000
    9. tcp LISTEN 0 128 *:80
    10. [root@docker ~]# curl http://127.0.0.1/info.php
    11. <pre>
    12. Array
    13. (
    14. [REMOTE_ADDR] => 172.17.0.1
    15. [REQUEST_METHOD] => GET
    16. [HTTP_USER_AGENT] => curl/7.61.1
    17. [REQUEST_URI] => /info.php
    18. )
    19. php_host: 4525e99cea77
    20. 1229

    四  服务编排与治理

    1  概述

    从计算机诞生开始,架构就是一个一直绕不开的话题

    架构并不是被发明出来的,而是持续演进的结果

    2013年一个名为 docker的项目开源,随容器技术的兴起一种通过以容器为载体,使用多个小型服务组合来构建复杂应用的微服务架构逐渐清晰,这些小型服务围绕具体应用来构建。各个服务之间可以采用不同的编程语言,不同的存储技术,运行在各自的进程之中,互不干扰,协同工作

    2  微服务架构

    微服务并不是一种技术,而是架构思想、它以容器技术为载体,演进出的一种以软件运行环境、产品、研发、运营为一体全新模式。站在 Docker 的角度,软件就是容器的组合而容器又是服务的最佳载体,一台计算机同时运行多个容器从而就能很轻松地实现复杂的架构。

    优点:松耦合高内聚、高度可扩展、出色的弹性、易于部署、访问

    3  容器服务编排

    在微服务架构中每个微服务一般都会包含多个容器实例

    如果每个微服务都要手动管理,那么效率之低、维护量之大可想而知。为了解决编排部署的问题,docker 公司推出了docker Compose 工具

    Compose 是一个用于定义和运行多容器的应用的工具

    使用 Compose,可以在一个文件中配置多个容器服务,然后使用一个简单的命令就可以轻松、高效地管理配置中引用的所有容器服务

    4  容器服务治理

    服务文件:docker-compose.yaml

    1. # 安装 compose 组件
    2. [root@docker ~]# dnf install -y docker-compose-plugin
    3. # 创建项目
    4. [root@docker ~]# vim docker-compose.yaml
    5. name: websvc # 项目名称
    6. version: "3" # 语法格式版本
    7. services: # 关键字,定义服务
    8. websvc: # 服务名称
    9. container_name: nginx # 容器名称
    10. image: myos:nginx # 创建容器使用的镜像

    指令说明
    up创建项目并启动容器
    down删除项目容器及网络
    ls列出可以管理的项目
    start/stop/restart启动项目/停止项目/重启项目
    images列出项目使用的镜像
    ps显示项目中容器的状态
    logs查看下项目中容器的日志

    5  项目管理

    1. # 创建项目,并启动
    2. [root@docker ~]# docker compose -f docker-compose.yaml up -d
    3. [+] Running 2/2
    4. ⠿ Network websvc_default Created 0.0s
    5. ⠿ Container nginx Started 0.3s
    6. # 查看项目
    7. [root@docker ~]# docker compose ls
    8. NAME STATUS CONFIG FILES
    9. websvc running(1) /root/docker-compose.yaml
    10. # 查看项目中的容器状态
    11. [root@docker ~]# docker compose -p websvc ps
    12. NAME COMMAND SERVICE STATUS PORTS
    13. nginx "nginx -g 'daemon of…" websvc running 80/tcp
    14. # 启动、停止、重启项目
    15. [root@docker ~]# docker compose -p websvc stop
    16. [+] Running 1/1
    17. ⠿ Container nginx Stopped 0.1s
    18. [root@docker ~]# docker compose -p websvc start
    19. [+] Running 1/1
    20. ⠿ Container nginx Started 0.2s
    21. [root@docker ~]# docker compose -p websvc restart
    22. [+] Running 1/1
    23. ⠿ Container nginx Started 0.3s
    24. # 查看项目中容器的日志
    25. [root@docker ~]# docker inspect nginx |grep IPAddress
    26. [root@docker ~]# curl http://172.17.0.2/info.php
    27. <html>
    28. <head><title>404 Not Found</title></head>
    29. <body>
    30. <center><h1>404 Not Found</h1></center>
    31. <hr><center>nginx/1.22.1</center>
    32. </body>
    33. </html>
    34. [root@docker ~]# docker compose -p websvc logs
    35. nginx | 2023/02/13 13:55:39 [error] 7#0: *1 open() "/usr/local/nginx/html/info.php" failed (2: No such file or directory), client: 172.17.0.1, server: localhost, request: "GET /info.php HTTP/1.1", host: "172.17.0.2"
    36. # 删除项目
    37. [root@docker ~]# docker compose -p websvc down
    38. [+] Running 2/2
    39. ⠿ Container nginx Removed 0.1s
    40. ⠿ Network websvc_default Removed 0.0s

    6  compose

    <1>  概述

    Compose 项目是 Docker 官方的开源项目,负责实现容器集群的快速编排,在 Compose 中有两个核心概念,分别是服务和项目

    服务 (service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。

    项目(project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yaml 文件中定义

    <2>  compose语法

    指令说明
    networks配置容器连接的网络
    container_name指定容器名称
    depends_on解决容器的依赖、启动先后的问题
    command覆盖容器启动后默认执行的命令
    environment设置环境变量
    image指定为镜像名称或镜像 ID
    network_mode设置网络模式
    restart容器保护策略[always、no、on-failure]
    ports暴露端口信息
    volumes数据卷,支持 [volume、bind、tmpfs、npipe]

    <3>  定义 nginx + nginx-fpm 项目

    1. [root@docker ~]# vim docker-compose.yaml
    2. name: websvc # 项目名称
    3. version: "3" # 语法版本格式
    4. services: # 关键字,定义服务
    5. nginxsvc: # 服务名称
    6. container_name: nginx # 容器名称
    7. image: myos:nginx # 创建容器使用的镜像
    8. restart: always # 容器保护策略
    9. volumes: # 卷
    10. - type: bind # 卷类型
    11. source: /var/webconf/nginx.conf # 宿主机路径
    12. target: /usr/local/nginx/conf/nginx.conf # 容器路径
    13. - type: bind
    14. source: /var/webroot # 宿主机路径
    15. target: /usr/local/nginx/html # 容器路径
    16. network_mode: bridge # 网络工作模式
    17. ports: # 端口绑定
    18. - 80:80 # 宿主机端口:容器端口
    19. environment:
    20. - "TZ=Asia/Shanghai"
    21. php-fpm: # 服务名称
    22. container_name: php-fpm # 容器名称
    23. image: myos:php-fpm # 创建容器使用的镜像
    24. restart: always # 容器保护策略
    25. volumes: # 卷
    26. - type: bind # 卷类型
    27. source: /var/webroot # 宿主机路径
    28. target: /usr/local/nginx/html # 容器路径
    29. depends_on: # 依赖关系
    30. - nginxsvc # 依赖容器名称
    31. network_mode: "container:nginx" # 网络工作模式

    <4>  验证项目

    1. # 创建,并启动项目
    2. [root@docker ~]# docker compose -f docker-compose.yaml up -d
    3. [+] Running 2/2
    4. ⠿ Container nginx Started 0.3s
    5. ⠿ Container php-fpm Started 0.3s
    6. # 查看项目
    7. [root@docker ~]# docker compose ls
    8. NAME STATUS CONFIG FILES
    9. websvc running(2) /root/docker-compose.yaml
    10. # 查看容器状态,验证服务
    11. [root@docker ~]# docker compose -p websvc ps
    12. NAME COMMAND SERVICE STATUS
    13. nginx "nginx -g 'daemon of..." nginx running ......
    14. php-fpm "php-fpm --nodaemoni..." php-fpm running ......
    15. # 访问 php 页面验证
    16. [root@docker ~]# curl -s http://127.0.0.1/info.php
    17. <pre>
    18. Array
    19. (
    20. [REMOTE_ADDR] => 172.17.0.1
    21. [REQUEST_METHOD] => GET
    22. [HTTP_USER_AGENT] => curl/7.61.1
    23. [REQUEST_URI] => /info.php
    24. )
    25. php_host: 7e037978c775
    26. 1229

    五  harbor仓库

    1  概述

    Habor 是在 Registry 上进行了相应的企业级扩展,从而获得了更加广泛的应用,这些新的企业级特性包括:提供 WEB界面,优化用户体验,支持登陆、搜索功能,区分公有、私有镜像,以及基于角色的访问控制,集成日志审计、支持水平扩展等功能。

    部署 harbor 环境非常繁琐,涉及到 web服务器、数据库服务器、程序代码、docker 私有镜像仓库等 9个应用

    2  安装部署

    官方为了简化安装部署的步骤和流程,采用了微服务方式对项目进行了管理,所有应用官方都以 docker 镜像的方式发布,项目采用 compose 方式管理

    使用微服务项目方式部署 harbor 仓库

    主机名ip地址最低配置
    harbor192.168.1.302CPU,4G内存
    • 安装部署docker
    1. [root@harbor ~]# vim /etc/hosts
    2. 192.168.1.30 harbor
    3. # 安装部署 docker 及 compose 组件
    4. [root@harbor ~]# dnf install -y docker-ce docker-compose-plugin
    5. [root@harbor ~]# systemctl enable --now docker
    • 创建https证书
    1. # 导入 harbor 项目镜像
    2. [root@harbor ~]# tar -zxf harbor-v2.7.0.tgz -C /usr/local/
    3. [root@harbor ~]# cd /usr/local/harbor
    4. [root@harbor harbor]# docker load -i harbor.v2.7.0.tar.gz
    5. # 创建 https 证书
    6. [root@harbor harbor]# mkdir tls
    7. [root@harbor harbor]# openssl genrsa -out tls/cert.key 2048
    8. [root@harbor harbor]# openssl req -new -x509 -days 3650 \
    9. -key tls/cert.key -out tls/cert.crt \
    10. -subj "/C=CN/ST=BJ/L=BJ/O=Tedu/OU=NSD/CN=harbor"
    • 启动harbor项目
    1. # 修改配置文件
    2. [root@harbor harbor]# cp harbor.yml.tmpl harbor.yml
    3. [root@harbor harbor]# vim harbor.yml
    4. 05: hostname: harbor
    5. 08: # http:
    6. 10: # port: 80
    7. 17: certificate: /usr/local/harbor/tls/cert.crt
    8. 18: private_key: /usr/local/harbor/tls/cert.key
    9. 34: harbor_admin_password: admin123
    10. # 预安装环境检查,生成项目文件
    11. [root@harbor harbor]# /usr/local/harbor/prepare
    12. # 创建并启动项目
    13. [root@harbor harbor]# docker compose -f docker-compose.yml up -d
    14. # 添加开机自启动
    15. [root@harbor harbor]# chmod 0755 /etc/rc.d/rc.local
    16. [root@harbor harbor]# echo "/usr/bin/docker compose -p harbor start" >>/etc/rc.d/rc.local
    • 查看验证项目
    1. # 查看项目
    2. [root@harbor harbor]# docker compose ls
    3. NAME STATUS CONFIG FILES
    4. harbor running(9) /usr/local/harbor/docker-compose.yml
    5. # 查看容器状态
    6. [root@harbor harbor]# docker compose -p harbor ps
    7. NAME COMMAND SERVICE STATUS
    8. harbor-core "/harbor/entrypoint.…" core running (healthy)
    9. harbor-db "/docker-entrypoint.…" postgresql running (healthy)
    10. harbor-jobservice "/harbor/entrypoint.…" jobservice running (healthy)
    11. harbor-log "/bin/sh -c /usr/loc…" log running (healthy)
    12. harbor-portal "nginx -g 'daemon of…" portal running (healthy)
    13. nginx "nginx -g 'daemon of…" proxy running (healthy)
    14. redis "redis-server /etc/r…" redis running (healthy)
    15. registry "/home/harbor/entryp…" registry running (healthy)
    16. registryctl "/home/harbor/start.…" registryctl running (healthy)

    3  harbor管理

    用户:用来登录 harbor,以及认证权限

    项目:用来存储镜像的地址路径

    • 管理员可以分配项目权限给用户
    • 用户也可以自己创建项目

    公共仓库:任何人都可以访问或下载镜像,上传镜像需要用户认证

    私有仓库:不管是上传还是下载只有认证用户才可以访问

    容器管理命令说明
    docker login登录私有镜像仓库
    docker logout退出登录
    • 登录私有仓库
    1. # 添加主机配置
    2. [root@docker ~]# vim /etc/hosts
    3. 192.168.1.30 harbor
    4. 192.168.1.35 registry
    5. # 添加私有仓库配置
    6. [root@docker ~]# vim /etc/docker/daemon.json
    7. {
    8. "registry-mirrors": ["https://harbor:443", "http://registry:5000"],
    9. "insecure-registries":["harbor:443", "registry:5000"]
    10. }
    11. [root@docker ~]# systemctl restart docker
    12. # 登录 harbor 仓库
    13. [root@docker ~]# docker login harbor:443
    14. Username: luck
    15. Password: ********
    16. ... ...
    17. Login Succeeded
    18. # 认证信息记录文件
    19. [root@docker ~]# cat /root/.docker/config.json
    20. {
    21. "auths": {
    22. "harbor:443": {
    23. "auth": "bHVjazoqKioqKioqKg=="
    24. }
    25. }
    26. }
    27. # 退出登录
    28. [root@docker ~]# docker logout harbor:443
    29. Removing login credentials for harbor:443
    • 上传镜像
    1. # 设置标签
    2. [root@docker ~]# docker tag rockylinux:8.5 harbor:443/myimg/rockylinux:8.5
    3. # 没有登录上传失败
    4. [root@docker ~]# docker push harbor:443/myimg/rockylinux:8.5
    5. 65dbea0a4b39: Preparing
    6. unauthorized: unauthorized to access repository ......
    7. # 登录成功后才可以上传
    8. [root@docker ~]# docker login harbor:443
    9. Username: luck
    10. Password: ********
    11. Login Succeeded
    12. # 上传成功
    13. [root@docker ~]# docker push harbor:443/myimg/rockylinux:8.5
    14. The push refers to repository [harbor:443/myimg/rockylinux]
    15. ......
    16. # 设置标签
    17. [root@docker ~]# docker tag myos:latest harbor:443/library/myos:latest
    18. # 上传镜像到 library 项目,没有权限上传失败
    19. [root@docker ~]# docker push harbor:443/library/myos:latest
    20. The push refers to repository [harbor:443/library/myos]
    21. 65dbea0a4b39: Preparing
    22. unauthorized: unauthorized to access repository:
    23. ......
    24. # 赋权后重新上传镜像
    25. [root@docker ~]# docker push harbor:443/library/myos:latest
    26. The push refers to repository [harbor:443/library/myos]
    27. ......
    • 案例:上传镜像到 library 项目
    1. 镜像管理
    2. 赋予普通用户管理项目library 的权限
    3. 上传 rockylinux:8.5到 myimg/rockylinux:8.5
    4. 上传 myos:httpd到 myimg/httpd:latest
    5. 上传 myos:8.5、myos:httpd、myos:nginx、myos:php-fpm、myos:latest 到 library 项目下
    1. [root@docker ~]# docker tag myos:httpd harbor:443/myimg/httpd:latest
    2. [root@docker ~]# docker push harbor:443/myimg/httpd:latest
    3. [root@docker ~]# docker rmi harbor:443/myimg/httpd:latest
    4. [root@docker ~]# for i in 8.5 httpd nginx php-fpm latest;do
    5. docker tag myos:${i} harbor:443/library/myos:${i}
    6. docker push harbor:443/library/myos:${i}
    7. docker rmi myos:${i} harbor:443/library/myos:${i}
    8. done

  • 相关阅读:
    4.2 Ioc容器加载过程-Bean的生命周期深度剖析
    内存管理篇——物理内存的管理
    ABAP json解析使用引用代替预定义数据结构
    在ubuntu上用QT写一个简单的C++小游戏(附源码)
    JavaWeb之组件Servlet详解
    Hiredis的基本使用
    物联网相关名词
    20_ue4实现键盘控制物体自转(蓝图通讯2)
    python实现层次分析法(AHP)
    017 基于Spring Boot的食堂管理系统
  • 原文地址:https://blog.csdn.net/2301_79227925/article/details/132774184