1、使用虚拟机的目的
实现应用运行环境的隔离,减少服务器的资源浪费
2、虚拟机应用怎么访问硬件资源(硬件平台虚拟化方式/主机虚拟化)
- app向Guest OS发起请求
- Guest OS 向Hypervisor发起请求
- Hypervisor向Host OS 发起请求
- Host OS 以自己身份操作硬件
APP使用硬件资源必须进行多级调度
3、虚拟机应用怎么访问硬件资源(操作系统虚拟化方式/容器)
- app直接向HOST OS发起请求
- HOST OS 直接操作硬件
4、主机虚拟化与容器虚拟化的优缺点
主机虚拟化
- 优点
- 应用程序运行环境强隔离
- 虚拟机操作系统与底层操作系统无关化
- 虚拟化内部操作不会影响到物理机
- 缺点
- 拥有操作系统会占用部署资源及存储
- 网络传输效率低
- 当应用程序调用硬件是响应用户访问时间延迟大
容器虚拟化
- 优点
- 可以实现应用程序的隔离
- 直接使用物理机的操作系统可以快速响应用户的请求
- 不占用部署时间
- 占用少量的磁盘空间
- 缺点
- 学习成本增加,操作控制复杂,服务治理复杂
- 容器的隔离性差
5、三种云平台架构
-
IaaS 提供虚拟机
- 阿里云 ECS
- OpenStack VM实例
-
PaaS 容器级服务(CaaS)
- LXC
- Docker
- OpenShift
- Rancher
-
SaaS 应用程序
- 互联网中的应用都是
6、容器有独立的
- UTS主机名\用户名
- Mount文件系统
- IP
- User(用户)
- PID(进程数)
- IPC虚拟机内部之间的通信
容器技术使用到了Linux内核中的NameSpace,一个隔离处理的容器就是一个NameSpace命名空间,一个虚拟机就是一个域
- UTS: 每一个NameSpace都拥有独立的主机或域名,可以把每个NameSpace认为一个独立主机
- IPC: 每个容器依旧使用linux内核中进程交互的方法,实现进程间的通信
- Mount: 每个容器的文件系统是独立的
- Net:每个容器的网络是隔离的
- User: 每个容器的用户和组ID是隔离的,每个容器都拥有root用户
- PID:每个容器都拥有独立的进程树,容器是物理机的一个进程,所以容器中的进程是物理机的线程
什么是命名空间:
- 应用程序运行环境隔离的空间,就是一个容器,每一个容器都将拥有UTS,IPC,Mount,Net,User, PID六个命名空间
虚拟机通过Hypervisor(虚拟机监视器)中的 VMM实现资源的隔离
- VMM
- 分配虚拟机所使用的CPU,核心数,内存,磁盘
- 适配模型
容器使用到了CGroups内核技术
CGroups(控制组): 用于实现容器的资源隔离、限制和审计
- 可对进程做资源隔离
- 9大子系统
- 把资源定义为子系统,可以通过子系统对资源进行限制
- CPU 可以让进程使用CPU的比例,时间片划分
- memory限制内存使用,linux虚拟机使用虚拟内存,包括物理内存和虚拟交换分区
- blkio 限制块设备的IO(输入输出)带宽
- cpuacct 生成CGroups 使用CPU的资源报告
- cpuset 用于多CPU执行CGroups时,对进程进行CPU分组
- devices允许或拒绝设备的访问
- freezer暂停或恢复cgroup运行
- net_cls 标记每个网络包
- ns 名称空间子系统
主机虚拟化实现资源隔离的方式
- 使用 Hypervisor中的VMM实现资源隔离
- PAM(ssh su sudo samba gdm kdm ftp)
- 用户认证
- 资源限制
- ulimit(linux 中命令: ulimit -a)
- cat /etc/security/limits.conf
- 仅对用户做资源限制
容器管理工具介绍
- LXC
- 2008
- 是第一套完整的容器管理解决方案
- 不需要任何补丁直接运行在linux内核之上的管理容器
- 创建容器慢,不方便移植
- docker
- 2013
- dotcloud(公司后更名Docker)
- 是在LXC基础上发展起来的
- 拥有一套容器管理生态系统
- 生态系统包括:容器镜像、注册表、RESTFUL API及命令行操作界面
- 属于容器管理系统
docker
- 容器管理系统
- 可以运行在windows上,但只能运行在Linux内核中
容器&镜像&仓库之间的关系
client客户端通过命令docker build/pull/run 将指令发送给DOCKER_HOST中的Docker daemon,Docker daemon 在本地镜像中拉取容器,仓库用于存储容器的镜像,docker在本地没有镜像的时候会去仓库中下载镜像再启动容器
镜像是容器的模板,如果容器没有运行命令就会停止容器
docker daemon 管理
- 远程管理docker daemon
- 可以把docker client与docker daemon分开部署
- 可以通过第三方软件管理docker daemon创建的容器
docker的守护进程 docker daemonn
Docker安装
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
systemctl enable docker
docker version
docker有两种命令
docker --help
- 管理命令(Management Commands)
- 普通命令(Commends)
管理命令是对普通命令的分类和补充
容器镜像分类
- 系统镜像
- 应用镜像
搜索镜像(dockerhub)
docke search rhel7
管理命令搜索: docker image --help
获取镜像:pull --Pull an image or a repository to a registry
registry 注册室的隔间放置镜像(image)或者仓库(repo)
dockerhub -> regitry
library -> repo
docker容器镜像的传输
docker save -- Save one or more images to a tar archive
- 本地容器镜像打包
docker save -o centos.tar centos:latest # 将镜像打包传输到本地
- 传输到其他服务器
scp centos.tar 192.168.174.10:/root/
- 导入到本地目录
docker load --Load an image from a tar archive or STDIN
加载镜像从一个tar 包或一个标准输入
docker load -i centos.tar
docker images
启动容器
docker run -- Run a command in a new container
docker run -it --name=test centos:latest /bin/bash
# -i 交互式命令 -t 给一个终端 容器名称 镜像名 执行的命令
docker exec -- Run a command in a running container
docker exec test ip a
attach -- Attach local standard input, output, and error streams to a running container
# 只能进入开启的容器
[root@server1 ~]# docker start c1
c1
[root@server1 ~]# docker attach c1
[root@07970fe23c0a /]# exit
- 运行apache
httpd -k start
把正在运行的容器打包后作为容器镜像
docker export -- Export a container's filesystem as a tar archive
docker import -- Import the contents from a tarball to create a filesystem image
docker export -o centos-httpd.tar test
docker import -m httpd centos-httpd.tar centos-httpd:v1
# -m set commit message for imported image
# :v1 :TAG 打标签
查看容器IP地址
ip a
docker0
# 容器默认的网桥
yum install iproute
- 查看容器的详细信息
inspect -- Return low-level information on Docker objects
删除容器
docker rm -- Remove one or more containers
docker rmi -- Remove one or more images
端口按端口号可以分为3大类:
1:公认端口(Well Known Port)
公认端口号从0到1023,它们紧密绑定与一些常见服务,例如FTP服务使用端口21,你在 /etc/services 里面可以看到这种映射关系。
2:注册端口(Registered Ports):
从1024到49151。它们松散地绑定于一些服务。也就是说有许多服务绑定于这些端口,这些端口同样用于许多其它目的.
3: 动态或私有端口(Dynamic and/or Private Ports)
动态端口,即私人端口号(private port numbers),是可用于任意软件与任何其他的软件通信的端口数,使用因特网的传输控制协议,或用户传输协议。动态端口一般从49152到65535
本机创建目录作为容器的挂载目录
[root@server1 ~]# mkdir /opt/cvolume
[root@server1 ~]# docker run -it -v /opt/cvolume/:/data --name c3 centos:latest /bin/bash
[root@dec505b6eeda /]# ls
bin data dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
容器时间同步
docker run -it -v /etc/localtime:/etc/localtime centos:latest /bin/bash
容器外执行容器内的命令
docker exec c1 ls
容器之间使用Link连接
- 在容器的编排部署中使用
- 如果一个容器服务依附于另一个容器服务
[root@server1 ~]# docker run -it --name c202 centos:latest /bin/bash
# ctrl + q + p 在不关闭容器的前提瞎,将终端页面转为server1
[root@6aaf41b6cd0b /]# read escape sequence
# 重新进入容器
[root@server1 ~]# docker attach c202
[root@6aaf41b6cd0b /]# read escape sequence
# 将c202容器作为mysqldb服务端连接到c203容器,mysqldb为c202的容器别名
[root@server1 ~]# docker run --link c202:mysqldb -it --name c203 centos:latest /bin/bash
[root@ccfae7f17e1f /]# ping mysqldb
PING mysqldb (172.17.0.2) 56(84) bytes of data.
64 bytes from mysqldb (172.17.0.2): icmp_seq=1 ttl=64 time=0.311 ms
64 bytes from mysqldb (172.17.0.2): icmp_seq=2 ttl=64 time=0.065 ms
^C
--- mysqldb ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1003ms
rtt min/avg/max/mdev = 0.065/0.188/0.311/0.123 ms
[root@ccfae7f17e1f /]# cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2 mysqldb 6aaf41b6cd0b c202
172.17.0.3 ccfae7f17e1f
容器镜像介绍
Docker镜像就是一组只读的目录。或者只读的Docker容器模板,镜像中含有一个Docker容器运行所需的文件系统。所以我们说Docker镜像就是启动一个Docker容器的基础。
容器镜像基础制作
- 部署一台最小化软件安装的操作系统
- 打包操作系统的根目录
- 排除/proc和/sys目录
启动状态的主机一定会包含主机进程以及这个主机所包含的设备映射,打包根目录一定要排除/proc目录,它会给每一个进程创建一个文件夹,每一个文件夹中保存着进程所使用的文件的描述符等相关信息,以及包含着设备映射信息的/dev 目录
root也无权在sys文件夹中创建目录
[root@server3 ~]# tar --numeric-owner --exclude=/proc --exclude=/sys -cvf centos7.5-base.tar /
# --numeric-owner 将打包里面所有的文件和目录,所有的属组和属组都变成数字
- 使用docker import导入至容器的运行主机
[root@server3 ~]# docker import centos7.5-base.tar centos7.5:latest
sha256:f506d533dc22a08fe59b05b3642c964577461b3f6846ca864a11e540eceb2c8a
[root@server3 ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
centos7.5 latest f506d533dc22 15 seconds ago 2.47GB
- 使用基础镜像启动容器
[root@server3 ~]# docker run -it --name centos centos7.5 /bin/bash
[root@16d1904e3d36 /]# ip a s
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
6: eth0@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
应用镜像制作
- 指应用程序运行的环境
commit -- Create a new image from a contaner's cahnges
[root@server1 ~]# docker run -it --name centos6u7 centos /bin/bash
[root@6cd5e2ec3e9f /]#
[root@server1 ~]# docker attach centos6u7
[root@6cd5e2ec3e9f /]# yum install httpd
[root@server1 ~]# docker commit centos6u7 centos6u7-httpd:v1
sha256:fd61b7a544d00d63205f1f37b43449cd2635de7cac57699269246b6f831aa689
[root@server1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos6u7-httpd v1 fd61b7a544d0 11 seconds ago 233MB
centos latest 5d0da3dc9764 2 months ago 231MB
使用Dockerfile创建应用镜像
build -- Build an image from a Dockerfile
Dockerfile工作原理
按照Dockerfile文件所定义内容传创建临时性容器,把Dockerfile中所定义的每行命令在临时容器中执行,然后生成镜像分层,所有命令执行结束后,生成一个新的镜像,中间过程为commit操作。
- 执行命令越多,最终得到的容器应用镜像越大,所以要做优化
Dockerfile关键字
- FROM (指定基础image)
- MAINTAINER(用来指定镜像创建者的信息)
- RUN(运行命令)
- CMD(设置container启动时执行的操作)
- ENTRYPOINT(设置container启动时执行的操作们,可以执行多个操作)
- USER(设置container容器的用户)
- EXPOSE(指定容器需要映射到宿主机器的端口)
- ENV(用于设置环境变量)
- ADD(从src复制文件到container的dest路径)
- VOLUME(指定挂载点)
- WORKDIR(切换目录)
应用案例
通过Dockerfile创建一个可以在启动容器时就直接启动httpd应用的镜像
- 创建目录,同于存储Dockerfile所使用的文件,隔离程序运行过程的环境
- 在此目录中创建Dockerfile文件及制作镜像所使用的httpd文件
- 使用Docker build读取Dockerfile文件创建镜像
- 使用创建的镜像启动容器(验证)
[root@server1 ~]# mkdir dockerbuild
[root@server1 ~]# cd dockerbuild/
[root@server1 dockerbuild]# vim run-httpd.sh
[root@server1 dockerbuild]# cat run-httpd.sh
#!/bin/bash
rm -rf /run/httpd/* # 删除apache的pid进程,防止容器原有的httpd进程影响脚本运行
exec /sbin/httpd -D FOREGROUND # (httpd -k start运用/sbin/httpd)-D 指定apache运行在前端
[root@server1 dockerbuild]# vim index.html
[root@server1 dockerbuild]# cat index.html
It's works !!!
[root@server1 dockerbuild]# cat Dockerfile
FROM centos # 基础镜像
MAINTAINER "mocking@gail.com" #作者信息
RUN yum clean all && rpm --rebuilddb
RUN yum -y install httpd # 执行的命令
ADD run-httpd.sh /run-httpd.sh # 将脚本文件添加到容器的根目录
RUN chmod -v +x /run-httpd.sh # 给脚本文件加执行权限
ADD index.html /var/www/html # 网页文件
EXPOSE 80 # 暴露端口
WORKDIR / # 切换目录
CMD ["/bin/bash","/run-httpd.sh"] # 用/bin/bash 命令运行脚本
[root@server1 dockerbuild]# docker build -t centos-base-httpd:v1 .
Sending build context to Docker daemon 4.096kB
Step 1/9 : FROM centos
---> 5d0da3dc9764
Step 2/9 : MAINTAINER "mocking@gail.com"
---> Running in 6dec2e336908
Removing intermediate container 6dec2e336908
---> 3d6691c1bd2f
Step 3/9 : RUN yum -y install httpd
...........
[root@server1 dockerbuild]# docker run -d centos-base-httpd:v1 # b
[root@server1 dockerbuild]# docker ps
[root@server1 dockerbuild]# docker inspect 31d # 查看容器IP
[root@server1 dockerbuild]# curl http://172.17.0.11
It's works !!!
定义网站内容替代
[root@server1 dockerbuild]# mkdir /web
[root@server1 dockerbuild]# echo "new web" >> /web/index.html
[root@server1 dockerbuild]# docker -d -v /web:/var/www/html/index.html centos-base-httpd:v1
容器镜像本身存储数据的位置及方法
- 容器镜像是一个文件系统的目录,最上一层为读写层,其余为只读的镜像层
- Docker容器镜像和容器的本身的数据都存放在服务器的/var/lib/docker,ubuntu发行版上存储方式为AUFS,Centos发行版的存储方式为Overlay或Overlay2
[root@server1 ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
[root@server1 ~]# docker info
Client:
Context: default
Debug Mode: false
Plugins:
app: Docker App (Docker Inc., v0.9.1-beta3)
buildx: Build with BuildKit (Docker Inc., v0.6.3-docker)
scan: Docker Scan (Docker Inc., v0.9.0)
Server:
Containers: 8
Running: 1
Paused: 0
Stopped: 7
Images: 3
Server Version: 20.10.10
Storage Driver: overlay2
..........
- OverlayFS是一个类似于AUFS的现代联合文件系统,实现更快更简单
- OverlayFS是内核提供的文件系统,overlay和overlay2是docker的存储驱动
[root@server1 ~]# ls /var/lib/docker/
buildkit image overlay2 runtimes tmp volumes
containers network plugins swarm trust
- Linux操作系统磁盘满有两点
- 磁盘空间不足
- 磁盘inode号不足
[root@server1 diff]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root 17G 3.4G 14G 20% /
devtmpfs 898M 0 898M 0% /dev
tmpfs 910M 0 910M 0% /dev/shm
tmpfs 910M 9.6M 901M 2% /run
tmpfs 910M 0 910M 0% /sys/fs/cgroup
/dev/sda1 1014M 146M 869M 15% /boot
tmpfs 182M 0 182M 0% /run/user/0
[root@server1 diff]# df -i
文件系统 Inode 已用(I) 可用(I) 已用(I)% 挂载点
/dev/mapper/centos-root 8910848 44558 8866290 1% /
devtmpfs 229864 399 229465 1% /dev
tmpfs 232906 1 232905 1% /dev/shm
tmpfs 232906 755 232151 1% /run
tmpfs 232906 16 232890 1% /sys/fs/cgroup
/dev/sda1 524288 327 523961 1% /boot
tmpfs 232906 1 232905 1% /run/user/0
- overlay共享数据方式是通过硬链接,只挂载一层,其他层通过最高层以硬链接方式共享(增加了磁盘的inode负担)
- overlay2通过每层的lower文件
docker运行前
没有启动docker daemon之间不会在/var/lib目录中添加docker目录
docker运行后
下载镜像后,存储在overlay2
目录中
启动一个容器,会在/var/lib/docker/overlay2目录下生成一层容器层,目录包括diff,link,lower,merged,work。
diff记录每一层数据内容,link记录该层链接目录,创建容器时将lower-id指向的镜像层目录以及upper目录联合挂载到merged目录;work用来完成如copy-on_write的操作
镜像仓库分类
- 公有仓库
- 私有仓库
镜像加速器
使用registry创建本地非安全镜像仓库
- 下载registry镜像
[root@server1 docker]# docker pull registry
Using default tag: latest
latest: Pulling from library/registry
79e9f2f55bf5: Pull complete
0d96da54f60b: Pull complete
5b27040df4a2: Pull complete
e2ead8259a04: Pull complete
3790aef225b9: Pull complete
Digest: sha256:169211e20e2f2d5d115674681eb79d21a217b296b43374b8e39f97fcf866b375
Status: Downloaded newer image for registry:latest
docker.io/library/registry:latest
- 创建用于挂载至registry镜像启动的目录,便于容器镜像持久性存储
[root@server1 docker]# mkdir /opt/data
- 启动容器获取镜像仓库
[root@server1 docker]# docker run -d -p 5000:5000 --restart always -v /opt/data/:/var/lib/registry registry:latest
e39e29e8d459a71c8ed75140974fc4e587870d815452ee9fb73b2175de23594b
# restart 重启策略开启
[root@server1 docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e39e29e8d459 registry:latest "/entrypoint.sh /etc…" About a minute ago Up 58 seconds 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp magical_chandrasekhar
- 验证私有仓库可用性
[root@server1 docker]# curl http://192.168.174.20:5000/v2/_catalog
{"repositories":[]}
# 主机IP
- 添加私有仓库到daemon.json
[root@server1 docker]# cat /etc/docker/daemon.json
{
"insecure-registries": ["http://192.168.174.20:5000"]
}
[root@server1 docker]# systemctl restart docker
- 容器打标签
[root@server1 docker]# docker tag centos:latest 192.168.174.20:5000/centos:v1
[root@server1 docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos6u7-httpd v1 fd61b7a544d0 2 days ago 233MB
registry latest b8604a3fe854 6 days ago 26.2MB
192.168.174.20:5000/centos v1 5d0da3dc9764 2 months ago 231MB
centos latest 5d0da3dc9764 2 months ago 231MB
ansible/centos7-ansible latest 688353a31fde 4 years ago 447MB
- 容器上传
[root@server1 docker]# docker push 192.168.174.20:5000/centos:v1
The push refers to repository [192.168.174.20:5000/centos]
74ddd0ec08fa: Pushed
v1: digest: sha256:a1801b843b1bfaf77c501e7a6d3f709401a1e0c83863037fa3aab063a7fdb9dc size: 529
[root@server1 docker]# ls /opt/data/docker/registry/v2/repositories/centos/
_layers _manifests _uploads
- 其他主机使用此镜像仓库
- 修改
/usr/lib/systemd/system/docker.service
# for containers run by docker
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
- 修改
/etc/docker/daemon.json
{
"insecure-registries": ["http://192.168.174.20:5000"]
}
使用Harbor实现本地通过web进行管理的非安全仓库
- 认识harbor
- vmware公司开源
- 良好的中文页面
- web管理页面
- 使用广泛
- pip工具准备
- 使用docker-compose工具进行启动
- pip用于批量安装python模块及解决python模块依赖
- 升级epel-release源
[root@server1 yum.repos.d]# yum install epel-release
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
软件包 epel-release-7-11.noarch 已安装并且是最新版本
无须任何处理
# 升级epel-release包
[root@server1 yum.repos.d]# yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
- yum 安装docker-compose
[root@server1 yum.repos.d]# yum install docker-compose.noarch -y
[root@server1 yum.repos.d]# docker-compose version
docker-compose version 1.18.0, build 8dd22a9
docker-py version: 2.6.1
CPython version: 3.6.8
OpenSSL version: OpenSSL 1.0.2k-fips 26 Jan 2017
Linux 上我们可以从 Github 上下载它的二进制包来使用,最新发行的版本地址:https://github.com/docker/compose/releases。
将可执行权限应用于二进制文件:
$ sudo chmod +x /usr/local/bin/docker-compose
创建软链:
$ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
测试是否安装成功:
[root@server1 ~]# docker-compose --version
Docker Compose version v2.1.1
- 安装harbor
- https://github.com/goharbor/harbor
- https://github.com/goharbor/harbor
[root@server1 ~]# tar xf harbor-offline-installer-v2.3.4.tgz
[root@server1 ~]# ll
总用量 1898828
-rw-------. 1 root root 1215 10月 20 2020 anaconda-ks.cfg
-rw------- 1 root root 238581248 11月 14 10:47 centos.tar
drwxr-xr-x 2 root root 62 11月 17 23:35 dockerbuild
-rwxr-xr-x 1 root root 24637440 11月 20 09:51 docker-compose
-rw-r--r-- 1 root root 1073741824 11月 4 10:47 file
drwxr-xr-x 2 root root 122 11月 20 10:03 harbor
-rw-r--r-- 1 root root 607432634 11月 20 10:02 harbor-offline-installer-v2.3.4.tgz
[root@server1 ~]# cd harbor/
[root@server1 harbor]#
- 检查docker和docker-compose版本
[root@server1 harbor]# docker --version
Docker version 20.10.10, build b485636
[root@server1 harbor]# docker-compose --version
Docker Compose version v2.1.1
- 开放80和5000端口
[root@server1 harbor]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e39e29e8d459 registry:latest "/entrypoint.sh /etc…" 12 hours ago Up 2 hours 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp magical_chandrasekhar
[root@server1 harbor]# docker stop e39
e39
[root@server1 harbor]# ln -sv /root/harbor /usr/local/
"/usr/local/harbor" -> "/root/harbor"
[root@server1 harbor]# cp harbor.yml.tmpl harbor.yml
[root@server1 harbor]# grep -Ev '#|^$' harbor.yml.tmpl > harbor.yml
[root@server1 harbor]# cat harbor.yml
hostname: 192.168.174.20
http:
port: 80
harbor_admin_password: Harbor12345
database:
password: root123
max_idle_conns: 100
max_open_conns: 900
......
[root@server1 harbor]# ./prepare
prepare base dir is set to /root/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/portal/nginx.conf
Generated configuration file: /config/log/logrotate.conf
.....
Successfully called func: create_root_cert
Generated configuration file: /compose_location/docker-compose.yml
Clean up the input dir
[root@server1 harbor]# ./install.sh
[Step 0]: checking if docker is installed ...
Note: docker version: 20.10.10
[Step 1]: checking docker-compose is installed ...
Note: docker-compose version: 2.1.1
[Step 2]: loading Harbor images ...
.........
[Step 5]: starting Harbor ...
[+] Running 9/9
⠿ Container harbor-log Started 3.9s
⠿ Container harbor-db Started 7.5s
⠿ Container registry Started 7.4s
⠿ Container redis Started 7.6s
⠿ Container harbor-portal Started 7.5s
⠿ Container registryctl Started 7.5s
⠿ Container harbor-core Started 8.4s
⠿ Container harbor-jobservice Started 9.7s
⠿ Container nginx Started 9.7s
✔ ----Harbor has been installed and started successfully.----
[root@server1 harbor]# ll
总用量 596296
drwxr-xr-x 3 root root 20 11月 20 10:22 common
-rw-r--r-- 1 root root 3361 11月 9 19:01 common.sh
-rw-r--r-- 1 root root 5996 11月 20 10:53 docker-compose.yml
-rw-r--r-- 1 root root 610560420 11月 9 19:01 harbor.v2.3.4.tar.gz
-rw-r--r-- 1 root root 568 11月 20 10:26 harbor.yml
-rw-r--r-- 1 root root 7840 11月 9 19:01 harbor.yml.tmpl
-rwxr-xr-x 1 root root 2500 11月 9 19:01 install.sh
-rw-r--r-- 1 root root 11347 11月 9 19:01 LICENSE
-rwxr-xr-x 1 root root 1881 11月 9 19:01 prepare
- 在daemon.json中添加此仓库地址
[root@server1 harbor]# cat /etc/docker/daemon.json
{
"insecure-registries": ["http://192.168.174.20"],
}
[root@server1 harbor]# systemctl restart docker
- 停止harbor
[root@server1 harbor]# docker-compose stop
[+] Running 9/9
⠿ Container harbor-jobservice Stopped 10.2s
⠿ Container nginx Stopped 0.0s
⠿ Container harbor-portal Stopped 0.2s
⠿ Container registryctl Stopped 10.2s
⠿ Container harbor-core Stopped 0.0s
⠿ Container registry Stopped 0.0s
⠿ Container redis Stopped 0.4s
⠿ Container harbor-db Stopped 0.3s
⠿ Container harbor-log Stopped 10.2s
docker容器网络
本地网络
- bridge (NAT模式,可使容器连接外网)
- 所有容器连接到桥,使用NAT让容器访问外网
[root@server1 harbor]# ip a
.....
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:78:27:d8:19 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:78ff:fe27:d819/64 scope link
valid_lft forever preferred_lft forever
# 所有容器连接到此桥,IP地址都是172.17.0.0、16
# 启动docker服务后启动
[root@server1 harbor]# yum provides *bin/brctl
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* epel: mirrors.bfsu.edu.cn
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
bridge-utils-1.5-9.el7.x86_64 : Utilities for configuring the linux ethernet bridge
源 :base
匹配来源:
文件名 :/usr/sbin/brctl
[root@server1 harbor]# yum install -y bridge-utils
[root@server1 harbor]# brctl show
bridge name bridge id STP enabled interfaces
br-8e519d308b13 8000.0242084074bd no veth0448bb5
veth240b69b
docker0 8000.02427827d819 no veth8c1aa09
[root@server1 harbor]# docker network ls
NETWORK ID NAME DRIVER SCOPE
b5fb9472e045 bridge bridge local
8e519d308b13 harbor_harbor bridge local
0d93d67917c3 host host local
d00f48d4269c none null local
- host (与主机共享网络,可使容器连接外网)
- 所有容器与docker host在同一个网络中,可以让外网主机访问到容器服务
- 可使用
--network
改变容器运行所使用的network
类型
[root@server1 harbor]# docker run -d --network host centos6u7-httpd:v1
4268a5ec3ee32542066045fdcb6456c4856f4dd438728961a7147882a9dd1099
[root@server1 harbor]# docker inspect 42
# 使用HOST模式,容器无IP地址
# 安装iproute后,ip a s 查看IP地址,发现其使用了docker host主机的地址
优点: 方便访问,直接访问主机IP就可以访问容器
缺点: 容器和主机运行同一种服务,容器占用主机的端口,端口冲突
仅在测试环境中使用
-
none网络
- 容器仅有LO网卡,不能与外界连接
- 在高级应用中使用
-
容器网络或联盟网络
- 容器间共享同一个网络命名空间,实现容器间的数据传输,容器不访问外网
Docker跨主机容器之间的通信
实现跨主机容器间通信的工具
- pipework
- Flannel
- Weave
- Open V Switch (OVS)虚拟交换机
- Calico
weave
每个宿主机上部署一个特殊的route容器,不同容器间的route容器连接。
flannel
- 是Overlay网络,覆盖型网络(要建立在原有的网络之上的网络,类似VPN)
- 通过etcd保存子网信息及网络分配信息
- 给每台Docker Host 分配一个网段
- 通过UDP传输
为集群中的所有节点重新规划IP地址的使用规则,让不同节点上的容器能够获得全集群唯一的虚拟IP地址。
flannel为每一个主机配置一个ip段和子网个数,使用etcd来维护分配的子网到实际的IP地址之间的 映射关系,使用etcd存储配置数据和子网分配信息,openstack使用mysql作为数据库,flannel使用etcd。
docker必须通过flannel才能与外界通信,flannel使用udp封装ip数据报,转发到远程主机,udp能穿透防火墙。
mtu : 网络中最大传输量,不可大于1500
容器编排部署
- 实现复杂容器应用架构之间的互联
- 减少大量容器部署的成本
编排部署工具
-
docker machine
- 创建和管理Docker Hosts的工具
-
docker compose
- 通过一个文件定义复杂的容器应用之间的关系
-
docker swarm
- 用于管理docker host
- 把docker host生成一个集群
- 可以使用yaml文件实现复杂容器应用编排
-
kubernetes
- k8s
- 高级容器编排系统
种服务,容器占用主机的端口,端口冲突
仅在测试环境中使用
-
none网络
- 容器仅有LO网卡,不能与外界连接
- 在高级应用中使用
-
容器网络或联盟网络
- 容器间共享同一个网络命名空间,实现容器间的数据传输,容器不访问外网
Docker跨主机容器之间的通信
实现跨主机容器间通信的工具
- pipework
- Flannel
- Weave
- Open V Switch (OVS)虚拟交换机
- Calico
weave
每个宿主机上部署一个特殊的route容器,不同容器间的route容器连接。
flannel
- 是Overlay网络,覆盖型网络(要建立在原有的网络之上的网络,类似VPN)
- 通过etcd保存子网信息及网络分配信息
- 给每台Docker Host 分配一个网段
- 通过UDP传输
为集群中的所有节点重新规划IP地址的使用规则,让不同节点上的容器能够获得全集群唯一的虚拟IP地址。
flannel为每一个主机配置一个ip段和子网个数,使用etcd来维护分配的子网到实际的IP地址之间的 映射关系,使用etcd存储配置数据和子网分配信息,openstack使用mysql作为数据库,flannel使用etcd。
docker必须通过flannel才能与外界通信,flannel使用udp封装ip数据报,转发到远程主机,udp能穿透防火墙。
mtu : 网络中最大传输量,不可大于1500
容器编排部署
- 实现复杂容器应用架构之间的互联
- 减少大量容器部署的成本
编排部署工具
-
docker machine
- 创建和管理Docker Hosts的工具
-
docker compose
- 通过一个文件定义复杂的容器应用之间的关系
-
docker swarm
- 用于管理docker host
- 把docker host生成一个集群
- 可以使用yaml文件实现复杂容器应用编排
-
kubernetes
- k8s
- 高级容器编排系统