了解docker及其基本操作

一、产生背景

以Linux而言,linux操作系统会有一个主进程pid=1派生出其他进程来控制不同服务
例如:
pid=2—>python (pid=3)—> java(pid=4)—>php(pid=4),三个服务可能会互相影响,但是希望这三个服务分别封装起来(可以使用kvm虚拟化技术,实现一个操作系统模拟多个操作系统/不同的运行时环境)随着技术的发展,虚拟化技术开销较大(比如:我只想运行一个python脚本,如果使用kvm虚拟化技术就需要安装一个操作系统并不方便/合理,安装一个kvm操作可能花费的时间更多)所以由此产生容器技术,虚拟化层的抽象层(用户层)剥离,使用docker egine来代替(来宾操作系统去除),只通过引擎就可以直接连接到宿主机操作系统中,减少了开销

二、docker简介

是一种轻量级的 “虚拟机”
在Linux容器里运行应该的开源工具
Docker是一个用于开发,交付和运行应用程序的开放平台。Docker使您能够将应用程序与基础架构分开,从而可以快速交付软件。是一个开源的应用容器引擎,让开发者以打包方式封装应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或者windows机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口
(沙箱(Sandbox):在计算机安全领域,沙箱是一种程序的隔离运行机制)

Docker在2013年一炮而红,直到现在,已经成为容器技术的代名词。
Docker从一开始就以提供标准化的运行时环境为目标,真正做到"build once,run anywhere",可以将同一个构建版本用于开发、测试、预发布、生产等任何环境,并且做到了与底层操作系统的解耦。在此基础上还进一步发展出了Caas(容器即服务)技术。
总结:Docker是基于容器技术的轻量级虚拟化解决方案

docker是容器引擎,把linux的cgroup、namespace等容器底层技术进行完美的封装、并抽象为用户提供创建和管理容器的便捷界面(命令行Cli、api等)docker也是一种C/S架构,client和server端工作在一起
(cgroup:资源管理技术(是谷歌开发集成在linux中))

(一)Docker核心三要素
1.镜像
一个面向Docker容器引擎的只读模板
提供单一的格式的一个组合型/叠加型文件(资源集合),一组资源集合,包含了应用程序软件包、应用程序相关的依赖包、运行应用程序所需要的基础环境(泛指操作系统环境)
2.容器
从镜像创建的运行实例
基于镜像的一种运行状态
3.仓库
集中保存镜像的地方
1.公有仓库:Docker官方仓库 docker hub ,github
2.私有仓库:个人化、私有化的仓库 registry(字符终端) ,harbor(web图形界面)gitlab

(二) 应用于应用的隔离
以操作系统维度应用与应用隔离,在操作系统中,是通过namespaces实现的,只要实现以下6个空间隔离,才能认为两个应用实现了隔离
容器隔离了6个名称空间(namespace资源隔离-用容器化技术封装)

mount 文件系统,挂载点
user 操作进程的用户和用户组
pid 进程编号
uts 主机名和主机域
ipc 信号量、消息队列,共享内存(不同的应用调用的时候应该使用不同的内存空间)
net 网络设备、网络协议、端口
命名空间:封闭的环境,在一个名称空间内不能有两个相同的技术栈,但是不同的命名空间可以一样

pid命名空间:进程隔离(pid:进程ipd号)
net命名空间:管理网络(net:网络)
ipc命名空间:管理访问ipc资源(ipc:进程间通信)
mnt命名共享:管理文件系统挂载点(mnt:mount挂载)
uts命名空间:隔离内核文件和版本标识符(uts:unix时间共享系统)

(三)与虚拟化相比docker的优势
docker 引擎统一了基础设施环境-docker环境(image封装一个简易的操作系统)
docker引擎统一了程序打包(装箱)方式-docker镜像(image)
docker 引擎统一了程序部署(运行)方式-docker容器(基于image运行,容器)

使用方向(app 小程序 微信小程序)

docker与虚拟机的区别

特点 Docker容器 虚拟机
启动速度 秒级 分钟级
计算能力损耗 几乎没有损耗(接近原生直接在内核中运行) 损耗50%左右
磁盘占用 MB GB(操作系统镜像2G)
系统支持数量 成百上千 一般几十台(操作系统级别)
操作系统 主要支持Linux 几乎所有
隔离性 进程级别,资源隔离/限制 系统级别,完全隔离(更彻底安全)
封装程度 只打包项目代码和依赖关系,共享宿主机内核 完整的操作系统,与宿主机隔离
docker解决了vm的孤岛问题:可以自定义传参

(四)docker的使用场景
1.打包应用程序简单部署
流程:将应用程序代码 ,打包成war包或jar包——>放入私有仓库中(代码仓库)——>jenkins等工具,jenkins可以查看代码构建镜像失败的原因,相当于简单测试(构建镜像/应用程序封装)——>运维下载,或使用容器技术进行运行/发布
2.可脱离底层硬件任意迁移(实现了应用的隔离,将应用拆分并进行解耦)比如云服务器迁移
3.持续集成和持续交付(CI/CD):开发到测试发布
4.部署为服务
5.提供PAAS产品(平台即服务)openstack的云主机类似于阿里云的ecs,属于IAAS,Docker(K8s)属于PAAS

(五)Docker引擎(Docker Engine)

Docker Engine 是具有以下主要组件的C/S客户段——服务器应用程序;
server端:服务器是一种长期运行的程序。称为守护程序进程(dockerr命令)
clinet:rest api,指程序可以用来与程序进行通信并指示其操作的接口
命令行界面(cli)客户端(docker命令)
docker run
docker start
docker rm

(六)Docker架构(docker architecture)
1.docker使用客户端——服务器架构。docker 客户端与docker守护进程进行对话,该守护进程完成构建,运行和分发docker容器的繁重工作。Docker区别于传统的虚拟化,不需要虚拟硬件资源,hi姐使用容器引擎,所以速度块

2.docker client:客户端/提供一个于用户交互,展示的平台+管理,控制docker服务端(命令行)

3.docker客户端(docker)是许多docker用户与docker交互的主要方式,当您使用比如docker run命令是客户端将这些命令发送到dockerd,以执行这些命令。该docker命令使用docker api。docker客户端可以与多个守护进程通信

4.docker daemon:守护进程

5.docker守护程序(docker)侦听docker
api请求并管理docker对象,例如图像,容器,网络和卷。守护程序还可以与其他守护进程通信以管理docker服务

6.docker image(镜像)
容器可以被打包成镜像

docker container :容器
docker registry :镜像仓库储存镜像的地方,默认在公共的docker hub 上查找,可以使用个人仓库

三、docker部署

关闭防火墙及安全机制

systemctl stop firewalld
systemctl disable firewalld
setenforce 0 
vim /etc/selinux/config
SELINUX=disabled

安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2

yum-utils提供了yum-config-manager,yum的管理工具

device-mapper-persistent-data 容器引擎的存储驱动

device mapper存储驱动程序需要device-mapper-persistent-data和lvm2

Device Mapper 是Linux2.6内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理的块设

设置阿里云镜像源

cd /etc/yum.repos.d
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-

安装Docker-CE

yum install -y docker-ce

systemctl start docker.service 
systemctl enable docker.service

配置阿里云的镜像加速

  • 加速地址从阿里云官网获取::https://account.aliyun.com/
  • 获取方式:登录阿里云–>控制台–>在上面搜索容器镜像服务–>左下角的镜像加速器—>根据文档操作

优化网络

vim /etc/sysctl.conf
net.ipv4.ip_forward=1		#ipv4转发功能

sysctl -p

systemctl restart docker 或 service network restart

##四、docker基本命令

查看docker版本信息

docker version

docker配置文件可选项(生产环境)

vim /etc/docker/daemon.json #守护进程配置文件server端
“graph”:“/data/docker”, #数据目录
 “storage-driver”:“overlay2”, #存储引擎
 “insecure-registries”:[“registry.access.redhat.com”,“quary.io”] #私有仓库
 “registry-mirrors”: [“https://…”] #镜像加速
 “bip”:“172.190.11.1/24”, #docker网络,表示docker 是哪台,建议当前服务器地址后两端 192.168.190.11/24 ,更容易故障定位
 “exec-opts”:[“native.cgroupdriver-systemd”], #启动时的额外参数
 “live-restore”:true #当docker容器引擎挂掉的时候,使用docker跑起来的容器还能继续运行systemctl daemon-reload
 systemctl restart docker

查找指定镜像

docker search 服务名

运行容器

docker run 容器名

查看docker版本

docker version 或者 docker info

下载镜像

docker pull 服务名
例如
docker search nginx
docker search centos:7
ps:linux发现版本apline centos redhat debian,生产环境可能需要安装不同版本环境,有利于优化镜

镜像为什么会分层下载
nginx image封装了——>操作系统的镜像——>nginx依赖包镜像——>等其他的一些服务镜像

查看镜像信息

docker images
docker inspect 镜像的ID
例如
docker images
docker inspect

查看image(镜像)列表

docker images

镜像添加新标签(打标签)

docker tag 仓库名:原镜像名 仓库名:新镜像名
例如:
docker tag nginx:latest nginx:v1
docker images
docker images | grep nginx

删除镜像

docker rmi 镜像id
docker rmi 镜像:标签

镜像导出

mkdir docker.image
cd docker.image
docker save -o 文件名 镜像:标签	
例如:
docker save -o nginx.docker nginx:v1

载入镜像

方法一:
docker load < 本地导出的镜像名
方法二:
docker --input 本地导出的镜像名

例如:
docker load < nginx_latest
docker load --input nginx_latest
12345678

上传镜像

1.将本地的镜像上传到公有的镜像仓库,要先登陆到镜像仓库
2.上传镜像前要修改标签,标签前面要加上Docker官网的账号名

  • 标签格式: Docker官网的账号名/仓库名:镜像名

一般不会上传到公有仓库中,公司内部都使用私有仓库

docker push [OPTIONS] NAME[:TAG]

例如:按照下面的流程就可以上传到公有云,有兴趣的可以上传

改标签

docker tag 仓库名:镜像名 用户名/仓库名:镜像名

登录

docker login
Username: #用户名
Password: #密码

上传

docker push 用户名/仓库名:镜像名

##五、docker容器操作

查询容器

docker ps -a
docker ps -aq		#指显示容器id号

创建容器

docker create -it nginx:latest /bin/bash
-i :让容器的标准输出保持打开
-t :分配一个伪终端
-d :后台守护进程的方式运行

容器状态有哪些,分别是什么场景

容器状态有7种:
created(已创建)
restarting(重启中)
up/running(运行中)
removing(迁移中)
paused(暂停)
exited(停止)
dead(死亡)

启动容器

docker start 容器id

停止容器

docker stop 容器id

后台运行
docker run -d centos:7 /bin/bash -c “while true;do echo hello;done” #-d后端执行一次退出,while是个循环语句,条件成立则循环执行,不加-d一直输出 hello

docker run centos:7 /usr/bin/bash -c ls / #启动容器,执行一次运行并执行一次命令并退出

进入容器

使用run 进入容器执行操作,退出容器后 容器状态退出

docker run -it nginx:latest /bin/bash
ctl + D 或 exit		#退出容器 ctl+d返回130 ,exit返回127

exce进入(容器必须为开启状态)

docker exce -it 容器id /bin/bash

容器导出

docker export 容器id > 文件名
示例:
docker export 容器id > nginx-1

容器导入(生成镜像文件)

docker import 导出的文件名(容器)指定镜像名称
示例:
docker import nginx-1 nginx:test1
cat 文件名(容器)| docker import - nginx:latest

删除容器

docker rm 容器id
docker rm -f 容器id

批量删除容器
docker rm $(docker ps -aq)

docker ps -a | awk ‘{print "docker rm "$1}’ | bash

批量删除状态为exit状态的容器

for i in $(docker ps -a |grep -i exit) | awk ‘{print $1}’;do docker rm -f $i;done

##六、docker网络模式

查看docker服务器的ifconfig

docker进程组 docker主进程_运维

######docker网络原理
Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都t接入同一个网桥(容器与容器网桥通过veth对进行通信对接),这样容器之间就能够通过容器的Container-IP直接通信。
注意:docker网桥可以有多个

Docker网桥是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络是无法寻址到的,这也意味着外部网络无法通过直接Container-IP访问到容器。如果容器希望外部访问能够访问到,可以通过映射容器端口到宿主主机(端口映射),即docker run创建容器时候通过 -p(指定暴露端口) 或 -P(随机分配暴露端口) 参数来启用,访问容器的时候就通过[宿主机IP]:[映射端口]访问容器。

#####docker网络的四种模式
Docker网络模式说明
host模式 容器和宿主机共享Network namespace ( --net=host )
container模式 容器和另外一个容器共享Network namespace。 kubernetes中的pod就是多个容器共享一个Network namespace(–net=container:NAME_or_ID)
none模式 容器有独立的Network namespace,封闭的网络环境,并没有对其进行任何网络设置,如分配veth pair 和网桥连接,配置IP等(–net=none)
bridge模式 (默认为该模式)–net=bridge 不同docker使用不同网桥docker run --net=br0 xxxxx… docker run --net=br1 xxxxx…

#####host模式
如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。==容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。==但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。
使用host模式的容器可以直接使用宿主机的IP地址与外界通信,容器内部的服务端口也可以使用宿主机的端口,不需要进行NAT,host最大的优势就是网络性能比较好,但是docker host上已经使用的端口就不能再用了,网络的隔离性不好。

#####container模式
这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。

#####none模式(封闭空间)
使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。
这种网络模式下容器只有lo回环网络,没有其他网卡。none模式可以在容器创建时通过–network=none来指定。这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性。

#####bridge模式(默认网络模式)
当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。

从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备,Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中。可以通过brctl show命令查看。

bridge模式是docker的默认网络模式,不写–net参数,就是bridge模式。使用docker run -p时,docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL查看

#####docker自定义网络
1.查看网络列表
docker network ls

bridge是默认分配的所以无法分配地址

docker run -itd --name test1 --network bridge --ip 172.17.0.10 centos:latest /bin/bash

------执行会报错--------#

自定义网络固定ip

docker network create --subnet=172.18.0.0/16 mynetwork #创建名称为mynetwork的docker网桥
 docker run -itd --name test2 --net mynetwork --ip 172.18.0.11 centos:latest /bin/bash

暴露端口

docker run -itd -p 3333:80 nginx /bin/bash		#指定端口
docker run -itd -P nginx /bin/bash		#-P随机端口

宿主机环境执行容器内命令

docker exec -it 容器id /bin/bash -c 'nginx'		#开启nginx服务

宿主机的文件传入容器内部

docker cp 文件路径 容器id:文件路径
示例
docker cp /opt/1.text 容器id:/etc/

然后浏览器访问本机IP+3333端口

解决进入容器后无法使用systemctl命令
docker run -itd --name test3 --privilege=true centos /sbin/init

添加参数,指定此容器是否为特权容器授予权限,使用此参数则不能使用attach命令

/sbin/init 是内核主动唤起的一个进程

七、docker镜像分层

######(一)概述
docker镜像
应用发布的标准格式
支撑一个docker容器的运行

docker镜像的创建方法
基于已有镜像创建
基于本地模板创建
基于Dockerfile创建

镜像分层原则
Dockerfile中的每个指令都会创建一个新的镜像层
镜像层将被缓存和服用
当Dockerfile的指令修改了,复制的文件变化了,或者构建镜像是指定的变量不同了,对应的镜像镜像层就会失效
某一层的镜像缓存失效后它之后的镜像层缓存都会失效
镜像层是不可变的,如果在某一层中添加一个文件,然后再下一层中删除,则镜像中依然会包含该文件

#####镜像分层结构
1.(内核层):由AUFS,LXC,Bootfs(boot file system)组成为上层的镜像提供kernel内核支持

AUFS是一个联合文件系统,它使用同一个Linux host上的多个目录,逐个堆叠起来,对外呈现出一个统一的文件系统。AUFS使用该特性,实现了Docker镜像的分层 分层的思想
bootfs:负责与内核交互 主要是引导加载kernel,linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层时bootfs,这一层与经典的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统就会卸载bootfs
rootfs(root file system)属于base images 在bootfs之上(base images)比如在linux系统中包含/dev,/proc,/bin,/etc等标准目录和文件,包含创建、启动操作系统的一些必要的组件,rootfs就是各个不同的操作系统的发行版本,比如Ubuntu,CentOS等等
lxc早期的内核引擎与docker引擎对接交互,docker提供一些库文件和引导文件。现在docker自身内置了所需要的lib库
2.base image(基础/系统镜像层):构建镜像运行的操作系统环境

3.add image(run指令运行的镜像层):比如nginx镜像的yum安装模块,或者nginx编译安装的指令,使用镜像封装每一个run执行命令

4.Container(可读写执行层):将下面的镜像组合运行提供给docker client使用

总结
1.docker镜像层位于bootfs之上
2.每一层镜像成为base image/底包(操作系统环境变量)比如centos dbian
3.容器层(可读可写),在最顶层。是docker server提供给docker client
4.容器层以下都是readonly只读,docker将readonly的FS层成为image

为什么docker的centos镜像只有200M就是因为一个精简的os,rootfs可以很小,之许哟啊将基础命令,工具和程序库就可以了,因为底层直接用host的kernel,自己只需要提供rootfs继续。由此可见不同的linux发现版本,bootfs基本一致,rootfs会有差别,不同的发现版本可以公用bootfs

补充

每次图送至docker hub 公有仓库只会推送增量部分(毕竟底包比较大,增量推送/更新部分比较小)所以生产环境中只要执行镜像再推送的时候增量部分控制到比较小的范围就可以

######(二)dockerfile结构

1.基础镜像信息(指定操作系统镜像是什么镜像,什么版本)
2.维护者信息
3.镜像操作指令
4.容器启动时执行的命令

######(三)dockerfile操作指令
指令 含义
FROM 镜像 指定新镜像所基于的操作系统镜像,第一条指令必须为FROM指令,每创建一个镜像就需要一条FROM指令
MAINTAINER + 名字 说明新镜像的维护人信息
RUN + 命令 在所基于的镜像执行命令,并提交到新的镜像中(每写一条指令都会创建一个镜像层)
CMD + [“要运行的程序”,“参数1”、“参数2”] 指令启动容器时要运行的命令或者脚本(例如 CMD [“run.sh”]),Dockerfile只能有一条CMD命令,如果指定多条则只能执行最后一条
EXPOSE + 端口号 指定新镜像加载到Docker时要开启的端口
ENV + 环境变量 + 变量值 设置一个环境变量的值,会被后面的RUN使用
ADD + 源文件/目录 + 目标文件/目录 将源文件复制到目标文件,源文件要与Dockerfile位于相同目录中,或者是一个URL,若源文件是压缩包则会将其解压缩
COPY + 源文件/目录 + 目标文件/目录 将本地主机上的文件/目录复制到目标地点,源文件/目录要与Dockerfile在相同的目录中
VOLUME + [“目录”] 在容器中创建一个挂载点(VOLUME [“/目录”] )
USER + 用户名/UID 指定运行容器时的用户(在编写mysql es mg数据库镜像文件时可能需要时用对用户授权)
WORKDIR + 路径 为下一步的RUN、CMD、ENTRYPOINT指定工作目录,相当于是一个临时的"CD",否则需要使用绝对路径
ONBUILD + 命令 指定所生成的镜像作为一个基础镜像时所要运行的命令
HEALTHCHECK 健康检查

CMD与ENTRYPOINT的区别
ENTRYPOINT类似于 CMD 指令,但其不会被 docker run 运行容器并且执行的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程,CMD相反,会被docker run指定命令覆盖
CMD和ENTRYPOINT可以联合使用
COPY与ADD的区别

在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>,ADD 的缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定

######(四)编写ssh dockerfile
 mkdir ssh
 cd sshdvim Dockerfile
 FROM centos:7
 RUN yum -y update
 RUN yum -y install openssh* net-tool lsof telnet passwd
 RUN echo ‘123456’ | passwd --stdin root
 RUN sed -i ‘s/UsePAM yes/UsePAM no/g’ /etc/ssh/sshd_config
 RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
 RUN sed -i ‘/session\s+required\s+pam_loginuid.so/s//#/’ /etc/pam.d/sshd
 RUN mkdir -p /root/.ssh && chown root.root /root && chmod 700 /root/.ssh
 EXPOSE 22
 CMD [“/usr/sbin/sshd”,“-D”]

生成镜像

docker build -t sshd:v1 。

启动容器并修改root密码

dockers run -d -P sshd:v1
 ssh localhost -p 端口######(五)tomcat的dockerfile
 FROM centos:7
 ADD apache-tomcat-9.0.16.tar.gz /opt
 ADD jdk-8u201-linux-x64.rpm /optWORKDIR /opt
 RUN rpm -ivh jdk-8u201-linux-x64.rpm
 ENV JAVA_HOME /usr/java/jdk1.8.0_201-amd64
 ENV CLASSPATH JAVA_HOME/lib/dt.jar
 ENV PATH /usr/java/jdk1.8.0_201-amd64/bin:$PATH
 RUN mv apache-tomcat-9.0.16 /opt/tomcatCMD [“/opt/tomcat/bin/catalina.sh”,“run”]
docker -d run -p 8080:8080 tomcat:v1 #开启容器

建立镜像文件

dockers build -t tomcat:v1 . (末尾的(.)号不要忘记)

指定端口开启容器

docker run -d -p 8080:8080 tomcat:v1

######(六)nginx的dockerfile及其优化(减小镜像的大小)

常规写法
方法一:

[root@localhost ~]#cd nginx
 [root@localhost nginx]#ls
 Dockerfile nginx-1.12.0.tar.gz
 [root@localhost nginx]#vim DockerfileFROM centos:7
 ADD nginx-1.12.0.tar.gz /optRUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make &> /dev/null
RUN useradd -M -s /sbin/nologin nginx
 WORKDIR /opt/nginx-1.12.0RUN ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx
RUN make &> /dev/null && make install &> /dev/null
EXPOSE 80
 CMD [“/usr/local/nginx/sbin/nginx”,“-g”,“daemon off;”]

方法二:

FROM centos:7
 MAINTAINER gtRUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make
 RUN useradd -M -s /sbin/nologin nginx
 ADD nginx-1.12.0.tar.gz /opt/
 WORKDIR /opt/nginx-1.12.0
 WORKDIR nginx-1.12.0
 RUN ./configure 
 –prefix=/usr/local/nginx 
 –user=nginx 
 –group=nginx 
 –with-http_stub_status_module && make && make install
 EXPOSE 80
 EXPOSE 443
 RUN echo “daemon off;”>>/usr/local/nginx/conf/nginx.confADD run.sh /run.sh
 RUN chmod 755 /run.sh
 CMD [“/run.sh”] #调用脚本

编写CMD中的nginx启动命令脚本

[root@localhost nginx1]#ls
 Dockerfile nginx-1.12.0.tar.gz run.sh
 [root@localhost nginx1]#vim run.sh/#!/bin/bash
/usr/local/nginx/sbin/nginx

创建镜像

docker build -t nginx:v1
######nginx —dockerfile优化


1.将不需要输出的指令放入/dev/null文件黑洞中
2.减少RUN指令
3.多阶段构建

[root@localhost ~]#cd nginx3
 [root@localhost nginx3]#ls
 Dockerfile nginx-1.12.0.tar.gz
 [root@localhost nginx3]#vim Dockerfile
 [root@localhost nginx3]#vim DockerfileFROM centos:7
 ADD nginx-1.12.0.tar.gz /opt
 WORKDIR /opt/nginx-1.12.0RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make &> /dev/null 
 && yum clean all &>/dev/null 
 && useradd -M -s /sbin/nologin nginx &> /dev/null 
 && ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx &> /dev/null 
 && make &> /dev/null && make install &> /dev/null 
 && rm -rf /mnt/nginx-1.12.0EXPOSE 80
 CMD [“/usr/local/nginx/sbin/nginx”,“-g”,“daemon off;”]

创建镜像

docker build -t nginx:test .

显示创建的镜像

docker images
######多阶段构建
FROM centos:7 as build
 ADD nginx-1.12.0.tar.gz /opt
 WORKDIR /opt/nginx-1.12.0RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make &> /dev/null 
 && yum clean all &>/dev/null 
 && useradd -M -s /sbin/nologin nginx &> /dev/null 
 && ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx &> /dev/null 
 && make &> /dev/null && make install &> /dev/null 
 && rm -rf /mnt/nginx-1.12.0FROM centos:7
 EXPOSE 80
 COPY --from=build /usr/local/nginx /usr/local/nginx #使用之前构建的环境
 CMD [“/usr/local/nginx/sbin/nginx”,“-g”,“daemon off;”]

创建镜像

docker build -t nginx:test .

会构建的很快

显示创建的镜像

docker images

##八、docker私有仓库建立,数据卷挂载,容器间通讯

(一)、仓库
1.代码仓库:公共仓库github ,私有仓库gitlib
2.镜像仓库:公共仓库 docker hub ,私有仓库:registry(有图像终端界面)harbor(字符终端界面)

(二)、registry私有仓库建立步骤
设立私有仓库后下载镜像时优先寻找私有仓库镜像内容

1.拉取镜像文件

docker pull registry

2.修改docker引擎终端配置

[root@localhost ~]#vim /etc/docker/daemon.json
{
 “insecure-registries”: [“192.168.190.11:5000”],
 “registry-mirrors”: [“https://45htmp62.mirror.aliyuncs.com”]/#镜像加速
}
 :wqsystemctl restart docker.service

3.创建registry容器并挂载宿主机目录

docker create -it registry /bin/bash
 docker ps -a
 docker start 84eab70a2490 #这样开启容器会失败docker run -d -p 5000:5000 -v /data/registry:/tmp/registry registry

可以使用该条命令挂载卷,run=pull+create+start

4.更改标识并上传本地的一个镜像文件

docker images

docker tag nginx:test 192.168.190.11:5000/nginx

docker push 192.168.190.11:5000/nginx

5.获取镜像列表

curl -XGET http://192.168.190.11:5000/v2/_catalog
 ---------输出信息----------
 [root@localhost ~]#curl -XGET http://192.168.190.11:5000/v2/_catalog
 {“repositories”:[“nginx”]}

6.测试私有仓库下载

docker rmi 192.168.190.11:5000/nginx		#删除已有的镜像

docker pull 192.168.190.11:5000/nginx		#指定镜像名称

######(一)docker数据卷
挂载到宿主机目录中

格式:docker run -v 宿主机目录:容器内目录 -it 镜像 /bin/bash #目录不存在的话自动创建

docker run -v /var/www:/data1 --name web1 -it centos /bin/bash
[root@d58e644c2f7b /]# cd /data1
 [root@d58e644c2f7b data1]# touch test1

######(二)容器数据卷(两个容器的交互目录挂载)
格式:docker run --volumes-from 另外的容器 -it 镜像 /bin/bash

docker run --name web1 -v /data1 -v /data2 -it centos /bin/bash
docker run --name web2 --volumes-from web1 -itd centos /bin/bash

(三)容器互联
在容器和接受容器间建立一条网络通讯隧道

docker run -itd -P --name web1 centos /bin/bash
 docker run -itd -P --name web2 --link web1:web1 centos /bin/bash--------验证-------
进入一个容器ping另一个容器
[root@localhost ~]#docker exec -it 974077bf71df /bin/bash
 [root@974077bf71df /]# ping web1
 PING web1 (172.17.0.3) 56(84) bytes of data.
 64 bytes from web1 (172.17.0.3): icmp_seq=1 ttl=64 time=0.157 ms
 64 bytes from web1 (172.17.0.3): icmp_seq=2 ttl=64 time=0.059 ms
 64 bytes from web1 (172.17.0.3): icmp_seq=3 ttl=64 time=0.069 ms

##九、docker-compose(容器编排)

(一)、前言
Docker Compose的前身时Fig,Fig被Docker收购之后更名为compose,compose向下兼容Fig
Docker compose是一种用于定义和运用多容器Docker应用的工具,只需要一个compose的配置文件和一个简单的命令就可以创建并运行所用所需的所有容器,而不再需要使用shell脚本来启动容器
Docker Compose 非常适合组合使用多个容器进行开发的场景

1.docker compose的文件结构
YAML是一种标记语言很直观放入数据序列化格式,文件格式及编写注意事项如下所示:

不支持制表符Tab缩进,需要使用空格缩进
通常开头缩进2个空格
字符后缩进1个空格,如冒号(😃、逗号(,)、横杆(- )
支持用#号注释
如果包含特殊字符用单引号引起来
布尔值必须用单引号括起来

示例:

house:
 family:
 name: tom
 parent:
 - john
 - jane
 children:
 - paul
 - mark
 address:
 number: 34
 street:
 city: beijing

2.docker compose配置常用字段
字段 描述
version 指定此yml文件基于的compase的版本
services 指定创建容器的服务选项,服务名:例如nginx等
build 指定构建镜像上下文路径(是一个路径基于docker-compos.yuml文件的所在目录)
context 上下文路径
dockerfile 指定构建镜像的 Dockerfile 文件名
image 指定容器运行的镜像
command 执行命令,覆盖默认命令
container_name 指定容器名称,由于容器名称是唯一的,如果指定自定义名称,则无法scale(扩展,使用副本集)
deploy 指定部署和运行服务相关配置,只能在Swarm模式使用
environment 添加环境变量
networks 配置网络,指定网卡设备等(四种网络模式)
ports 暴露容器端口,与-p相同,但端口不能低于60;指定端口也不能使用scale
networks 配置网络,指定网卡设备等
volumes 挂载宿主机路径或命令卷
restart 重启策略,定义是否重启容器;no(默认,不重启),always(总是重启),no-failure(退出状态非0时重启)
hostname 容器主机名

3.docker compose常用命令
字段 描述
build 重新构建服务
ps 列出容器
up 创建和启动容器
exec 在容器里面执行命令
scale 指定一个服务容器启动数量(弹性伸缩时增加服务器结合consul一起部署)
top 显示正在运行的容器进程
logs 查看服务容器的输出(生产环境中不建议直接查看所有日志)
down 删除容器、网络、数据卷和镜像
stop/start/restart 停止/启动/重启服务

######(二)、部署compose

1.安装compose

环境部署所有主机安装docker环境(内容为docker基础)

yum install docker-ce -y

2.下载compose
curl -L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-uname -s-uname -m -o /usr/local/bin/docker-compose

cp -p docker-compose /usr/local/bin/
chmod +x /usr/local/bin/docker-compose

mkdir /root/compose_tomcat/tomcat

3.编写dockerfile文件

需要上传安装tomcat所需要的包

cd /root/compose_tomcat/tomcat
vim Dockerfile
 FROM centos:7
 ADD apache-tomcat-8.5.16.tar.gz /usr/local
 ADD jdk-8u91-linux-x64.tar.gz /usr/localWORKDIR /usr/local
 RUN mv jdk1.8.0_91 /usr/local/java
 ENV JAVA_HOME /usr/local/java/
 ENV JAVA_BIN /usr/local/java/bin
 ENV JRE_HOME /usr/local/java/jre
 ENV PATH $PATH:/usr/local/java/bin:/usr/local/java/jre/bin
 ENV CLASSPATH /usr/local/java/jre/bin:/usr/local/java/lib:/usr/local/java/jre/lib/charsets.jar
 RUN mv apache-tomcat-8.5.16 /usr/local/tomcat
 EXPOSE 8080
 ENTRYPOINT [“/usr/local/tomcat/bin/catalina.sh”,“run”]

4.编写dockers-compose.yml文件

cd /root/compose_tomcat
 vim docker-compose.ymlversion: ‘3’
 services:
 tomcat:
 hostname: tomcat
 build:
 context: ./tomcat
 dockerfile: Dockerfile
 ports:
 - 1216:8080
 networks:
 - cluster
 volumes: #选配


- 宿主机目录:容器目录
networks:
cluster:

5.执行yml文件创建容器

docker-compose -f docker-compose.yml up -d

6.然后查看创建的容器以及浏览器访问

十、docker consul自动发现更新

######(一、概念)

1.consul
1.Consul是HashiCorp公司推出的开源工具,Consul由Go语言开发,部署起来非常容易,只需要极少的可执行程序和配置文件,具有绿色、轻量级的特点。
2.Consul是分布式的、高可用的、可横向扩展的用于实现分布式系统的服务发现与配置。

2.Consul的作用
服务注册与发现(主要功能),提供HTTP和DNS两种发现方式
健康检查,支持多种协议,HTTP、TCP等
Key/Value存储
支持多数据中心
基于Golong语言,可移植性强
支持ACL访问控制
与Docker等轻量级容器可无缝配合

3.consul-template概述(更新)
定义标准的格式,以及管理相关前端服务的配置文件
1.Consul-Template是一个守护进程,用于实时查询Consul集群信息

2.Consul-Template可以更新文件系统上任意数量的指定模板,生成配置文件

更新完成以后,可以选择运行shell命令执行更新操作,重新加载Nginx。

3.Consul-Template可以查询Consul中的服务目录、Key、Key-values等。

4.这种强大的抽象功能和查询语言模板可以使Consul-Template特别适合动态的创建配置文件。

例如:创建Apache/Nginx Proxy Balancers、Haproxy Backends

4.registrator的作用(自动发现)
一个由Go语言编写的,针对docker使用的,可以用于检测容器状态,自动注册和注销docker容器的服务到服务配置中心。目前支持Consul、Etcd和SkyDNS2

**总结:**后端每构建出一个容器,会向regitrator进行注册,控制consul完成更新操作,consul会触发consul template模板进行更新,核心机制:consul:自动发现自动更新,为容器提供服务(添加,删除,生命周期)

##(二)、实验部署

实验背景:nginx+tomcat实现对tomcat的反向代理
问题/需求:当后端tomcat节点大批量增加,需要在保证服务不中断的情况下在nginx配置文件增加这些后端节点的地址

docker进程组 docker主进程_docker_02

案例环境

主机

操作系统

IP地址

主要软件及版本

consul

Centos 7

192.168.190.11

Docker 、Consul、Consul-template

registrator

Centos 7

192.168.190.12

Docker、registrator

(一)部署consul服务器
192.168.190.11

1.拖入安装包并安装

mkdir /root/consul
 cd /root/consul//放入安装包
 unzip consul_0.9.2_linux_amd64.zip
 mv consul /usr/binconsul agent 
 -server \ #服务端
 -bootstrap \ #前端框架
 -ui \ #可被访问的web界面
 -data-dir=/var/lib/consul-data \ #consul数据目录
 -bind=192.168.190.11 \ #本地地址
 -client=0.0.0.0 \ #表示所有
 -node=consul-server01 &> /var/log/consul.log & # &后台运行consul agent 
 -server 
 -bootstrap 
 -ui 
 -data-dir=/var/log/consul-data 
 -bind=192.168.190.11 
 -client=0.0.0.0 
 -node=consul-server01 &> /var/log/consul.log &

2.查看集群信息

consul members
 [root@localhost consul]#consul members
 Node Address Status Type Build Protocol DC
 consul-server01 192.168.190.11:8301 alive server 0.9.2 2 dc1consul info | grep leader #查看consul集群架构并查询leader
 [root@localhost consul]#consul info | grep leader
 leader = true
 leader_addr = 192.168.190.11:8300----consul常用端口及功能----
 8300:集群内数据的读写和复制
 8301:单个数据中心gossip协议通讯
 8302:跨数据中心gossip协议通讯
 8500:提供获取服务列表、注册列表、注销服务等http接口,提供UI服务
 8600:采用DNS协议提供服务发现功能

3.通过http api获取集群信息

curl 127.0.0.1:8500/v1/status/peers //查看集群server成员
 curl 127.0.0.1:8500/v1/status/leader //集群Raf leader
 curl 127.0.0.1:8500/v1/catalog/services //注册的所有服务
 curl 127.0.0.1:8500/v1/catalog/nginx //查看nginx服务信息
 curl 127.0.0.1:8500/v1/catalog/nodes //集群节点详细信息

(二)容器服务自动加入consul集群
192.168.190.12

1.安装Gliderlabs/registrator

可检查容器运行状态自动注册,还可以注销docker容器服务,目前支持consul ,etcd和SkyDNS2
docker run -d 
 –name=registrator 
 –net=host 
 -v /var/run/docker.sock:/tmp/docker.sock 
 –restart=always 
 gliderlabs/registrator:latest 
 -ip=192.168.190.12 
 consul://192.168.190.11:8500

2.测试服务
测试发现功能是否正常

docker run -itd -p:81:80 --name test-01 -h test01 nginx
 docker run -itd -p:82:80 --name test-02 -h test02 nginx
 docker run -itd -p:88:80 --name test-03 -h test03 httpd
 docker run -itd -p:89:80 --name test-04 -h test04 httpd

3.验证http和nginx服务是否注册到consul

浏览器输入http://192.168.190.11:8500,“单击NODES”,然后单击“consurl-server01”,会出现5个服务

192.168.190.11验证
curl 127.0.0.1:8500/v1/catalog/services
[root@localhost consul]#curl 127.0.0.1:8500/v1/catalog/services
 {“consul”:[],“httpd”:[],“nginx”:[]}

(三)安装consul-template

== consul:192.168.190.11==

1.拖入安装包解压

unzip consul-template_0.19.3_linux_amd64.zip
mv consul-template /usr/bin/

2.准备template nginx模板文件
consul:192.168.190.11

vim /root/consul/nginx.ctmpl
upstream http_backend { #配置地址池名称
 {{range service “nginx”}} #指定服务范围
 server {{.Address}}:{{.Port}}; #读取服务节点地址端口 server ip port
 {{end}} #以end结尾
 }server { 
 listen 81; #指定监听的consul地址81或者88
 server_name localhost 192.168.190.11; #反向代理服务器的地址
 access_log /var/log/nginx/nginx01-access.log; #访问日志类型
 index index.html index.php;
 location / {
 proxy_set_header HOST $host; #记录访问的头部信息
 proxy_set_header X-Real-IP $remote_addr; #记录客户端访问真实地址
 proxy_set_header Client-IP $remote_addr;
 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #转发客户端地址
 proxy_pass http://http_backend;
 }
 }

upstream http_backend {
 {{range service “nginx”}}
 server {{.Address}}:{{.Port}};
 {{end}}
 }server {
 listen 81;
 server_name localhost 192.168.190.11;
 access_log /var/log/nginx/nginx01-access.log;
 index index.html index.php;
 location / {
 proxy_set_header HOST $host;
 proxy_set_header X-Real-IP $remote_addr;
 proxy_set_header Client-IP $remote_addr;
 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 proxy_pass http://http_backend;
 }
 }

3.编译安装nginx

192.168.190.11
yum install -y gcc pcre-devel zlib-devel
 cd /opt
 tar zxvf nginx-1.12.0.tar.gz
 cd nginx-1.12.0/
 ./configure --prefix=/usr/local/nginx
 make && make install3.1配置nginx配置文件
 vim /usr/local/nginx/conf/nginx.conf
 http {
 include mime.types;
 include vhost/*.conf; //添加虚拟主机目录(子配置文件) 
 default_type application/octet-stream;//创建虚拟主机目录
 mkdir /usr/local/nginx/conf/vhost
 //创建日志文件目录
 mkdir /var/log/nginx//启动nginx
 /usr/local/nginx/sbin/nginx

4.启动template

consul:192.168.190.11
consul-template -consul-addr 192.168.190.11:8500 \
指定consul集群的serverip端口
-template “/root/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/kgc.conf:/usr/local/nginx/sbin/nginx -s reload” \
将反向代理服务器的nginx配置文件关联模板文件并重载
–log-level=info
重开一个终端
 192.168.190.11cat /usr/local/nginx/conf/vhost/kgc.conf
upstream http_backend {
server 192.168.190.12:81;
server 192.168.190.12:82;
}
server {
 listen 81;
 server_name localhost 192.168.190.11;
 access_log /var/log/nginx/nginx01-access.log;
 index index.html index.php;
 location / {
 proxy_set_header HOST $host;
 proxy_set_header X-Real-IP $remote_addr;
 proxy_set_header Client-IP $remote_addr;
 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 proxy_pass http://http_backend;
 }
 }

5.测试访问

192.168.190.12:81
192.168.190.12:82
192.168.190.11:81

(四)测试是否能自动发现

192.168.190.12增加一台后端节点容器服务

docker run -itd -p:83:80 --name test-05 -h test05 nginx

(五)部署consul多节点
192.168.190.13
添加一台已有docker环境的服务器192.168.190.13/24加入已有的群集中

mkdir /root/consul
 cd /root/consul
 //放入安装包
 unzip consul_0.9.2_linux_amd64.zip
 mv consul /usr/binconsul agent 
 -server 
 -bootstrap 
 -ui 
 -data-dir=/var/lib/consul-data 
 -bind=192.168.190.13 
 -client=0.0.0.0 
 -node=consul-server02 
 -enable-script-checks=true 
 -datacenter=dc1 
 -join 192.168.190.11 &> /var/log/consul.log &--------参数解释--------------------------------
-enable-script-checks=true:设置检查服务为可用
 -datacenter:数据中心名称
 -join:加入到已有的集群中

##十一、docker私有仓库harbor

一、相关概念
Harbor被部署为多个Docker容器,因此可以部署在任何支持Docker的Linux发行版本上(registry是其核心组件)Harbor比registry相比好处是:harbor支持多功能,图像化管理,多用户权限,角色管理机制,安全机制服务端主机需要安装python,docker和docker compose。(web环境支持的是PY语言,故需要安装python)

1.harbor概念
Harbor 是VMware公司开源的云本地 registry 仓库,有可视化的Web管理界面,可以方便的管理和储存 Docker 镜像。Harbor 支持

2.Harbor的优势
基于角色控制
基于镜像的复制策略
支持LDAP/AD域,通过VPN连接域使用
图像删除和垃圾收集
图像UI,方便
审计,此功能使用较少,一般企业中用ELK收集、分析日志
RESTful API在多个仓库直接进行复制镜像,提供用户管理和访问控制和活动审计。

二、部署harbor
主机 操作系统 主机名/IP地址 主要软件及版本
Harbor(服务端) Centos 7 192.168.190.11 docker,docker-compose,harbor-offline-v1.1.2
client(客户端) Centos 7 192.168.190.12 docker

(一)安装harbor

1.下载 Harbor 安装程序

服务端需要安装docker-compose

cp -p docker-compose /usr/local/bin/
chmod +x /usr/local/bin/docker-compose

Harbor:192.168.190.11

//在线下载
wget http:// harbor.orientsoft.cn/harbor-1.2.2/harbor-offline-installer-v1.2.2.tgz

tar zxvf harbor-offline-installer-v1.2.2.tgz -C /usr/local/

2.配置harbor参数文件

vim /usr/local/harbor/harbor.cfg
//第五行
hostname = 192.168.190.11

关于harbor.cfg配置文件中有两类参数,所需参数和可选参数

(1)所需参数
这些参数需要在配置文件 Harbor.cfg中设置,如果修改此参数后,需要运行 install.sh脚本重新安装 Harbour,参数才会生效

hostname:用于访问用户界面和 register 服务。它应该是目标机器的 IP 地址或完全限定的域名(FQDN)例如 192.168.163.100 或test.com。不要使用 localhost 或 127.0.0.1 为主机名。
ui_url_protocol:(参数选项:http 或 https,默认为 http)用于访问 UI 和令牌/通知服务的协议。如果公证处于启用状态,则此参数必须为 https。
max_job_workers:镜像复制作业线程。
db_password:用于db_auth 的MySQL数据库root 用户的密码。
customize_crt:该属性可设置为打开或关闭,默认打开。打开此属性时,准备脚本创建私钥和根证书,用于生成/验证注册表令牌。当由外部来源提供密钥和根证书时,将此属性设置为 off。
ssl_cert:SSL 证书的路径,仅当协议设置为 https 时才应用。
ssl_cert_key:SSL 密钥的路径,仅当协议设置为 https 时才应用。
secretkey_path用于在复制策略中加密或解密远程 register 密码的密钥路径。不建议配置,有很大的安全隐患
(2)可选参数
这些参数对于更新是可选的,即用户可以将其保留为默认值,并在启动 Harbor 后在 Web UI 上进行更新。如果进入 Harbor.cfg,只会在第一次启动 Harbor 时生效,随后对这些参数 的更新,Harbor.cfg 将被忽略。

注意:如果选择通过UI设置这些参数,请确保在启动Harbour后立即执行此操作。具体来说,必须在注册或在 Harbor 中创建任何新用户之前设置所需的

auth_mode:当系统中有用户时(除了默认的 admin 用户),auth_mode 不能被修改。
Email:Harbor需要该参数才能向用户发送“密码重置”电子邮件,并且只有在需要该功能时才需要。请注意,在默认情况下SSL连接时没有启用。如果SMTP服务器需要SSL,但不支持STARTTLS,那么应该通过设置启用SSL email_ssl = TRUE。
harbour_admin_password:管理员的初始密码,只在Harbour第一次启动时生效。之后,此设置将被忽略,并且应 UI中设置管理员的密码。默认的用户名/密码是 admin/Harbor12345
auth_mode:使用的认证类型默认情况下,它是 db_auth,即凭据存储在数据库中。对于LDAP身份验证,请将其设置为 ldap_auth。
self_registration:启用/禁用用户注册功能。禁用时,新用户只能由 Admin 用户创建,只有管理员用户可以在 Harbour中创建新用户。
注意:当 auth_mode 设置为 ldap_auth 时,自注册功能将始终处于禁用状态,并且该标志被忽略。
Token_expiration:由令牌服务创建的令牌的到期时间(分钟),默认为 30 分钟。即登录–退出后,30分钟内可以不输入用户名和密码登录,30分钟后需要再次验证。
project_creation_restriction:用于控制哪些用户有权创建项目的标志,表示哪些用户可以创建项目。默认情况下, 每个人都可以创建一个项目。如果将其值设置为“adminonly”,那么只有 admin 可以创建项目。
verify_remote_cert打开或关闭,默认打开。此标志决定了当Harbor与远程 register 实例通信时是否验证 SSL/TLS 证书。
将此属性设置为 off 将绕过 SSL/TLS 验证,这在远程实例具有自签名或不可信证书时经常使用。
另外,默认情况下,Harbour 将镜像存储在本地文件系统上。在生产环境中,可以考虑 使用其他存储后端而不是本地文件系统,如 S3、Openstack Swif、Ceph 等。但需要更新common/templates/registry/config.yml 文件

3.启动Harbor

sh /usr/lcoal/harbor/install.sh

4.查看habor镜像及容器

docker images

docker ps -a

5.检查容器运行

cd /usr/local/harbor/
docker-compose ps

6.在UI界面创建项目

宿主机浏览器登入
上图检查一切正常,此时可以打开浏览器访问 http://192.168.190.11 的管理页面,默认的管理员用户名和密码是 admin/Harbor12345

(二)本地上传镜像到harbor中
测试本地登入harbor仓库
Harbor:192.168.190.11
此时可使用 Docker 命令在本地通过 127.0.0.1 来登录和推送镜像。默认情况下,Register 服务器在端口 80 上侦听。

登录

docker login -u admin -p Harbor12345 http://127.0.0.1

docker logout #退出

注意
使用192.168.190.11地址的上传镜像也会失败,可以使用127.0.0.1,如何更改下面会介绍

docker login -u admin -p Harbor12345 http://192.168.190.11

1.下载镜像进行测试

docker pull cirros
1

2.更改标签

docker tag cirros:latest 192.168.190.11/myproject/cirros:v1		#地址使用127.0.0.1代表本

3.推送镜像

docker push 192.168.190.11/myproject/cirros:v1

4.解决无法使用192.168.190.11地址推送镜像
vim /usr/lib/systemd/system/docker.service

添加字段

[Service]
ExecStart=/usr/bin/dockerd -H fd:// --insecure-registry 192.168.190.11 --containerd=/run/containerd/con tainerd.sock

准启动增加指向insecure-regiastry的密钥仓库位置

systemctl daemon-reload
systemctl restart docker

docker login -u admin -p Harbor12345 http://192.168.190.11

==重载配置文件后,重启服务一个容器状态Exited,如果还是无法开启 sh -x install.sh ==

5.报错:denied: requested access to the resource is denied
需要先登入然后上传

docker login -u admin -p Harbor12345 http://192.168.190.11

docker push 192.168.190.11/myproject/cirros:v1

(三)管理维护Harbor
可以使用 docker-compose 来管理 Harbor。一些有用的命令如下所示,必须在与docker-compose.yml 相同的目录中运行。

修改 Harbor.cfg 配置文件所需选项的步骤
要更改 Harbour 的配置文件时,请先停止现有的 Harbor 实例并更新 Harbor.cfg;然后运行 prepare 脚本来填充配置;最后重新创建并启动 Harbour 的实例。

1.停止现有的Harbor实例并移除

cd /usr/local/harbor
 docker-compose down -v
 ---------------输出内容--------------------
 Stopping nginx … done
 Stopping harbor-jobservice … done
 Stopping harbor-ui … done
 Stopping registry … done
 Stopping harbor-db … done
 Stopping harbor-adminserver … done
 Stopping harbor-log … done
 Removing nginx … done
 Removing harbor-jobservice … done
 Removing harbor-ui … done
 Removing registry … done
 Removing harbor-db … done
 Removing harbor-adminserver … done
 Removing harbor-log … done
 Removing network harbor_harbor

2.修改配置文件 Harbor.cfg

vim harbor.cfg		

./prepare

3.重启服务
docker-compose up -d

-----------输出内容------------
 Creating network “harbor_harbor” with the default driver
 Creating harbor-log … done
 Creating registry … done
 Creating harbor-adminserver … done
 Creating harbor-db … done
 Creating harbor-ui … done
 Creating harbor-jobservice … done
 Creating nginx … done4.启动报错,可能要关闭防火墙
 Creating network “harbor_harbor” with the default driver
 ERROR: Failed to Setup IP tables: Unable to enable SKIP DNAT rule: (iptables failed: iptables --wait -t nat -I DOCKER -i br-25094fc09b3c -j RETURN: iptables: No chain/target/match by that name.
 (exit status 1))关闭防火墙就可
systemctl stop firewalld
 systemctl restart docker
 docker-compose up -d

5.创建Harbor用户

docker进程组 docker主进程_运维_03

然后在对用户进行权限的设置

5.1测试先删除本地镜像
删除之前打标签的镜像

docker rmi 192.168.190.11/myproject/cirros:v1
 -------返回内容-------
 Untagged: 192.168.190.11/myproject/cirros:v2
 Untagged: 192.168.190.11/myproject/cirros@sha256:483f15ac97d03dc3d4dcf79cf71ded2e0995.2测试创建的新用户是否可以下载上传

admin用户登出

docker logout 192.168.190.11
--------返回内容-------
Removing login credentials for 192.168.190.11

登入zhangsan用户

docker login -u zhangsan -p Abc12345 http://192.168.190.11
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
 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-storeLogin Succeeded

下载镜像

docker pull 192.168.190.11/myproject/cirros:v1
v1: Pulling from myproject/cirros
 Digest: sha256:483f15ac97d03dc3d4dcf79cf71ded2e099cf76c340f3fdd0b3670a40a198a22
 Status: Downloaded newer image for 192.168.190.11/myproject/cirros:v1
 192.168.190.11/myproject/cirros:v1

上传镜像

docker tag 192.168.190.11/myproject/cirros:v1 192.168.190.11/myproject/cirros:v2
docker push 192.168.190.11/myproject/cirros:v2
[root@localhost harbor]#docker push 192.168.190.11/myproject/cirros:v2
 The push refers to repository [192.168.190.11/myproject/cirros]
 984ad441ec3d: Layer already exists
 f0a496d92efa: Layer already exists
 e52d19c3bee2: Layer already exists
 v2: digest: sha256:483f15ac97d03dc3d4dcf79cf71ded2e099cf76c340f3fdd0b3670a40a198a22 size: 943

(三)移除Harbor容器及全部数据
移除 Harbor 服务容器同时保留镜像数据/数据库

//在Harbor服务器上操作
docker-compose down -v
Stopping nginx … done
 Stopping harbor-jobservice … done
 Stopping harbor-ui … done
 Stopping registry … done
 Stopping harbor-db … done
 Stopping harbor-adminserver … done
 Stopping harbor-log … done
 Removing nginx … done
 Removing harbor-jobservice … done
 Removing harbor-ui … done
 Removing registry … done
 Removing harbor-db … done
 Removing harbor-adminserver … done
 Removing harbor-log … done
 Removing network harbor_harbor

**注意:**如需重新部署,需要移除Harbor服务器全部数据,持久数据,日志数据。如镜像,数据库等在宿主机的/data目录下,日志在宿主机的/var/log/Harbor目录下

rm -rf /data/database
rm -rf /data/registry/
move this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

下载镜像

docker pull 192.168.190.11/myproject/cirros:v1

v1: Pulling from myproject/cirros
Digest: sha256:483f15ac97d03dc3d4dcf79cf71ded2e099cf76c340f3fdd0b3670a40a198a22
Status: Downloaded newer image for 192.168.190.11/myproject/cirros:v1
192.168.190.11/myproject/cirros:v1

上传镜像

docker tag 192.168.190.11/myproject/cirros:v1 192.168.190.11/myproject/cirros:v2

docker push 192.168.190.11/myproject/cirros:v2

[root@localhost harbor]#docker push 192.168.190.11/myproject/cirros:v2
The push refers to repository [192.168.190.11/myproject/cirros]
984ad441ec3d: Layer already exists 
f0a496d92efa: Layer already exists 
e52d19c3bee2: Layer already exists 
v2: digest: sha256:483f15ac97d03dc3d4dcf79cf71ded2e099cf76c340f3fdd0b3670a40a198a22 size: 943

(三)移除Harbor容器及全部数据
移除 Harbor 服务容器同时保留镜像数据/数据库

//在Harbor服务器上操作

docker-compose down -v

Stopping nginx              ... done
Stopping harbor-jobservice  ... done
Stopping harbor-ui          ... done
Stopping registry           ... done
Stopping harbor-db          ... done
Stopping harbor-adminserver ... done
Stopping harbor-log         ... done
Removing nginx              ... done
Removing harbor-jobservice  ... done
Removing harbor-ui          ... done
Removing registry           ... done
Removing harbor-db          ... done
Removing harbor-adminserver ... done
Removing harbor-log         ... done
Removing network harbor_harbor

**注意:**如需重新部署,需要移除Harbor服务器全部数据,持久数据,日志数据。如镜像,数据库等在宿主机的/data目录下,日志在宿主机的/var/log/Harbor目录下

```bash
rm -rf /data/database
rm -rf /data/registry/