小阿轩yx-Docker Compose与私有仓库部署

小阿轩yx-Docker Compose 与私有仓库部署

Docker 的网络模式

Docker 四种网络模式

|--------------|----------------|-----------------------------------------------------------------------------|
| 网络模式 | 参数 | 说明 |
| host 模式 | - - net=host | 容器和宿主机共享 Network namespace |
| container 模式 | - - net={id} | 容器和另外一个容器共享 Network namespace。 kubernetes 中的pod就是多个容器共享一个 Network namespace |
| none 模式 | - - net=none | 容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配 veth pair 和网桥连接,配置IP等 |
| bridge 模式 | - - net=bridge | 默认为该模式,通过 -p 指定端口映射 |

Bridge 模式

  • 是 docker 的默认网络模式
  • 不写-net参数,就是 bridge 模式

bridge 模式图

Host 模式

  • 容器不会获得一个独立的 Network Namespace,是和宿主机共用一个 Network Namespace
  • 容器不会虚拟出自己的网卡、配置自己的 IP 等,使用宿主机的 IP 和端口
  • 容器的文件系统、进程列表等和宿主机是隔离的

Host 模式图

Container 模式

  • 指定新创建的容器和已经存在的容器共享一个 Network Namespace,不和宿主机共享
  • 不会创建自己网卡、配置自己的 IP ,是和指定的容器共享 IP、端口范围
  • 除了网络方面,文件系统、进程列表还是隔离的

Container 模式图

None 模式

  • 容器拥有自己的 Network Namespace,但是不为 Docker 容器进行网络配置
  • 容器没有网卡、IP、路由等信息,需要手动设置

None 模式图

Docker 重启策略

  • 面向生产环境的一个启动策略,在开发过程中可以忽略该策略
  • 都是由 Docker 守护进程完成的,因此与守护进程息息相关

no

  • 默认策略,在容器退出时不重启容器

on-failure

  • 在容器非正常退出时(退出状态非0),才会重启容器

on-failure:3

  • 指定启动的次数,在容器非正常退出时重启容器,最多重启3次

always

  • 在容器退出时总是重启容器

unless-stopped

  • 在容器退出时总是重启容器,但是不考虑在 Docker 守护进程启动时就已经停止了的容器

Docker 容器的常见退出状态码

|-----|--------------------|
| 状态码 | 说明 |
| 0 | 正常退出 |
| 125 | Docker 守护进程本身错误 |
| 126 | 容器启动后,要执行的默认命令无法调用 |
| 127 | 容器启动后,要执行的默认命令不存在 |
| 其他 | 容器启动后正常执行的命令返回的状态码 |

  • 通过状态码可以大概判断出容器的情况

Docker Compose 工具

什么是 Docker Compose

  • 前身是 Fig
  • 它是一个定义及运行多个 Docker 容器的工具

文件格式以及编写注意事项

YAML

  • 一种标记语言
  • 它可以很直观的展示数据序列化格式
  • 可读性高
  • 类似于 XML 数据描述语言,语法比 XML 简单的很多
  • 数据结构通过缩进来表示
  • 连续的项目通过减号来表示

使用 YAML 时需要注意事项

  • 不支持制表符 tab 键缩进、需要使用空格缩进
  • 通常开头缩进两个空格
  • 字符后缩进一个空格,如冒号、逗号、横杆
  • 用#号注释
  • 如果包含特殊字符,要使用单引号('')引起来
  • 布尔值(true、false、yes、no、on、off)必须用引号("")括起来,这样分析器会将它们截石位字符串

常用字段

常用命令

Harbor 私有仓库

什么是 Harbor

  • 是 VMWare 公司开源的企业级 Docker Registry 项目
  • 扩展了开源 Docker Distribution
  • 是一个企业级私有 Registry 服务器

目标

  • 帮助用户迅速搭建一个企业级的 Docker Registry 服务

它以 Docker 公司开源的 Registry 为基础, 提供企业用户需求的功能

  • 管理 UI
  • 基于角色的访问控制(Role Based AccessControl)
  • AD/LDAP 集成
  • 审计日志(Auditlogging)

特点

  • 更好的性能和安全
  • 提升用户使用 Registry 构建和运行环境传输镜像的效率

Harbor 的优势

基于角色控制

  • 用户和仓库都是基于项目进行组织的,而用户在项目中可以拥有不同的权限

基于镜像的复制策略

  • 镜像可以在多个 Harbor 实例之间进行复制(同步),适用于负载平衡、高可用性、多数据中心、多混合多云场景

支持 LDAP/AD

  • Harbor 与现有的企业 LDAP/AD 集成,用于用户认证和管理

删除图像和收集垃圾

  • 镜像可以被删除,也可以回收镜像占用空间

图形 UI

  • 用户可以轻松浏览、搜索镜像仓库对项目进行管理

审计

  • 对存储库的所有操作都进行记录

RESTful API

  • 用户大多数管理操作的 RESTful API,易于与外部系统集成

Harbor 的构成

Harbor 架构上主要有五个组件

  • Proxy
  • Core services
  • Database(Harbor-db)
  • Logcollector(Harbor-log)
Proxy
  • Harbor 的 Registry、UI、Token 等服务通过一个前置的反向代理统一接收浏览器和 Docker 客户端的请求,并将请求转发给后端不同的服务
Registry
  • 负责储存 Docker 镜像,并处理 Docker push/pul 命令。
  • 由于要对用户进行访问控制,即不同用户对 Dockerimage 有不同的读写权限,Registry 会指向一个 Token 服务,强制用户的每次 Docker pull/push 请求都要携带一个合法的 Token,Registry 会通过公钥对Token 进行解密验证。
Core services
  • 这是 Harbor 的核心功能

主要提供的服务

Ul(Harbor-ui)

  • 提供图形化界面,帮助用户管理 Registry 上的镜像(image),并对 用户进行授权。

Webhook

  • 为了及时获取Registry上image 状态变化的情况,在 Registry上 配 置 Webhook, 把状态变化传递给 UI 模块。

Token 服务

  • 负责根据用户权限给每个 Dockerpush/pul 命令签发 Token。Docker 客 户端向 Registry 服务发起的请求,如果不包含 Token,会被重定向,获得 Token 后再 重新向Registry 进行请求
Database(Harbor-db)
  • 为 coreservices 提供数据库服务,负责存储用户权限、审计日志、Docker image 分组信息等数据
Log collector(Harbor-log)
  • 为了帮助监控 Harbor 运行,负责收集其它组件的 log,供日后进行分析
  • Harbor 的每个组件都是以 Docker 容器的形似构建的,因此,使用 Docker Compose 来对它进行部署

部署 Harbor 私有仓库

资源列表

|---------------|---------------|------|----------------|
| 操作系统 | 主机名 | 配置 | IP |
| CentOS7.9-101 | harbor、client | 2C4G | 192.168.10.101 |
| CentOS7.9-106 | harbor | 2C4G | 192.168.10.106 |

使用 Compose 基本上分为三步

  • Dockerfile 定义应用的运行环境
  • docker-compose.yml 定义组成应用的各服务
  • docker-compose up 启动整个应用

基础环境

  • 两个节点都要操作
  • 更改使用最新本v2.29.1的 docker-compose

提升权限

复制代码
[root@localhost ~]# chmod +x docker-compose

查看版本

复制代码
[root@localhost ~]# docker-compose -version
docker compose version v2.29.1

将 images 镜像包通过 Xftp 上传至虚拟机

进入 images 目录

复制代码
[root@localhost ~]# cd images/

执行导入的脚本文件

复制代码
[root@localhost images]# bash imp_docker_img.sh

退出目录并查看镜像

复制代码
[root@localhost images]# cd
[root@localhost ~]# docker images
REPOSITORY                TAG            IMAGE ID            CREATED
mysql                     latest         99afc808f15b        12 month
cirrors                   latest         2008a6682996        15 month
httpd                     latest         daablfa13f86        17 month
nginx                     latest         904b8cb13b93        17 month
centos                    7              eebbee3f44bd        2 years
gliderlabs/registrator    latest         3b59190c6c80        8 years

Docker Compose 文件结构

编写编排文件

compose 默认的模版文件名字为 docker-compose.yaml

复制代码
[root@localhost ~]# vim docker-compose.yaml
services:
  webapp:
    image: 'httpd:latest'
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - "/var/www/html:/usr/local/apache2/htdocs:rw"
  • httpd 的容器中网站的根目录在:/usr/local/apache2/htdocs
  • Compose 文件格式有3个版本:1.x、2.x、3.x,目前主流的为 3.x,其支持 docker 1.13.0 及其以上版本

Docker Compose 常用命令

执行文件,生成容器

复制代码
[root@localhost ~]# docker-compose up -d
[+] Running 2/2
√ Network root_default    Created            0.1s
√ Network root_webapp-1    Started           0.6s
  • 不加选项-d会在前台运行,结束该进程,这个容器就关闭了,加上-d后可以让容器在后台持续运行

列出当前运行的容器

复制代码
[root@localhost ~]# docker-compose ps
    Name            Command        State         Ports       
-------------------------------------------------------------
root_webapp_1   httpd-foreground   Up      0.0.0.0:80->80/tcp

进入 html 目录

复制代码
[root@localhost ~]# cd /var/www/html/

创建一个测试页面

复制代码
[root@localhost html]# echo test>index.html

用浏览器访问

  • 192.168.10.101

退出到家目录并查看服务日志

复制代码
[root@localhost html]# cd
[root@localhost ~]# docker-compose logs webapp

port:打印绑定的公共端口,下面命令可以输出httpd服务80端口和443端口所绑定的公共端口

复制代码
[root@localhost ~]# docker-compose port webapp 80
0.0.0.0:80

[root@localhost ~]# docker-compose port webapp 443
0.0.0.0:443

停止正在运行的服务器

复制代码
[root@localhost ~]# docker-compose stop webapp
[+] Stopping 1/1
√ Container root-webapp-1    Stopped            1.2s

启动存在的服务器

复制代码
[root@localhost ~]# docker-compose start webapp
[+] Running 1/1
√ Container root-webapp-1    Started            0.4s

重启存在的服务器

复制代码
[root@localhost ~]# docker-compose restart webapp
[+] Restarting 1/1
√ Container root-webapp-1    Started            1.6s

删除指定的容器

复制代码
[root@localhost ~]# docker-compose stop webapp
[root@localhost ~]# docker-compose rm webapp
? Going to remove root-webapp-1 Yes
[+] Remove 1/0
√ Container root-webapp-1 Removed            0.0s

kill:通过发送 SIGKILL 信号来杀死指定服务的容器

复制代码
[root@localhost ~]# docker-compose kill webapp

先注释掉文件中的端口

复制代码
[root@localhost httpd]# cat docker-compose.yml 

services:
  webapp:
    image: 'httpd:latest'
#    ports: 
#      - "9090:80"
#      - "443:443"
    volumes:
      - "/var/www/html:/usr/local/apache2/htdocs:rw"

杀死并删除所有的容器

复制代码
[root@localhost ~]# docker-compose kill webapp
[root@localhost ~]# docker-compose em webapp

给容器做副本

复制代码
[root@localhost ~]# docker-compose scale webapp=3
[+] Running 3/3
√ Container root-webapp-3 Started                0.4s
√ Container root-webapp-1 Started                0.4s
√ Container root-webapp-2 Started                0.4s

查看状态

复制代码
[root@localhost ~]# docker-compose ps
compose 案例

进入目录

复制代码
[root@localhost ~]# cd /opt

编写配置文件

复制代码
[root@localhost ~]# vim docker-compose.yaml
services:
  webapp:
    image: 'nginx'
    ports:
      - "80:80"
    volumes:
      - "/www/html:/www/html:rw"
      - "/opt/nginx/nginx.conf:/etc/nginx/nginx.conf"

创建配置文件

复制代码
[root@localhost ~]# mkdir /opt/nginx

进入目录

复制代码
[root@localhost ~]# cd nginx/

将 nginx 配置上传至服务器

修改 nginx 配置文件

复制代码
[root@localhost nginx]# vim nginx.conf
location / {
            //30行
            root   /www/html;
            index  index.html index.htm index.php;
        }

location ~ \.php$ {
            //40行
            root           /www/html;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            //43行
            fastcgi_param  SCRIPT_FILENAME  /www/html$fastcgi_script_name;
            include        fastcgi_params;
        }
//末尾删除
daemon off;

退出到 opt 目录

复制代码
[root@localhost nginx]# cd ..

执行文件,生成容器

复制代码
[root@localhost opt]# docker-compose up -d
[+] Running 2/2
√ Network opt_default        Created            0.1s
√ Container opt-webnginx-1   Started            0.4s

列出当前运行的容器

复制代码
[root@localhost ~]# docker-compose up
或
[root@localhost ~]# docker-compose ps

新开一个192.168.10.106主机

将 harbor-offline-installer-v2.4.3.tgz源码包通过Xftp上传至106服务器

解压源码包

复制代码
[root@localhost ~]# tar zxvf harbor-offline-installer-v2.4.3.tgz

进入目录并查看

复制代码
[root@localhost ~]# cd harbor
[root@localhost harbor]# ls
common.sh  harbor.v2.4.3.tar.gz  harbor.yml.tmpl  install.sh  LICENSE  prepare

配置harbor

将配置文件模板拷贝一份,并命名为harbor.yml,这是默认的配置文件名称

复制代码
[root@localhost harbor]# cp harbor.yml.tmpl harbor.yml

解压 harbor 包

复制代码
[root@localhost harbor]# tar zxvf harbor.v2.4.3.tar.gz
  • 其实也没必要解压(包很大,几百兆)

修改配置文件

复制代码
[root@localhost harbor]# vim harbor.yml
# 修改为当前所在节点的ip
# 第5行
hostname: 192.168.10.106

# 登录界面的密码
harbor_admin_password: pwd123

# 将https相关的配置给注释掉,这里为了简单只使用http,而且也可以在nginx那一层去做https
# https related config
#https:
  # https port for harbor, default is 443
#  port: 443
  # The path of cert and key files for nginx
#  certificate: /your/certificate/path
#  private_key: /your/private/key/path
  • 注释掉 https 相关的行

运行 Harbor 的安装脚本

复制代码
[root@localhost harbor]# ./install.sh

[Step 0]: checking if docker is installed ...

Note: docker version: 26.1.4

[Step 1]: checking docker-compose is installed ...

Note: docker-compose version: 2.29.1

[Step 2]: loading Harbor images ...
Loaded image: goharbor/prepare:v2.4.3
Loaded image: goharbor/harbor-jobservice:v2.4.3
Loaded image: goharbor/harbor-registryctl:v2.4.3
Loaded image: goharbor/registry-photon:v2.4.3
Loaded image: goharbor/harbor-core:v2.4.3
Loaded image: goharbor/notary-signer-photon:v2.4.3
Loaded image: goharbor/clair-photon:v2.4.3
Loaded image: goharbor/trivy-adapter-photon:v2.4.3
Loaded image: goharbor/harbor-log:v2.4.3
Loaded image: goharbor/nginx-photon:v2.4.3
Loaded image: goharbor/clair-adapter-photon:v2.4.3
Loaded image: goharbor/chartmuseum-photon:v2.4.3
Loaded image: goharbor/harbor-portal:v2.4.3
Loaded image: goharbor/harbor-db:v2.4.3
Loaded image: goharbor/redis-photon:v2.4.3
Loaded image: goharbor/notary-server-photon:v2.4.3

[Step 3]: preparing environment ...

[Step 4]: preparing harbor configs ...
prepare base dir is set to /usr/local/src/harbor
WARNING:root:WARNING: HTTP protocol is insecure. Harbor will deprecate http protocol in the future. Please make sure to upgrade to https
Generated configuration file: /config/log/logrotate.conf
Generated configuration file: /config/log/rsyslog_docker.conf
Generated configuration file: /config/nginx/nginx.conf
Generated configuration file: /config/core/env
Generated configuration file: /config/core/app.conf
Generated configuration file: /config/registry/config.yml
Generated configuration file: /config/registryctl/env
Generated configuration file: /config/registryctl/config.yml
Generated configuration file: /config/db/env
Generated configuration file: /config/jobservice/env
Generated configuration file: /config/jobservice/config.yml
Generated and saved secret to file: /data/secret/keys/secretkey
Successfully called func: create_root_cert
Generated configuration file: /compose_location/docker-compose.yml
Clean up the input dir

[Step 5]: starting Harbor ...
Creating network "harbor_harbor" with the default driver
Creating harbor-log ... done
Creating harbor-db     ... done
Creating harbor-portal ... done
Creating redis         ... done
Creating registryctl   ... done
Creating registry      ... done
Creating harbor-core   ... done
Creating harbor-jobservice ... done
Creating nginx             ... done
✔ ----Harbor has been installed and started successfully.----

查看状态

复制代码
[root@localhost harbor]# docker-compose ps
或
[root@localhost harbor]# docker images

安装完成,使用浏览器访问Harbor,正常情况下应能进入登录界面

  • 192.168.10.106

账号

  • admin

密码

  • Harbor12345

登录成功

添加项目

  • 到这一步106做一个快照

添加用户

添加项目成员

将 192.168.10.101 当作客户端

查看镜像

复制代码
[root@localhost ~]# docker images
REPOSITORY                TAG            IMAGE ID            CREATED
mysql                     latest         99afc808f15b        12 month
cirrors                   latest         2008a6682996        15 month
httpd                     latest         daablfa13f86        17 month
nginx                     latest         904b8cb13b93        17 month
centos                    7              eebbee3f44bd        2 years
gliderlabs/registrator    latest         3b59190c6c80        8 years

修改 cirrors 名字

复制代码
[root@localhost ~]# docker tag cirros 192.168.10.106/kubernetes/cirros:v1

查看镜像

复制代码
[root@localhost ~]# docker images
//改名字之后的镜像
192.168.10.106/kubernetes/cirros    v1    2008a6682996 15 months    ago    16.3MB

登录镜像仓库

复制代码
[root@localhost ~]# docker login 192.168.10.106
Username: zhangsan
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/configJson.
Configure a credential helper to remove this warning. Seehttps://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

上传镜像

复制代码
[root@localhost ~]# docker push 192.168.10.106/kubernetes/cirros:v1
The push refers to repository [192.168.10.106/kubernetes/cirros]
d8083b07a8e2: Pushed
b42b2edd1b7f: Pushed
032cc20cbfb2: Pushed
v1: digest:sha256:d573d48afdadelef2c5bba38681e8c8ce0794e985409e7d5c35a2c3653c547aa 
size: 943

用浏览器验证查看

拉取镜像复制命令

再新开一个192.168.10.102服务器恢复 docker 快照

将复制的命令粘贴在102上

复制代码
[root@localhost ~]# docker pull 192.168.10.106/kubernetes/cirros:v1
v1: Pulling from kubernetes/cirros
Digest:sha256:d573d48afdadelef2c5bba38681e8c8ce0794e985409e7d5c35a203653c547aa
Status: Downloaded newer image for 192.168.10.106/kubernetes/cirros:v
192.168.10.106/kubernetes/cirros:v1

查看镜像

复制代码
[root@localhost ~]# docker images
REPOSITORY                            TAG        IMAGE ID            CREATED        SIZE
192.168.10.106/kubernetes/cirros      v1         2008a668299615      months ago     16.3MB

小阿轩yx-Docker Compose 与私有仓库部署

相关推荐
且从容.16 分钟前
ubuntu安装flink
linux·ubuntu·flink
爱和冰阔落2 小时前
【Linux网络】TCP 服务器如何并发处理多个客户端?从 fork、僵尸进程到双重 fork
linux·运维·服务器·网络
程序员沉梦听雨2 小时前
WSL2的安装与使用
linux·wsl
微小的鱼2 小时前
Linux的渲染与显示系统链路
android·java·linux
lisanmengmeng2 小时前
alertmanger 标签 rules 打上分组标签
linux·运维·服务器
Android系统攻城狮3 小时前
Linux FFmpeg深度解析之av_write_frame调用流程与实战(三十三)
linux·运维·服务器·ffmpeg·音视频进阶·ffmpeg音视频
孙克旭_3 小时前
k8s基础组件与创建资源
运维·docker·容器·kubernetes
Linux-lucky15 小时前
45-Linux学习之旅之防火墙与WEB加固
linux·前端·网络·学习·ubuntu
禁默15 小时前
启元 Q1 二次开发实践:Ubuntu 部署与仿真验证,从 PrimeConsole 到 ROS 2 Humble + RViz
linux·运维·ubuntu
skywalk816316 小时前
把 去也网站 从 Ubuntu 搬到 FreeBSD:一次 Service Jail + nginx 的部署实录
linux·运维·nginx·ubuntu·freebsd