docker介绍及部署搭建与详细步骤--全

docker容器

阅读目录(Content)

回到顶部(go to top)

docker容器

1:什么是容器?

容器就是在隔离的环境运行的一个进程,如果进程停止,容器就会销毁。隔离的环境拥有自己的系统文件,ip地址,主机名等

kvm虚拟机,linux,系统文件 ###下图表示系统文件

1563758502713

程序:代码,命令
进程:正在运行的程序

2:容器和虚拟化的区别

linux容器技术,容器虚拟化和kvm虚拟化的区别
kvm虚拟化: 需要硬件的支持,需要模拟硬件,可以运行不同的操作系统,启动时间分钟级(开机启动流程)

linux开机启动流程:

bios开机硬件自检(检查电脑有没有问题)
根据bios设置的优先启动项boot 网卡 硬盘 u盘 光驱 (这就是第一次装系统,装完第二次为啥不会弹出再装系统界面。这是因为系统本身存在优先级)
读取mbr引导 2T UEFI(gpt分区) mbr硬盘分区信息,内核加载路径,
加载内核
启动第一个进程/sbin/init systemd
系统初始化完成
运行服务(nginx,httpd,mysql)
。。。

1575334859712

容器启动流程:

直接共用宿主机内核:
第一个进程直接启动服务(nginx,httpd,mysql) 秒级启动

容器:共用宿主机内核,轻量级,损耗少,启动快,性能高,只能运行在linux系统上
虚拟机:需要硬件的支持,需要模拟硬件,需要走开机启动流程,可以运行不同的操作系统

为什么容器:为企业节省成本

100台虚拟机 100个服务 10台

100个容器 100个服务 6台 (节省4台服务器的钱、节省机房托管费用。。。二三十万。。。)

1575334903540

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的路径下,可以使用相对路径

img

13:docker镜像的分层(kvm 链接克隆,写时复制的特性)

img

基于镜像做的链接克隆,就是每个镜像都是一层一层的。基于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

容器之间是相互共通的
####
[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

1575705131711

1575705171468

1575705217613

创建网卡后的低级自动发现

1575706335588

自定义监控项原型



1575706575939

1575706682816

1575706780521

案例:添加监控项原型,监控网卡的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

1575707858247

1575707941920

1575707972634

  • 监测中--->最新数据(创建成功)

1575708066342

自定义自动发现规则


### 创建自动发现规则脚本
[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界面创建自动发现规则

1575711570940

1575711655505

1575711809616

  • 没有监控项原型,我们去创建一个监控项原型
[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


  • 点击监控项原型--->创建监控项原型(变量值)

1575713094126

  • 监控项--->docker

1575713274875

  • 表示创建成功

1575713339046

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

1575598196346

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/

1575601536920

img

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页面查看,成功

1575555337756

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

1575557612995

容器监控实践--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查看指标

img

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

img

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的数据

img

image

其他内容参考后续的prometheus文章

深入解析

cAdvisor结构图

img

image

cadvisor地址:https://github.com/google/cadvisor

主函数逻辑:(cadvisor/cadvisor.go)

img

image.png

通过new出来的memoryStorage以及sysfs实例,创建一个manager实例,manager的interface中定义了许多用于获取容器和machine信息的函数

核心函数:

img

image.png

生成manager实例的时候,还需要传递两个额外的参数,分别是

  • maxHousekeepingInterval:存在内存的时间,默认60s
  • allowDynamicHousekeeping:是否允许动态配置housekeeping,也就是下一次开始搜集容器信息的时间,默认true

因为需要暴露服务,所以在handler文件中,将上面生成的containerManager注册进去(cadvisor/http/handler.go),之后就是启动manager,运行其Start方法,开始搜集信息,存储信息的循环操作。

以memory采集为例:

img

image

具体的信息还是通过runc/libcontainer获得,libcontainer是对cgroup的封装。在/sys/fs/cgroup/memory中包含大量的了memory相关的信息(参考docker原生监控文章)

img

image

Prometheus的收集器(cadvisor/metrics/prometheus.go)

img

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

1575612738222

1575612882885

1575613090503

1575613157200

1575613224858

1575613315615

1575613392137

1575613532366

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

posted @ 2019-12-18 19:12  老王教你学Linux  阅读(6887)  评论(0编辑  收藏  举报