【运维知识大神篇】运维人必学的Docker教程6(Docker-Compose使用详解+Linux特性管理+macvlan技术+consul实现大规模跨主机通信overlay+私有仓库harbor)

本篇文章继续给大家介绍Docker的有关内容,包括docker启动特权容器及利用特权修改内核参数,Attach和Exec区别,Docker-compose使用详解,Linux特性管理,macvlan技术实现docker跨主机通信,使用consul工具实现大规模跨主机通信overlay(基于vxlan实现),Docker相关参数说明,测试使用的Docker私有仓库docker-registry和企业级docker仓库harbor。

目录

特权容器

Attach和Exec区别

一、使用案例

二、进程展示

Docker-Compose详解

一、compose基础参数使用

二、docker-compose部署zabbix

1、官方提供的compose

2、自己精简的compose

Linux特性管理

macvlan技术实现docker跨主机通信

一、使用示例

二、macvlan优缺点

1、优点

2、缺点

3、解决ping不通外网

大规模跨主机通信Overlay(基于vxlan实现)

daemon.json相关参数说明

Docker私有仓库

一、docker-registry

1、docker-registry部署

二、harbor(企业级)

1、自动部署harbor脚本


特权容器

在启动容器的时候可以指定称为特权容器,给予容器更高的权限和控制权力,使用特权容器可以允许某些任务需要更高的权限或者需要直接访问主机资源时使用。但是由于特权容器可以绕过Docker的安全性保护机制,因此需要谨慎使用,并避免将敏感数据暴露给特权容器。

#启动centos容器
[root@Docker01 ~]# docker run --privileged -id centos:7 tailf /etc/hosts
de5875cf7c9f98af181c672ddb222477d47ab1022329cdfbcc2f5cee76e695df
[root@Docker01 ~]# docker ps
CONTAINER ID   IMAGE      COMMAND              CREATED         STATUS         PORTS     NAMES
de5875cf7c9f   centos:7   "tailf /etc/hosts"   7 seconds ago   Up 6 seconds             competent_ishizaka

#进入容器修改端口转发,由于是特权容器,所以可以修改
[root@Docker01 ~]# docker exec -it competent_ishizaka bash
[root@de5875cf7c9f /]# sysctl -w net.ipv4.ip_forward=0    #临时关闭端口转发
net.ipv4.ip_forward = 0
[root@de5875cf7c9f /]# sysctl -q net.ipv4.ip_forward      #查看端口是否转发
net.ipv4.ip_forward = 0
[root@de5875cf7c9f /]# sysctl -w net.ipv4.ip_forward=1    #临时开启端口转发
net.ipv4.ip_forward = 1
[root@de5875cf7c9f /]# cat /etc/sysctl.d/docker.conf
net.ipv4.ip_forward = 1                                   #永久开启端口转发
[root@de5875cf7c9f /]# sysctl -q net.ipv4.ip_forward
net.ipv4.ip_forward = 1

Attach和Exec区别

Attach是将宿主机的stdin,stdout,stderr到指定的容器,并不会产生新的进程

Exec是在一个正在运行的容器中执行新的程序

一、使用案例

[root@Docker01 ~]# docker run --name c1 -itd alpine
699177e172ea5423c4e424ca79f1d8fd2079ab8da215786ebd61c727f0b2a687
[root@Docker01 ~]# docker attach c1
/ # pwd
/
/ # ls /
bin    home   mnt    root   srv    usr
dev    lib    opt    run    sys    var
etc    media  proc   sbin   tmp
/ # read escape sequence    #使用ctrl+p ctrl+q  可以不中断当前容器,让容器继续后台运行

[root@Docker01 ~]# docker attach c1
/ # exit    #表示退出并停止当前的容器
[root@Docker01 ~]# docker ps
CONTAINER ID   IMAGE      COMMAND              CREATED          STATUS          PORTS     NAMES

[root@Docker01 ~]# docker run --name c2 -itd alpine tail -f /etc/hosts
645b6dd465fac07e8913fed6192e512c6153e933dcb8cb20b200831628eebcfb
[root@Docker01 ~]# docker attach c2    #如果在启动容器的时候后面不小心跟了夯住的指令,会既不显示也无法退出,此时只能通过进程杀掉
ls
exit

[root@Docker01 ~]# ps -axu|grep attach|grep -v grep
root      29543  0.0  0.3 751768 15704 pts/3    Sl+  21:40   0:00 docker attach c2
[root@Docker01 ~]# kill -9 29543

二、进程展示

[root@Docker01 ~]# docker run --name c1 -itd alpine
f66a48d02e2d95b5eaa1dde81623eb1fda8a949ae69fe2cae2dcfeb44ca49df0
[root@Docker01 ~]# docker attach c1
/ # ps -ef
PID   USER     TIME  COMMAND
    1 root      0:00 /bin/sh
    7 root      0:00 ps -ef
/ # exit
[root@Docker01 ~]# docker exec -it c1 sh
/ # ps -ef
PID   USER     TIME  COMMAND
    1 root      0:00 /bin/sh
   13 root      0:00 sh            #发现exec比attahc实际多一个进程
   19 root      0:00 ps -ef
/ # read escape sequence

Docker-Compose详解

Docker-compose是单机编排工具,有点类似于ansible,同样使用yaml文件格式编写,通过它可以实现多容器的快速启动,包括镜像的拉取等等操作,它都是并行,我们也可以使用shell脚本去启动,但是那是串行。compose相当于是在dockerfile的基础上又多了一层把不同的容器定义成不同的服务,一个yaml文件可以定义多个服务,一个服务对应一个容器,并描述这些容器之间的关系和配置信息。

相比于使用单独的 Dockerfile 来构建 Docker 镜像,使用 Docker Compose 则可以同时管理多个容器,并且可以跨容器进行网络连接和数据卷挂载等操作,就不用我们到时候一个一个的写build.sh了,也不用考虑要先自定义存储卷和自定义网段了。

一、compose基础参数使用

编写yaml文件

[root@Docker01 ~]# cat docker-compose.yml
# docker-compose版本号
version: "3.9"

# docker-compose启动的服务
services:
  # 服务的名称,可以自定义
  service1:
    # 指定镜像
    image: game:v0.1
    # 指定编译的相关参数
    build:
      # 指定工作目录
      context: .
      # 指定dockerfile文件名称
      dockerfile: game1.dockerfile

  service2:
    image: game:v0.2
    build:
      context: .
      dockerfile: game2.dockerfile

  service3:
    image: game:v0.3
    build:
      context: .
      dockerfile: game3.dockerfile

运行方式 

[root@Docker01 ~]# docker-compose up -d                   #创建容器并放在后台启动
[root@Docker01 ~]# docker-compose down                    #停止并删除容器
[root@Docker01 ~]# docker-compose -f 1.yaml down          #使用-f选项指定docker-compose文件,若不指定默认为docker-compose.yaml
[root@Docker01 ~]# docker-compose -f 1.yaml -p game up -d #-p选项指定项目名称,若不指定默认为当前目录名称
[root@Docker01 ~]# docker-compose -f 1.yaml -p game ps    #显示当前启动的服务,镜像,命令,状态,端口
[root@Docker01 ~]# docker-compose build game1             #编译指定的镜像
[root@Docker01 ~]# docker-compose build                   #编译所有的镜像
[root@Docker01 ~]# docker-compose build --no-cache        #不使用缓存编译所有的镜像
[root@Docker01 ~]# docker-compose push                    #推送镜像至私有仓库

二、docker-compose部署zabbix

一些常用软件也会采取docker-compose的方式部署,实现真正的秒级部署,一键部署

1、官方提供的compose

1、安装git工具

[root@Docker01 ~]# yum -y install git

2、拉取代码

[root@Docker01 ~]# git clone https://github.com/zabbix/zabbix-docker.git

3、部署zabbix

[root@Docker01 ~]# ll -d zabbix-docker/
drwxr-xr-x 6 root root 4096 Jun 12 22:11 zabbix-docker/
[root@Docker01 ~]# cd zabbix-docker/
[root@Docker01 zabbix-docker]# docker-compose -f ./docker-compose_v3_alpine_mysql_latest.yaml up -d

4、展示zabbix的web界面,注意,由于docker-compose部署的过快,所以需要等待一会儿数据库进行初始化

【运维知识大神篇】运维人必学的Docker教程6(Docker-Compose使用详解+Linux特性管理+macvlan技术+consul实现大规模跨主机通信overlay+私有仓库harbor)_第1张图片

【运维知识大神篇】运维人必学的Docker教程6(Docker-Compose使用详解+Linux特性管理+macvlan技术+consul实现大规模跨主机通信overlay+私有仓库harbor)_第2张图片

2、自己精简的compose

官方的compose比较臃肿,我做了如下精简,可以正常使用

version: '3.3'

services:
   mysql-server:
     image: mysql:8.0
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: root_pwd
       MYSQL_DATABASE: zabbix
       MYSQL_USER: zabbix
       MYSQL_PASSWORD: zabbix_pwd
     networks:
       - zabbix-net
     command: ["--character-set-server=utf8", "--collation-server=utf8_bin", "--default-authentication-plugin=mysql_native_password"]
     
   zabbix-java-gateway:
     image: zabbix/zabbix-java-gateway:alpine-5.4-latest
     restart: always
     networks:
       - zabbix-net
     
   zabbix-server:
     depends_on:
       - mysql-server
     image: zabbix/zabbix-server-mysql:alpine-5.4-latest
     restart: always
     environment:
       DB_SERVER_HOST: mysql-server
       MYSQL_DATABASE: zabbix
       MYSQL_USER: zabbix
       MYSQL_PASSWORD: zabbix_pwd
       MYSQL_ROOT_PASSWORD: root_pwd
       ZBX_JAVAGATEWAY: zabbix-java-gateway
     networks:
       - zabbix-net
     ports:
       - "10051:10051"
       
   zabbix-web-nginx-mysql:
     depends_on:
       - zabbix-server
     image: zabbix/zabbix-web-nginx-mysql:alpine-5.4-latest
     ports:
       - "80:8080"
     restart: always
     environment:
       DB_SERVER_HOST: mysql-server
       MYSQL_DATABASE: zabbix
       MYSQL_USER: zabbix
       MYSQL_PASSWORD: zabbix_pwd
       MYSQL_ROOT_PASSWORD: root_pwd
     networks:
       - zabbix-net

networks:
    zabbix-net:
       # name: oldboyedu-zabbix  # 官方是3.5版本才支持的.但yum安装的话是1.18.0的docker-compose,最高支持3.3版本哟~
       ipam:
         driver: default
         config:
           - subnet: 172.30.100.0/24
             # gateway: 172.30.100.254  # 对于gateway参数目前仅有"version 2"才支持

Linux特性管理

Linux内核特性查询参考链接:https://man7.org/linux/man-pages/man7/capabilities.7.html
Docker内核特性文档参考链接:https://docs.docker.com/compose/compose-file/compose-file-v3/#cap_add-cap_drop

我们先编写dockerfile,在centos中安装iptables防火墙和net-tools网络管理工具包

FROM centos:7

RUN sed -e 's|^mirrorlist=|#mirrorlist=|g' \
         -e 's|^#baseurl=http://mirror.centos.org|baseurl=https://mirrors.tuna.tsinghua.edu.cn|g' \
         -i.bak \
         /etc/yum.repos.d/CentOS-*.repo

RUN yum -y install iptables net-tools && rm -rf /var/cache/yum

CMD ["tail","-f","/etc/hosts"]

我们可以通过compose的编写去进行配置容器的Linux内核特性

[root@Docker01 wordpress]# cat 1.yaml
version: "3.9"

services:
  linux:
    image: centos:7
    build:
      context:.
      dockerfile: Dockerfile
    # 配置特权容器
    # privileged: true
    # 添加Linux内核特性,cap_add的优先级要大于cap_drop,所以两个同时开启会添加内核特性,但是如果cap_add开启,禁止了个别的内核特性,就会禁止
    # cap_add:
    # - ALL
    # # 删除Linux内核特性
    # cap_drop:
    # - ALL
    #
    # 建议配置黑名单
    cap_add:            
    - ALL
    cap_drop:    
    # 代表禁用网络管理的配置
    - NET_ADMIN
    # 代表禁用chown命令
    - CHOWN
    # 代表禁用chroot命令
    - SYS_CHROOT

macvlan技术实现docker跨主机通信

跨主机通信技术主要有macvlan,overlay,flannel,calico,后两个是使用etcd作为数据库存储,写文章写到K8s的时候我会再介绍下,今天主要讲解macvlan,overlay

一、使用示例

1、判断Linux内核是否支持macvlan模块

modprobe macvlan是一个Linux内核模块,用于创建macvlan网络接口。macvlan接口可以作为虚拟网卡,将数据包从原始物理接口复制到macvlan接口上,并通过这个接口发送和接收数据包。

使用modprobe macvlan命令加载macvlan模块后,可以使用ip命令创建macvlan接口,并配置相关参数。

[root@Docker01 ~]# lsmod | grep macvlan
[root@Docker01 ~]# modprobe macvlan
[root@Docker01 ~]# lsmod | grep macvlan
macvlan                19239  0 

2、 两个节点创建同网段的自定义网络类型

[root@Docker01 ~]# docker network create -d macvlan --subnet 172.29.0.0/16 --gateway 172.29.0.254 -o parent=ens33 koten-macvlan
[root@Docker02 ~]# docker network create -d macvlan --subnet 172.29.0.0/16 --gateway 172.29.0.254 -o parent=ens33 koten-macvlan

3、10.0.0.201节点基于自定义网络启动容器,并手动分配IP地址

[root@Docker01 ~]# docker container run --rm -it --name c1 --network koten-macvlan --ip 172.29.0.201 alpine 
/ # ifconfig|grep 201
          inet addr:172.29.0.201  Bcast:172.29.255.255  Mask:255.255.0.0

4、10.0.0.202节点基于自定义网络启动容器,并手动分配IP地址

[root@Docker02 ~]# docker container run --rm -it --name c2 --network koten-macvlan --ip 172.29.0.202 alpine 
/ # ifconfig|grep 202
          inet addr:172.29.0.202  Bcast:172.29.255.255  Mask:255.255.0.0

5、测试相互ping通

[root@Docker01 ~]# 
/ # ping 172.29.0.202
PING 172.29.0.202 (172.29.0.202): 56 data bytes
64 bytes from 172.29.0.202: seq=0 ttl=64 time=1.259 ms

[root@Docker02 ~]# 
/ # ping 172.29.0.201
PING 172.29.0.201 (172.29.0.201): 56 data bytes
64 bytes from 172.29.0.201: seq=0 ttl=64 time=0.391 ms

6、测试容器内ping宿主机和外网,无法ping通

/ # ping 10.0.0.201
PING 10.0.0.201 (10.0.0.201): 56 data bytes
^C
--- 10.0.0.201 ping statistics ---
3 packets transmitted, 0 packets received, 100% packet loss
/ # ping baidu.com
^C
/ # ping 39.156.66.10
PING 39.156.66.10 (39.156.66.10): 56 data bytes
^C
--- 39.156.66.10 ping statistics ---
2 packets transmitted, 0 packets received, 100% packet loss
/ # 

二、macvlan优缺点

1、优点

1、docker原生支持,无需安装额外插件,配置起来相对简单
2、适合小规模docker环境,例如只有1-3台,如果服务器过多,手动分配IP地址可能会无形之间增加工作量

2、缺点

1、需要手动分配IP地址,如果让其自动分配IP地址可能会存在多个主机自动分配的IP地址冲突的情况,到时候还需要人工介入维护;
2、本机相同网络(上面案例为"koten_macvlan")的容器之间相互通信没问题,跨主机之间的容器进行通信也没问题,但容器无法与宿主机之间进行通信,也无法连接到外网

3、解决ping不通外网

如果非要使用macvlan,我们需要手动分配IP地址,无法联网的问题,只需要使用"docker network connect"重新分配一块网卡即可解决。

[root@Docker01 ~]# docker network connect bridge c1
/ # ping 10.0.0.201    #成功ping通宿主机
PING 10.0.0.201 (10.0.0.201): 56 data bytes
64 bytes from 10.0.0.201: seq=0 ttl=64 time=0.097 ms

/ # ping 39.156.66.10    #成功ping通外网
PING 39.156.66.10 (39.156.66.10): 56 data bytes
64 bytes from 39.156.66.10: seq=0 ttl=127 time=9.904 ms

大规模跨主机通信Overlay(基于vxlan实现)

Overlay的优势就是可以自动分配ip不会冲突,并且可以实现容器访问外网,适合集群部署。

Overlay网络是一种在物理网络之上创建逻辑网络的网络结构,通过节点之间的连接来提供高级别的服务。Overlay网络可用于各种应用程序,如点对点文件共享、在线游戏、视频流媒体等,可以支持大规模跨主机通信。

Consul是一个开源的服务发现和配置工具,它可以帮助分布式系统中的服务进行注册和发现,并提供了健康检查、故障转移、安全等功能。Consul还可以用作分布式锁和键值存储等场景,从而为大规模跨主机通信提供支持。

1、部署consul服务

注意网卡是ens33,还是eth0

[root@Docker01 ~]# docker run -d --network host --restart always --name=dev-consul -e CONSUL_BIND_INTERFACE=ens33 consul:1.13.8

2、docker客户端指定consul服务的地址

客户端对应的cluster-advertise值要根据实际情况调整

[root@Docker02 ~]# cat > /etc/docker/daemon.json <<'EOF'
{
  "registry-mirrors": ["https://tuv7rqqq.mirror.aliyuncs.com"],
   "cluster-store": "consul://10.0.0.201:8500",
   "cluster-advertise": "10.0.0.202:6666"
}
EOF
[root@Docker02 ~]# systemctl restart docker

[root@Docker03 ~]# cat > /etc/docker/daemon.json <<'EOF'
{
  "registry-mirrors": ["https://tuv7rqqq.mirror.aliyuncs.com"],
   "cluster-store": "consul://10.0.0.201:8500",
   "cluster-advertise": "10.0.0.203:7777"
}
EOF
[root@Docker03 ~]# systemctl restart docker

网页访问服务端的IP和端口就能看到consul的web界面

【运维知识大神篇】运维人必学的Docker教程6(Docker-Compose使用详解+Linux特性管理+macvlan技术+consul实现大规模跨主机通信overlay+私有仓库harbor)_第3张图片

3、任何客户端节点创建网络,其他客户端都会通过consul来实时同步配置 

在centos202创建自定义网络,centos203也会显示

[root@Docker02 ~]# docker network create -d overlay --subnet 172.30.0.0/16 --gateway 172.30.0.254 koten-overlay
236db24d970099552f82da06a6f9bf06e4a8f1063ce6f1f3c6d77174c53b79e2
[root@Docker02 ~]# docker network ls | grep koten-overlay
236db24d9700   koten-overlay                    overlay   global

[root@Docker03 ~]# docker network ls | grep koten-overlay
236db24d9700   koten-overlay                    overlay   global

4、10.0.0.202节点基于自定义网络启动器

[root@Docker02 ~]# docker container run --rm -it --name c1 --network koten-overlay alpine 
/ # ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:AC:1E:00:01  
          inet addr:172.30.0.1  Bcast:172.30.255.255  Mask:255.255.0.0
......

5、10.0.0.203节点基于自定义网络启动容器

发现两边自动生成的IP地址,并且不冲突

[root@Docker03 ~]# docker container run --rm -it --name c2 --network koten-overlay alpine 
/ # ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:AC:1E:00:02  
          inet addr:172.30.0.2  Bcast:172.30.255.255  Mask:255.255.0.0
......

6、可以通过tcpdump抓包

只有容器中ping外网可以抓到数据包,但是ping另一个节点的容器IP是无法抓到,中间走的vxlan通道

[root@Docker02 ~]# docker container run --rm -it --name c1 --network koten-overlay alpine 
/ # ping baidu.com
PING baidu.com (110.242.68.66): 56 data bytes
64 bytes from 110.242.68.66: seq=0 ttl=127 time=11.295 ms

[root@Docker02 ~]# tcpdump -i docker_gwbridge -nn icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on docker_gwbridge, link-type EN10MB (Ethernet), capture size 262144 bytes
23:35:19.406201 IP 172.19.0.2 > 110.242.68.66: ICMP echo request, id 8, seq 0, length 64

daemon.json相关参数说明

在我们的/etc/docker/daemon.json中,常常会配置一些参数,对我们的docker服务进行管理

bip                     指定docker的网关地址
data-root               指定docker的数据存储目录。
insecure-registries     指定私有仓库。
storage-driver          指定存储驱动。
cluster-store           配置的是consul服务监听的地址。
cluster-advertise       指定的是docker的宿主机注册到consul中的指定网卡中的ip,也可以写ip和端口号,端口只要没被占用就可以了。

{
  "registry-mirrors": ["https://tuv7rqqq.mirror.aliyuncs.com","https://registry.docker-cn.com","https://mirror.ccs.tencentyun.com"],    #加速源
  "exec-opts": ["native.cgroupdriver=systemd"],  #使用systemd作为控制组的驱动程序
  "log-driver": "json-file",                     #日志以json格式输出
  "log-opts": {"max-size": "200m", "max-file": "5"}    #max-size指定了单个日志文件的最大大小为 200MB,当日志文件达到这个大小时,Docker将创建一个新的日志文件。max-file 指定了保留的最大日志文件数量为 5,超过这个数量后,旧的日志文件将被删除。
}

Docker私有仓库

私有仓库是不对外开发的镜像仓库,一般是公司内部使用的私有镜像仓库,类似于gitlab

由于官方的镜像仓库大家都可以访问,若都放在官方,大家都能拿到公司的自建镜像;另外官方的服务器在国外,访问速度很慢,甚至有时候官网都打不开。所以出于安全性和访问速度两方面的角度考虑一定要使用私有仓库。

一、docker-registry

docker registry,是一个轻量级的私有仓库,基本上不占内存,很适合学习测试使用,上传的镜像会进行压缩处理,没有提供较好的WebUI,维护起来比较麻烦,尤其是删除镜像。

1、docker-registry部署

1、Centos201进行服务端部署

[root@Docker01 ~]# docker run -d --network host --restart=always --name koten-registry -v /var/lib/registry registry

2、Centos202配置客户端参数

[root@Docker02 ~]# cat /etc/docker/daemon.json
{
  "registry-mirrors": ["https://tuv7rqqq.mirror.aliyuncs.com"],
   "cluster-store": "consul://10.0.0.201:8500",
   "cluster-advertise": "10.0.0.202:7777",
   "insecure-registries": ["10.0.0.201:5000","centos201:5000"]
}
[root@Docker02 ~]# systemctl restart docker

3、Centos上传镜像到docker-registries私有仓库

[root@Docker02 ~]# docker tag alpine:latest 10.0.0.201:5000/koten-alpine:v1 
[root@Docker02 ~]# docker push 10.0.0.201:5000/koten-alpine:v1
The push refers to repository [10.0.0.201:5000/koten-alpine]
8d3ac3489996: Pushed 
v1: digest: sha256:e7d88de73db3d3fd9b2d63aa7f447a10fd0220b7cbf39803c803f2af9ba256b3 size: 528

此时web端也可以看到我们私有仓库上传的镜像 

【运维知识大神篇】运维人必学的Docker教程6(Docker-Compose使用详解+Linux特性管理+macvlan技术+consul实现大规模跨主机通信overlay+私有仓库harbor)_第4张图片

4、Centos203下载私有仓库的镜像,同样需要先配置文件,不然可能显示地址被拒绝,hosts解析不到,https错误信息

[root@Docker03 ~]# cat /etc/docker/daemon.json
{
  "registry-mirrors": ["https://tuv7rqqq.mirror.aliyuncs.com"],
   "cluster-store": "consul://10.0.0.201:8500",
   "cluster-advertise": "10.0.0.203:7777",
   "insecure-registries": ["10.0.0.201:5000","centos201:5000"]
}
[root@Docker03 ~]# systemctl restart docker
#拉取镜像
[root@Docker03 ~]# docker pull 10.0.0.201:5000/koten-alpine:v1
v1: Pulling from koten-alpine
Digest: sha256:e7d88de73db3d3fd9b2d63aa7f447a10fd0220b7cbf39803c803f2af9ba256b3
Status: Downloaded newer image for 10.0.0.201:5000/koten-alpine:v1
10.0.0.201:5000/koten-alpine:v1
[root@Docker03 ~]# docker images|grep koten-alpine
10.0.0.201:5000/koten-alpine    v1                  c059bfaa849c   18 months ago   5.59MB

5、在Centos201服务端删除镜像数据

#删除源数据
[root@Docker01 ~]# docker exec koten-registry rm -rf /var/lib/registry/docker/registry/v2/repositories/koten-alpine
#回收数据(删除实际存放镜像的文件,内存占的更多)
[root@Docker01 ~]# docker exec koten-registry registry garbage-collect /etc/docker/registry/config.yml

0 blobs marked, 3 blobs and 0 manifests eligible for deletion
......

此时web端自然也看不到了 

二、harbor(企业级)

harbor是基于官方的docker registry"进行二次开发,是企业级镜像仓库。

GitHub官网地址:https://github.com/goharbor/harbor

1、下载harbor

[root@Docker01 ~]# wget https://github.com/goharbor/harbor/releases/download/v2.8.2/harbor-offline-installer-v2.8.2.tgz 

2、解压软件包

[root@Docker01 ~]# tar xf harbor-offline-installer-v2.8.2.tgz -C /koten/softwares/

3、修改配置文件

[root@Docker01 ~]# cd /koten/softwares/harbor/
[root@Docker01 harbor]# cp harbor.yml.tmpl harbor.yml
[root@Docker01 harbor]# cat harbor.yml
......
hostname: harbor.koten.com
......
#注释掉https的相关配置
#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
......
#设置管理员密码
harbor_admin_password: 1

4、安装harbor

可以看看它写的shell脚本,会给自己一些启发

[root@Docker01 harbor]# ./install.sh     #安装前关闭80端口
......
[+] Building 0.0s (0/0)                              
[+] Running 10/10
 ✔ Network harbor_harbor        Created         0.1s 
 ✔ Container harbor-log         Started         0.7s 
 ✔ Container harbor-db          Started         1.8s 
 ✔ Container harbor-portal      Started         1.8s 
 ✔ Container redis              Started         2.0s 
 ✔ Container registry           Started         1.9s 
 ✔ Container registryctl        Started         1.7s 
 ✔ Container harbor-core        Started         2.3s 
 ✔ Container harbor-jobservice  Started         3.1s 
 ✔ Container nginx              Started         3.1s 
✔ ----Harbor has been installed and started successfully.----

安装好后就可以看到web界面了 

【运维知识大神篇】运维人必学的Docker教程6(Docker-Compose使用详解+Linux特性管理+macvlan技术+consul实现大规模跨主机通信overlay+私有仓库harbor)_第5张图片

【运维知识大神篇】运维人必学的Docker教程6(Docker-Compose使用详解+Linux特性管理+macvlan技术+consul实现大规模跨主机通信overlay+私有仓库harbor)_第6张图片

5、linux端登录harbor

linux登录了harbor,才能在指定的私有仓库中拉取添加镜像

三种登录方式,推荐最后一种,更加安全

echo 1 | docker login -u admin --password-stdin harbor.koten.com
docker login -u admin -p 1 harbor.koten.com
docker login harbor.koten.com
[root@Docker02 ~]# docker login harbor.koten.com
Username: admin
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

6、linux端退出harbor

在企业中使用完后一定要退出,为了安全考虑

[root@Docker02 ~]# docker logout harbor.koten.com
Removing login credentials for harbor.koten.com

7、harbor使用方式

新建项目 

【运维知识大神篇】运维人必学的Docker教程6(Docker-Compose使用详解+Linux特性管理+macvlan技术+consul实现大规模跨主机通信overlay+私有仓库harbor)_第7张图片

复制推送命令 

【运维知识大神篇】运维人必学的Docker教程6(Docker-Compose使用详解+Linux特性管理+macvlan技术+consul实现大规模跨主机通信overlay+私有仓库harbor)_第8张图片

Centos202推送镜像到私有仓库

#添加hosts解析
[root@Docker02 ~]# cat /etc/hosts
......
10.0.0.201 harbor.koten.com

#修改配置文件,添加私有仓库的链接
[root@Docker02 ~]# cat /etc/docker/daemon.json
{
  "registry-mirrors": ["https://tuv7rqqq.mirror.aliyuncs.com"],
   "cluster-store": "consul://10.0.0.201:8500",
   "cluster-advertise": "10.0.0.202:7777",
   "insecure-registries": ["10.0.0.201:5000","centos201:5000","harbor.koten.com"]
}
[root@Docker02 ~]# systemctl restart docker

#登录harbor
[root@Docker02 ~]# docker login harbor.koten.com
Username: admin
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

#镜像名称与后面标签名称可以一致也可以不一致,推荐一致
[root@Docker02 harbor]# docker tag nginx:1.14.2 harbor.koten.com/koten-test/nginx:1.14.2
#推送镜像
[root@Docker02 ~]# docker push harbor.koten.com/koten-test/nginx:1.14.2
The push refers to repository [harbor.koten.com/koten-test/nginx]
82ae01d5004e: Pushed 
b8f18c3b860b: Pushed 
5dacd731af1b: Pushed 
1.14.2: digest: sha256:706446e9c6667c0880d5da3f39c09a6c7d2114f5a5d6b74a2fafd24ae30d2078 size: 948

#退出harbor
[root@Docker02 ~]# docker logout harbor.koten.com
Removing login credentials for harbor.koten.com

【运维知识大神篇】运维人必学的Docker教程6(Docker-Compose使用详解+Linux特性管理+macvlan技术+consul实现大规模跨主机通信overlay+私有仓库harbor)_第9张图片

Centos203下载镜像到私有仓库

在此处复制拉取镜像的命令

【运维知识大神篇】运维人必学的Docker教程6(Docker-Compose使用详解+Linux特性管理+macvlan技术+consul实现大规模跨主机通信overlay+私有仓库harbor)_第10张图片

#添加hosts解析
[root@Docker03 ~]# cat /etc/hosts
......
10.0.0.201 harbor.koten.com

#修改配置文件,添加私有仓库的链接
[root@Docker03 ~]# cat /etc/docker/daemon.json
{
  "registry-mirrors": ["https://tuv7rqqq.mirror.aliyuncs.com"],
   "cluster-store": "consul://10.0.0.201:8500",
   "cluster-advertise": "10.0.0.203:7777",
   "insecure-registries": ["10.0.0.201:5000","centos201:5000","harbor.koten.com"]
}
[root@Docker03 ~]# systemctl restart docker

#登录harbor
[root@Docker03 ~]# docker login harbor.koten.com
Username: admin
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

#拉取镜像
[root@Docker03 ~]# docker pull harbor.koten.com/koten-test/nginx:1.14.2
1.14.2: Pulling from koten-test/nginx
Digest: sha256:706446e9c6667c0880d5da3f39c09a6c7d2114f5a5d6b74a2fafd24ae30d2078
Status: Downloaded newer image for harbor.koten.com/koten-test/nginx:1.14.2
harbor.koten.com/koten-test/nginx:1.14.2
[root@Docker03 ~]# docker images|grep harbor.koten.com/koten-test/nginx
harbor.koten.com/koten-test/nginx   1.14.2              295c7be07902   4 years ago     109MB


#退出harbor
[root@Docker03 ~]# docker logout harbor.koten.com
Removing login credentials for harbor.koten.com

删除项目

注意删除项目的时候要先删除里面的镜像才能删除项目 

1、自动部署harbor脚本

编写自动部署脚本,自动下载,配置,安装

[root@Docker01 ~]# cat deploy_harbor.sh 
#!/bin/bash

VERSION=2.8.1

#准备软件下载目录
if [ ! -d download ];then
	mkdir download	
fi

#准备软件存放目录
if [ ! -d /koten/softwares ];then
        mkdir -p /koten/softwares
fi

#下载安装脚本
wget https://github.com/goharbor/harbor/releases/download/v${VERSION}/harbor-offline-installer-v${VERSION}.tgz  -O download

#解压软件包
tar xf download/harbor-offline-installer-v2.8.2.tgz -C /koten/softwares/

#修改配置文件
\cp /koten/softwares/harbor/{harbor.yml.tmpl,harbor.yml}
sed -i '/hostname/s#reg.mydomain.com#harbor.koten.com#g' /koten/softwares/harbor/harbor.yml
sed -i '/harbor_admin_password/s#Harbor12345#1#g' /koten/softwares/harbor/harbor.yml
sed -i '12,18 s/^/#/' /koten/softwares/harbor/harbor.yml

#执行安装脚本
/koten/softwares/harbor/install.sh

运行部署脚本,查看效果

[root@Docker01 ~]# sh deploy_harbor.sh
[+] Building 0.0s (0/0)                              
[+] Running 10/10
 ✔ Network harbor_harbor        Created         0.1s 
 ✔ Container harbor-log         Started         0.7s 
 ✔ Container harbor-db          Started         2.0s 
 ✔ Container registryctl        Started         2.3s 
 ✔ Container registry           Started         2.2s 
 ✔ Container harbor-portal      Started         2.2s 
 ✔ Container redis              Started         2.1s 
 ✔ Container harbor-core        Started         2.7s 
 ✔ Container nginx              Started         3.8s 
 ✔ Container harbor-jobservice  Started         3.6s 
✔ ----Harbor has been installed and started successfully.----

【运维知识大神篇】运维人必学的Docker教程6(Docker-Compose使用详解+Linux特性管理+macvlan技术+consul实现大规模跨主机通信overlay+私有仓库harbor)_第11张图片

我们重新部署,数据也不会丢失,因为在配置文件里可以看到我们的数据存放到了/data里 

[root@Docker01 ~]# cat /koten/softwares/harbor/harbor.yml|grep data_volume
data_volume: /data

我是koten,10年运维经验,持续分享运维干货,感谢大家的阅读和关注!

你可能感兴趣的:(运维知识分享,#,大神运维知识,docker,运维,容器,harbor,consul,macvlan,docker,compose)