docker学习笔记

Docker&CKA学习笔记(注:本人CKA学习来自阿良教育)
第一章、容器存在的意义、优势、docker介绍
1.1 容器存在的意义

1、上线流程繁琐

开发->测试->申请资源->审批->部>测试等环节

2、资源利用率低

普遍服务器利用率低,造成过多浪费

3、扩容/缩容不及时

业务高峰期扩容流程繁琐,上线不及时

4、服务器环境瘫肿

服务器越来越臃肿,对维护、迁移带来困难

5、环境不一致性

1.2 容器的优势

虚拟机与容器的对比:

虚拟化硬件-->宿主机-->中间软件层-->子系统-->应用

硬件-->主机系统-->docker引擎-->容器应用(相比虚拟化少了一个子系统)

 

Container

VM

启动速度

秒级

分钟级

允许性能

接近原生

5%左右损失

磁盘占用

MB

GB

数量

成百上千

一般几十台

隔离性

进程级

系统级(更彻底)

操作系统

主要支持Linux

几乎所有

封装程度

只打包项目代码和依赖关系,共享宿主机内核

完整的操作系统

1、已知

2、未知

业务机器增加承载量,可以应对一些突发,30%

--弹性伸缩

开发人员:

1、开发项目

2、打包项目环境+代码成镜像

3、部署到容器平台

运维人员:怎么高效去管理这些容器

好处:

1、运维人员节省人工成本

2、持续发布有问题更快解决

1.3 docker介绍

容器:

1、容器提供一个基本的独立环境,实现容器隔离、资源限制主要解决应用层面问题,应用快速部署、高效管理

虚拟机:

1、提升服务器资源利用率

2、提供一个完全隔离的环境

Docker是什么:

(1)使用最广泛的开源容器引擎

(2)一种操作系统级的虚拟化技术

(3)依赖于Linux内核特性: Namespace(资源限制)和Cgroups(资源隔离)

(4)一个简单的应用程序打包工具

Docker设计目标:

  1. 提供简单的应用程序打包工具
  2. 开发人员和运维人员职责逻辑分离
  3. 多环境保持一致性

Docker应用场景:

应用程序打包和发布

应用程序隔离

持续集成

部署微服务

快速搭建测试环境

提供PaaS产品(平台即服务)

第二章、Docker基本组成与使用上

Daocker的基本组成:

Docker客户端-->docker的主机<-->docker镜像

版本所支持平台:

Docker版本:

社区版(CE)

企业版(EE)

支持平台:

Linux

MAC

Windows

2.1 安装docker
2.2 Docker镜像管理
镜像是什么?

一个分层存储的文件,不是一个单一的文件

一个软件的环境

一个镜像可以创建N个容器

一种标准化的交付

一个不包含Linux内核而又精简的Linux操作系统

2、配置加速器
Docker Hub是由Docker公司负责维护的公共像仓库,包含大量的容器镜像,Docker工具默认从这个公共镜像库下载镜像地址: https://hub.docker.com

[root@cka-1 ~]# vi /etc/docker/daemon.json

{

"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]

}

[root@cka-1 ~]# systemctl restart docker.service

多个加速器

[root@libin ~]# cat /etc/docker/daemon.json

{

"registry-mirrors": [

"https://registry.docker-cn.com",

"http://hub-mirror.c.163.com",

"https://docker.mirrors.ustc.edu.cn"

]

}

3、镜像常用的管理命令
命令格式: docker image COMMAND

指令

描述

ls

列出镜像

build

构建镜像来自Dockerfile

history

查看镜像历史

inspect

显示一个或多个镜像详细信息

pull

从镜像仓库拉取镜像

push

推送一个镜像到镜像仓库

rm

移除一个或多个镜像

prune

移除没有被标记或者没有被任何容器引用的镜像

tag

创建一个引用源镜像标记目标镜像

save

保存一个或多个镜像到一个tar归档文件

load

加载镜像来自tar归档或标准输入

4、Docker容器管理
创建容器常用选项
命令格式: docker run [options] image [command] [arg...]

选项

描述

-i, -interactive

交互式

-t, -tty

分配一个伪终端

-d, -detach

运行容器到后台

-e,-env

设置环境变量

-p, -publish list

发布容器端口到主机,暴露端口

-P -publish-all

发布容器所有EXPOSE的端口到宿主机随机端口

--name string

指定容器名称

-h, -hostname

设置容器主机名

--ip string

指定容器IP,只能用于自定义网络

--network

连接容器到一个网络

-v, -volume list

--mount mount (新方式)

将文件系统附加到容器

--restart string

容器退出时重启策略,默认no,可选值: [always|on-failure]

-m,-memory

容器可以使用的最大内存量

-memory-swap

允许交换到磁盘的内存量

-memory-swappiness=<0-100>

容器使用SWAP分区交换的百分比 (0-100,默认为-1)

-oom-kill-disable

禁用OOM Killer

--cpus

可以使用的CPU数量

-cpuset-cpus

限制容器使用特定的CPU核心,如(0-3,0,1)

-cpu-shares

CPU共享 (相对权重)

常用容器管理命令
命令格式:docker contain COMMAND

选项

描述

ls

列出容器

inspect

查看一个或多个容器详细信息

exec

在运行容器中执行命令

commit

创建一个新镜像来自一个容器

cp

拷贝文件/文件夹到一个容器

logs

获取一个容器日志

port

列出或指定容器端口映射

top

显示一个容器运行的进程

stats

显示容器资源使用统计

stop/start/restart

停止/启动一个或多个容器

rm

删除一个或多个容器

prune

移除已停止的容器

Docker实战:
简介:我使用的是VMware workstation的虚拟机俗称docker的宿主机,配置为centos7,4G2C,20G的/,虚拟机网络NAT我物理电脑网卡,物理机上使用mobaxterm工具远程。

[root@localhost ~]# sudo yum install -y yum-utils

添加到yum仓库(建议添加阿里云)

阿里云源:

[root@cka-1 yum.repos.d]# sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

[root@cka-1 yum.repos.d]#sudo 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

[root@localhost ~]# sudo yum-config-manager \

> --add-repo \

> https://download.docker.com/linux/centos/docker-ce.repo

卸载旧版本

[root@localhost ~]# sudo yum remove docker \

> docker-client \

> docker-client-latest \

> docker-common \

> docker-latest \

> docker-latest-logrotate \

> docker-logrotate \

> docker-engine

查看可用的版本

[root@cka-1 ~]# yum list docker-ce --showduplicates | sort -r

安装社区版docker

[root@cka-1 ~]# yum install docker-ce -y

启动和开机自启

[root@cka-1 ~]# systemctl start docker

[root@cka-1 ~]# systemctl enable docker

Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.

查看已安装的docker的详细信息

[root@cka-1 ~]# docker info

[root@cka-1 ~]# docker ps(列出有哪些容器)

[root@cka-1 diff]# docker container ls(与docker ps一样)

关闭selinux

[root@cka-1 ~]# vim /etc/selinux/config

SELINUX=disabled

[23:36:14 root@libin3 ~]# getenforce

Disabled

关闭防火墙

[root@cka-1 ~]# systemctl stop firewalld.service

[root@cka-1 ~]# systemctl disable firewalld.service

[root@cka-1 ~]# iptables -vnL

重启

[root@cka-1 ~]# shutdown -r 0

配置docker加速器

[root@cka-1 ~]# vi /etc/docker/daemon.json

{

"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]

}

[root@cka-1 ~]# systemctl restart docker.service

可用查看配置的加速器

[root@cka-1 ~]# docker info | grep -A2 "Registry Mirrors"

Registry Mirrors:

https://b9pmyelo.mirror.aliyuncs.com/

启动一个nginx镜像

旧[root@cka-1 ~]# docker run -d nginx

新[root@cka-1 ~]# docker container run -d nginx

列出本地的镜像

[root@cka-1 ~]# docker image ls

查看一个镜像有哪些步骤

[root@cka-1 ~]# docker history nginx

以json形式查看镜像的详细信息

[root@cka-1 ~]# docker inspect nginx

移除所有没有与容器关联的镜像

[root@cka-1 ~]# docker image prune -a

镜像的导出并拷贝到其他机器导入(场景:将一个能上网的机器使用先使用docker pull到本地,再docker save命令将镜像导出,再通过scp到不能上网的机器上,在不能上网的机器上使用docker load导入到本地)

[root@cka-1 ~]# docker pull redis

导出归档包,

[root@cka-1 ~]# docker save redis -o redis.tar

[root@cka-1 ~]# du -sh redis.tar

不解压查看内容,校验时如果内容发生变化,就会从镜像仓库去拉取最新的

[root@cka-1 ~]# tar xvf redis.tar

拷贝到一台不能上网的机器

[root@cka-1 ~]# scp redis.tar root@192.168.137.135:~

将镜像导入到本地

[root@libin ~]# docker load -i redis.tar

再启动镜像

[root@libin ~]# docker run -d redis

如果需要访问,就需要暴露一个端口

[root@cka-1 ~]# docker run -d -p 8080:80 nginx

746f043e8c88303bbbef800b0c79eaee503ff91defd2c6880bd3cd439c05fb3f

测试

[root@libin ~]# curl 192.168.137.136:8080

Docker容器管理:

先查看容器ID(-l:查看最新的容器)

[root@cka-1 ~]# docker ps

进入到容器

[root@cka-1 ~]# docker exec -it 746f043e8c88 bash

root@746f043e8c88:/#

root@746f043e8c88:/# exit

先启动一个centos的镜像

[root@cka-1 ~]# docker run -d centos (退出状态)

再启动一个nginx的镜像(启动状态)

[root@cka-1 ~]# docker run -d nginx

[root@cka-1 ~]# docker run -it -d nginx(启动状态)

[root@cka-1 ~]# docker run -it -d centos(启动状态)

说明:centos室没有任何进程,nginx有守护进程,-it为容器提供伪终端,去hang住了容器,因此才不会退出,-d是放到后台去使用

-e设置一个变量到容器中;-p (s宿主机端口88:80服务端口) ;-name 设置容器名字;-h 设置主机名 --restart=always(设置容器自动启动)

[root@cka-1 ~]# docker run -d -e env=cka_prod -p 88:80 --name web -h web --restart=always nginx

edb6fedd54a00472dfffa718377fde02f2bf9d173e69e306e7a6bab1d1c0548c

进入web容器并配置页面或者免交互

[root@cka-1 diff]# docker exec web ls(免交互对容器指向命令)

[root@cka-1 ~]# docker exec -it web bash

root@web:/# cd /usr/share/nginx/

root@web:/usr/share/nginx# ls

html

root@web:/usr/share/nginx# cd html/

root@web:/usr/share/nginx/html# ls

50x.html index.html

root@web:/usr/share/nginx/html# echo "<h1>welcome to study k8s</h1>" > index.html

查看变量

root@web:/usr/share/nginx/html# exit

exit

[root@cka-1 ~]# docker exec -it web bash

root@web:/# hostname

web

root@web:/# echo $env

cka_prod

查看容器的视图

限制容器内存和cpu(最多使用500M和1核CPU)

[root@cka-1 diff]# docker run -m="500m" --cpus="1" -d nginx

查看一个容器的日志

查看一个容器的端口

[root@cka-1 diff]# docker port web

80/tcp -> 0.0.0.0:88

80/tcp -> :::88

查看容器的进程

[root@cka-1 diff]# docker top web

查看容器的资源使用率,例如打印CPU使用率

[root@cka-1 diff]# docker stats web --no-stream | awk 'NR==2{print $3}'

查看所有状态的容器

[root@cka-1 diff]# docker ps -a

查看所有容器的ID

[root@cka-1 diff]# docker ps -q

快速移除以退出的容器

[root@cka-1 diff]# docker container prune

[root@cka-1 diff]# docker rm $(docker ps -q)

强制删除所有的容器

[root@libin ~]# docker rm -f $(docker ps -q)

容器数据持久化

(1)Docker提供三种方式将数据从宿主机挂载到容器中:

volumes: Docker管理宿主机文件系统的一部分 (/var/lib/docker/volumes)保存数据的最佳方式。

bind mounts: 将宿主机上的任意位置的文件或者目录挂载到容器中。

内存方面:基本不用

volumes示例:

1、创建数据卷

# docker volume create nginx-vol

# docker volume ls

#docker volume inspect nginx-vol

  1. 使用数据卷

# docker run -d --name=nginx-test --mount type=bind,src=/app/wwwroot.dst=/usr/share/nginx/htmI nginx

# docker run -d --name=nginx-test -v /app/wwwroot:/usr/share/nginx/htmI nginx

bind mounts示例:

1、挂载宿主机目录到容器

# docker run -d --name=nginx-test --mount src=nginx-vol,dst=/usr/share/nginx/html nginx

# docker run -d --name=nginx-test -v nginx-vol:/usr/share/nginx/htmI nginx

把上个实验的容器给清空(容器删除,容器里面的内容也会被删除)

[root@cka-1 ~]# docker rm -f $(docker ps -q)

bind mounts的方式:/opt/www/cka/目标容器的目录,也就是持久化的目录

挂载宿主机目录到容器(名字为web 暴露宿主机端口为88,容器端口为80)

[root@cka-1 ~]# docker run -d --name web -p 88:80 -v /opt/www/cka/:/usr/share/nginx/html nginx

[root@cka-1 ~]# docker run -d -e env=cka_prod -p 88:80 --name web -h web -v /opt/www/cka/:/usr/share/nginx/html --restart=always nginx(这里多了开机自启)

这里变成403的原因是宿主机将nginx的网页覆盖了

进入nginx容器,编辑一个网页

[root@cka-1 ~]# docker exec -it web bash

root@e081d06c49c7:/# cd /usr/share/nginx/html/

root@e081d06c49c7:/usr/share/nginx/html# echo "<h1>welcom to study k8s_cka</h1>" > index.html

root@e081d06c49c7:/usr/share/nginx/html# exit

在宿主机上,修改页面

[root@cka-1 ~]# vim /opt/www/cka/index.html

再删除容器,再启动容器,我们看看是什么现象,页面是不会改变的

[root@cka-1 ~]# docker rm -f web

web

总结:制作镜像

  1. 启动容器之后的应用程序服务产生的数据尽量放到一个目录下 /data
  2. 构建镜像时是不能将已经生成的应用程序数据打包进去的,因为宿主机的目录会覆盖到容器中
容器网络

容器网络命令空间:

容器内(eth0:172.17.0.2)<---网线veth--->docker0(交换机)-->宿主机eth0:192.168.0.2

引入docker0一方面时解决容器之间在二层里面通信;能让容器的数据包到达宿主机上;能让宿主机上的数据包通过docker0网桥给流入到容器里面;

veth pair:成对出现的一种虚拟网络设备,数据从一端进从另一端出。用于解决网络命名空间之间隔离。

docker0:网桥是一个二层网络设备,通过网桥可以将Linux支持的不同的端口连接起来,并实现类似交换机那样的多对多的通信。

Docker使用iptables实现网络通信:

(1)外部访问容器:(DNAT目标地址转换,88->80)

iptables -t nat -vnL DOCKER

数据包(外界)-->eth0--DNAT-->docker0-->veth-->eth0(容器)

(2)容器访问外部(源地址转换):

iptables -t nat -vnL POSTROUTING

数据包(容器)-->eth0--veth-->docker0-->snat-->eth0(外界)

[root@cka-1 ~]# docker run -d -it busybox

[root@cka-1 ~]# docker exec -it e8cf22ce39a4 sh

/ # ping www.baidu.com

[root@cka-1 ~]# iptables -t nat -vnL POSTROUTING

dockerfile概述

Docker通过Dockerfile自动构建镜像,Dockerfile是一个包含用于组建镜像的文本文件,由一条一条的指令组成。

逐步执行:

FROM centos:laster(引用镜像)

LABEL maintalner cka(打标签)

RUN yum install gcc -y(执行shell命令)

COPY run.sh /usr/bin(拷贝一个文件)

EXPOSE 80(声明暴露一个端口不是实际暴露)

CMD [“run.sh”](启动应用程序)

指令

描述

FROM

构建新镜像是基于哪个镜像

LABEL

标签

RUN

构建镜像时运行的Shell命令

COPY

拷贝文件或目录到镜像中

ADD

解压压缩包并拷贝

ENV

设置环境变量

USER

为RUN、CMD、ENTRYPOINT执行命令指定运行用户

EXPOSE

声明容器运行的服务端口

WORKDIR

为RUN、CMD、ENTRYPOINT、COPY和ADD设置工作目录

CMD

运行容器时默认执行,如果有多个CMD指令,最后一个生效

构建镜像命令:

Usage: docker build [OPTIONS] PATH URL | - [flags]

Options:

-t,--tag list # 镜像名称

-f --file string # 指定Dockerfile文件位置

# docker build -t shykes/myapp .

# docker build -t shykes/myapp -f /path/Dockerfile /path

# docker build -t shykes/myapp http://www.example.com/Dockerfile

构建dockerfile(任何应用程序都应放到前台去启动)
7.1 构建NGINX镜像和tomcat镜像
7.1.1构建nginx镜像

[root@cka-1 ~]# mkdir dockerfile

[root@cka-1 ~]# cd dockerfile/

[root@cka-1 dockerfile]# vim Dockerfile (这里只能能写Dockerfile;这里采用yum方式安装nginx,编译的方式后面我也实验了)

FROM centos:7

RUN yum install epel-release -y && \

yum install nginx -y

CMD ["nginx","-g","daemon off;"]

编译的方式:

FROM centos:7

LABEL maintainer www.ctnrs.com

RUN yum install -y gcc gcc-c++ make \

openssl-devel pcre-devel gd-devel \

iproute net-tools telnet wget curl && \

yum clean all && \

rm -rf /var/cache/yum/*

ADD nginx-1.15.5.tar.gz /

RUN cd nginx-1.15.5 && \

./configure --prefix=/usr/local/nginx \

--with-http_ssl_module \

--with-http_stub_status_module && \

make -j 4 && make install && \

mkdir /usr/local/nginx/conf/vhost && \

cd / && rm -rf nginx* && \

In -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

ENV PATH $PATH:/usr/local/nginx/sbin

COPY nginx.conf /usr/local/nginx/conf/nginx.conf

WORKDIR /usr/local/nginx

EXPOSE 80

CMD ["nginx","-g","daemon off;"]

[root@cka-1 dockerfile]# docker build -t nginx:v1 .

如果构建dockerfile时报错:

临时解决:

[root@cka-1 dockerfile]# echo 1 > /proc/sys/net/ipv4/ip_forward (打开内核转发功能)

[root@cka-1 dockerfile]# echo 1 >/proc/sys/net/bridge/bridge-nf-call-iptables

[root@cka-1 dockerfile]# sysctl -w net.ipv4.ip_forward=1

永久解决:(我这里采用这种)

[root@cka-1 dockerfile]# vi /etc/sysctl.conf

net.ipv4.ip_forward=1

[root@cka-1 dockerfile]# systemctl restart network

[root@cka-1 dockerfile]# systemctl restart docker

链接:https://pan.baidu.com/s/1zr53ZP73zJ-qShXf6mPYEQ?pwd=fcjq
提取码:fcjq (这里有nginx tomcat php 等dockerfile,但是前提是你的实验环境网络能通外部网络)

编译安装nginx

[root@cka-1 ~]# unzip dockerfile.zip

[root@cka-1 ~]# cd dockerfile/

[root@cka-1 dockerfile]# ls

Dockerfile java nginx php tomcat

[root@cka-1 dockerfile]# cd nginx/

[root@cka-1 nginx]# ll

总用量 1016

-rw-r--r-- 1 root root 709 6月 20 2020 Dockerfile

-rw-r--r-- 1 root root 1024791 10月 2 2018 nginx-1.15.5.tar.gz

-rw-r--r-- 1 root root 794 6月 20 2020 nginx.conf

-rw-r--r-- 1 root root 429 6月 20 2020 php.conf

[root@cka-1 nginx]# cat Dockerfile (编译安装nginx)

FROM centos:7

LABEL maintainer www.ctnrs.com

RUN yum install -y gcc gcc-c++ make \

openssl-devel pcre-devel gd-devel \

iproute net-tools telnet wget curl && \

yum clean all && \

rm -rf /var/cache/yum/*

ADD nginx-1.15.5.tar.gz /

RUN cd nginx-1.15.5 && \

./configure --prefix=/usr/local/nginx \

--with-http_ssl_module \

--with-http_stub_status_module && \

make -j 4 && make install && \

mkdir /usr/local/nginx/conf/vhost && \

cd / && rm -rf nginx* && \

ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

ENV PATH $PATH:/usr/local/nginx/sbin

COPY nginx.conf /usr/local/nginx/conf/nginx.conf

WORKDIR /usr/local/nginx

EXPOSE 80

CMD ["nginx", "-g", "daemon off;"]

[root@cka-1 nginx]# docker build -t nginx:v2 .

启动容器

[root@cka-1 tomcat]# docker run -d --name web2 -p 90:80 -v /opt/www/cka/:/usr/share/nginx/html nginx:v2

访问http://192.168.137.136:90/ 发现是原始网页,原因编译安装容器根目录(/usr/local/nginx )不一样

再重新映射一下,再访问http://192.168.137.136:92

[root@cka-1 tomcat]# docker run -d --name web4 -p 92:80 -v /opt/www/cka/:/usr/local/nginx/html nginx:v2

7.1.2构建tomcat镜像

安装tomcat

[root@cka-1 nginx]# cd ..

[root@cka-1 dockerfile]# cd tomcat/

[root@cka-1 tomcat]# ll

总用量 27336

-rw-r--r-- 1 root root 9717059 7月 5 2019 apache-tomcat-8.5.43.tar.gz

-rw-r--r-- 1 root root 575 6月 20 2020 Dockerfile

-rw-r--r-- 1 root root 18265402 6月 20 2020 ROOT.war

[root@cka-1 tomcat]# cat Dockerfile

FROM centos:7

MAINTAINER www.ctnrs.com

ENV VERSION=8.5.43

RUN yum install java-1.8.0-openjdk wget curl unzip iproute net-tools -y && \

yum clean all && \

rm -rf /var/cache/yum/*

ADD apache-tomcat-${VERSION}.tar.gz /usr/local/

RUN mv /usr/local/apache-tomcat-${VERSION} /usr/local/tomcat && \

sed -i '1a JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom"' /usr/local/tomcat/bin/catalina.sh && \

ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

ENV PATH $PATH:/usr/local/tomcat/bin

WORKDIR /usr/local/tomcat

EXPOSE 8080

CMD ["catalina.sh", "run"]

[root@cka-1 tomcat]# docker build -t tomcat:cka .

启动容器tomcat,并暴露端口8081,服务端口为8080

[root@cka-1 tomcat]# docker run -d -p 8081:8080 tomcat:cka

a367282298c942cea202a7edb1d2d703158c21e55d8d32fabf1d1bad298b6fd9

访问http://192.168.137.136:8081/

进入tomcat容器并修改(记住路径:/usr/local/tomcat/webapps/ROOT)

[root@cka-1 tomcat]# docker exec -it a367282298c942cea202a7edb1d2d703158c21e55d8d32fabf1d1bad298b6fd9 bash

[root@a367282298c9 tomcat]# cd webapps/ROOT/

[root@a367282298c9 ROOT]# echo "<h1>welcome to sudy tomcat</h1>" > index.jsp

再访问http://192.168.137.136:8081/(jsp也能识别html,)

将宿主机页面替换容器界面

[root@cka-1 tomcat]# docker run -d -p 8082:8080 -v /opt/www/cka/:/usr/local/tomcat/webapps/ROOT tomcat:cka

7ec34368eaf4504fa43c48b5bb7a23eedb5855c43acfe6fb9cf06e05ca3f86af

再访问http://192.168.137.136:8082

Harbor镜像仓库搭建与使用

Harbor概述

Harbor是由VMWare公司开源的容器镜像仓库。事实上,Harbor是在Docker Registry上进行了相应的企业级扩展,从而获得了更加广泛的应用,这些新的企业级特性包括:管理用户界面,基于角色的访问控制 ,AD/LDAP集成以及审计日志等,足以满足基本企业需求。

官方:https://goharbor.io/

Github:https://github.com/goharbor/harbor

Harbor部署:先决条件

服务器硬件配置:

最低要求:CPU2核/内存4G/硬盘40GB

推荐:CPU4核/内存8G/硬盘160GB

软件:

Docker CE 17.06版本+

Docker Compose 1.18版本+

Harbor安装有2种方式:

在线安装:从Docker Hub下载Harbor相关镜像,因此安装软件包非常小

离线安装:安装包包含部署的相关镜像,因此安装包比较大

Harbor部署

1、先安装Docker和Docker Compose

https://github.com/docker/compose/releases

2、部署Harbor HTTP

# tar zxvf harbor-offline-installer-v2.0.0.tgz

# cd harbor

# cp harbor.yml.tmpl harbor.yml

# vi harbor.yml

hostname: reg.ctnrs.com

https: # 先注释https相关配置

harbor_admin_password: Harbor12345

# ./prepare

# ./install.sh

Harbor基本使用

1、配置http镜像仓库可信任

# vi /etc/docker/daemon.json

{"insecure-registries":["reg.ctnrs.com"]}

# systemctl restart docker

2、打标签

# docker tag centos:7 reg.ctnrs.com/library/centos:7

3、上传

# docker push reg.ctnrs.com/library/centos:7

4、下载

# docker pull reg.ctnrs.com/library/centos:7

链接:https://pan.baidu.com/s/1EZOtXAKLzllZOGJMxQQxdA?pwd=vors
提取码:vors (这为Harbor离线包)
链接:https://pan.baidu.com/s/15A3LVJ_vmChh9o_7URzfiw?pwd=bmcu
提取码:bmcu (这为docker-compose工具)

这里为我实验的操作

移动docker-compose工具到/usr/bin

[root@cka-1 ~]# mv docker-compose-Linux-x86_64 /usr/bin/docker-compose

给个执行权限(就能执行docker-compose 命令了)

[root@cka-1 ~]# chmod +x /usr/bin/docker-compose

解压harbor

[root@cka-1 ~]# tar zxvf harbor-offline-installer-v2.0.0.tgz

[root@cka-1 ~]# cd harbor/

[root@cka-1 harbor]# ls

common.sh harbor.v2.0.0.tar.gz harbor.yml.tmpl install.sh LICENSE prepare

[root@cka-1 harbor]# cp harbor.yml.tmpl harbor.yml

设置成IP访问

[root@cka-1 harbor]# vim harbor.yml

hostname: 192.168.137.136

#https:

#port: 443

#certificate: /your/certificate/path

#private_key: /your/private/key/path

初始化,下面这里安装需要一定时间,耐心等待

[root@cka-1 harbor]# ./prepare

导入镜像

[root@cka-1 harbor]# ./install.sh

查看当前服务启动的状态

访问http://192.168.137.136/,默认用户名admin,密码为Harbor12345

推送镜像,先给本地镜像重新命名

192.168.137.136/library为远程仓库的地址,可以在看下面截图出,重新打标记

[root@cka-1 harbor]# docker tag tomcat:cka 192.168.137.136/library/tomcat:v1

上传,这时需要配置http镜像仓库可信任

[root@cka-1 harbor]# docker push 192.168.137.136/library/tomcat:v1

The push refers to repository [192.168.137.136/library/tomcat]

Get "https://192.168.137.136/v2/": dial tcp 192.168.137.136:443: connect: connection refused

[root@cka-1 harbor]# ss -antp | grep 443

这里注意,我前面可能用到多个加速器,如果在这可能会导致重启docker失败,所有就使用下面两个就行

[root@cka-1 harbor]# vim /etc/docker/daemon.json(每个加速器后加逗号)

{

"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"],

"insecure-registries": ["192.168.137.136"]

}

[root@cka-1 harbor]# systemctl restart docker.service

查看是否配置成功

[root@cka-1 harbor]# docker info | grep -A2 "Registries"

刚刚因为我排错docker服务重启失败了,harbor挂了,所以我这里再重新启动

[root@cka-1 harbor]# docker-compose up -d (重新启动harbor)

[root@cka-1 harbor]# docker-compose stop (为关闭所有的容器,介绍)

上传镜像前,我们需要先登录,再进行推送到harbor仓库

[root@cka-1 harbor]# docker login 192.168.137.136

[root@cka-1 harbor]# docker push 192.168.137.136/library/tomcat:v1

这时我们就可以看到上传的镜像仓库了

http://192.168.137.136/harbor/projects/1/repositories

这样就推送成功了

再push一个nginx到harbor仓库

[root@cka-1 harbor]# docker tag nginx:v2 192.168.137.136/library/nginx:cka

[root@cka-1 harbor]# docker push 192.168.137.136/library/nginx:cka

拉取一个镜像,我这里再启动一台192.168.137.135,并配置加速器

[root@libin ~]# vim /etc/docker/daemon.json

{

"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"],

"insecure-registries": ["192.168.137.136"]

}

[root@libin ~]# docker system prune -a(发现拉取不了,清理掉系统无用的镜像)

再尝试拉取,便成功了

[root@libin ~]# docker pull 192.168.137.136/library/nginx@sha256:dc0cf2c3fb1ab3afe5ebdfd4e854cda66458ecd9b5121cd38aa3007b4d99a102

直接使用推送的地址也能拉取

[root@libin ~]# docker pull 192.168.137.136/library/tomcat:v1

启动一个nginx的容器

[root@libin ~]# docker run -d -p 88:80 192.168.137.136/library/nginx:cka

ec493f4bdc88c2c4f3f788b26d0f0b99b1d0fc023003b20fbf643d63f696bffb

编辑nginx网页

[root@libin ~]# docker exec -it mystifying_cori bashdock

[root@ec493f4bdc88 nginx]# echo "<h1>welcome go to changsha</h1>" >html/index.html

到此,docker的入门学习结束。

posted @ 2022-12-09 21:35  LB_运维技术  阅读(214)  评论(0编辑  收藏  举报