容器技术-对外发布任务,服务编排与治理,harbor仓库

容器技术

 

对外发布服务

端口绑定

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

 

容器卷

  • docker run -itd -v 宿主机对象:容器内对象 镜像名称:标签

共享网页目录

# 创建共享卷目录
[root@docker ~]# mkdir /var/webroot 

# 添加测试页面
[root@docker ~]# echo "hello world" >/var/webroot/index.html
[root@docker ~]# cp info.php /var/webroot/

# 创建 nginx 容器,并映射数据卷
[root@docker ~]# docker run -itd --rm --name mynginx \
                   -v /var/webroot:/usr/local/nginx/html myos:nginx

# 创建 apache 容器,与 mynginx 映射同样的卷
[root@docker ~]# docker run -itd --rm --name myhttpd \
                   -v /var/webroot:/var/www/html myos:httpd

# 查看容器 IP 地址,并访问验证
[root@docker ~]# docker inspect mynginx |grep -i IPAddress
[root@docker ~]# curl http://172.17.0.2
hello world

[root@docker ~]# docker inspect myhttpd |grep -i IPAddress
[root@docker ~]# curl http://172.17.0.3 
hello world

 修改配置文件

# 获取配置文件
[root@docker ~]# mkdir /var/webconf 
[root@docker ~]# docker cp mynginx:/usr/local/nginx/conf/nginx.conf /var/webconf/

# 编辑配置文件,添加 php 解析配置
[root@docker ~]# vim /var/webconf/nginx.conf
        location ~ \.php$ {
            root           html;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            include        fastcgi.conf;
        }

# 使用卷映射配置文件,重建 nginx 容器
[root@docker ~]# docker rm -f mynginx
[root@docker ~]# docker run -itd --rm --name mynginx -p 80:80 \
                   -v /var/webconf/nginx.conf:/usr/local/nginx/conf/nginx.conf \
                   -v /var/webroot:/usr/local/nginx/html myos:nginx

# 进入容器验证配置文件
[root@docker ~]# docker exec -it mynginx /bin/bash 
[root@e440b53a860a html]# cat /usr/local/nginx/conf/nginx.conf

容器网络通信

实验架构图例

共享名称空间 

# 创建 php 容器,使用 nginx 的网络名称空间
[root@docker ~]# docker run -itd --network=container:mynginx \
                   -v /var/webroot:/usr/local/nginx/html \
                   --rm --name myphp myos:php-fpm

# 配置验证
[root@docker ~]# docker exec -it mynginx ss -ltun
Netid  State      Recv-Q    Send-Q     Local Address:Port
tcp    LISTEN     0         128            127.0.0.1:9000
tcp    LISTEN     0         128                    *:80
[root@docker ~]# curl http://127.0.0.1/info.php
<pre>
Array
(
    [REMOTE_ADDR] => 172.17.0.1
    [REQUEST_METHOD] => GET
    [HTTP_USER_AGENT] => curl/7.61.1
    [REQUEST_URI] => /info.php
)
php_host:   4525e99cea77
1229

  •  

     

     

     服务编排与治理

    容器服务治理

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

    项目管理  

    #安装docker-compose命令的软件包
    [root@docker ~]# dnf -y install docker-compose-plugin
    
    
    # 创建目录,目录就是项目名称
    [root@docker ~]# mkdir web
    # 定义项目文件
    [root@docker ~]# vim web/docker-compose.yaml
    name: websvc
    version: "3"
    services:
      websvc:
        container_name: nginx
        image: myos:nginx
  • 容器项目管理
  • # 创建项目,并启动
    [root@docker ~]# docker compose -f web/docker-compose.yaml up -d
    [+] Running 2/2
     ⠿ Network web_default  Created      0.0s
     ⠿ Container nginx      Started      0.3s
    
    # 查看项目
    [root@docker ~]# docker compose ls
    NAME           STATUS          CONFIG FILES
    web            running(1)      /root/web/docker-compose.yaml
    
    # 查看项目中的容器状态
    [root@docker ~]# docker compose -p web ps
    NAME      COMMAND                 SERVICE    STATUS      PORTS
    nginx     "nginx -g 'daemon of…"  websvc     running     80/tcp
    
    # 启动、停止、重启项目
    [root@docker ~]# docker compose -p web stop
    [+] Running 1/1
     ⠿ Container nginx  Stopped         0.1s
    [root@docker ~]# docker compose -p web start
    [+] Running 1/1
     ⠿ Container nginx  Started         0.2s
    [root@docker web]# docker compose -p web restart
    [+] Running 1/1
     ⠿ Container nginx  Started         0.3s
     
    # 查看项目中容器的日志
    [root@docker ~]# docker inspect nginx |grep IPAddress
    [root@docker ~]# curl http://172.17.0.2/info.php
    <html>
    <head><title>404 Not Found</title></head>
    <body>
    <center><h1>404 Not Found</h1></center>
    <hr><center>nginx/1.22.1</center>
    </body>
    </html>
    [root@docker ~]# docker compose -p web logs
    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"
    
    # 删除项目
    [root@docker web]# docker compose -p web down
    [+] Running 2/2
     ⠿ Container nginx      Removed         0.1s
     ⠿ Network web_default  Removed         0.0s
  • compose语法

  • 指令	说明
    networks	配置容器连接的网络
    container_name	指定容器名称
    depends_on	解决容器的依赖、启动先后的问题
    command	覆盖容器启动后默认执行的命令
    environment	设置环境变量
    image	指定为镜像名称或镜像 ID
    network_mode	设置网络模式
    restart	容器保护策略[always、no、on-failure]
    ports	暴露端口信息
    volumes	数据卷,支持 [volume、bind、tmpfs、npipe]
    
    
    
    restart容器保护策略[always、no、on-failure]
    always:当容器退出时,Docker 将自动重新启动容器。无论容器是正常退出还是异常退出,都会自动重启。这通常用于保持容器一直运行,以确保服务的连续性。
    
    no:当容器退出时,Docker 不会自动重新启动容器。这意味着一旦容器退出,它将保持停止状态。这通常用于临时容器,例如批处理任务或一次性任务。
    
    on-failure:当容器异常退出时,Docker 将根据容器的退出状态重新启动容器。可以通过 --restart 参数指定重新启动的最大次数。如果连续重启次数达到最大次数后,容器将停止运行。这个选项通常用于遇到故障时自动恢复容器。
    Volume(数据卷):数据卷是 Docker 中持久化存储数据的最佳方式,它是在容器和宿主机之间创建了一个特殊的目录或文件。数据卷可以在容器之间共享和重用,并且对容器中的数据进行持久化存储。当容器被删除时,卷的数据仍然保留在宿主机上。数据卷在容器内的路径通常位于 /var/lib/docker/volumes/ 目录下。
    
    Bind (绑定挂载):绑定挂载是将宿主机的文件或目录直接挂载到容器中的指定路径上。这种方式可以在容器和宿主机之间实现文件共享,容器中的数据更改会直接反映在宿主机上,反之亦然。
    
    Tmpfs(临时文件系统):Tmpfs 是一种基于内存的文件系统,它将文件存储在 RAM 中,而不是硬盘上。Tmpfs 是一种临时性存储,当容器停止后,其中的数据将被清除。Tmpfs 在容器内的路径通常位于 /dev/shm 目录下。
    
    Npipe(命名管道):Npipe 是 Windows 平台专有的一种通信机制,它可以在不同的容器之间进行进程间通信。Npipe 通过创建一个命名管道(Named pipe)来实现容器之间的通信。

    容器服务编排

  • [root@docker ~]# vim web/docker-compose.yaml 
    name: websvc
    version: "3"
    services:
      nginxsvc:
        container_name: nginx
        image: myos:nginx
        restart: always
        volumes:
          - type: bind
            source: /var/webconf/nginx.conf
            target: /usr/local/nginx/conf/nginx.conf
          - type: bind
            source: /var/webroot
            target: /usr/local/nginx/html
        network_mode: bridge
        ports:
          - 80:80
        environment:
          - "TZ=Asia/Shanghai"
      phpsvc:
        container_name: php
        image: myos:php-fpm
        restart: always
        volumes:
          - type: bind
            source: /var/webroot
            target: /usr/local/nginx/html
        depends_on:
          - nginxsvc
        network_mode: "container:nginx"
      cache:
        container_name: cache
        image: myos:nginx
        restart: "no"
        network_mode: bridge
        volumes:
          - type: bind
            source: /var/webroot
            target: /webroot
        command: ["sh","-c","rm -f  /webroot/cache/*"]
    
    验证项目
    # 创建,并启动项目
    [root@docker ~]# docker compose -f web/docker-compose.yaml up -d
    [+] Running 2/2
     ⠿ Container nginx    Started             0.3s
     ⠿ Container php-fpm  Started             0.3s
    
    # 查看项目
    [root@docker ~]# docker compose ls
    NAME           STATUS        CONFIG FILES
    web            running(2)    /root/websvc/docker-compose.yaml
    
    # 查看容器状态,验证服务
    [root@docker ~]# docker compose -p web ps 
    NAME           COMMAND                    SERVICE    STATUS
    nginx          "nginx -g 'daemon of..."   nginx      running    ......
    php-fpm        "php-fpm --nodaemoni..."   php-fpm    running    ......
    
    # 访问 php 页面验证
    [root@docker ~]# curl -s http://127.0.0.1/info.php
    <pre>
    Array
    (
        [REMOTE_ADDR] => 172.17.0.1
        [REQUEST_METHOD] => GET
        [HTTP_USER_AGENT] => curl/7.61.1
        [REQUEST_URI] => /info.php
    )
    php_host:   7e037978c775
    1229

     

     

     

     

     

harbor仓库

安装部署

安装部署docker

[root@harbor ~]# vim /etc/hosts
192.168.1.30    harbor
# 安装部署 docker 及 compose 组件
[root@harbor ~]# dnf install -y docker-ce docker-compose-plugin
[root@harbor ~]# mkdir -p /etc/docker
[root@harbor ~]# vim /etc/docker/daemon.json
{
    "registry-mirrors": ["https://harbor:443"],
    "insecure-registries":["harbor:443"]
}
[root@harbor ~]# systemctl enable --now docker
  • 拷贝 public/harbor-v2.7.0.tgz 到 harbor 主机
    rsync -av public/harbor-v2.7.0.tgz 192.168.1.30:./

 创建https证书

# 导入 harbor 项目镜像
[root@harbor ~]# tar -zxf harbor-v2.7.0.tgz -C /usr/local/
[root@harbor ~]# cd /usr/local/harbor
[root@harbor harbor]# docker load -i harbor.v2.7.0.tar.gz
# 创建 https 证书
[root@harbor harbor]# mkdir tls
[root@harbor harbor]# openssl genrsa -out tls/cert.key 2048
[root@harbor harbor]# openssl req -new -x509 -days 3650 \
                         -key tls/cert.key -out tls/cert.crt \
                         -subj "/C=CN/ST=BJ/L=BJ/O=Tedu/OU=NSD/CN=harbor"
启动harbor项目
# 修改配置文件
[root@harbor harbor]# cp harbor.yml.tmpl harbor.yml
[root@harbor harbor]# vim harbor.yml
05:    hostname: harbor
08:    # http:
10:      # port: 80
17:    certificate: /usr/local/harbor/tls/cert.crt
18:    private_key: /usr/local/harbor/tls/cert.key
34:    harbor_admin_password: admin123

# 预安装环境检查,生成项目文件
[root@harbor harbor]# /usr/local/harbor/prepare
# 创建并启动项目
[root@harbor harbor]# docker compose -f docker-compose.yml up -d
# 添加开机自启动
[root@harbor harbor]# chmod 0755 /etc/rc.d/rc.local
[root@harbor harbor]# echo "/usr/bin/docker compose -p harbor start" >>/etc/rc.d/rc.local
  • 查看验证项目
  • # 查看项目
    [root@harbor harbor]# docker compose ls
    NAME                STATUS              CONFIG FILES
    harbor              running(9)          /usr/local/harbor/docker-compose.yml
    # 查看容器状态
    [root@harbor harbor]# docker compose -p harbor ps
    NAME                COMMAND                  SERVICE             STATUS
    harbor-core         "/harbor/entrypoint.…"   core                running (healthy)
    harbor-db           "/docker-entrypoint.…"   postgresql          running (healthy)
    harbor-jobservice   "/harbor/entrypoint.…"   jobservice          running (healthy)
    harbor-log          "/bin/sh -c /usr/loc…"   log                 running (healthy)
    harbor-portal       "nginx -g 'daemon of…"   portal              running (healthy)
    nginx               "nginx -g 'daemon of…"   proxy               running (healthy)
    redis               "redis-server /etc/r…"   redis               running (healthy)
    registry            "/home/harbor/entryp…"   registry            running (healthy)
    registryctl         "/home/harbor/start.…"   registryctl         running (healthy)
  • 通过 ELB 发布 harbor 服务,通过浏览器配置管理

harbor管理

容器管理命令	说明
docker login	登录私有镜像仓库
docker logout	退出登录
登录私有仓库
# 添加主机配置
[root@docker ~]# vim /etc/hosts
192.168.1.30    harbor
192.168.1.35    registry
# 添加私有仓库配置
[root@docker ~]# vim /etc/docker/daemon.json
{
    "registry-mirrors": ["https://harbor:443", "http://registry:5000", "镜像加速器地址"],
    "insecure-registries":["harbor:443", "registry:5000"]
}
[root@docker ~]# systemctl restart docker

# 登录 harbor 仓库
[root@docker ~]# docker login harbor:443
Username: luck
Password: ********
... ...
Login Succeeded
# 认证信息记录文件
[root@docker ~]# cat /root/.docker/config.json 
{
    "auths": {
        "harbor:443": {
            "auth": "bHVjazoqKioqKioqKg=="
        }
    }
}
# 退出登录
[root@docker ~]# docker logout harbor:443
Removing login credentials for harbor:443
上传镜像
# 设置标签
[root@docker ~]# docker tag rockylinux:8.5 harbor:443/myimg/rockylinux:8.5
# 没有登录上传失败
[root@docker ~]# docker push harbor:443/myimg/rockylinux:8.5
65dbea0a4b39: Preparing 
unauthorized: unauthorized to access repository ......

# 登录成功后才可以上传
[root@docker ~]# docker login harbor:443
Username: luck
Password: ********

Login Succeeded
# 上传成功
[root@docker ~]# docker push harbor:443/myimg/rockylinux:8.5 
The push refers to repository [harbor:443/myimg/rockylinux]
......

# 设置标签
[root@docker ~]# docker tag myos:latest harbor:443/library/myos:latest
# 上传镜像到 library 项目,没有权限上传失败
[root@docker ~]# docker push harbor:443/library/myos:latest
The push refers to repository [harbor:443/library/myos]
65dbea0a4b39: Preparing 
unauthorized: unauthorized to access repository: 
......

# 赋权后重新上传镜像
[root@docker ~]# docker push harbor:443/library/myos:latest
The push refers to repository [harbor:443/library/myos]
......
  • 案例六:上传镜像到 library 项目
  • [root@docker ~]# docker tag myos:httpd harbor:443/myimg/httpd:latest
    [root@docker ~]# docker push harbor:443/myimg/httpd:latest
    [root@docker ~]# docker rmi harbor:443/myimg/httpd:latest
    [root@docker ~]# for i in 8.5 httpd nginx php-fpm latest;do
        docker tag myos:${i} harbor:443/library/myos:${i}
        docker push harbor:443/library/myos:${i}
        docker rmi myos:${i} harbor:443/library/myos:${i}
    done

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值