一:虚拟化类型:
主机级虚拟化:首先需要有硬件平台
Type-1:
Type-2:VM、Kvm
容器级虚拟化:
Docker概念
1,docker 是一个开源的应用引擎
2.docker诞生于2013年,基于Go语言实现,dotCloud公司开发(docker inc)
3,docker可以让开发者打包应用程序及依赖包到有个轻量级的、可移植的容器中,人后发布到任何流行的Linux机器上
4,容器使用沙箱机制,实现程序相互隔离
5,容器性能开销极低
6,Docker从17.03版本之后氛围CE社区办和EE企业
二:内核需要对什么做隔离:
UTS 主机名域名
mount 文进系统
PID 进程号
IPC 底层通信 消息队列
user 用户名用户组
netwoke 网络、端口、协议栈
三:主机资源分配配置
Control Cgroups CGroups
cgroups对主机进程进行分组,并对不同的组进行cpu、 内存、IO、device设备等资源分配
四:Docker编排工具
machine:
swarm:
compose:
Kubenets:
五:docker三大组件
registry:镜像仓库 https://hub.docker.com
images:镜像
containers:容器
六:docker安装
1,下载清华大学的docker开源软件源到/etc/yum.repo.d/下
wget https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
2,yum clean all &&n yum makecache
3,yum isntall -y deocker-ce
七:添加docker镜像加速器
mkdir -p /etc/docker/daemon.json
{
"registry-mirrors":{"https://registry.docker-cn.com"}
}
八:docker命令工具使用
1,查看docker 版本信息
docker version
docker info
2,搜索镜像
docker search nginx
3,下载镜像
docker 【image】 pull nginx
4,查看本地下载的镜像
docker image ls
5,删除镜像
docker image rm nginx
6,查看运行的容器
[root@ceph3 yum.repos.d]# docker container ls
[root@ceph3 yum.repos.d]# docker ps
7,创建并启动容器
[root@ceph3 yum.repos.d]# docker run --name b1 -it busybox
/ #
/ # ls
/ # bin dev etc home proc root sys tmp usr var
8,启动终止的容器
[root@ceph3 yum.repos.d]# docker container start -ai b1
/ #
9.删除容器
[root@ceph3 yum.repos.d]# docker container
attach cp diff export kill ls port rename rm start stop unpause wait
commit create exec inspect logs pause prune restart run stats top update
[root@ceph3 yum.repos.d]# docker container stop b1
b1
[root@ceph3 yum.repos.d]# docker container rm b1
b1
[root@ceph3 yum.repos.d]# docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
九:镜像制作:
1,基于容器制作
1),首先启动一个容器,对容器就行配置修改
[root@ceph3 ~]# docker run --name b1 -it busybox
/ # ls
bin dev etc home proc root sys tmp usr var
/ # mkdir -p /data/html
/ # vi /data/html/index.html
/ # ls
bin data dev etc home proc root sys tmp usr var
2),使用docker commit 工具制作。不要退出容器,另起一个终端制作新镜像
[root@ceph3 ~]# docker commit -p b1 busybox:v1.1.1
sha256:7fef11d271c67d8acb1b7691a8420adf9512ac0eea4344247c5620f1d0dffe25
[root@ceph3 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox v1.1.1 7fef11d271c6 10 seconds ago 1.22MB
nginx latest ed21b7a8aee9 3 days ago 127MB
busybox latest 83aa35aa1c79 3 weeks ago 1.22MB
[root@ceph3 ~]#
-p:制作竟像时暂停容器
b1:原容器名,即基于哪个容器制作
busybox:v1.1.1:制作的镜像标签
2.1)制作竟像时指定镜像启动时的运行命令
docker commit -a "hu <huzhanxun@139.com>" -c 'CMD ["/bin/httpd","-f","-h","/data/html"]' -p b1 busybox:v6.0
-a:制定镜像制作作者
-c:制定容器启东时的运行指令
3),验证制作的镜像。通过新镜像启动容器并查看之前配置是否存在
[root@ceph3 ~]# docker run --name b1 -it busybox:v1.1.1
/ # ls
bin data dev etc home proc root sys tmp usr var
/ # cat /data/html/index.html
<h1>busybox httpd server</h1>
/ #
4),向docker hub中推送镜像
1,首先登入docker hub创建一个仓库
2,登入docker hub
docker login
username:huzhanxun
password:!@2020Up#$
3,推送镜像
[root@ceph3 ~]# docker push huzhanxun/httpd
The push refers to repository [docker.io/huzhanxun/httpd]
b54535c685c3: Pushed
5d23f5c71792: Pushed
a6d503001157: Pushed
Head https://production.cloudflare.docker.com/registry-v2/docker/registry/v2/blobs/sha256/01/0155eadf7d316b2b172876dfbcaa6d25026c05538e53d6e60203ab160ba25813/data?verify=1585981524-qku%2BHKSb7cuErwe6PnUujmCEMJc%3D: read tcp 192.168.3.149:52382->104.18.124.25:443: read: connection reset by peer
[root@ceph3 ~]#
5),镜像的导出导入
1,镜像导出
[root@ceph3 ~]# docker save -o myimage.gz busybox:v1.1.1 huzhanxun/httpd
[root@ceph3 ~]# ls
anaconda-ks.cfg initial-setup-ks.cfg myimage.gz 公共 模板 视频 图片 文档 下载 音乐 桌面
-o:指定镜像存放位置
2,镜像导入
[root@ceph3 ~]# docker load -i myimage.gz
Loaded image: huzhanxun/httpd:v1.0
Loaded image: busybox:v1.1.1
[root@ceph3 ~]#
-i:指定镜像文件
十:docker 网络
1),docker安装提供了三种网络模式,默认使用bridge模式
[root@ceph3 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
b9d3951b1d34 bridge bridge local
d775c609a7a3 host host local
5f4b6e7427ed none null local
2),创建容器是指定网络模型
1,指定none网络
[root@ceph3 ~]# docker run --name t3 --network none --rm -it -h t1.com busybox
/ # ls
bin dev etc home proc root sys tmp usr var
/ # hostname
t1.com
/ # ifconfig
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
1.1指定host网络
[root@ceph3 ~]# docker run --name t5 --network host -it --rm busybox
/ # echo "hello container" > /tmp/index.html
/ # httpd -h /tmp/
/ # netstat -tnl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 :::80 :::* LISTEN
[root@ceph3 ~]# curl http://192.168.2.3
hello container
1.2创建新的docker网络桥
[root@ceph3 ~]# docker network create -d bridge --subnet "172.26.0.0/16" --gateway "172.26.0.1" mybr0
db1ccd22ebae692e91daa1b305fbed6f484efe35b182f159575890e549cda77e
[root@ceph3 ~]# ifconfig
br-db1ccd22ebae: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.26.0.1 netmask 255.255.0.0 broadcast 172.26.255.255
ether 02:42:7f:cf:63:3e txqueuelen 0 (Ethernet)
RX packets 29231 bytes 3228151 (3.0 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 287 bytes 59750 (58.3 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@ceph3 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
d1d321a99bce bridge bridge local
d775c609a7a3 host host local
db1ccd22ebae mybr0 bridge local
5f4b6e7427ed none null local
[root@ceph3 ~]# docker run --name t5 --network mybr0 --rm -it busybox
/ # ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:AC:1A:00:02
inet addr:172.26.0.2 Bcast:172.26.255.255 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:14 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1414 (1.3 KiB) TX bytes:0 (0.0 B)
1.3不同bridge下的容器通信需要打开路由转发功能
echo 1 > /proc/sys/net/ipv4/ip_forward
2,指定dns
[root@ceph3 ~]# docker run --name t3 --dns 114.144.144.144 --rm -it -h t1.com busybox
/ # cat /etc/
group hostname hosts localtime mtab network/ passwd resolv.conf shadow
/ # cat /etc/resolv.conf
nameserver 114.144.144.144
3,指定hots文件
[root@ceph3 ~]# docker run --name t3 --dns 114.144.144.144 --add-host t1.com:1.1.1.1 --rm -it -h t1.com busybox
/ # 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
1.1.1.1 t1.com
172.17.0.2 t1.com t1
/ #
4,动态端口暴露
[root@ceph3 ~]# docker run --name t5 -p 80 --rm busybox:v6.0
[root@ceph3 ~]# iptables -t nat -vnL
pkts bytes target prot opt in out source destination
0 0 RETURN all -- docker0 * 0.0.0.0/0 0.0.0.0/0
0 0 DNAT tcp -- !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:32768 to:172.17.0.2:80
此时访问宿主机的ip:32768就会映射到容器的80上
[root@ceph3 ~]# curl http://192.168.3.150:32768
<h1>busybox httpd server</h1>
5,手动指定暴露的ip和端口
[root@ceph3 ~]# docker run --name t5 -p 192.168.3.150:8080:80 --rm busybox:v6.0
[root@ceph3 ~]# docker port t5
80/tcp -> 192.168.3.150:8080
[root@ceph3 ~]# iptables -t nat -vnL
Chain DOCKER (2 references)
pkts bytes target prot opt in out source destination
0 0 RETURN all -- docker0 * 0.0.0.0/0 0.0.0.0/0
0 0 DNAT tcp -- !docker0 * 0.0.0.0/0 192.168.3.150 tcp dpt:8080 to:172.17.0.2:80
6,指定docker bridge桥网络的ip
[root@ceph3 ~]# systemctl stop docker
[root@ceph3 ~]# vim /etc/docker/daemon.json
{
"bip": "10.1.0.1/16"
}
[root@ceph3 ~]# systemctl start docker
[root@ceph3 ~]# ifconfig
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.1.0.1 netmask 255.255.0.0 broadcast 10.1.255.255
[root@ceph3 ~]# docker run --name t5 -it --rm busybox
/ # ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:0A:01:00:02
inet addr:10.1.0.2 Bcast:10.1.255.255 Mask:255.255.0.0
7,允许远程管理本机docker
1,打开本地2375端口并制定docker.sock
vim /etc/docker/daemon.json
{
"hosts": ["tcp://0.0.0.0:2375","unix:///var/run/docker.sock"]
}
systemctl start docker
2,在其他主机上执行docker指令制定宿主机ip地址
docker -H 192.168.3.147 images
十一:docker存储
1,docker管理的存储卷。只需要制定容器内的挂载点,无需制定在宿主机上的挂载点,宿主机挂载位置自动生成
[root@ceph3 ~]# docker run --name t6 -it --rm -v /data/ busybox
/ # ls
bin data dev etc home proc root sys tmp usr var
查看存储卷在宿主机上的位置
[root@ceph3 ~]# docker inspect t6
"Mounts":
{
"Type": "volume",
"Name": "5a535f05fad37831791ffafc04fd351d23013bd11a77b86d7b8af997d3a68b9a",
"Source": "/var/lib/docker/volumes/5a535f05fad37831791ffafc04fd351d23013bd11a77b86d7b8af997d3a68b9a/_data",
}
2,bind手动管理的存储卷,需要手动指定宿主机和容器的挂载位置
[root@ceph3 ~]# docker run --name t6 -it --rm -v /data/t6:/data/t6/ busybox
查看存储卷在宿主机上的位置
[root@ceph3 ~]# docker inspect t6
"Mounts":
{
"Type": "bind",
"Source": "/data/t6",
"Destination": "/data/t6",
}
3,共享其他容器的存储卷
[root@ceph3 ~]# docker run --name t6 -v /data/b1:/data/html/ --rm -it busybox
[root@ceph3 ~]# docker run --name t7 -it --network container:t6 --volumes-from t6 --rm busybox
十二:docker file文件制作镜像
1,编辑dockerfile文件:
[root@ceph3 img1]# vim Dockerfile
FROM busybox:latest
#FROM 指定基础镜像。即基于哪个镜像制作
MAINTAINER "<15910298243@139.com>"
#maintainer指定作者信息
USER ${USER:-user_name}
ARG user
# ARG 相当于定义了一个变量,其他指令可以应用这个变量
# 在构建竟像时通过--bulid-arg user=lisi 就可以传递变量了
# docker build --build-arg user=what_user Dockerfile
ENV DOC_ROOT=/data/web1/ \
DOC_WEB=/data/web2/
#定义变量,后面可以直接应用。多个变量定义是需要用“\”,转移
COPY index.html $DOC_ROOT
#从宿主机复制单个文件到镜像容器中
COPY 111 /etc/111/
#复制宿主机111目录下的文件到镜像/etc/111/目录下
#ADD http://nginx.org/download/nginx-1.14.2.tar.gz /
ADD nginx-1.14.2.tar.gz /opt/
#ADD也是复制文件但是可以支持tar文件和url网络文件。同时如果是本地tar文件则会自动展开。如果是url路径的tar文件则只会下载不会展开
WORKDIR /usr/local/src/
#定义容器工作的目录,如果下文引用”./“当前目录则默认就是定义的工作目录
Volume /data/mysql/
#创建存储卷,容器的挂载位置为/data/mysql/
EXPOSE 80/tcp
#默认待暴露端口但是不会真正暴露。当启动容器是加上-P 就会将指定的暴露端口真正的暴露出来,映射到宿主机的端口上
RUN mkdir -p /opt/web/ && echo "<h1> hello </h1>" > /opt/web/index.html
# RUN运行的指令实在构建镜像时运行的
CMD /bin/httpd -f -h /opt/web/
# CMD运行的指令是在创建容器是执行的.同事dockerfile中只有最有一个CMD生效
ADD entryporint.sh /bin/
ENTRYPOINT /bin/entrypoint.sh
# ENTRYPOINT 也是在容器中执行命令,但是entrypoint 可以执行脚本,同时可以接受启动容器时传递的参数
# 这里entrypoint将去调用entrypoint.sh脚本
# docker run --name t1 -it -e "port=8080" httpd:v1.0 。 -e可以向entrypoint.sh中传递环境变量的值
# vim entrypoint.sh
# #!/bin/sh
# cat /etc/nginx/conf.d/www.conf << EOF
# server{
# servername=${hostname}
# listen=${IP:-0.0.0.0}:${PORT:-80
# root ${NGX_DOC_ROOT:-/usr/share/nginx/html}
# }
# EOF
#
# exec "$@"
#
# }
2,docker bulid 构建镜像
docker bulid -t hrttp:v1.0 ./
# 运行这个指令需要在dockerfile统计目录下执行
十三:docker registry 私有仓库
1,无网页版本地私有仓库:
1,下载软件包
[root@ceph3 ~]# yum install -y docker-registry
[root@ceph3 ~]# rpm -ql docker-distribution
/etc/docker-distribution/registry/config.yml
/usr/bin/registry
/usr/lib/systemd/system/docker-distribution.service
/usr/share/doc/docker-distribution-2.6.2
/usr/share/doc/docker-distribution-2.6.2/AUTHORS
/usr/share/doc/docker-distribution-2.6.2/CONTRIBUTING.md
/usr/share/doc/docker-distribution-2.6.2/LICENSE
/usr/share/doc/docker-distribution-2.6.2/MAINTAINERS
/usr/share/doc/docker-distribution-2.6.2/README.md
/var/lib/registry
# 镜像存放默认目录,这个位置是可以在配置文件“/etc/docker-distribution/registry/config.yml”中修改的
[root@ceph3 ~]#
2,因为镜像仓坤都是默认以https方式访问的,在没有证书的情况下需要修改客户端机器的配置文件让客户端信任服务器端http的不安全模式
[root@ceph3 ~]# vim /etc/docker/daemon.json
{
"insecure-registries": ["ceph3:5000"]
}
3,启动仓库
[root@ceph3 ~]# systemctl start docker-distribution
4,制作镜像,标签要添加上服务的域名和端口号
[root@ceph3 ~]# docker tag httpd:v1.0 ceph3:5000/web2
5,推送镜像
[root@ceph3 ~]# docker push ceph3:5000/web2
The push refers to repository [ceph3:5000/web2]
ca8e9bb6aab8: Mounted from web
a6d503001157: Mounted from web
latest: digest: sha256:5eee58e91e7302d1d016b552b7c1d03d7febb20c95eca22c0b02ae3f43c66cb7 size: 734
[root@ceph3 ~]#
6,查看推送的镜像
[root@ceph3 ~]# ls /var/lib/registry/docker/registry/v2/repositories/
web web2
# 推送上来的镜像
[root@ceph3 ~]#
7,下载私有仓库的镜像
[root@ceph3 ~]# docker pull ceph3:5000/web2
Using default tag: latest
latest: Pulling from web2
Digest: sha256:5eee58e91e7302d1d016b552b7c1d03d7febb20c95eca22c0b02ae3f43c66cb7
Status: Downloaded newer image for ceph3:5000/web2:latest
ceph3:5000/web2:latest
2,Harbor私有仓库安装
1,下载docker-compose包,Harbor依赖docker-compose
[root@ceph3 harbor]# yum install epel*
[root@ceph3 harbor]# yum install docker-compose
2,解压harbor包
[root@ceph3 harbor]# tar -zxvf harbor-offline-installer-v1.8.1.tgz
[root@ceph3 harbor]# cd harbor/
[root@ceph3 harbor]# vim harbor.yml 修改必要的参数
[root@ceph3 harbor]# ./ install.sh
3,访问harba
http://192.168.3.151
user:admin
password:Harbor12345
4,停止habor
docker-compose stop
组件概念:
1,service:由于pod的地址可能改变,通过service可以为pod提供一个统一的访问入口,pod创建后会向service进行注册,通告自身的ip信息。每一组pod都会有一个service。通常一类pod会有一个service提供解析服务
2.deployment:pod控制器,可以创建指定数量的pod并监控pod状态信息
k8s工具使用:
1,kubctl:
kubectl -h 查看帮助信息
kubectl create deployment my-nginx --image=nginx --replicas=1 建一个nginx服务的deployment,副本数量为1
kubectl get pods 查看pod的信息及状态
kubectl get nodes 查看node节点信息
kubectl describe ---
1,1deploymeny创建
kubectl run mynginx --image=nginx:1.8 --replicas=1
2,查看k8s对象状态:
kubectl get 资源类型
kubectl get namespace:查看名称空间
-n: -n namespace 指定名称空间
-A:所有名称空间里的pod
-o wide:显示详细信息
资源类型:
pod:
kubectl get pod -o wide
node
service
deployment
kubectl get deployment -o wide
kubectl describe:更详细的信息:
kubectl describe pod pod名称 -n pod所在的名称空间:
node节点安装:
1,安装docker,作用为了启动容器
2,安装kubelet,接受apiserver指令控制容器
3,安装kube-proxy:为容器分配网络
4,安装网络插件-cni