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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM