docker介绍及部署搭建与详细步骤--全
docker容器
阅读目录(Content)
docker容器
1:什么是容器?
容器就是在隔离的环境运行的一个进程,如果进程停止,容器就会销毁。隔离的环境拥有自己的系统文件,ip地址,主机名等
kvm虚拟机,linux,系统文件 ###下图表示系统文件
程序:代码,命令
进程:正在运行的程序
2:容器和虚拟化的区别
linux容器技术,容器虚拟化和kvm虚拟化的区别
kvm虚拟化: 需要硬件的支持,需要模拟硬件,可以运行不同的操作系统,启动时间分钟级(开机启动流程)
linux开机启动流程:
bios开机硬件自检(检查电脑有没有问题)
根据bios设置的优先启动项boot 网卡 硬盘 u盘 光驱 (这就是第一次装系统,装完第二次为啥不会弹出再装系统界面。这是因为系统本身存在优先级)
读取mbr引导 2T UEFI(gpt分区) mbr硬盘分区信息,内核加载路径,
加载内核
启动第一个进程/sbin/init systemd
系统初始化完成
运行服务(nginx,httpd,mysql)
。。。
容器启动流程:
直接共用宿主机内核:
第一个进程直接启动服务(nginx,httpd,mysql) 秒级启动
容器:共用宿主机内核,轻量级,损耗少,启动快,性能高,只能运行在linux系统上
虚拟机:需要硬件的支持,需要模拟硬件,需要走开机启动流程,可以运行不同的操作系统
为什么容器:为企业节省成本
100台虚拟机 100个服务 10台
100个容器 100个服务 6台 (节省4台服务器的钱、节省机房托管费用。。。二三十万。。。)
3:容器技术的发展过程:
1):chroot技术(1979年),新建一个子系统(拥有自己完整的系统文件)
相关参考资料:https://www.ibm.com/developerworks/cn/linux/l-cn-chroot/
chang root (在centos中下载Ubuntu系统,解压,cd ubuntu系统,然后执行命令,是在Ubuntu中执行)
作业1:使用chroot监狱限制SSH用户访问指定目录和使用指定命令(cp,ls)----限制系统,除了指定的几个命令之外啥都干不了。
https://linux.cn/article-8313-1.html
ls
2):linux容器(lxc) linux container(namespaces 命名空间 隔离环境 及cgroups 资源限制)--------------现在基本不怎么使用了,在这里只是了解就好。
docker与lxc的前世今生
lxc: linux contains 叫----linux容器(namespace是用来做资源隔离的、cgroup是用来做资源限制的)
lxc是最接近虚拟机的容器:启动进程是/sbin/init,rsyslog
容器是一个进程 直接启动nginx,相对来说lxc,docker更轻量级
kvm: 1c 2g
容器: 1c 2g
docker (namespace 资源隔离的cgroup 资源限制的)
容器是一个进程,nginx
docker容器引擎,只不过现在docker成了容器的代名词
lxc容器
l ibcontainer 容器技术|
cgroups 限制一个进程能够使用的资源。cpu,内存,硬盘io
kvm虚拟机:资源限制(1c 1G 20G)
##需要使用epel源
#安装epel源
yum install epel-release -y
编译epel源配置文件
vi /etc/yum.repos.d/epel.repo
[epel]
name=Extra Packages for Enterprise Linux 7 - $basearch
baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/7/$basearch
#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-7&arch=$basearch
failovermethod=priority
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
[epel-debuginfo]
name=Extra Packages for Enterprise Linux 7 - $basearch - Debug
baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/7/$basearch/debug
#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-debug-7&arch=$basearch
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
gpgcheck=1
[epel-source]
name=Extra Packages for Enterprise Linux 7 - $basearch - Source
baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/7/SRPMS
#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-source-7&arch=$basearch
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
gpgcheck=1
安装lxc
yum install lxc-* -y
yum install libcgroup* -y
yum install bridge-utils.x86_64 -y
桥接网卡
[root@controller ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
echo 'TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=yes
BRIDGE=virbr0' >/etc/sysconfig/network-scripts/ifcfg-eth0
[root@controller ~]# cat /etc/sysconfig/network-scripts/ifcfg-virbr0
echo 'TYPE=Bridge
BOOTPROTO=static
NAME=virbr0
DEVICE=virbr0
ONBOOT=yes
IPADDR=10.0.0.11
NETMASK=255.255.255.0
GATEWAY=10.0.0.254
DNS1=180.76.76.76' >/etc/sysconfig/network-scripts/ifcfg-virbr0
启动cgroup
systemctl start cgconfig.service
启动lxc
systemctl start lxc.service
创建lxc容器
方法1:
lxc-create -t download -n centos6 -- --server mirrors.tuna.tsinghua.edu.cn/lxc-images -d centos -r 6 -a amd64
方法2:
lxc-create -t centos -n test
为lxc容器设置root密码:
[root@controller ~]# chroot /var/lib/lxc/test/rootfs passwd
Changing password for user root.
New password:
BAD PASSWORD: it is too simplistic/systematic
BAD PASSWORD: is too simple
Retype new password:
passwd: all authentication tokens updated successfully.
为容器指定ip和网关
vi /var/lib/lxc/centos7/config
lxc.network.name = eth0
lxc.network.ipv4 = 10.0.0.111/24
lxc.network.ipv4.gateway = 10.0.0.254
启动容器
lxc-start -n centos7
3):docker容器
centos7.6 2G 10.0.0.11 docker01 host解析
centos7.6 2G 10.0.0.12 docker02 host解析
Docker是通过进程虚拟化技术(namespaces及cgroups cpu、内存、磁盘io等)来提供容器的资源隔离与安全保障等。由于Docker通过操作系统层的虚拟化实现隔离,所以Docker容器在运行时,不需要类似虚拟机(VM)额外的操作系统开销,提高资源利用率。
namespace 资源隔离
cgroups 进程的资源限制
kvm 虚拟磁盘文件,资源隔离
kvm 资源限制,--cpus --memory
docker 初期把lxc二次开发,libcontainer
4:docker的安装
10.0.0.11:修改主机名和host解析 ###源地址:https://mirrors.tuna.tsinghua.edu.cn/help/docker-ce/
10.0.0.12:修改主机名和host解析与docker01一样。
docker engine 0.9 .... docker engine 1.12,1.13
在2017年出现 docker ce docker ee 1703,1706现在最新版1903
[root@docker01 ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.0.0.11 docker01
10.0.0.12 docker02
[root@docker01 ~]# rm -fr /etc/yum.repos.d/local.repo
[root@docker01 ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
[root@docker01 ~]# wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
[root@docker01 ~]# sed -i 's#download.docker.com#mirrors.tuna.tsinghua.edu.cn/docker-ce#g' /etc/yum.repos.d/docker-ce.repo
[root@docker01 ~]# yum install docker-ce -y
注意环境问题go1.12.12 此处忽略
[root@docker01 ~]# docker version
Client: Docker Engine - Community
Version: 19.03.5
API version: 1.40
Go version: go1.12.12
Git commit: 633a0ea
Built: Wed Nov 13 07:25:41 2019
OS/Arch: linux/amd64
Experimental: false
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
5:docker的主要组成部分
docker是传统的CS架构分为docker client和docker server,像mysql一样
命令:docker version
[root@controller ~]# docker version
Client:
Version: 17.12.0-ce
API version: 1.35
Go version: go1.9.2
Git commit: c97c6d6
Built: Wed Dec 27 20:10:14 2017
OS/Arch: linux/amd64
Server:
Engine:
Version: 17.12.0-ce
API version: 1.35 (minimum version 1.12)
Go version: go1.9.2
Git commit: c97c6d6
Built: Wed Dec 27 20:12:46 2017
OS/Arch: linux/amd64
Experimental: false
[root@docker01 ~]# systemctl start docker.service
[root@docker01 ~]# systemctl enable docker.service
docker主要组件有:镜像、容器、仓库, 网络,存储、监控
启动容器必须需要一个镜像,仓库中只存储镜像
容器---镜像---仓库
6:启动第一个容器
docker的主要目标是"Build,Ship and Run any App,Angwhere",构建,运输,处处运行
部署服务,环境问题
一次构建,处处运行
docker是一种软件的打包技术
docker初次体验:
安装Nginx步骤:
官网下载Nginx源码包wget
tar
创建Nginx用户
编译安装
./config....
修改配置文件,
启动
配置docker镜像加速
vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
docker run -d -p 80:80 nginx
run(创建并运行一个容器)
-d 放在后台
-p 端口映射
nginx docker镜像的名字
7:docker的镜像管理
搜索镜像 docker search +镜像名称
[root@docker01 ~]# docker search tomcat ###搜索tomcat的镜像
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
tomcat Apache Tomcat is an open source implementati… 2573 [OK]
tomee Apache TomEE is an all-Apache Java EE certif… 71 [OK]
dordoka/tomcat Ubuntu 14.04, Oracle JDK 8 and Tomcat 8 base… 53 [OK]
bitnami/tomcat Bitnami Tomcat Docker Image 30 [OK]
选镜像的建议:
1,优先考虑官方
2,stars数量多
官方镜像仓库地址:hub.docker.com
获取镜像:
docker pull(push)
镜像加速器:阿里云加速器,daocloud加速器,中科大加速器,Docker 中国官方镜像加速:https://registry.docker-cn.com
官方pull docker pull centos:6.8(没有指定版本,默认会下载最新版)
私有仓库pull docker pull daocloud.io/huangzhichong/alpine-cn:latest
配置docker镜像加速
vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
命令:
查看镜像列表
docker images or docker image ls
删除镜像
docker rmi 例子:docker image rm centos:latest
导出镜像
docker save 例子:docker image save centos -o docker-centos7.4.tar.gz
导入镜像
docker load 例子:docker image load -i docker-centos7.4.tar.gz
[root@docker01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
yiliao v1 854323d80fea About an hour ago 453MB
nginx latest 540a289bab6c 5 weeks ago 126MB
alpine 3.9 055936d39205 6 months ago 5.53MB
[root@docker01 ~]# docker image rm -f e8289dcc1d4b #此处为IMAGE ID
Untagged: daocloud.io/huangzhichong/alpine-cn:latest
Deleted: sha256:e8289dcc1d4b00c0d5696681a299c6d3bd045e0627470c05d95166e73acc2246
Deleted: sha256:4bd0fc2d9f8c87f1fbcdd95cf23810b933094f75d51d1de30c0fec084f87c7cb
Deleted: sha256:60ab55d3379d47c1ba6b6225d59d10e1f52096ee9d5c816e42c635ccc57a5a2b
[root@docker01 ~]# docker image save nginx -o docker_nginx.tar.gz
[root@docker01 ~]# ls
anaconda-ks.cfg docker_centos6.9.tar.gz docker_nginx.tar.gz
[root@docker01 ~]# docker image load -i docker_nginx.tar.gz
Loaded image: nginx:latest
[root@docker01 ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
yiliao v1 854323d80fea About an hour ago 453MB
nginx latest 540a289bab6c 5 weeks ago 126MB
[root@docker01 ~]# docker image load -i docker_alpine.zip
f1b5933fe4b5: Loading layer 5.796MB/5.796MB
Loaded image: alpine:3.9
###压缩包格式都可以
### 拓展(提升工作效率:批量下载和导入docker)
[root@docker01 ~]# for n in docker_alpine3.9.tar.gz docker_busybox.tar.gz docker_centos6.9.tar.gz docker_k8s_dns.tar.gz;do wget http://192.168.37.200/191127/$n;docker image load -i $n ;done
喝茶去喽。。。。。
#将多个镜像打成一个包
[root@docker01 ~]# docker image save nginx:latest alpine:3.9 busybox:latest -o docker_test.tar.gz
[root@docker01 ~]# ls
docker_test.tar.gz
###将所有的容器打成一个包
[root@docker01 ~]# docker image save `docker images |awk 'NR>1{print $1":"$2}' |xargs -n 100` -o docker_all_image.tar.gz
[root@docker01 ~]# ll -h
total 1.5G
-rw------- 1 root root 645M Dec 3 20:38 docker_all_image.tar.gz
docker image
build Build an image from a Dockerfile
history 历史
import Import the contents from a tarball to create a filesystem image
inspect 详细信息,及详情
load 镜像导入
ls 列表
prune 清理未构建完成的缓存
pull 下载
push 上传
rm 删除
save 保存
tag 标签
8:docker的容器管理
*** docker run -d -p 80:80 nginx:latest
run(创建并运行一个容器)
-d 放在后台
-p 端口映射
-v 源地址(宿主机):目标地址(容器)
nginx docker镜像的名字
docker run -it --name centos6 centos:6.9 /bin/bash
-it 分配交互式的终端interactive tty
--name 指定容器的名字
/bin/sh覆盖容器的初始命令
运行容器***
docker run image_name
docker run ==== docker create + docker start
启动容器
docker start
停止容器
docker stop CONTAINER_ID
杀死容器
docker kill container_name
查看容器列表
docker ps(-a -l -q)
进入正在运行的容器(目的,调试,排错)
*** docker exec (会分配一个新的终端tty)
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
docker exec -it 容器id或容器名字 /bin/bash(/bin/sh) ##docker exec -it540a289bab6c/bin/bash
docker attach(使用同一个终端,打开两个窗口可以发现是增删改查同步的,这时候偷偷(退出)离开的快捷键为ctrl+p,ctrl+q
docker attach [OPTIONS] CONTAINER
nsenter(安装yum install -y util-linux 弃用)
重命名
docker rename
删除容器
docker rm
批量删除容器(全部删除已经启动的)
docker rm -f `docker ps -a -q`
docker logs #查看容器的输出(排错)
### 夯住的命令
tail -f /etc/hosts
nginx :nginx -g 'daemon off;'
[root@docker01 ~]# docker run -d -p 88:80 nginx:latest tail -f /etc/hosts
94302b6359eabb9471a0c818bdf34370e254408c96d92019041043704e345260
[root@docker01 ~]# curl -I 10.0.0.11:88
curl: (7) Failed connect to 10.0.0.11:88; Connection refused
[root@docker01 ~]# docker ps -a -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
94302b6359ea nginx:latest "tail -f /etc/hosts" 2 minutes ago Up 2 minutes 0.0.0.0:88->80/tcp great_wozniak
###进入docker启动nginx
[root@docker01 ~]# docker exec -it 94302b6359ea /bin/bash
root@94302b6359ea:/# nginx
root@94302b6359ea:/# 10.0.0.11 - - [03/Dec/2019:13:13:20 +0000] "HEAD / HTTP/1.1"
[root@docker01 ~]# curl -I 10.0.0.11:88
HTTP/1.1 200 OK
Server: nginx/1.17.5
Date: Tue, 03 Dec 2019 13:13:20 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 22 Oct 2019 14:30:00 GMT
Connection: keep-alive
ETag: "5daf1268-264"
Accept-Ranges: bytes
### 一般我们用下面这种方法
[root@docker01 ~]# docker run -d -p 89:80 nginx:latest nginx -g 'daemon off;'
e7b1cbc2e38f6cb53d20aec8ae13deab80c7df544a6800d73cb40764d9b79036
[root@docker01 ~]# curl -I 10.0.0.11:88
HTTP/1.1 200 OK
Server: nginx/1.17.5
Date: Tue, 03 Dec 2019 13:22:20 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 22 Oct 2019 14:30:00 GMT
Connection: keep-alive
ETag: "5daf1268-264"
Accept-Ranges: bytes
###宿主机有网,虚拟机没网
sysctl net.ipv4.ip_forward=1
总结:docker容器内的第一个进程(初始命令)必须一直处于前台运行的状态(必须夯住),否则这个容器,就会处于退出状态!(为什么夯住?)
业务在容器中运行:初始命令,夯住,启动服务
9:docker容器的网络访问(端口映射)
docker0:172.17.0.1 jumpserver:172.17.0.2 nginx:172.17.0.3
指定映射(docker 会自动添加一条iptables规则来实现端口映射)
-p hostPort:containerPort
[root@docker01 ~]# run -d -p 80:80 nginx:latest
-p ip:hostPort:containerPort 多个容器都想使用8080端口
[root@docker01 ~]# ifconfig eth0:1 10.0.0.100/24 up
[root@docker01 ~]# docker run -d -p 10.0.0.100:81:80 nginx:latest
-p ip::containerPort(随机端口)
[root@docker01 ~]# docker run -d -p 10.0.0.100::80 nginx:latest
-p hostPort:containerPort/udp --udp
[root@docker01 ~]# docker run -d -p 10.0.0.100::80/udp nginx:latest
b360c780a57d1769dcf01095182723309226590e2fb03d655ca7b8ee02e29fda
-p 10.0.0.100::53/udp 使用宿主机的10.0.0.100这个ip地址的随机端口的udp协议映射容器的udp53端口
-p 81:80 –p 443:443 可以指定多个-p ###容器里面多个服务
随机映射
docker run -P (随机端口) ip:宿主机端口
通过iptables来实现的端口映射
10:docker的数据卷管理
/usr/share/nginx/html
-v /opt/xiaoniao:/usr/share/nginx/html
持久化
数据卷(文件或目录)
-v 卷名:/data (第一次卷是空,会容器的数据复制到卷中,如果卷里面有数据,把卷数据的挂载到容器中)
-v src(宿主机的目录):dst(容器的目录)
数据卷容器
--volumes-from(跟某一个已经存在的容器挂载相同的卷)
[root@docker01 ~]# cd /opt/
[root@docker01 opt]# ls
containerd everyxiaoqiang-yiliao-master.zip
[root@docker01 opt]# unzip everyxiaoqiang-yiliao-master.zip
[root@docker01 opt]# docker rm -f `docker ps -a -q` ##清除镜像
[root@docker01 opt]# docker run -d -p 80:80 -v /opt/yiliao:/usr/share/nginx/html nginx:latest
9584dd8b215160be0e1a3357a36a9d5188a8ac2a7e5a9df5dae2ed0417f5b33a
[root@docker01 opt]# docker ps -a -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9584dd8b2151 nginx:latest "nginx -g 'daemon of…" 46 seconds ago Up 45 seconds 0.0.0.0:80->80/tcp quizzical_raman
基于nginx启动一个容器,监听80和81,访问80,出现nginx默认欢迎首页,访问81,出现小鸟。
-p 80:80 -p 81:81 -v xxx:xxx -v xxx:xxxx
基于nginx多端口的多站点。
搭建一个lnmp架构
###启动一个基础容器
[root@docker01 ~]# docker run -it -p 80:80 centos:6.9 /bin/bash
[root@84b4aac619e6 /]# echo "192.168.37.200 mirrors.aliyun.com" >>/etc/hosts
[root@84b4aac619e6 /]# curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
104 2185 104 2185 0 0 442k 0 --:--:-- --:--:-- --:--:-- 1066k
[root@84b4aac619e6 /]# curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
102 923 102 923 0 0 77296 0 --:--:-- --:--:-- --:--:-- 150k
[root@84b4aac619e6 /]# yum install nginx php-fpm php-gd php-mbstring unzip php-mariadb -y
[root@84b4aac619e6 /]# vi /etc/php-fpm.d/www.conf ###将apache换成nginx
......
user = nginx
; RPM: Keep a group allowed to write in log dir.
group = nginx
......
[root@84b4aac619e6 /]# service php-fpm start
Starting php-fpm: [ OK ]
[root@84b4aac619e6 /]# nginx
[root@84b4aac619e6 /]# cd /etc/nginx/conf.d/
[root@84b4aac619e6 conf.d]# cat default.conf
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /html/wordpress;
index index.php index.html index.html;
include /etc/nginx/default.d/*.conf;
location / {
}
location ~ \. {
root /html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /html$fastcgi_script_name;
include fastcgi_params;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
[root@84b4aac619e6 conf.d]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@84b4aac619e6 conf.d]# service nginx restart
Stopping nginx: [ OK ]
Starting nginx: [ OK ]
[root@84b4aac619e6 conf.d]# service php-fpm restart
Stopping php-fpm: [ OK ]
Starting php-fpm: [ OK ]
[root@84b4aac619e6 html]# yum install wget -y
[root@84b4aac619e6 html]# wget http://192.168.37.200/191127/wordpress-4.9.4-zh_CN.zip
[root@84b4aac619e6 html]# unzip wordpress-4.9.4-zh_CN.zip
[root@84b4aac619e6 html]# chown -R nginx:nginx .
11:手动将容器保存为镜像
docker commit 容器id或者容器的名字 新的镜像名字[:版本号可选]
1):基于容器制作镜像
docker run -it centos:6.9
######
yum install httpd
yum install openssh-server
/etc/init.d/sshd start
vi /init.sh
#!/bin/bash
/etc/init.d/httpd start
/usr/sbin/sshd -D
chmod +x /init.sh
(2)将容器提交为镜像
docker commit 699d13a555ae centos6-ssh-httpd:v1
(3)测试镜像功能是否可用
[root@docker01 wordpress]# docker run -d -p 84:80 centos6.9:v3
3b85246fcebbb4d71b9e59feaf216673bf9f59e9e4ba56703946129f8da5f32f
手动制作的镜像,传输时间长
镜像初始命令
制作一个kodexplorer网盘docker镜像。nginx + php-fpm(httpd + php)
###上传centos6镜像
echo "192.168.37.200 mirrors.aliyun.com" >>/etc/hosts
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
yum install nginx -y
yum install unzip -y
cd /usr/share/nginx/html/
curl -o yiliao.zip http://192.168.37.200/191127/everyxiaoqiang-yiliao-master.zip
unzip yiliao.zip
mv yiliao/* .
nginx
1.什么是容器
容器就是在隔离的环境中运行的一个进程.如果进程结束,容器退出. 这个隔离的环境,有自己的系统文件,ip地址,主机名,进程管理
2:容器和虚拟机的区别
容器: 不依赖硬件cpu支持共用宿主机内核,轻量级,启动快,性能高,损坏少
虚拟机虚拟化: 依赖硬件cpu支持,拥有自己的内核,
docker用的多: 节省成本
3:docker-ce的安装
centos base源 docker engine 1.13
docker.repo
yum install docker-ce 17.03 1903
4:docker主要内容
容器 镜像 仓库 网络 存储 监控
5:docker镜像常用命令
docker image:
docker image ls 查看镜像列表
docker image rm 删除镜像
docker image load 导入镜像
docker image save 导出镜像
docker image pull 下载镜像(拉取镜像)
docker image push 上传镜像
docker image history kod:v5 --no-truc 历史命令
6:docker容器的常用命令
docker run 创建并启动容器
docker kill 强制关闭容器
docker rm 删除容器
docker ps 查看容器列表
docker start 启动容器
docker stop 关闭容器
docker restart 重启容器
docker exec 进入正在运行的容器(分配一个新的端口)(排查错误)
docker attach 进入正在运行的容器(同一个终端)
docker logs 查看容器的终端输出(排查错误)
docker cp #容器和宿主机之间拷贝
docker container diff id #对比容器发生的变化
docker container export id -o docker_test.tar.gz #将容器导出为镜像,文件格式
docker container diff inspect #查看容器属性
docker container pause #容器挂起
docker container unpause #容器解除挂起
docker stats --no-stream(只去一次的值) #监控用的
docker run -d --cpus 1 --memory 50 MiB kod:v5 #资源限制内存、cpu
dockerr container top oldxu #查看oldxu起了哪些进程
[root@docker01 ~]# docker run -d -p 80:80 nginx
7e5740f8990c6a1db84a27f0024e272816068e794d3a510f054c1959c1f45858
[root@docker01 ~]# docker ps -a -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7e5740f8990c nginx "nginx -g 'daemon of…" About a minute ago Up About a minute 0.0.0.0:80->80/tcp trusting_tesla
[root@docker02 ~]# docker container diff 7e5740f8990c
[root@docker02 ~]# docker container export 7e5740f8990c -o docker_test.tar.gz
[root@docker02 ~]# ls
anaconda-ks.cfg docker_nginx.tar.gz docker_test.tar.gz
[root@docker01 ~]# docker container inspect 7e5740f8990c #查看容器属性
7:docker端口映射
docker run -p
宿主机端口:容器端口 最常见
ip1:宿主机端口:容器端口 ip2:宿主机端口:容器端口
ip1::容器端口 随机端口
ip1::容器端口/udp
-p 宿主机端口1:容器端口1 -p 宿主机端口2:容器端口2
docker run -P 自动随机端口映射
8:docker数据卷
docker run -v 宿主机目录:容器目录 -v 宿主机文件:容器文件
9:手动制作镜像
a:启动一个基础容器,在容器安装自己的服务
b:把安装好服务的容器提交为镜像
c:测试镜像是否可用
12:dockerfile自动构建docker镜像
类似ansible剧本,大小几kb
手动做镜像:大小几百M+
dockerfile 支持自定义容器的初始命令
dockerfile主要组成部分:
基础镜像信息 FROM centos:6.9
制作镜像操作指令 RUN yum install openssh-server -y
容器启动时执行指令 CMD ["/bin/bash"]
dockerfile常用指令:
FROM 这个镜像的妈妈是谁?(指定基础镜像)
MAINTAINER 告诉别人,谁负责养它?(指定维护者信息,可以没有) ##一般不用
LABLE 描述,标签 ##一般不用
RUN 你想让它干啥(在命令前面加上RUN即可)
ADD 给它点创业资金(会自动解压tar) 制作docker基础的系统镜像
WORKDIR 我是cd,今天刚化了妆(设置当前工作目录)
VOLUME 给它一个存放行李的地方(设置卷,挂载主机目录)
EXPOSE 它要打开的门是啥(指定对外的端口)(-P 随机端口)
CMD 奔跑吧,兄弟!(指定容器启动后的要干的事情)(容易被替换)
dockerfile其他指令:
COPY 复制文件(不会解压)rootfs.tar.gz
ENV 环境变量
ENTRYPOINT 容器启动后执行的命令(无法被替换,启容器的时候指定的命令,会被当成参数)
制作成镜像:
docker build -t 镜像名字:版本号 dockerfile的路径
如果在dockerfile的路径下,可以使用相对路径
13:docker镜像的分层(kvm 链接克隆,写时复制的特性)
基于镜像做的链接克隆,就是每个镜像都是一层一层的。基于centos6.9---->安装nginx。做了什么操作就增加一层,一层可以多个业务使用。最底层镜像没有parent。先安装nginx再安装php和先安装php再安装nginx打包的镜像是不一样的。
### 镜像分层的好处:复用,节省磁盘空间,相同的内容只需加载一份到内,提高构建速度。
修改dockerfile之后,再次构建速度快
13.1 dockerfile 优化方案:
1:尽可能选择体积小linux,alpine
2:尽可能合并RUN指令,清理无用的文件(yum缓存,源码包)
3:修改dockerfile,把变化的内容尽可能放在dockerfile结尾
4: 使用.dockerignore,减少不必要的文件ADD . /html
14:容器间的互联(--link 是单方向的!!!)
容器之间是相互共通的
####
[root@docker01 ~]# docker run -it alpine:3.9
/ # ping 127.0.0.2
PING 127.0.0.2 (127.0.0.2): 56 data bytes
64 bytes from 127.0.0.2: seq=0 ttl=64 time=0.170 ms
64 bytes from 127.0.0.2: seq=1 ttl=64 time=0.077 ms
[root@docker02 ~]# docker run -it alpine:3.9
/ # ping 127.17.0.3
PING 127.17.0.3 (127.17.0.3): 56 data bytes
64 bytes from 127.17.0.3: seq=0 ttl=64 time=0.084 ms
64 bytes from 127.17.0.3: seq=1 ttl=64 time=0.089 ms
一般容器ip地址是变动的,好多容器都是很纯的,如何让容器之间通讯呢?
[root@docker02 ~]# docker run -d -it --name db01 alpine:3.9
6d4ff52336775e6e69b2a4bc9f352d0942b5b61d67fe95c5028a88c696dcd8fc
[root@docker02 ~]# docker ps -a -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6d4ff5233677 alpine:3.9 "/bin/sh" 53 seconds ago Up 51 seconds db01
[root@docker01 ~]# docker run -it --link db01:web01 alpine:3.9 /bin/bash
/# ping db01 ###测试可以ping通
###总结:
docker run -d -p 80:80 nginx
docker run -it --link quirky_brown:web01 qstack/centos-ssh /bin/bash
nginx容器的名字:别名 镜像名
ping web01
容器间的互联 zabbix练习
lb --->nginx 172.17.0.4 --> db01 172.17.0.3 --> nfs01 172.17.0.2
使用docker运行zabbix-server
[root@docker01 ~]# cd srv/
[root@docker01 srv]# ls
docker-compose.yml zabbix-agent-3.2.0-1.el7.x86_64.rpm zabbix-server-mysql.tar.gz
docker-mysql-5.7.tar.gz zabbix-java-gateway.tar.gz zabbix-web-nginx-mysql.tar.gz
[root@docker01 srv]# for n in `ls *`;do docker load -i $n ;done ##循环上传所有的镜像
### zabbix.com 打开官网--->中文--->产品手册--->zabbix4.0-->安装---->从容器中安装(如下内容直接粘贴运行即可)
1. 首先,启动空的 MySQL 服务器实例。
2. 其次,启动 Zabbix Java gateway 实例
3. 然后,启动 Zabbix server 实例,并将其关联到已创建的 MySQL server 实例。
4. 最后,启动 Zabbix Web 界面,并将其关联到已创建的 MySQL server 和 Zabbix server 实例。
[root@docker01 srv]#
docker run --name mysql-server -t \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix_pwd" \
-e MYSQL_ROOT_PASSWORD="root_pwd" \
-d mysql:5.7 \
--character-set-server=utf8 --collation-server=utf8_bin
docker run --name zabbix-java-gateway -t \
-d zabbix/zabbix-java-gateway:latest
docker run --name zabbix-server-mysql -t \
-e DB_SERVER_HOST="mysql-server" \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix_pwd" \
-e MYSQL_ROOT_PASSWORD="root_pwd" \
-e ZBX_JAVAGATEWAY="zabbix-java-gateway" \
--link mysql-server:mysql \
--link zabbix-java-gateway:zabbix-java-gateway \
-p 10051:10051 \
-d zabbix/zabbix-server-mysql:latest
docker run --name zabbix-web-nginx-mysql -t \
-e DB_SERVER_HOST="mysql-server" \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix_pwd" \
-e MYSQL_ROOT_PASSWORD="root_pwd" \
--link mysql-server:mysql \
--link zabbix-server-mysql:zabbix-server \
-p 80:80 \
-d zabbix/zabbix-web-nginx-mysql:latest
###清理容器
[root@docker01 srv]# docker rm -f `docker ps -a -q`
[root@docker01 srv]# docker-compose up -d
Creating srv_mysql-server_1 ... done
Creating srv_zabbix-java-gateway_1 ... done
Creating srv_mysql-server_1 ...
Creating srv_zabbix-server_1 ... done
Creating srv_zabbix-server_1 ...
Creating srv_zabbix-web_1 ... done
###浏览器访问10.0.0.11
监控报警:微信报警,alpine
yum 安装zabbix好使
[root@docker02 srv]# rpm -ivh zabbix-agent-3.2.0-1.el7.x86_64.rpm
warning: zabbix-agent-3.2.0-1.el7.x86_64.rpm: Header V4 RSA/SHA512 Signature, key ID a14fe591: NOKEY
Preparing... ################################# [100%]
package zabbix-agent-3.2.0-1.el7.x86_64 is already installed
[root@docker02 srv]# systemctl restart zabbix-agent.service
[root@docker02 srv]# systemctl enable zabbix-agent.service
监控一台主机(web界面创建)
[root@docker01 srv]# docker-compose restart zabbix-server
低级自动发现---->功能:根据原型自动创建监控项(测试:我们在docker02上面创建一个分区)
[root@docker02 srv]# dd if=/dev/zero of=/opt/test.raw bs=200M count=1
[root@docker02 srv]# mkfs.xfs /opt/test.raw
[root@docker02 srv]# mount -o loop /opt/test.raw /mnt
10.0.0.11重启
[root@docker01 srv]# docker-compose restart zabbix-server
Restarting srv_zabbix-server_1 ... done
创建网卡后的低级自动发现
自定义监控项原型
案例:添加监控项原型,监控网卡的mac地址(eth0)
[root@docker01 srv]# ifconfig eth0 |awk 'NR==4 {print $2}'
00:0c:29:c1:51:a4
[root@docker02 srv]# vim /etc/zabbix/zabbix_agentd.d/user_define.conf
UserParameter=net.if.mac[*], ifconfig $1 |awk '/ether/ {print $$2}'
[root@docker02 srv]# systemctl restart zabbix-agent.service
###在服务端安装zabbix_agint测试
[root@docker01 srv]# wget https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/3.2/rhel/7/x86_64/zabbix-agent-3.2.11-1.el7.x86_64.rpm
[root@docker01 srv]# rpm -ivh zabbix-agent-3.2.11-1.el7.x86_64.rpm
warning: zabbix-agent-3.2.11-1.el7.x86_64.rpm: Header V4 RSA/SHA512 Signature, key ID a14fe591: NOKEY
Preparing... ################################# [100%]
Updating / installing...
1:zabbix-agent-3.2.11-1.el7 ################################# [100%]
[root@docker01 srv]# zabbix_get -s 10.0.0.12 -k net.if.mac[eth0]
00:0c:29:93:4c:31
- 监测中--->最新数据(创建成功)
自定义自动发现规则
### 创建自动发现规则脚本
[root@docker02 ~]# mkdir /scripts
[root@docker02 ~]# cd /scripts/
[root@docker02 scripts]# vim docker_discovery.sh
#!/bin/bash
port=($(/usr/bin/docker ps -a|grep -v "CONTAINER ID"|awk '{print $NF}'))
printf '{\n'
printf '\t"data":[\n'
for key in ${!port[@]}
do
if [[ "${#port[@]}" -gt 1 && "${key}" -ne "$((${#port[@]}-1))" ]];then
printf '\t {\n'
printf "\t\t\t\"{#CONTAINERNAME}\":\"${port[${key}]}\"},\n"
else [[ "${key}" -eq "((${#port[@]}-1))" ]]
printf '\t {\n'
printf "\t\t\t\"{#CONTAINERNAME}\":\"${port[${key}]}\"}\n"
fi
done
printf '\t ]\n'
printf '}\n'
[root@docker02 scripts]# sh docker_discovery.sh
[root@docker02 scripts]# sh docker_discovery.sh
{
"data":[
{
"{#CONTAINERNAME}":"cadvisor"},
{
"{#CONTAINERNAME}":"node_exporter"},
{
"{#CONTAINERNAME}":"test02"},
{
"{#CONTAINERNAME}":"recursing_matsumoto"},
{
"{#CONTAINERNAME}":"nginx"},
{
"{#CONTAINERNAME}":"harbor-jobservice"},
{
"{#CONTAINERNAME}":"harbor-portal"},
{
"{#CONTAINERNAME}":"harbor-core"},
{
"{#CONTAINERNAME}":"redis"},
{
"{#CONTAINERNAME}":"registryctl"},
{
"{#CONTAINERNAME}":"registry"},
{
"{#CONTAINERNAME}":"harbor-db"},
{
"{#CONTAINERNAME}":"harbor-log"}
]
}
[root@docker02 scripts]# vim /etc/zabbix/zabbix_agentd.d/user_define.conf
[root@docker02 scripts]# cat /etc/zabbix/zabbix_agentd.d/user_define.conf
UserParameter=net.if.mac[*], ifconfig $1 |awk '/ether/ {print $$2}'
UserParameter=docker.discover,/bin/bash /scripts/docker_discovery.sh
[root@docker02 scripts]# chmod u+s /usr/bin/docker
[root@docker02 scripts]# systemctl restart zabbix-agent.service
###在docker01上测试
[root@docker01 ~]# zabbix_get -s 10.0.0.12 -k docker.discover
{
"data":[
{
"{#CONTAINERNAME}":"cadvisor"},
{
"{#CONTAINERNAME}":"harbor-db"},
{
"{#CONTAINERNAME}":"harbor-log"}
]
}
####在web界面创建自动发现规则
- 没有监控项原型,我们去创建一个监控项原型
[root@docker02 scripts]# vim /etc/zabbix/zabbix_agentd.d/user_define.conf
[root@docker02 scripts]# cat /etc/zabbix/zabbix_agentd.d/user_define.conf
UserParameter=net.if.mac[*], ifconfig $1 |awk '/ether/ {print $$2}'
UserParameter=docker.discover,/bin/bash /scripts/docker_discovery.sh
UserParameter=docker_alive[*],/usr/bin/docker ps -a|grep $1|grep -c Up
[root@docker02 scripts]# systemctl restart zabbix-agent.service
[root@docker02 scripts]# docker run -it --name oldxu alpine:3.9
### docker01测试
[root@docker01 ~]# zabbix_get -s 10.0.0.12 -k docker_alive[oldxu]
1
- 点击监控项原型--->创建监控项原型(变量值)
- 监控项--->docker
- 表示创建成功
15:docker registry(私有仓库)
15.1普通的registry
docker run -d -p 5000:5000 --restart=always --name registry -v /opt/myregistry:/var/lib/registry registry
上传镜像到私有仓库:
a:给镜像打标签
docker tag centos6-sshd:v3 10.0.0.11:5000/centos6-sshd:v3
b:上传镜像
docker push 10.0.0.11:5000/centos6-sshd:v3
docker run -d 10.0.0.11:5000/centos6-sshd:v3
如果遇到报错:
The push refers to repository [10.0.0.11:5000/centos6.9_ssh]
Get https://10.0.0.11:5000/v2/: http: server gave HTTP response to HTTPS client
解决方法:
vim /etc/docker/daemon.json
{
"insecure-registries": ["10.0.0.11:5000"]
}
systemctl restart docker
15.2带basic认证的registry
yum install httpd-tools -y
mkdir /opt/registry-var/auth/ -p
htpasswd -Bbn oldboy 123456 >> /opt/registry-var/auth/htpasswd
docker run -d -p 5000:5000 --restart=always -v /opt/registry-var/auth/:/auth/ -v /opt/myregistry:/var/lib/registry -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd" registry
#####------> 课堂练习 <------######
### 在10.0.0.11 上执行
[root@docker01 ~]# rz -E
rz waiting to receive.
[root@docker01 ~]# docker load -i registry.tar.gz
ef763da74d91: Loading layer [==================================================>] 5.058MB/5.058MB
7683d4fcdf4e: Loading layer [==================================================>] 7.894MB/7.894MB
656c7684d0bd: Loading layer [==================================================>] 22.79MB/22.79MB
a2717186d7dd: Loading layer [==================================================>] 3.584kB/3.584kB
3c133a51bc00: Loading layer [==================================================>] 2.048kB/2.048kB
[root@docker01 ~]# docker run -d -p 5000:5000 --restart=always --name registry -v /opt/myregistry:/var/lib/registry regist
5384fec9ffe2088e93b34a11bd13c2c66a0e7785ef8e23b10ad0ad2a32fbea87
### 在10.0.0.12上执行
[root@docker02 ~]# docker tag nginx:latest 10.0.0.11:5000/nginx:latest
[root@docker02 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
10.0.0.11:5000/nginx latest 540a289bab6c 6 weeks ago 126MB
10.0.0.11 5000 540a289bab6c 6 weeks ago 126MB
nginx latest 540a289bab6c 6 weeks ago 126MB
[root@docker02 ~]# docker push 10.0.0.11:5000/nginx:latest
The push refers to repository [10.0.0.11:5000/nginx]
Get https://10.0.0.11:5000/v2/: http: server gave HTTP response to HTTPS client
[root@docker02 ~]# cat /etc/docker/daemon.json ###需要编辑将https转换成http
{
"insecure-registries": ["10.0.0.11:5000"]
}
[root@docker02 ~]# systemctl restart docker
[root@docker02 ~]# docker push 10.0.0.11:5000/nginx:latest
The push refers to repository [10.0.0.11:5000/nginx]
a89b8f05da3a: Pushed
6eaad811af02: Pushed
b67d19e65ef6: Pushed
latest: digest: sha256:f56b43e9913cef097f246d65119df4eda1d61670f7f2ab720831a01f66f6ff9c size: 948
[root@docker02 ~]# docker run -it nginx:latest /bin/bash
root@6f5828400349:/# echo 'asdfas' >1.txt
root@6f5828400349:/# exit
exit
[root@docker02 ~]# docker commit 6f5828400349 10.0.0.11:5000/test:v1
sha256:fc41f498981594ec8a13026c924667e0867996b41c3d8e1ecf7b8d86924c2ea8
[root@docker02 ~]# docker push 10.0.0.11:5000/test:v1
The push refers to repository [10.0.0.11:5000/test]
c807577ddda5: Pushed
a89b8f05da3a: Mounted from nginx
6eaad811af02: Mounted from nginx
b67d19e65ef6: Mounted from nginx
v1: digest: sha256:4f47bb1a092f2291d53197159798c5351ea5eb5105e549d91f138ffb23d67b33 size: 1155
[root@docker02 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
10.0.0.11:5000/test v1 fc41f4989815 43 seconds ago 126MB
10.0.0.11:5000/nginx latest 540a289bab6c 6 weeks ago 126MB
10.0.0.11 5000 540a289bab6c 6 weeks ago 126MB
nginx latest 540a289bab6c 6 weeks ago 126MB
[root@docker02 ~]# cd /var/lib/docker
[root@docker02 docker]# rm -rf *
[root@docker02 docker]# systemctl restart docker
[root@docker02 docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
[root@docker02 docker]# docker pull 10.0.0.11:5000/nginx:latest
latest: Pulling from nginx
8d691f585fa8: Pull complete
5b07f4e08ad0: Pull complete
abc291867bca: Pull complete
Digest: sha256:f56b43e9913cef097f246d65119df4eda1d61670f7f2ab720831a01f66f6ff9c
Status: Downloaded newer image for 10.0.0.11:5000/nginx:latest
10.0.0.11:5000/nginx:latest
[root@docker02 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
10.0.0.11:5000/nginx latest 540a289bab6c 6 weeks ago 126MB
###故障案例
###故障解决一个redis坏了,另外一个业务服务加相同ip
ifconfig etho:1 10.0.0.54/24 up
16:docker-compose(单机版的容器编排工具)
类似于ansible剧本
[root@docker02 ~]# mkdir /wordpress
[root@docker02 ~]# cd /wordpress/
[root@docker02 wordpress]# docker images mysql
REPOSITORY TAG IMAGE ID CREATED SIZE
[root@docker02 wordpress]# docker load -i wordpress-latest.tar
[root@docker02 wordpress]# yum install -y docker-compose -y(需要配置epel源)
[root@docker02 my_wordpress~]# vi docker-compose.yml
version: '3'
services:
db:
image: mysql:5.7
volumes:
- /data/db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
volumes:
- /data/web_data:/var/www/html
ports:
- "80:80"
restart: always
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
### 启动
[root@docker02 wordpress]# docker-compose up
### 后台启动
[root@docker02 wordpress]# docker-compose up -d
17:重启docker服务,容器全部退出的解决办法
方法一:docker run --restart=always
方法二:"live-restore": true
docker server配置文件/etc/docker/daemon.json参考
{
"registry-mirrors": ["http://b7a9017d.m.daocloud.io"],
"insecure-registries":["10.0.0.11:5000"],
"live-restore": true
}
18:Docker Machine安装docker服务
Docker Machine 二进制 10.0.0.11
10.0.0.12 免密码登陆 从docker的官网下载二进制的包,去安装docker
10.0.0.13 免密码登陆
ansible:
shell
19:Docker网络类型
None:不为容器配置任何网络功能,--net=none
Container:与另一个运行中的容器共享Network Namespace,--net=container:containerID(K8S)
Host:与宿主机共享Network Namespace,--network=host ###性能最高
Bridge:Docker设计的NAT网络模型
### 课堂案例实解 #####
[root@docker01 ~]# docker network
Usage: docker network COMMAND
Manage networks
Commands:
connect Connect a container to a network
create Create a network
disconnect Disconnect a container from a network
inspect Display detailed information on one or more networks
ls List networks
prune Remove all unused networks
rm Remove one or more networks
Run 'docker network COMMAND --help' for more information on a command.
[root@docker01 ~]# docker run -d -P nginx:latest #随机端口运行容器
[root@docker01 ~]# docker run -it --network=host alpine:3.9 ##容器网络配置成和本机一样的
/ # hostname · ###主机名和宿主机一致
docker01
/ # cat /etc/hosts ##hosts解析和宿主机一致
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.0.0.11 docker01
10.0.0.12 docker02
192.168.37.200 mirrors.aliyun.com
/ #
[root@docker01 ~]# docker run -d -P kod:v8
581d65e8dc0781ec726866253f0f5865c3331684a882107d5a3150bc38fff966
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
581d65e8dc07 kod:v8 "/bin/bash /init.sh" 16 seconds ago Up 15 seconds angry_ardinghelli
c76fcbdb84ec nginx:latest "nginx -g 'daemon of…" 13 minutes ago Up 13 minutes 0.0.0.0:32769->80/tcp gallant_wilson
[root@docker01 ~]# docker run -it --network container:581d65e8dc07 alpine:3.9
### 运行alpine:3.9 与kod:v8 容器一致
/ # hostname
581d65e8dc07
20:Docker跨主机容器之间的通信macvlan
默认一个物理网卡,只有一个物理mac地址,虚拟多个mac地址qwerrty
##创建macvlan网络
docker network create --driver macvlan --subnet 10.0.0.0/24 --gateway 10.0.0.254 -o parent=eth0 macvlan_1
##设置eth0的网卡为混杂模式
ip link set eth1 promisc on
##创建使用macvlan网络的容器
docker run -it --network macvlan_1 --ip=10.0.0.200 busybox
作业1:docker跨主机容器间的通信flannel
###课堂演示
[root@docker01 ~]# docker network create --driver macvlan --subnet 10.0.0.0/24 --gateway 10.0.0.254 -o parent=eth0 macvlan_1
216908a532007660491b6e67507d50d5de84e2264d97064e0195d7192583a866
[root@docker02 ~]# docker network create --driver macvlan --subnet 10.0.0.0/24 --gateway 10.0.0.254 -o parent=eth0 macvlan_1
a873fb5b166f678c423fe1e62a3444f20da26603d759b19817a72a38473bb753
[root@docker01 ~]# docker run -it --network macvlan_1 --ip=10.0.0.77 alpine:3.9
/ # ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 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
16: eth0@if2: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UNKNOWN
link/ether 02:42:0a:00:00:4d brd ff:ff:ff:ff:ff:ff
inet 10.0.0.77/24 brd 10.0.0.255 scope global eth0
valid_lft forever preferred_lft forever
[root@docker02 ~]# docker network create --driver macvlan --subnet 10.0.0.0/24 --gateway 10.0.0.254 -o parent=eth0 macvlan_1
a873fb5b166f678c423fe1e62a3444f20da26603d759b19817a72a38473bb753
[root@docker02 ~]# docker run -it --network macvlan_1 --ip=10.0.0.66 alpine:3.9
/ # ping 10.0.0.77 ##可以相互通信
PING 10.0.0.77 (10.0.0.77): 56 data bytes
64 bytes from 10.0.0.77: seq=0 ttl=64 time=0.979 ms
[root@docker01 ~]# docker run -it --network macvlan_1 --ip=10.0.0.88 kod:v8
###夯住了。。。。。正常现象
### 如下图浏览器访问10.0.0.88可以访问到kod:v8
[c:\~]$ ping 10.0.0.88 ##可以ping通
正在 Ping 10.0.0.88 具有 32 字节的数据:
来自 10.0.0.88 的回复: 字节=32 时间<1ms TTL=64
来自 10.0.0.88 的回复: 字节=32 时间<1ms TTL=64
21:Dcoker跨主机容器通信之overlay
docker03上:
docker run -d -p 8500:8500 -h consul --name consul progrium/consul -server -bootstrap
设置容器的主机名
consul:kv类型的存储数据库(key:value)
docker01、02上:
vim /etc/docker/daemon.json
{
"hosts":["tcp://0.0.0.0:2376","unix:///var/run/docker.sock"],
"cluster-store": "consul://10.0.0.13:8500",
"cluster-advertise": "10.0.0.11:2376"
}
vim /etc/docker/daemon.json
vim /usr/lib/systemd/system/docker.service
systemctl daemon-reload
systemctl restart docker
2)创建overlay网络
docker network create -d overlay --subnet 172.16.1.0/24 --gateway 172.16.1.254 ol1
3)启动容器测试
docker run -it --network ol1 --name oldboy01 busybox /bin/bash
每个容器有两块网卡,eth0实现容器间的通讯,eth1实现容器访问外网
### 上课演示 #### --->创建一台docker03 10.0.0.13
[root@web03 ~]# rm -fr /etc/yum.repos.d/local.repo
[root@web03 ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 2523 100 2523 0 0 4158 0 --:--:-- --:--:-- --:--:-- 4163
[root@web03 ~]# wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
--2019-12-06 10:32:16-- https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
Resolving mirrors.ustc.edu.cn (mirrors.ustc.edu.cn)... 202.141.176.110, 218.104.71.170
Connecting to mirrors.ustc.edu.cn (mirrors.ustc.edu.cn)|202.141.176.110|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 2424 (2.4K) [application/octet-stream]
Saving to: ‘/etc/yum.repos.d/docker-ce.repo’
100%[===================================================================>] 2,424 --.-K/s in 0s
2019-12-06 10:32:17 (434 MB/s) - ‘/etc/yum.repos.d/docker-ce.repo’ saved [2424/2424]
[root@web03 ~]# sed -i 's#download.docker.com#mirrors.tuna.tsinghua.edu.cn/docker-ce#g' /etc/yum.repos.d/docker-ce.repo
[root@web03 ~]# yum install docker-ce -y
Complete!
[root@web03 ~]# systemctl start docker.service
[root@web03 ~]# systemctl enable docker.service
[root@web03 ~]# rz
[root@web03 ~]# ls
anaconda-ks.cfg docker_alpine3.9.tar.gz docker_progrium_consul.tar.gz
[root@web03 ~]# docker image load -i docker_progrium_consul.tar.gz
745737c319fa: Loading layer 5.628MB/5.628MB
f3ab176661f3: Loading layer 9.417MB/9.417MB
1feb7d205df9: Loading layer 4.806MB/4.806MB
70f8ad72ed07: Loading layer 18.25MB/18.25MB
e4b1687664d8: Loading layer 255kB/255kB
f70996ac24ae: Loading layer 1.001MB/1.001MB
33cdef66dc09: Loading layer 15.45MB/15.45MB
2472fd5d1e44: Loading layer 15.45MB/15.45MB
655df57eba5d: Loading layer 2.56kB/2.56kB
5f70bf18a086: Loading layer 1.024kB/1.024kB
18fc328d2a80: Loading layer 3.584kB/3.584kB
af8c1839c171: Loading layer 2.56kB/2.56kB
d46ded49a20c: Loading layer 2.56kB/2.56kB
Loaded image: progrium/consul:latest
[root@web03 ~]# docker run -d -p 8500:8500 -h consul --name consul progrium/consul -server -bootstrap
3cf7f137c85dcccfb6441e36d1b616af1c48ff9a7fc35014fc265cce656157c4
[root@web03 ~]#
### docker01 10.0.0.11上面运行
^C[root@docker01 ~]# vim /etc/docker/daemon.json
{
"cluster-store": "consul://10.0.0.13:8500",
"cluster-advertise": "10.0.0.11:2376"
}
[root@docker01 ~]# systemctl restart docker
[root@docker01 ~]# docker network create -d overlay --subnet 172.16.1.0/24 --gateway 172.16.1.254 ol1
8c98a16fe29654d70de68202691aec56c5797889d08053efceeb83a2d0cd6c42
[root@docker01 ~]# docker run -it --network ol1 --name test01 alpine:3.9
/ #
### docker02 10.0.0.12 上面运行
[root@docker02 ~]# vim /etc/docker/daemon.json
{
"cluster-store": "consul://10.0.0.13:8500",
"cluster-advertise": "10.0.0.12:2376"
}
[root@docker02 ~]# systemctl restart docker
[root@docker02 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
bff90e7cf6df bridge bridge local
f759b8417602 harbor_harbor bridge local
a4a1341292fa host host local
a873fb5b166f macvlan_1 macvlan local
9101cb77790c none null local
8c98a16fe296 ol1 overlay global
[root@docker02 ~]# docker run -it --network ol1 --name test02 alpine:3.9
/ # ping test01
PING test01 (172.16.1.1): 56 data bytes
64 bytes from 172.16.1.1: seq=0 ttl=64 time=1.976 ms
64 bytes from 172.16.1.1: seq=1 ttl=64 time=0.568 ms
^C
--- test01 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.568/1.272/1.976 ms
/ # ^C
/ # exit
访问http://10.0.0.13:8500/ui/#/dc1/kv/docker/nodes/
22:docker企业级镜像仓库harbor(vmware 中国团队)
第一步:安装docker和docker-compose
第二步:下载harbor-offline-installer-v1.3.0.tgz
第三步:上传到/opt,并解压
第四步:修改harbor.cfg配置文件
hostname = 10.0.0.11
harbor_admin_password = 123456
第五步:执行install.sh
### 具体命令
[root@docker02 ~]# yum install docker-compose -y
[root@docker02 ~]# cd /opt/
[root@docker02 opt]# rz ## harbor-offline-installer-v1.8.0.tgz
containerd harbor-offline-installer-v1.8.0.tgz
[root@docker02 opt]# tar xf harbor-offline-installer-v1.8.0.tgz
[root@docker02 opt]# cd harbor/
[root@docker02 harbor]# vim harbor.yml
......
hostname: 10.0.0.12 ###域名
harbor_admin_password: 123456 ###设置密码
......
###如果需要配置https则替换自己的阿里云https证书路径。(记得做host 域名 劫持)
[root@docker02 harbor]# ./install.sh
......
✔ ----Harbor has been installed and started successfully.----
Now you should be able to visit the admin portal at http://10.0.0.12.
For more details, please visit https://github.com/goharbor/harbor .
浏览器访问10.0.0.12
###将10.0.0.11的镜像上传到harbor
[root@docker01 srv]# docker tag alpine:3.9 10.0.0.12/library/alpine:3.9
[root@docker01 srv]# vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"],
"insecure-registries": ["10.0.0.12"]
}
[root@docker01 srv]# systemctl restart docker
[root@docker01 srv]# docker login 10.0.0.12
Username:admin
Paddword:123456
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@docker01 srv]# docker push 10.0.0.12/library/alpine:3.9
#### 在web页面查看,成功
Harbor的HTTPS模式
[root@docker02 harbor]# cd /opt/
[root@docker02 opt]# mkdir cert
[root@docker02 opt]# cd cert/
[root@docker02 cert]# rz ###证书
[root@docker02 cert]# ls
blog.oldqiang.com.zip
[root@docker02 cert]# unzip blog.oldqiang.com.zip
Archive: blog.oldqiang.com.zip
inflating: blog.oldqiang.com.csr
[root@docker02 cert]# mv Nginx nginx
[root@docker02 cert]# cd nginx/
[root@docker02 nginx]# ls
1_blog.oldqiang.com_bundle.crt 2_blog.oldqiang.com.key
[root@docker02 harbor]# vim harbor.yml
[root@docker02 harbor]# vim install.sh
......
hostname: blog.oldqiang.com
https:
port: 443
certificate: /opt/cert/nginx/1_blog.oldqiang.com_bundle.crt
private_key: /opt/cert/nginx/2_blog.oldqiang.com.key
......
[root@docker02 harbor]# ./install.sh
....
✔ ----Harbor has been installed and started successfully.----
Now you should be able to visit the admin portal at https://blog.oldqiang.com.
For more details, please visit https://github.com/goharbor/harbor .
### 在本机(Windows)上做劫持10.0.0.12 blog.oldqiang.com
容器监控实践--cadvisor
概述
为了解决docker stats的问题(存储、展示),谷歌开源的cadvisor诞生了,cadvisor不仅可以搜集一台机器上所有运行的容器信息,还提供基础查询界面和http接口,方便其他组件如Prometheus进行数据抓取,或者cadvisor + influxdb + grafna搭配使用。
cAdvisor可以对节点机器上的资源及容器进行实时监控和性能数据采集,包括CPU使用情况、内存使用情况、网络吞吐量及文件系统使用情况
Cadvisor使用Go语言开发,利用Linux的cgroups获取容器的资源使用信息,在K8S中集成在Kubelet里作为默认启动项,官方标配。
安装
- 1.使用二进制部署
下载二进制:https://github.com/google/cadvisor/releases/latest
本地运行:./cadvisor -port=8080 &>>/var/log/cadvisor.log
- 2.使用docker部署
docker run \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:rw \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--volume=/dev/disk/:/dev/disk:ro \
--publish=8080:8080 \
--detach=true \
--name=cadvisor \
google/cadvisor:latest
注意:
在Ret Hat,CentOS, Fedora 等发行版上需要传递如下参数,因为 SELinux 加强了安全策略:
--privileged=true
启动后访问:http://127.0.0.1:8080查看页面,/metric查看指标
image
* 常见指标:http://yjph83.iteye.com/blog/2394091
* 指标分析:https://luoji.live/cadvisor/cadvisor-source-code-metrics-20160927.html`
- 3.kubernetes中使用
* Daemonset部署: https://github.com/google/cadvisor/tree/master/deploy/kubernetes
* kubelet自带cadvisor监控所有节点,可以设置--cadvisor-port=8080指定端口(默认为4194)
* kubernetes 在2015-03-10 这个提交(Run cAdvisor inside the Kubelet. Victor Marmol 2015/3/10 13:39)中cAdvisor开始集成在kubelet中,目前的1.6及以后均存在
注意:
从 v1.7 开始,Kubelet metrics API 不再包含 cadvisor metrics,而是提供了一个独立的 API 接口:
* Kubelet metrics: http://127.0.0.1:8001/api/v1/proxy/nodes/<node-name>/metrics
* Cadvisor metrics: http://127.0.0.1:8001/api/v1/proxy/nodes/<node-name>/metrics/cadvisor
cadvisor 监听的端口将在 v1.12 中删除,建议所有外部工具使用 Kubelet Metrics API 替代。
常用搭配
1.cAdvisor+Heapster+influxdb
image
Heapster:在k8s集群中获取metrics和事件数据,写入InfluxDB,heapster收集的数据比cadvisor多,却全,而且存储在influxdb的也少。
Heapster将每个Node上的cAdvisor的数据进行汇总,然后导到InfluxDB。
Heapster的前提是使用cAdvisor采集每个node上主机和容器资源的使用情况,
再将所有node上的数据进行聚合。
这样不仅可以看到Kubernetes集群的资源情况,
还可以分别查看每个node/namespace及每个node/namespace下pod的资源情况。
可以从cluster,node,pod的各个层面提供详细的资源使用情况。
- InfluxDB:时序数据库,提供数据的存储,存储在指定的目录下。
- Grafana:提供了WEB控制台,自定义查询指标,从InfluxDB查询数据并展示。
cAdvisor+Prometheus+Grafana
访问http://localhost:8080/metrics,可以拿到cAdvisor暴露给 Prometheus的数据
image
其他内容参考后续的prometheus文章
深入解析
cAdvisor结构图
image
cadvisor地址:https://github.com/google/cadvisor
主函数逻辑:(cadvisor/cadvisor.go)
image.png
通过new出来的memoryStorage以及sysfs实例,创建一个manager实例,manager的interface中定义了许多用于获取容器和machine信息的函数
核心函数:
image.png
生成manager实例的时候,还需要传递两个额外的参数,分别是
- maxHousekeepingInterval:存在内存的时间,默认60s
- allowDynamicHousekeeping:是否允许动态配置housekeeping,也就是下一次开始搜集容器信息的时间,默认true
因为需要暴露服务,所以在handler文件中,将上面生成的containerManager注册进去(cadvisor/http/handler.go),之后就是启动manager,运行其Start方法,开始搜集信息,存储信息的循环操作。
以memory采集为例:
image
具体的信息还是通过runc/libcontainer获得,libcontainer是对cgroup的封装。在/sys/fs/cgroup/memory中包含大量的了memory相关的信息(参考docker原生监控文章)
image
Prometheus的收集器(cadvisor/metrics/prometheus.go)
image
更多源码参考文章:https://luoji.live/categories/cadvisor/
总结
优缺点:
- 优点:谷歌开源产品,监控指标齐全,部署方便,而且有官方的docker镜像。
- 缺点:是集成度不高,默认只在本地保存1分钟数据,但可以集成InfluxDB等存储
备注:
爱奇艺参照cadvisor开发的dadvisor,数据写入graphite,
等同于cadvisor+influxdb,但dadvisor并没有开源
使用prometheus+grafana监控docker容器
### 在docker03安装10.0.0.13(容器安装)
在docker01和docker02上面安装dockerload
10.0.0.11
[root@docker01 ~]# wget http://192.168.37.200/191127/docker_monitor_node.tar.gz
--2019-12-06 13:42:45-- http://192.168.37.200/191127/docker_monitor_node.tar.gz
Connecting to 192.168.37.200:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 94738432 (90M) [text/html]
Saving to: ‘docker_monitor_node.tar.gz’
100%[==============================================>] 94,738,432 27.9MB/s in 3.2s
2019-12-06 13:42:48 (27.9 MB/s) - ‘docker_monitor_node.tar.gz’ saved [94738432/94738432]
[root@docker01 ~]# docker load -i docker_monitor_node.tar.gz
975e03895fb7: Loading layer 4.688MB/4.688MB
f9fe8137e4e3: Loading layer 2.765MB/2.765MB
78f40987f0cd: Loading layer 16.88MB/16.88MB
Loaded image: quay.io/prometheus/node-exporter:latest
cd7100a72410: Loading layer 4.403MB/4.403MB
9ea477e6d99e: Loading layer 33.09MB/33.09MB
66b3c2e84199: Loading layer 32.88MB/32.88MB
Loaded image: google/cadvisor:latest
[root@docker01 ~]# #启动node-exporter
[root@docker01 ~]# docker run -d -p 9100:9100 -v "/:/host:ro,rslave" --name=node_exporter quay.io/prometheus/node-exporter --path.rootfs /host
c50f6cad9512531bc6e432dae384d930d855c06139410a2124a82b896f98f752
[root@docker01 ~]#
[root@docker01 ~]# #启动cadvisor
[root@docker01 ~]# docker run --volume=/:/rootfs:ro --volume=/var/run:/var/run:rw --volume=/sys:/sys:ro --volume=/var/lib/docker/:/var/lib/docker:ro --publish=8080:8080 --detach=true --name=cadvisor google/cadvisor:latest
5e80f5624dd5195ab5bd0b5c08fb011000d21333984e828492f32bf40a56079d
10.0.0.12
[root@docker02 ~]# wget http://192.168.37.200/191127/docker_monitor_node.tar.gz
--2019-12-06 13:42:52-- http://192.168.37.200/191127/docker_monitor_node.tar.gz
Connecting to 192.168.37.200:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 94738432 (90M) [text/html]
Saving to: ‘docker_monitor_node.tar.gz’
100%[==============================================>] 94,738,432 36.0MB/s in 2.5s
2019-12-06 13:42:54 (36.0 MB/s) - ‘docker_monitor_node.tar.gz’ saved [94738432/94738432]
[root@docker02 ~]# docker load -i docker_monitor_node.tar.gz
975e03895fb7: Loading layer 4.688MB/4.688MB
f9fe8137e4e3: Loading layer 2.765MB/2.765MB
78f40987f0cd: Loading layer 16.88MB/16.88MB
Loaded image: quay.io/prometheus/node-exporter:latest
cd7100a72410: Loading layer 4.403MB/4.403MB
9ea477e6d99e: Loading layer 33.09MB/33.09MB
66b3c2e84199: Loading layer 32.88MB/32.88MB
Loaded image: google/cadvisor:latest
[root@docker02 ~]# #启动node-exporter
[root@docker02 ~]# docker run -d -p 9100:9100 -v "/:/host:ro,rslave" --name=node_exporter quay.io/prometheus/node-exporter --path.rootfs /host
eb77b902e05c221485592569a02f581cfd466c8d4d25ffc5de19c56aba75238e
[root@docker02 ~]# #启动cadvisor
[root@docker02 ~]# docker run --volume=/:/rootfs:ro --volume=/var/run:/var/run:rw --volume=/sys:/sys:ro --volume=/var/lib/docker/:/var/lib/docker:ro --publish=8080:8080 --detach=true --name=cadvisor google/cadvisor:latest
77d7900a0bc0aafe99883ac202f1f92cb90e44105e84f19f2f0548ad2c01
10.0.0.13上传prometheus包
[root@web03 ~]# rz -E
rz waiting to receive.
[root@web03 ~]# ls
anaconda-ks.cfg docker_progrium_consul.tar.gz
docker_alpine3.9.tar.gz prometheus-2.12.0.linux-amd64.tar.gz
[root@web03 ~]# mv prometheus-2.12.0.linux-amd64.tar.gz /opt/
[root@web03 ~]# cd /opt/
[root@web03 opt]# ls
containerd prometheus-2.12.0.linux-amd64.tar.gz
[root@web03 opt]# tar xf prometheus-2.12.0.linux-amd64.tar.gz
[root@web03 opt]# mv prometheus-2.12.0.linux-amd64 prometheus
[root@web03 opt]# cd prometheus/
[root@web03 prometheus]# ls
console_libraries consoles LICENSE NOTICE prometheus prometheus.yml promtool
[root@web03 prometheus]# vim prometheus.yml
......
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'cadvvisor'
static_configs:
- targets: ['10.0.0.11:8080','10.0.0.12:8080']
- job_name: 'node-exporter'
static_configs:
- targets: ['10.0.0.11:9100','10.0.0.12:9100']
###其余规则添加也是一样的
......
[root@web03 prometheus]# ./prometheus --config.file="prometheus.yml" #启动
# 访问10.0.0.13:9090 界面有点丑
## 清华源:https://mirrors.tuna.tsinghua.edu.cn/grafana/yum/rpm/
[root@web03 ~]# wget http://192.168.37.200/191127/grafana-6.3.3-1.x86_64.rpm
--2019-12-06 14:07:09-- http://192.168.37.200/191127/grafana-6.3.3-1.x86_64.rpm
Connecting to 192.168.37.200:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 58546654 (56M) [application/x-redhat-package-manager]
Saving to: ‘grafana-6.3.3-1.x86_64.rpm’
100%[=============================================================================>] 58,546,654 20.2MB/s in 2.8s
2019-12-06 14:07:11 (20.2 MB/s) - ‘grafana-6.3.3-1.x86_64.rpm’ saved [58546654/58546654]
[root@web03 ~]# yum localinstall grafana-6.3.3-1.x86_64.rpm -y
Complete!
[root@web03 ~]# systemctl start grafana-server.service
[root@web03 ~]# systemctl enable grafana-server.service
Created symlink from /etc/systemd/system/multi-user.target.wants/grafana-server.service to /usr/lib/systemd/system/grafana-server.service.
浏览器访问10.0.0.13:3000 账号密码均为admin
grafana:
插件:zabbix
数据源:zabbix
dashboard 米修斯官方默认支持
## 压测
[root@docker02 ~]# yum install httpd-tools -y
[root@docker02 ~]# ab -n 10000 -c10 http://10.0.0.11/index.php
22.1、k8s的安装方法
kubernetes 二进制安装 安装最新版,步骤繁琐!!
https://github.com/minminmsn/k8s1.13/blob/master/kubernetes/kubernetes1.13.1%2Betcd3.3.10%2Bflanneld0.10%E9%9B%86%E7%BE%A4%E9%83%A8%E7%BD%B2.md
kubeadm 安装(网络原因)
https://www.qstack.com.cn/archives/425.html
minikube 安装(网络原因)
yum 安装(最容易 1.5)
go编译安装(大神级别)
k8s-master 管理者
kubelet --docker 启动容器
kubelet --docker
22.2、制作一个只支持sshd服务的镜像
1):启动一个容器,并修改
docker run -it -p 1022:22 centos:6.8 /bin/bash
yum install openssh-server -y
echo 'root:123456'|chpasswd
/etc/init.d/sshd start
测试:ssh远程登录
2):将修改后的容器,保存为镜像
docker commit friendly_swartz centos6-ssh
3)测试新镜像,sshd是否可用
docker run -d -p 1122:22 centos6-ssh:latest /usr/sbin/sshd -D
ssh root@10.0.0.11 -p 1122
22.3、制作了一个支持sshd和httpd双服务的镜像
1):启动一个容器,并修改
docker run -d -p 1122:22 centos6-ssh:latest /usr/sbin/sshd -D
yum install httpd -y
/etc/init.d/httpd start
vi /init.sh
#!/bin/bash
/etc/init.d/httpd start
/usr/sbin/sshd -D
chmod +x /init.sh
2):将修改后的容器,保存为镜像
docker commit 11bf5984784a centos6-httpd
3)测试新镜像,检测sshd和httpd是否可用
docker run -d -p 1222:22 -p 80:80 centos6-httpd:latest /init.sh
作业:使用Dockerfile完成kodexplorer网盘项目
课前回顾:
Linux容器是与系统其他部分隔离开的一系列进程,从另一个系统镜像rootfs运行,并由该镜像提供支持进程所需的全部文件。
容器镜像包含了应用的所有依赖项,因而在从开发到测试再到生产的整个过程中,它都具有可移植性和一致性。
1:chroot,ldd
2:lxc namespace(6大命名空间)和cgroup
3:docker和kvm区别,docker镜像基础操作,docker容器日常操作,commit制作镜像,dockfile来自动构建镜像
22.4、docker私有仓库registry
1)启动registry容器
docker run -d -p 5000:5000 --restart=always --name registry -v /opt/myregistry:/var/lib/registry registry
2)修改/etc/docker/daemon.json配置文件
{
"registry-mirrors": ["https://registry.docker-cn.com"],
"insecure-registries": ["10.0.0.11:5000"]
}
3)重启docker服务
systemctl restart docker
4)为镜像打标签
docker tag centos:6.8 10.0.0.11:5000/oldboy/centos:6.8
5)push推送镜像
docker push 10.0.0.11:5000/oldboy/centos:6.8