docker容器
閱讀目錄(Content)
docker容器
1:什么是容器?
容器就是在隔離的環境運行的一個進程,如果進程停止,容器就會銷毀。隔離的環境擁有自己的系統文件,ip地址,主機名等
kvm虛擬機,linux,系統文件 ###下圖表示系統文件
程序:代碼,命令
進程:正在運行的程序
2:容器和虛擬化的區別
linux容器技術,容器虛擬化和kvm虛擬化的區別
kvm虛擬化: 需要硬件的支持,需要模擬硬件,可以運行不同的操作系統,啟動時間分鍾級(開機啟動流程)
linux開機啟動流程:
bios開機硬件自檢(檢查電腦有沒有問題)
根據bios設置的優先啟動項boot 網卡 硬盤 u盤 光驅 (這就是第一次裝系統,裝完第二次為啥不會彈出再裝系統界面。這是因為系統本身存在優先級)
讀取mbr引導 2T UEFI(gpt分區) mbr硬盤分區信息,內核加載路徑,
加載內核
啟動第一個進程/sbin/init systemd
系統初始化完成
運行服務(nginx,httpd,mysql)
。。。
容器啟動流程:
直接共用宿主機內核:
第一個進程直接啟動服務(nginx,httpd,mysql) 秒級啟動
容器:共用宿主機內核,輕量級,損耗少,啟動快,性能高,只能運行在linux系統上
虛擬機:需要硬件的支持,需要模擬硬件,需要走開機啟動流程,可以運行不同的操作系統
為什么容器:為企業節省成本
100台虛擬機 100個服務 10台
100個容器 100個服務 6台 (節省4台服務器的錢、節省機房托管費用。。。二三十萬。。。)
3:容器技術的發展過程:
1):chroot技術(1979年),新建一個子系統(擁有自己完整的系統文件)
相關參考資料:https://www.ibm.com/developerworks/cn/linux/l-cn-chroot/
chang root (在centos中下載Ubuntu系統,解壓,cd ubuntu系統,然后執行命令,是在Ubuntu中執行)
作業1:使用chroot監獄限制SSH用戶訪問指定目錄和使用指定命令(cp,ls)----限制系統,除了指定的幾個命令之外啥都干不了。
https://linux.cn/article-8313-1.html
ls
2):linux容器(lxc) linux container(namespaces 命名空間 隔離環境 及cgroups 資源限制)--------------現在基本不怎么使用了,在這里只是了解就好。
docker與lxc的前世今生
lxc: linux contains 叫----linux容器(namespace是用來做資源隔離的、cgroup是用來做資源限制的)
lxc是最接近虛擬機的容器:啟動進程是/sbin/init,rsyslog
容器是一個進程 直接啟動nginx,相對來說lxc,docker更輕量級
kvm: 1c 2g
容器: 1c 2g
docker (namespace 資源隔離的cgroup 資源限制的)
容器是一個進程,nginx
docker容器引擎,只不過現在docker成了容器的代名詞
lxc容器
l ibcontainer 容器技術|
cgroups 限制一個進程能夠使用的資源。cpu,內存,硬盤io
kvm虛擬機:資源限制(1c 1G 20G)
##需要使用epel源
#安裝epel源
yum install epel-release -y
編譯epel源配置文件
vi /etc/yum.repos.d/epel.repo
[epel]
name=Extra Packages for Enterprise Linux 7 - $basearch
baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/7/$basearch
#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-7&arch=$basearch
failovermethod=priority
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
[epel-debuginfo]
name=Extra Packages for Enterprise Linux 7 - $basearch - Debug
baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/7/$basearch/debug
#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-debug-7&arch=$basearch
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
gpgcheck=1
[epel-source]
name=Extra Packages for Enterprise Linux 7 - $basearch - Source
baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/7/SRPMS
#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-source-7&arch=$basearch
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
gpgcheck=1
安裝lxc
yum install lxc-* -y
yum install libcgroup* -y
yum install bridge-utils.x86_64 -y
橋接網卡
[root@controller ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
echo 'TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=yes
BRIDGE=virbr0' >/etc/sysconfig/network-scripts/ifcfg-eth0
[root@controller ~]# cat /etc/sysconfig/network-scripts/ifcfg-virbr0
echo 'TYPE=Bridge
BOOTPROTO=static
NAME=virbr0
DEVICE=virbr0
ONBOOT=yes
IPADDR=10.0.0.11
NETMASK=255.255.255.0
GATEWAY=10.0.0.254
DNS1=180.76.76.76' >/etc/sysconfig/network-scripts/ifcfg-virbr0
啟動cgroup
systemctl start cgconfig.service
啟動lxc
systemctl start lxc.service
創建lxc容器
方法1:
lxc-create -t download -n centos6 -- --server mirrors.tuna.tsinghua.edu.cn/lxc-images -d centos -r 6 -a amd64
方法2:
lxc-create -t centos -n test
為lxc容器設置root密碼:
[root@controller ~]# chroot /var/lib/lxc/test/rootfs passwd
Changing password for user root.
New password:
BAD PASSWORD: it is too simplistic/systematic
BAD PASSWORD: is too simple
Retype new password:
passwd: all authentication tokens updated successfully.
為容器指定ip和網關
vi /var/lib/lxc/centos7/config
lxc.network.name = eth0
lxc.network.ipv4 = 10.0.0.111/24
lxc.network.ipv4.gateway = 10.0.0.254
啟動容器
lxc-start -n centos7
3):docker容器
centos7.6 2G 10.0.0.11 docker01 host解析
centos7.6 2G 10.0.0.12 docker02 host解析
Docker是通過進程虛擬化技術(namespaces及cgroups cpu、內存、磁盤io等)來提供容器的資源隔離與安全保障等。由於Docker通過操作系統層的虛擬化實現隔離,所以Docker容器在運行時,不需要類似虛擬機(VM)額外的操作系統開銷,提高資源利用率。
namespace 資源隔離
cgroups 進程的資源限制
kvm 虛擬磁盤文件,資源隔離
kvm 資源限制,--cpus --memory
docker 初期把lxc二次開發,libcontainer
4:docker的安裝
10.0.0.11:修改主機名和host解析 ###源地址:https://mirrors.tuna.tsinghua.edu.cn/help/docker-ce/
10.0.0.12:修改主機名和host解析與docker01一樣。
docker engine 0.9 .... docker engine 1.12,1.13
在2017年出現 docker ce docker ee 1703,1706現在最新版1903
[root@docker01 ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.0.0.11 docker01
10.0.0.12 docker02
[root@docker01 ~]# rm -fr /etc/yum.repos.d/local.repo
[root@docker01 ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
[root@docker01 ~]# wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
[root@docker01 ~]# sed -i 's#download.docker.com#mirrors.tuna.tsinghua.edu.cn/docker-ce#g' /etc/yum.repos.d/docker-ce.repo
[root@docker01 ~]# yum install docker-ce -y
注意環境問題go1.12.12 此處忽略
[root@docker01 ~]# docker version
Client: Docker Engine - Community
Version: 19.03.5
API version: 1.40
Go version: go1.12.12
Git commit: 633a0ea
Built: Wed Nov 13 07:25:41 2019
OS/Arch: linux/amd64
Experimental: false
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
5:docker的主要組成部分
docker是傳統的CS架構分為docker client和docker server,像mysql一樣
命令:docker version
[root@controller ~]# docker version
Client:
Version: 17.12.0-ce
API version: 1.35
Go version: go1.9.2
Git commit: c97c6d6
Built: Wed Dec 27 20:10:14 2017
OS/Arch: linux/amd64
Server:
Engine:
Version: 17.12.0-ce
API version: 1.35 (minimum version 1.12)
Go version: go1.9.2
Git commit: c97c6d6
Built: Wed Dec 27 20:12:46 2017
OS/Arch: linux/amd64
Experimental: false
[root@docker01 ~]# systemctl start docker.service
[root@docker01 ~]# systemctl enable docker.service
docker主要組件有:鏡像、容器、倉庫, 網絡,存儲、監控
啟動容器必須需要一個鏡像,倉庫中只存儲鏡像
容器---鏡像---倉庫
6:啟動第一個容器
docker的主要目標是"Build,Ship and Run any App,Angwhere",構建,運輸,處處運行
部署服務,環境問題
一次構建,處處運行
docker是一種軟件的打包技術
docker初次體驗:
安裝Nginx步驟:
官網下載Nginx源碼包wget
tar
創建Nginx用戶
編譯安裝
./config....
修改配置文件,
啟動
配置docker鏡像加速
vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
docker run -d -p 80:80 nginx
run(創建並運行一個容器)
-d 放在后台
-p 端口映射
nginx docker鏡像的名字
7:docker的鏡像管理
搜索鏡像 docker search +鏡像名稱
[root@docker01 ~]# docker search tomcat ###搜索tomcat的鏡像
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
tomcat Apache Tomcat is an open source implementati… 2573 [OK]
tomee Apache TomEE is an all-Apache Java EE certif… 71 [OK]
dordoka/tomcat Ubuntu 14.04, Oracle JDK 8 and Tomcat 8 base… 53 [OK]
bitnami/tomcat Bitnami Tomcat Docker Image 30 [OK]
選鏡像的建議:
1,優先考慮官方
2,stars數量多
官方鏡像倉庫地址:hub.docker.com
獲取鏡像:
docker pull(push)
鏡像加速器:阿里雲加速器,daocloud加速器,中科大加速器,Docker 中國官方鏡像加速:https://registry.docker-cn.com
官方pull docker pull centos:6.8(沒有指定版本,默認會下載最新版)
私有倉庫pull docker pull daocloud.io/huangzhichong/alpine-cn:latest
配置docker鏡像加速
vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
命令:
查看鏡像列表
docker images or docker image ls
刪除鏡像
docker rmi 例子:docker image rm centos:latest
導出鏡像
docker save 例子:docker image save centos -o docker-centos7.4.tar.gz
導入鏡像
docker load 例子:docker image load -i docker-centos7.4.tar.gz
[root@docker01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
yiliao v1 854323d80fea About an hour ago 453MB
nginx latest 540a289bab6c 5 weeks ago 126MB
alpine 3.9 055936d39205 6 months ago 5.53MB
[root@docker01 ~]# docker image rm -f e8289dcc1d4b #此處為IMAGE ID
Untagged: daocloud.io/huangzhichong/alpine-cn:latest
Deleted: sha256:e8289dcc1d4b00c0d5696681a299c6d3bd045e0627470c05d95166e73acc2246
Deleted: sha256:4bd0fc2d9f8c87f1fbcdd95cf23810b933094f75d51d1de30c0fec084f87c7cb
Deleted: sha256:60ab55d3379d47c1ba6b6225d59d10e1f52096ee9d5c816e42c635ccc57a5a2b
[root@docker01 ~]# docker image save nginx -o docker_nginx.tar.gz
[root@docker01 ~]# ls
anaconda-ks.cfg docker_centos6.9.tar.gz docker_nginx.tar.gz
[root@docker01 ~]# docker image load -i docker_nginx.tar.gz
Loaded image: nginx:latest
[root@docker01 ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
yiliao v1 854323d80fea About an hour ago 453MB
nginx latest 540a289bab6c 5 weeks ago 126MB
[root@docker01 ~]# docker image load -i docker_alpine.zip
f1b5933fe4b5: Loading layer 5.796MB/5.796MB
Loaded image: alpine:3.9
###壓縮包格式都可以
### 拓展(提升工作效率:批量下載和導入docker)
[root@docker01 ~]# for n in docker_alpine3.9.tar.gz docker_busybox.tar.gz docker_centos6.9.tar.gz docker_k8s_dns.tar.gz;do wget http://192.168.37.200/191127/$n;docker image load -i $n ;done
喝茶去嘍。。。。。
#將多個鏡像打成一個包
[root@docker01 ~]# docker image save nginx:latest alpine:3.9 busybox:latest -o docker_test.tar.gz
[root@docker01 ~]# ls
docker_test.tar.gz
###將所有的容器打成一個包
[root@docker01 ~]# docker image save `docker images |awk 'NR>1{print $1":"$2}' |xargs -n 100` -o docker_all_image.tar.gz
[root@docker01 ~]# ll -h
total 1.5G
-rw------- 1 root root 645M Dec 3 20:38 docker_all_image.tar.gz
docker image
build Build an image from a Dockerfile
history 歷史
import Import the contents from a tarball to create a filesystem image
inspect 詳細信息,及詳情
load 鏡像導入
ls 列表
prune 清理未構建完成的緩存
pull 下載
push 上傳
rm 刪除
save 保存
tag 標簽
8:docker的容器管理
*** docker run -d -p 80:80 nginx:latest
run(創建並運行一個容器)
-d 放在后台
-p 端口映射
-v 源地址(宿主機):目標地址(容器)
nginx docker鏡像的名字
docker run -it --name centos6 centos:6.9 /bin/bash
-it 分配交互式的終端interactive tty
--name 指定容器的名字
/bin/sh覆蓋容器的初始命令
運行容器***
docker run image_name
docker run ==== docker create + docker start
啟動容器
docker start
停止容器
docker stop CONTAINER_ID
殺死容器
docker kill container_name
查看容器列表
docker ps(-a -l -q)
進入正在運行的容器(目的,調試,排錯)
*** docker exec (會分配一個新的終端tty)
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
docker exec -it 容器id或容器名字 /bin/bash(/bin/sh) ##docker exec -it540a289bab6c/bin/bash
docker attach(使用同一個終端,打開兩個窗口可以發現是增刪改查同步的,這時候偷偷(退出)離開的快捷鍵為ctrl+p,ctrl+q
docker attach [OPTIONS] CONTAINER
nsenter(安裝yum install -y util-linux 棄用)
重命名
docker rename
刪除容器
docker rm
批量刪除容器(全部刪除已經啟動的)
docker rm -f `docker ps -a -q`
docker logs #查看容器的輸出(排錯)
### 夯住的命令
tail -f /etc/hosts
nginx :nginx -g 'daemon off;'
[root@docker01 ~]# docker run -d -p 88:80 nginx:latest tail -f /etc/hosts
94302b6359eabb9471a0c818bdf34370e254408c96d92019041043704e345260
[root@docker01 ~]# curl -I 10.0.0.11:88
curl: (7) Failed connect to 10.0.0.11:88; Connection refused
[root@docker01 ~]# docker ps -a -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
94302b6359ea nginx:latest "tail -f /etc/hosts" 2 minutes ago Up 2 minutes 0.0.0.0:88->80/tcp great_wozniak
###進入docker啟動nginx
[root@docker01 ~]# docker exec -it 94302b6359ea /bin/bash
root@94302b6359ea:/# nginx
root@94302b6359ea:/# 10.0.0.11 - - [03/Dec/2019:13:13:20 +0000] "HEAD / HTTP/1.1"
[root@docker01 ~]# curl -I 10.0.0.11:88
HTTP/1.1 200 OK
Server: nginx/1.17.5
Date: Tue, 03 Dec 2019 13:13:20 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 22 Oct 2019 14:30:00 GMT
Connection: keep-alive
ETag: "5daf1268-264"
Accept-Ranges: bytes
### 一般我們用下面這種方法
[root@docker01 ~]# docker run -d -p 89:80 nginx:latest nginx -g 'daemon off;'
e7b1cbc2e38f6cb53d20aec8ae13deab80c7df544a6800d73cb40764d9b79036
[root@docker01 ~]# curl -I 10.0.0.11:88
HTTP/1.1 200 OK
Server: nginx/1.17.5
Date: Tue, 03 Dec 2019 13:22:20 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 22 Oct 2019 14:30:00 GMT
Connection: keep-alive
ETag: "5daf1268-264"
Accept-Ranges: bytes
###宿主機有網,虛擬機沒網
sysctl net.ipv4.ip_forward=1
總結:docker容器內的第一個進程(初始命令)必須一直處於前台運行的狀態(必須夯住),否則這個容器,就會處於退出狀態!(為什么夯住?)
業務在容器中運行:初始命令,夯住,啟動服務
9:docker容器的網絡訪問(端口映射)
docker0:172.17.0.1 jumpserver:172.17.0.2 nginx:172.17.0.3
指定映射(docker 會自動添加一條iptables規則來實現端口映射)
-p hostPort:containerPort
[root@docker01 ~]# run -d -p 80:80 nginx:latest
-p ip:hostPort:containerPort 多個容器都想使用8080端口
[root@docker01 ~]# ifconfig eth0:1 10.0.0.100/24 up
[root@docker01 ~]# docker run -d -p 10.0.0.100:81:80 nginx:latest
-p ip::containerPort(隨機端口)
[root@docker01 ~]# docker run -d -p 10.0.0.100::80 nginx:latest
-p hostPort:containerPort/udp --udp
[root@docker01 ~]# docker run -d -p 10.0.0.100::80/udp nginx:latest
b360c780a57d1769dcf01095182723309226590e2fb03d655ca7b8ee02e29fda
-p 10.0.0.100::53/udp 使用宿主機的10.0.0.100這個ip地址的隨機端口的udp協議映射容器的udp53端口
-p 81:80 –p 443:443 可以指定多個-p ###容器里面多個服務
隨機映射
docker run -P (隨機端口) ip:宿主機端口
通過iptables來實現的端口映射
10:docker的數據卷管理
/usr/share/nginx/html
-v /opt/xiaoniao:/usr/share/nginx/html
持久化
數據卷(文件或目錄)
-v 卷名:/data (第一次卷是空,會容器的數據復制到卷中,如果卷里面有數據,把卷數據的掛載到容器中)
-v src(宿主機的目錄):dst(容器的目錄)
數據卷容器
--volumes-from(跟某一個已經存在的容器掛載相同的卷)
[root@docker01 ~]# cd /opt/
[root@docker01 opt]# ls
containerd everyxiaoqiang-yiliao-master.zip
[root@docker01 opt]# unzip everyxiaoqiang-yiliao-master.zip
[root@docker01 opt]# docker rm -f `docker ps -a -q` ##清除鏡像
[root@docker01 opt]# docker run -d -p 80:80 -v /opt/yiliao:/usr/share/nginx/html nginx:latest
9584dd8b215160be0e1a3357a36a9d5188a8ac2a7e5a9df5dae2ed0417f5b33a
[root@docker01 opt]# docker ps -a -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9584dd8b2151 nginx:latest "nginx -g 'daemon of…" 46 seconds ago Up 45 seconds 0.0.0.0:80->80/tcp quizzical_raman
基於nginx啟動一個容器,監聽80和81,訪問80,出現nginx默認歡迎首頁,訪問81,出現小鳥。
-p 80:80 -p 81:81 -v xxx:xxx -v xxx:xxxx
基於nginx多端口的多站點。
搭建一個lnmp架構
###啟動一個基礎容器
[root@docker01 ~]# docker run -it -p 80:80 centos:6.9 /bin/bash
[root@84b4aac619e6 /]# echo "192.168.37.200 mirrors.aliyun.com" >>/etc/hosts
[root@84b4aac619e6 /]# curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
104 2185 104 2185 0 0 442k 0 --:--:-- --:--:-- --:--:-- 1066k
[root@84b4aac619e6 /]# curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
102 923 102 923 0 0 77296 0 --:--:-- --:--:-- --:--:-- 150k
[root@84b4aac619e6 /]# yum install nginx php-fpm php-gd php-mbstring unzip php-mariadb -y
[root@84b4aac619e6 /]# vi /etc/php-fpm.d/www.conf ###將apache換成nginx
......
user = nginx
; RPM: Keep a group allowed to write in log dir.
group = nginx
......
[root@84b4aac619e6 /]# service php-fpm start
Starting php-fpm: [ OK ]
[root@84b4aac619e6 /]# nginx
[root@84b4aac619e6 /]# cd /etc/nginx/conf.d/
[root@84b4aac619e6 conf.d]# cat default.conf
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /html/wordpress;
index index.php index.html index.html;
include /etc/nginx/default.d/*.conf;
location / {
}
location ~ \. {
root /html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /html$fastcgi_script_name;
include fastcgi_params;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
[root@84b4aac619e6 conf.d]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@84b4aac619e6 conf.d]# service nginx restart
Stopping nginx: [ OK ]
Starting nginx: [ OK ]
[root@84b4aac619e6 conf.d]# service php-fpm restart
Stopping php-fpm: [ OK ]
Starting php-fpm: [ OK ]
[root@84b4aac619e6 html]# yum install wget -y
[root@84b4aac619e6 html]# wget http://192.168.37.200/191127/wordpress-4.9.4-zh_CN.zip
[root@84b4aac619e6 html]# unzip wordpress-4.9.4-zh_CN.zip
[root@84b4aac619e6 html]# chown -R nginx:nginx .
11:手動將容器保存為鏡像
docker commit 容器id或者容器的名字 新的鏡像名字[:版本號可選]
1):基於容器制作鏡像
docker run -it centos:6.9
######
yum install httpd
yum install openssh-server
/etc/init.d/sshd start
vi /init.sh
#!/bin/bash
/etc/init.d/httpd start
/usr/sbin/sshd -D
chmod +x /init.sh
(2)將容器提交為鏡像
docker commit 699d13a555ae centos6-ssh-httpd:v1
(3)測試鏡像功能是否可用
[root@docker01 wordpress]# docker run -d -p 84:80 centos6.9:v3
3b85246fcebbb4d71b9e59feaf216673bf9f59e9e4ba56703946129f8da5f32f
手動制作的鏡像,傳輸時間長
鏡像初始命令
制作一個kodexplorer網盤docker鏡像。nginx + php-fpm(httpd + php)
###上傳centos6鏡像
echo "192.168.37.200 mirrors.aliyun.com" >>/etc/hosts
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
yum install nginx -y
yum install unzip -y
cd /usr/share/nginx/html/
curl -o yiliao.zip http://192.168.37.200/191127/everyxiaoqiang-yiliao-master.zip
unzip yiliao.zip
mv yiliao/* .
nginx
1.什么是容器
容器就是在隔離的環境中運行的一個進程.如果進程結束,容器退出. 這個隔離的環境,有自己的系統文件,ip地址,主機名,進程管理
2:容器和虛擬機的區別
容器: 不依賴硬件cpu支持共用宿主機內核,輕量級,啟動快,性能高,損壞少
虛擬機虛擬化: 依賴硬件cpu支持,擁有自己的內核,
docker用的多: 節省成本
3:docker-ce的安裝
centos base源 docker engine 1.13
docker.repo
yum install docker-ce 17.03 1903
4:docker主要內容
容器 鏡像 倉庫 網絡 存儲 監控
5:docker鏡像常用命令
docker image:
docker image ls 查看鏡像列表
docker image rm 刪除鏡像
docker image load 導入鏡像
docker image save 導出鏡像
docker image pull 下載鏡像(拉取鏡像)
docker image push 上傳鏡像
docker image history kod:v5 --no-truc 歷史命令
6:docker容器的常用命令
docker run 創建並啟動容器
docker kill 強制關閉容器
docker rm 刪除容器
docker ps 查看容器列表
docker start 啟動容器
docker stop 關閉容器
docker restart 重啟容器
docker exec 進入正在運行的容器(分配一個新的端口)(排查錯誤)
docker attach 進入正在運行的容器(同一個終端)
docker logs 查看容器的終端輸出(排查錯誤)
docker cp #容器和宿主機之間拷貝
docker container diff id #對比容器發生的變化
docker container export id -o docker_test.tar.gz #將容器導出為鏡像,文件格式
docker container diff inspect #查看容器屬性
docker container pause #容器掛起
docker container unpause #容器解除掛起
docker stats --no-stream(只去一次的值) #監控用的
docker run -d --cpus 1 --memory 50 MiB kod:v5 #資源限制內存、cpu
dockerr container top oldxu #查看oldxu起了哪些進程
[root@docker01 ~]# docker run -d -p 80:80 nginx
7e5740f8990c6a1db84a27f0024e272816068e794d3a510f054c1959c1f45858
[root@docker01 ~]# docker ps -a -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7e5740f8990c nginx "nginx -g 'daemon of…" About a minute ago Up About a minute 0.0.0.0:80->80/tcp trusting_tesla
[root@docker02 ~]# docker container diff 7e5740f8990c
[root@docker02 ~]# docker container export 7e5740f8990c -o docker_test.tar.gz
[root@docker02 ~]# ls
anaconda-ks.cfg docker_nginx.tar.gz docker_test.tar.gz
[root@docker01 ~]# docker container inspect 7e5740f8990c #查看容器屬性
7:docker端口映射
docker run -p
宿主機端口:容器端口 最常見
ip1:宿主機端口:容器端口 ip2:宿主機端口:容器端口
ip1::容器端口 隨機端口
ip1::容器端口/udp
-p 宿主機端口1:容器端口1 -p 宿主機端口2:容器端口2
docker run -P 自動隨機端口映射
8:docker數據卷
docker run -v 宿主機目錄:容器目錄 -v 宿主機文件:容器文件
9:手動制作鏡像
a:啟動一個基礎容器,在容器安裝自己的服務
b:把安裝好服務的容器提交為鏡像
c:測試鏡像是否可用
12:dockerfile自動構建docker鏡像
類似ansible劇本,大小幾kb
手動做鏡像:大小幾百M+
dockerfile 支持自定義容器的初始命令
dockerfile主要組成部分:
基礎鏡像信息 FROM centos:6.9
制作鏡像操作指令 RUN yum install openssh-server -y
容器啟動時執行指令 CMD ["/bin/bash"]
dockerfile常用指令:
FROM 這個鏡像的媽媽是誰?(指定基礎鏡像)
MAINTAINER 告訴別人,誰負責養它?(指定維護者信息,可以沒有) ##一般不用
LABLE 描述,標簽 ##一般不用
RUN 你想讓它干啥(在命令前面加上RUN即可)
ADD 給它點創業資金(會自動解壓tar) 制作docker基礎的系統鏡像
WORKDIR 我是cd,今天剛化了妝(設置當前工作目錄)
VOLUME 給它一個存放行李的地方(設置卷,掛載主機目錄)
EXPOSE 它要打開的門是啥(指定對外的端口)(-P 隨機端口)
CMD 奔跑吧,兄弟!(指定容器啟動后的要干的事情)(容易被替換)
dockerfile其他指令:
COPY 復制文件(不會解壓)rootfs.tar.gz
ENV 環境變量
ENTRYPOINT 容器啟動后執行的命令(無法被替換,啟容器的時候指定的命令,會被當成參數)
制作成鏡像:
docker build -t 鏡像名字:版本號 dockerfile的路徑
如果在dockerfile的路徑下,可以使用相對路徑
13:docker鏡像的分層(kvm 鏈接克隆,寫時復制的特性)
基於鏡像做的鏈接克隆,就是每個鏡像都是一層一層的。基於centos6.9---->安裝nginx。做了什么操作就增加一層,一層可以多個業務使用。最底層鏡像沒有parent。先安裝nginx再安裝php和先安裝php再安裝nginx打包的鏡像是不一樣的。
### 鏡像分層的好處:復用,節省磁盤空間,相同的內容只需加載一份到內,提高構建速度。
修改dockerfile之后,再次構建速度快
13.1 dockerfile 優化方案:
1:盡可能選擇體積小linux,alpine
2:盡可能合並RUN指令,清理無用的文件(yum緩存,源碼包)
3:修改dockerfile,把變化的內容盡可能放在dockerfile結尾
4: 使用.dockerignore,減少不必要的文件ADD . /html
14:容器間的互聯(--link 是單方向的!!!)
容器之間是相互共通的
####
[root@docker01 ~]# docker run -it alpine:3.9
/ # ping 127.0.0.2
PING 127.0.0.2 (127.0.0.2): 56 data bytes
64 bytes from 127.0.0.2: seq=0 ttl=64 time=0.170 ms
64 bytes from 127.0.0.2: seq=1 ttl=64 time=0.077 ms
[root@docker02 ~]# docker run -it alpine:3.9
/ # ping 127.17.0.3
PING 127.17.0.3 (127.17.0.3): 56 data bytes
64 bytes from 127.17.0.3: seq=0 ttl=64 time=0.084 ms
64 bytes from 127.17.0.3: seq=1 ttl=64 time=0.089 ms
一般容器ip地址是變動的,好多容器都是很純的,如何讓容器之間通訊呢?
[root@docker02 ~]# docker run -d -it --name db01 alpine:3.9
6d4ff52336775e6e69b2a4bc9f352d0942b5b61d67fe95c5028a88c696dcd8fc
[root@docker02 ~]# docker ps -a -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6d4ff5233677 alpine:3.9 "/bin/sh" 53 seconds ago Up 51 seconds db01
[root@docker01 ~]# docker run -it --link db01:web01 alpine:3.9 /bin/bash
/# ping db01 ###測試可以ping通
###總結:
docker run -d -p 80:80 nginx
docker run -it --link quirky_brown:web01 qstack/centos-ssh /bin/bash
nginx容器的名字:別名 鏡像名
ping web01
容器間的互聯 zabbix練習
lb --->nginx 172.17.0.4 --> db01 172.17.0.3 --> nfs01 172.17.0.2
使用docker運行zabbix-server
[root@docker01 ~]# cd srv/
[root@docker01 srv]# ls
docker-compose.yml zabbix-agent-3.2.0-1.el7.x86_64.rpm zabbix-server-mysql.tar.gz
docker-mysql-5.7.tar.gz zabbix-java-gateway.tar.gz zabbix-web-nginx-mysql.tar.gz
[root@docker01 srv]# for n in `ls *`;do docker load -i $n ;done ##循環上傳所有的鏡像
### zabbix.com 打開官網--->中文--->產品手冊--->zabbix4.0-->安裝---->從容器中安裝(如下內容直接粘貼運行即可)
1. 首先,啟動空的 MySQL 服務器實例。
2. 其次,啟動 Zabbix Java gateway 實例
3. 然后,啟動 Zabbix server 實例,並將其關聯到已創建的 MySQL server 實例。
4. 最后,啟動 Zabbix Web 界面,並將其關聯到已創建的 MySQL server 和 Zabbix server 實例。
[root@docker01 srv]#
docker run --name mysql-server -t \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix_pwd" \
-e MYSQL_ROOT_PASSWORD="root_pwd" \
-d mysql:5.7 \
--character-set-server=utf8 --collation-server=utf8_bin
docker run --name zabbix-java-gateway -t \
-d zabbix/zabbix-java-gateway:latest
docker run --name zabbix-server-mysql -t \
-e DB_SERVER_HOST="mysql-server" \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix_pwd" \
-e MYSQL_ROOT_PASSWORD="root_pwd" \
-e ZBX_JAVAGATEWAY="zabbix-java-gateway" \
--link mysql-server:mysql \
--link zabbix-java-gateway:zabbix-java-gateway \
-p 10051:10051 \
-d zabbix/zabbix-server-mysql:latest
docker run --name zabbix-web-nginx-mysql -t \
-e DB_SERVER_HOST="mysql-server" \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix_pwd" \
-e MYSQL_ROOT_PASSWORD="root_pwd" \
--link mysql-server:mysql \
--link zabbix-server-mysql:zabbix-server \
-p 80:80 \
-d zabbix/zabbix-web-nginx-mysql:latest
###清理容器
[root@docker01 srv]# docker rm -f `docker ps -a -q`
[root@docker01 srv]# docker-compose up -d
Creating srv_mysql-server_1 ... done
Creating srv_zabbix-java-gateway_1 ... done
Creating srv_mysql-server_1 ...
Creating srv_zabbix-server_1 ... done
Creating srv_zabbix-server_1 ...
Creating srv_zabbix-web_1 ... done
###瀏覽器訪問10.0.0.11
監控報警:微信報警,alpine
yum 安裝zabbix好使
[root@docker02 srv]# rpm -ivh zabbix-agent-3.2.0-1.el7.x86_64.rpm
warning: zabbix-agent-3.2.0-1.el7.x86_64.rpm: Header V4 RSA/SHA512 Signature, key ID a14fe591: NOKEY
Preparing... ################################# [100%]
package zabbix-agent-3.2.0-1.el7.x86_64 is already installed
[root@docker02 srv]# systemctl restart zabbix-agent.service
[root@docker02 srv]# systemctl enable zabbix-agent.service
監控一台主機(web界面創建)
[root@docker01 srv]# docker-compose restart zabbix-server
低級自動發現---->功能:根據原型自動創建監控項(測試:我們在docker02上面創建一個分區)
[root@docker02 srv]# dd if=/dev/zero of=/opt/test.raw bs=200M count=1
[root@docker02 srv]# mkfs.xfs /opt/test.raw
[root@docker02 srv]# mount -o loop /opt/test.raw /mnt
10.0.0.11重啟
[root@docker01 srv]# docker-compose restart zabbix-server
Restarting srv_zabbix-server_1 ... done
創建網卡后的低級自動發現
自定義監控項原型
案例:添加監控項原型,監控網卡的mac地址(eth0)
[root@docker01 srv]# ifconfig eth0 |awk 'NR==4 {print $2}'
00:0c:29:c1:51:a4
[root@docker02 srv]# vim /etc/zabbix/zabbix_agentd.d/user_define.conf
UserParameter=net.if.mac[*], ifconfig $1 |awk '/ether/ {print $$2}'
[root@docker02 srv]# systemctl restart zabbix-agent.service
###在服務端安裝zabbix_agint測試
[root@docker01 srv]# wget https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/3.2/rhel/7/x86_64/zabbix-agent-3.2.11-1.el7.x86_64.rpm
[root@docker01 srv]# rpm -ivh zabbix-agent-3.2.11-1.el7.x86_64.rpm
warning: zabbix-agent-3.2.11-1.el7.x86_64.rpm: Header V4 RSA/SHA512 Signature, key ID a14fe591: NOKEY
Preparing... ################################# [100%]
Updating / installing...
1:zabbix-agent-3.2.11-1.el7 ################################# [100%]
[root@docker01 srv]# zabbix_get -s 10.0.0.12 -k net.if.mac[eth0]
00:0c:29:93:4c:31
- 監測中--->最新數據(創建成功)
自定義自動發現規則
### 創建自動發現規則腳本
[root@docker02 ~]# mkdir /scripts
[root@docker02 ~]# cd /scripts/
[root@docker02 scripts]# vim docker_discovery.sh
#!/bin/bash
port=($(/usr/bin/docker ps -a|grep -v "CONTAINER ID"|awk '{print $NF}'))
printf '{\n'
printf '\t"data":[\n'
for key in ${!port[@]}
do
if [[ "${#port[@]}" -gt 1 && "${key}" -ne "$((${#port[@]}-1))" ]];then
printf '\t {\n'
printf "\t\t\t\"{#CONTAINERNAME}\":\"${port[${key}]}\"},\n"
else [[ "${key}" -eq "((${#port[@]}-1))" ]]
printf '\t {\n'
printf "\t\t\t\"{#CONTAINERNAME}\":\"${port[${key}]}\"}\n"
fi
done
printf '\t ]\n'
printf '}\n'
[root@docker02 scripts]# sh docker_discovery.sh
[root@docker02 scripts]# sh docker_discovery.sh
{
"data":[
{
"{#CONTAINERNAME}":"cadvisor"},
{
"{#CONTAINERNAME}":"node_exporter"},
{
"{#CONTAINERNAME}":"test02"},
{
"{#CONTAINERNAME}":"recursing_matsumoto"},
{
"{#CONTAINERNAME}":"nginx"},
{
"{#CONTAINERNAME}":"harbor-jobservice"},
{
"{#CONTAINERNAME}":"harbor-portal"},
{
"{#CONTAINERNAME}":"harbor-core"},
{
"{#CONTAINERNAME}":"redis"},
{
"{#CONTAINERNAME}":"registryctl"},
{
"{#CONTAINERNAME}":"registry"},
{
"{#CONTAINERNAME}":"harbor-db"},
{
"{#CONTAINERNAME}":"harbor-log"}
]
}
[root@docker02 scripts]# vim /etc/zabbix/zabbix_agentd.d/user_define.conf
[root@docker02 scripts]# cat /etc/zabbix/zabbix_agentd.d/user_define.conf
UserParameter=net.if.mac[*], ifconfig $1 |awk '/ether/ {print $$2}'
UserParameter=docker.discover,/bin/bash /scripts/docker_discovery.sh
[root@docker02 scripts]# chmod u+s /usr/bin/docker
[root@docker02 scripts]# systemctl restart zabbix-agent.service
###在docker01上測試
[root@docker01 ~]# zabbix_get -s 10.0.0.12 -k docker.discover
{
"data":[
{
"{#CONTAINERNAME}":"cadvisor"},
{
"{#CONTAINERNAME}":"harbor-db"},
{
"{#CONTAINERNAME}":"harbor-log"}
]
}
####在web界面創建自動發現規則
- 沒有監控項原型,我們去創建一個監控項原型
[root@docker02 scripts]# vim /etc/zabbix/zabbix_agentd.d/user_define.conf
[root@docker02 scripts]# cat /etc/zabbix/zabbix_agentd.d/user_define.conf
UserParameter=net.if.mac[*], ifconfig $1 |awk '/ether/ {print $$2}'
UserParameter=docker.discover,/bin/bash /scripts/docker_discovery.sh
UserParameter=docker_alive[*],/usr/bin/docker ps -a|grep $1|grep -c Up
[root@docker02 scripts]# systemctl restart zabbix-agent.service
[root@docker02 scripts]# docker run -it --name oldxu alpine:3.9
### docker01測試
[root@docker01 ~]# zabbix_get -s 10.0.0.12 -k docker_alive[oldxu]
1
- 點擊監控項原型--->創建監控項原型(變量值)
- 監控項--->docker
- 表示創建成功
15:docker registry(私有倉庫)
15.1普通的registry
docker run -d -p 5000:5000 --restart=always --name registry -v /opt/myregistry:/var/lib/registry registry
上傳鏡像到私有倉庫:
a:給鏡像打標簽
docker tag centos6-sshd:v3 10.0.0.11:5000/centos6-sshd:v3
b:上傳鏡像
docker push 10.0.0.11:5000/centos6-sshd:v3
docker run -d 10.0.0.11:5000/centos6-sshd:v3
如果遇到報錯:
The push refers to repository [10.0.0.11:5000/centos6.9_ssh]
Get https://10.0.0.11:5000/v2/: http: server gave HTTP response to HTTPS client
解決方法:
vim /etc/docker/daemon.json
{
"insecure-registries": ["10.0.0.11:5000"]
}
systemctl restart docker
15.2帶basic認證的registry
yum install httpd-tools -y
mkdir /opt/registry-var/auth/ -p
htpasswd -Bbn oldboy 123456 >> /opt/registry-var/auth/htpasswd
docker run -d -p 5000:5000 --restart=always -v /opt/registry-var/auth/:/auth/ -v /opt/myregistry:/var/lib/registry -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd" registry
#####------> 課堂練習 <------######
### 在10.0.0.11 上執行
[root@docker01 ~]# rz -E
rz waiting to receive.
[root@docker01 ~]# docker load -i registry.tar.gz
ef763da74d91: Loading layer [==================================================>] 5.058MB/5.058MB
7683d4fcdf4e: Loading layer [==================================================>] 7.894MB/7.894MB
656c7684d0bd: Loading layer [==================================================>] 22.79MB/22.79MB
a2717186d7dd: Loading layer [==================================================>] 3.584kB/3.584kB
3c133a51bc00: Loading layer [==================================================>] 2.048kB/2.048kB
[root@docker01 ~]# docker run -d -p 5000:5000 --restart=always --name registry -v /opt/myregistry:/var/lib/registry regist
5384fec9ffe2088e93b34a11bd13c2c66a0e7785ef8e23b10ad0ad2a32fbea87
### 在10.0.0.12上執行
[root@docker02 ~]# docker tag nginx:latest 10.0.0.11:5000/nginx:latest
[root@docker02 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
10.0.0.11:5000/nginx latest 540a289bab6c 6 weeks ago 126MB
10.0.0.11 5000 540a289bab6c 6 weeks ago 126MB
nginx latest 540a289bab6c 6 weeks ago 126MB
[root@docker02 ~]# docker push 10.0.0.11:5000/nginx:latest
The push refers to repository [10.0.0.11:5000/nginx]
Get https://10.0.0.11:5000/v2/: http: server gave HTTP response to HTTPS client
[root@docker02 ~]# cat /etc/docker/daemon.json ###需要編輯將https轉換成http
{
"insecure-registries": ["10.0.0.11:5000"]
}
[root@docker02 ~]# systemctl restart docker
[root@docker02 ~]# docker push 10.0.0.11:5000/nginx:latest
The push refers to repository [10.0.0.11:5000/nginx]
a89b8f05da3a: Pushed
6eaad811af02: Pushed
b67d19e65ef6: Pushed
latest: digest: sha256:f56b43e9913cef097f246d65119df4eda1d61670f7f2ab720831a01f66f6ff9c size: 948
[root@docker02 ~]# docker run -it nginx:latest /bin/bash
root@6f5828400349:/# echo 'asdfas' >1.txt
root@6f5828400349:/# exit
exit
[root@docker02 ~]# docker commit 6f5828400349 10.0.0.11:5000/test:v1
sha256:fc41f498981594ec8a13026c924667e0867996b41c3d8e1ecf7b8d86924c2ea8
[root@docker02 ~]# docker push 10.0.0.11:5000/test:v1
The push refers to repository [10.0.0.11:5000/test]
c807577ddda5: Pushed
a89b8f05da3a: Mounted from nginx
6eaad811af02: Mounted from nginx
b67d19e65ef6: Mounted from nginx
v1: digest: sha256:4f47bb1a092f2291d53197159798c5351ea5eb5105e549d91f138ffb23d67b33 size: 1155
[root@docker02 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
10.0.0.11:5000/test v1 fc41f4989815 43 seconds ago 126MB
10.0.0.11:5000/nginx latest 540a289bab6c 6 weeks ago 126MB
10.0.0.11 5000 540a289bab6c 6 weeks ago 126MB
nginx latest 540a289bab6c 6 weeks ago 126MB
[root@docker02 ~]# cd /var/lib/docker
[root@docker02 docker]# rm -rf *
[root@docker02 docker]# systemctl restart docker
[root@docker02 docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
[root@docker02 docker]# docker pull 10.0.0.11:5000/nginx:latest
latest: Pulling from nginx
8d691f585fa8: Pull complete
5b07f4e08ad0: Pull complete
abc291867bca: Pull complete
Digest: sha256:f56b43e9913cef097f246d65119df4eda1d61670f7f2ab720831a01f66f6ff9c
Status: Downloaded newer image for 10.0.0.11:5000/nginx:latest
10.0.0.11:5000/nginx:latest
[root@docker02 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
10.0.0.11:5000/nginx latest 540a289bab6c 6 weeks ago 126MB
###故障案例
###故障解決一個redis壞了,另外一個業務服務加相同ip
ifconfig etho:1 10.0.0.54/24 up
16:docker-compose(單機版的容器編排工具)
類似於ansible劇本
[root@docker02 ~]# mkdir /wordpress
[root@docker02 ~]# cd /wordpress/
[root@docker02 wordpress]# docker images mysql
REPOSITORY TAG IMAGE ID CREATED SIZE
[root@docker02 wordpress]# docker load -i wordpress-latest.tar
[root@docker02 wordpress]# yum install -y docker-compose -y(需要配置epel源)
[root@docker02 my_wordpress~]# vi docker-compose.yml
version: '3'
services:
db:
image: mysql:5.7
volumes:
- /data/db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
volumes:
- /data/web_data:/var/www/html
ports:
- "80:80"
restart: always
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
### 啟動
[root@docker02 wordpress]# docker-compose up
### 后台啟動
[root@docker02 wordpress]# docker-compose up -d
17:重啟docker服務,容器全部退出的解決辦法
方法一:docker run --restart=always
方法二:"live-restore": true
docker server配置文件/etc/docker/daemon.json參考
{
"registry-mirrors": ["http://b7a9017d.m.daocloud.io"],
"insecure-registries":["10.0.0.11:5000"],
"live-restore": true
}
18:Docker Machine安裝docker服務
Docker Machine 二進制 10.0.0.11
10.0.0.12 免密碼登陸 從docker的官網下載二進制的包,去安裝docker
10.0.0.13 免密碼登陸
ansible:
shell
19:Docker網絡類型
None:不為容器配置任何網絡功能,--net=none
Container:與另一個運行中的容器共享Network Namespace,--net=container:containerID(K8S)
Host:與宿主機共享Network Namespace,--network=host ###性能最高
Bridge:Docker設計的NAT網絡模型
### 課堂案例實解 #####
[root@docker01 ~]# docker network
Usage: docker network COMMAND
Manage networks
Commands:
connect Connect a container to a network
create Create a network
disconnect Disconnect a container from a network
inspect Display detailed information on one or more networks
ls List networks
prune Remove all unused networks
rm Remove one or more networks
Run 'docker network COMMAND --help' for more information on a command.
[root@docker01 ~]# docker run -d -P nginx:latest #隨機端口運行容器
[root@docker01 ~]# docker run -it --network=host alpine:3.9 ##容器網絡配置成和本機一樣的
/ # hostname · ###主機名和宿主機一致
docker01
/ # cat /etc/hosts ##hosts解析和宿主機一致
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.0.0.11 docker01
10.0.0.12 docker02
192.168.37.200 mirrors.aliyun.com
/ #
[root@docker01 ~]# docker run -d -P kod:v8
581d65e8dc0781ec726866253f0f5865c3331684a882107d5a3150bc38fff966
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
581d65e8dc07 kod:v8 "/bin/bash /init.sh" 16 seconds ago Up 15 seconds angry_ardinghelli
c76fcbdb84ec nginx:latest "nginx -g 'daemon of…" 13 minutes ago Up 13 minutes 0.0.0.0:32769->80/tcp gallant_wilson
[root@docker01 ~]# docker run -it --network container:581d65e8dc07 alpine:3.9
### 運行alpine:3.9 與kod:v8 容器一致
/ # hostname
581d65e8dc07
20:Docker跨主機容器之間的通信macvlan
默認一個物理網卡,只有一個物理mac地址,虛擬多個mac地址qwerrty
##創建macvlan網絡
docker network create --driver macvlan --subnet 10.0.0.0/24 --gateway 10.0.0.254 -o parent=eth0 macvlan_1
##設置eth0的網卡為混雜模式
ip link set eth1 promisc on
##創建使用macvlan網絡的容器
docker run -it --network macvlan_1 --ip=10.0.0.200 busybox
作業1:docker跨主機容器間的通信flannel
###課堂演示
[root@docker01 ~]# docker network create --driver macvlan --subnet 10.0.0.0/24 --gateway 10.0.0.254 -o parent=eth0 macvlan_1
216908a532007660491b6e67507d50d5de84e2264d97064e0195d7192583a866
[root@docker02 ~]# docker network create --driver macvlan --subnet 10.0.0.0/24 --gateway 10.0.0.254 -o parent=eth0 macvlan_1
a873fb5b166f678c423fe1e62a3444f20da26603d759b19817a72a38473bb753
[root@docker01 ~]# docker run -it --network macvlan_1 --ip=10.0.0.77 alpine:3.9
/ # ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
16: eth0@if2: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UNKNOWN
link/ether 02:42:0a:00:00:4d brd ff:ff:ff:ff:ff:ff
inet 10.0.0.77/24 brd 10.0.0.255 scope global eth0
valid_lft forever preferred_lft forever
[root@docker02 ~]# docker network create --driver macvlan --subnet 10.0.0.0/24 --gateway 10.0.0.254 -o parent=eth0 macvlan_1
a873fb5b166f678c423fe1e62a3444f20da26603d759b19817a72a38473bb753
[root@docker02 ~]# docker run -it --network macvlan_1 --ip=10.0.0.66 alpine:3.9
/ # ping 10.0.0.77 ##可以相互通信
PING 10.0.0.77 (10.0.0.77): 56 data bytes
64 bytes from 10.0.0.77: seq=0 ttl=64 time=0.979 ms
[root@docker01 ~]# docker run -it --network macvlan_1 --ip=10.0.0.88 kod:v8
###夯住了。。。。。正常現象
### 如下圖瀏覽器訪問10.0.0.88可以訪問到kod:v8
[c:\~]$ ping 10.0.0.88 ##可以ping通
正在 Ping 10.0.0.88 具有 32 字節的數據:
來自 10.0.0.88 的回復: 字節=32 時間<1ms TTL=64
來自 10.0.0.88 的回復: 字節=32 時間<1ms TTL=64
21:Dcoker跨主機容器通信之overlay
docker03上:
docker run -d -p 8500:8500 -h consul --name consul progrium/consul -server -bootstrap
設置容器的主機名
consul:kv類型的存儲數據庫(key:value)
docker01、02上:
vim /etc/docker/daemon.json
{
"hosts":["tcp://0.0.0.0:2376","unix:///var/run/docker.sock"],
"cluster-store": "consul://10.0.0.13:8500",
"cluster-advertise": "10.0.0.11:2376"
}
vim /etc/docker/daemon.json
vim /usr/lib/systemd/system/docker.service
systemctl daemon-reload
systemctl restart docker
2)創建overlay網絡
docker network create -d overlay --subnet 172.16.1.0/24 --gateway 172.16.1.254 ol1
3)啟動容器測試
docker run -it --network ol1 --name oldboy01 busybox /bin/bash
每個容器有兩塊網卡,eth0實現容器間的通訊,eth1實現容器訪問外網
### 上課演示 #### --->創建一台docker03 10.0.0.13
[root@web03 ~]# rm -fr /etc/yum.repos.d/local.repo
[root@web03 ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 2523 100 2523 0 0 4158 0 --:--:-- --:--:-- --:--:-- 4163
[root@web03 ~]# wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
--2019-12-06 10:32:16-- https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
Resolving mirrors.ustc.edu.cn (mirrors.ustc.edu.cn)... 202.141.176.110, 218.104.71.170
Connecting to mirrors.ustc.edu.cn (mirrors.ustc.edu.cn)|202.141.176.110|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 2424 (2.4K) [application/octet-stream]
Saving to: ‘/etc/yum.repos.d/docker-ce.repo’
100%[===================================================================>] 2,424 --.-K/s in 0s
2019-12-06 10:32:17 (434 MB/s) - ‘/etc/yum.repos.d/docker-ce.repo’ saved [2424/2424]
[root@web03 ~]# sed -i 's#download.docker.com#mirrors.tuna.tsinghua.edu.cn/docker-ce#g' /etc/yum.repos.d/docker-ce.repo
[root@web03 ~]# yum install docker-ce -y
Complete!
[root@web03 ~]# systemctl start docker.service
[root@web03 ~]# systemctl enable docker.service
[root@web03 ~]# rz
[root@web03 ~]# ls
anaconda-ks.cfg docker_alpine3.9.tar.gz docker_progrium_consul.tar.gz
[root@web03 ~]# docker image load -i docker_progrium_consul.tar.gz
745737c319fa: Loading layer 5.628MB/5.628MB
f3ab176661f3: Loading layer 9.417MB/9.417MB
1feb7d205df9: Loading layer 4.806MB/4.806MB
70f8ad72ed07: Loading layer 18.25MB/18.25MB
e4b1687664d8: Loading layer 255kB/255kB
f70996ac24ae: Loading layer 1.001MB/1.001MB
33cdef66dc09: Loading layer 15.45MB/15.45MB
2472fd5d1e44: Loading layer 15.45MB/15.45MB
655df57eba5d: Loading layer 2.56kB/2.56kB
5f70bf18a086: Loading layer 1.024kB/1.024kB
18fc328d2a80: Loading layer 3.584kB/3.584kB
af8c1839c171: Loading layer 2.56kB/2.56kB
d46ded49a20c: Loading layer 2.56kB/2.56kB
Loaded image: progrium/consul:latest
[root@web03 ~]# docker run -d -p 8500:8500 -h consul --name consul progrium/consul -server -bootstrap
3cf7f137c85dcccfb6441e36d1b616af1c48ff9a7fc35014fc265cce656157c4
[root@web03 ~]#
### docker01 10.0.0.11上面運行
^C[root@docker01 ~]# vim /etc/docker/daemon.json
{
"cluster-store": "consul://10.0.0.13:8500",
"cluster-advertise": "10.0.0.11:2376"
}
[root@docker01 ~]# systemctl restart docker
[root@docker01 ~]# docker network create -d overlay --subnet 172.16.1.0/24 --gateway 172.16.1.254 ol1
8c98a16fe29654d70de68202691aec56c5797889d08053efceeb83a2d0cd6c42
[root@docker01 ~]# docker run -it --network ol1 --name test01 alpine:3.9
/ #
### docker02 10.0.0.12 上面運行
[root@docker02 ~]# vim /etc/docker/daemon.json
{
"cluster-store": "consul://10.0.0.13:8500",
"cluster-advertise": "10.0.0.12:2376"
}
[root@docker02 ~]# systemctl restart docker
[root@docker02 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
bff90e7cf6df bridge bridge local
f759b8417602 harbor_harbor bridge local
a4a1341292fa host host local
a873fb5b166f macvlan_1 macvlan local
9101cb77790c none null local
8c98a16fe296 ol1 overlay global
[root@docker02 ~]# docker run -it --network ol1 --name test02 alpine:3.9
/ # ping test01
PING test01 (172.16.1.1): 56 data bytes
64 bytes from 172.16.1.1: seq=0 ttl=64 time=1.976 ms
64 bytes from 172.16.1.1: seq=1 ttl=64 time=0.568 ms
^C
--- test01 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.568/1.272/1.976 ms
/ # ^C
/ # exit
訪問http://10.0.0.13:8500/ui/#/dc1/kv/docker/nodes/
22:docker企業級鏡像倉庫harbor(vmware 中國團隊)
第一步:安裝docker和docker-compose
第二步:下載harbor-offline-installer-v1.3.0.tgz
第三步:上傳到/opt,並解壓
第四步:修改harbor.cfg配置文件
hostname = 10.0.0.11
harbor_admin_password = 123456
第五步:執行install.sh
### 具體命令
[root@docker02 ~]# yum install docker-compose -y
[root@docker02 ~]# cd /opt/
[root@docker02 opt]# rz ## harbor-offline-installer-v1.8.0.tgz
containerd harbor-offline-installer-v1.8.0.tgz
[root@docker02 opt]# tar xf harbor-offline-installer-v1.8.0.tgz
[root@docker02 opt]# cd harbor/
[root@docker02 harbor]# vim harbor.yml
......
hostname: 10.0.0.12 ###域名
harbor_admin_password: 123456 ###設置密碼
......
###如果需要配置https則替換自己的阿里雲https證書路徑。(記得做host 域名 劫持)
[root@docker02 harbor]# ./install.sh
......
✔ ----Harbor has been installed and started successfully.----
Now you should be able to visit the admin portal at http://10.0.0.12.
For more details, please visit https://github.com/goharbor/harbor .
瀏覽器訪問10.0.0.12
###將10.0.0.11的鏡像上傳到harbor
[root@docker01 srv]# docker tag alpine:3.9 10.0.0.12/library/alpine:3.9
[root@docker01 srv]# vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"],
"insecure-registries": ["10.0.0.12"]
}
[root@docker01 srv]# systemctl restart docker
[root@docker01 srv]# docker login 10.0.0.12
Username:admin
Paddword:123456
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
[root@docker01 srv]# docker push 10.0.0.12/library/alpine:3.9
#### 在web頁面查看,成功
Harbor的HTTPS模式
[root@docker02 harbor]# cd /opt/
[root@docker02 opt]# mkdir cert
[root@docker02 opt]# cd cert/
[root@docker02 cert]# rz ###證書
[root@docker02 cert]# ls
blog.oldqiang.com.zip
[root@docker02 cert]# unzip blog.oldqiang.com.zip
Archive: blog.oldqiang.com.zip
inflating: blog.oldqiang.com.csr
[root@docker02 cert]# mv Nginx nginx
[root@docker02 cert]# cd nginx/
[root@docker02 nginx]# ls
1_blog.oldqiang.com_bundle.crt 2_blog.oldqiang.com.key
[root@docker02 harbor]# vim harbor.yml
[root@docker02 harbor]# vim install.sh
......
hostname: blog.oldqiang.com
https:
port: 443
certificate: /opt/cert/nginx/1_blog.oldqiang.com_bundle.crt
private_key: /opt/cert/nginx/2_blog.oldqiang.com.key
......
[root@docker02 harbor]# ./install.sh
....
✔ ----Harbor has been installed and started successfully.----
Now you should be able to visit the admin portal at https://blog.oldqiang.com.
For more details, please visit https://github.com/goharbor/harbor .
### 在本機(Windows)上做劫持10.0.0.12 blog.oldqiang.com
容器監控實踐--cadvisor
概述
為了解決docker stats的問題(存儲、展示),谷歌開源的cadvisor誕生了,cadvisor不僅可以搜集一台機器上所有運行的容器信息,還提供基礎查詢界面和http接口,方便其他組件如Prometheus進行數據抓取,或者cadvisor + influxdb + grafna搭配使用。
cAdvisor可以對節點機器上的資源及容器進行實時監控和性能數據采集,包括CPU使用情況、內存使用情況、網絡吞吐量及文件系統使用情況
Cadvisor使用Go語言開發,利用Linux的cgroups獲取容器的資源使用信息,在K8S中集成在Kubelet里作為默認啟動項,官方標配。
安裝
- 1.使用二進制部署
下載二進制:https://github.com/google/cadvisor/releases/latest
本地運行:./cadvisor -port=8080 &>>/var/log/cadvisor.log
- 2.使用docker部署
docker run \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:rw \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--volume=/dev/disk/:/dev/disk:ro \
--publish=8080:8080 \
--detach=true \
--name=cadvisor \
google/cadvisor:latest
注意:
在Ret Hat,CentOS, Fedora 等發行版上需要傳遞如下參數,因為 SELinux 加強了安全策略:
--privileged=true
啟動后訪問:http://127.0.0.1:8080查看頁面,/metric查看指標
image
* 常見指標:http://yjph83.iteye.com/blog/2394091
* 指標分析:https://luoji.live/cadvisor/cadvisor-source-code-metrics-20160927.html`
- 3.kubernetes中使用
* Daemonset部署: https://github.com/google/cadvisor/tree/master/deploy/kubernetes
* kubelet自帶cadvisor監控所有節點,可以設置--cadvisor-port=8080指定端口(默認為4194)
* kubernetes 在2015-03-10 這個提交(Run cAdvisor inside the Kubelet. Victor Marmol 2015/3/10 13:39)中cAdvisor開始集成在kubelet中,目前的1.6及以后均存在
注意:
從 v1.7 開始,Kubelet metrics API 不再包含 cadvisor metrics,而是提供了一個獨立的 API 接口:
* Kubelet metrics: http://127.0.0.1:8001/api/v1/proxy/nodes/<node-name>/metrics
* Cadvisor metrics: http://127.0.0.1:8001/api/v1/proxy/nodes/<node-name>/metrics/cadvisor
cadvisor 監聽的端口將在 v1.12 中刪除,建議所有外部工具使用 Kubelet Metrics API 替代。
常用搭配
1.cAdvisor+Heapster+influxdb
image
Heapster:在k8s集群中獲取metrics和事件數據,寫入InfluxDB,heapster收集的數據比cadvisor多,卻全,而且存儲在influxdb的也少。
Heapster將每個Node上的cAdvisor的數據進行匯總,然后導到InfluxDB。
Heapster的前提是使用cAdvisor采集每個node上主機和容器資源的使用情況,
再將所有node上的數據進行聚合。
這樣不僅可以看到Kubernetes集群的資源情況,
還可以分別查看每個node/namespace及每個node/namespace下pod的資源情況。
可以從cluster,node,pod的各個層面提供詳細的資源使用情況。
- InfluxDB:時序數據庫,提供數據的存儲,存儲在指定的目錄下。
- Grafana:提供了WEB控制台,自定義查詢指標,從InfluxDB查詢數據並展示。
cAdvisor+Prometheus+Grafana
訪問http://localhost:8080/metrics,可以拿到cAdvisor暴露給 Prometheus的數據
image
其他內容參考后續的prometheus文章
深入解析
cAdvisor結構圖
image
cadvisor地址:https://github.com/google/cadvisor
主函數邏輯:(cadvisor/cadvisor.go)
image.png
通過new出來的memoryStorage以及sysfs實例,創建一個manager實例,manager的interface中定義了許多用於獲取容器和machine信息的函數
核心函數:
image.png
生成manager實例的時候,還需要傳遞兩個額外的參數,分別是
- maxHousekeepingInterval:存在內存的時間,默認60s
- allowDynamicHousekeeping:是否允許動態配置housekeeping,也就是下一次開始搜集容器信息的時間,默認true
因為需要暴露服務,所以在handler文件中,將上面生成的containerManager注冊進去(cadvisor/http/handler.go),之后就是啟動manager,運行其Start方法,開始搜集信息,存儲信息的循環操作。
以memory采集為例:
image
具體的信息還是通過runc/libcontainer獲得,libcontainer是對cgroup的封裝。在/sys/fs/cgroup/memory中包含大量的了memory相關的信息(參考docker原生監控文章)
image
Prometheus的收集器(cadvisor/metrics/prometheus.go)
image
更多源碼參考文章:https://luoji.live/categories/cadvisor/
總結
優缺點:
- 優點:谷歌開源產品,監控指標齊全,部署方便,而且有官方的docker鏡像。
- 缺點:是集成度不高,默認只在本地保存1分鍾數據,但可以集成InfluxDB等存儲
備注:
愛奇藝參照cadvisor開發的dadvisor,數據寫入graphite,
等同於cadvisor+influxdb,但dadvisor並沒有開源
使用prometheus+grafana監控docker容器
### 在docker03安裝10.0.0.13(容器安裝)
在docker01和docker02上面安裝dockerload
10.0.0.11
[root@docker01 ~]# wget http://192.168.37.200/191127/docker_monitor_node.tar.gz
--2019-12-06 13:42:45-- http://192.168.37.200/191127/docker_monitor_node.tar.gz
Connecting to 192.168.37.200:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 94738432 (90M) [text/html]
Saving to: ‘docker_monitor_node.tar.gz’
100%[==============================================>] 94,738,432 27.9MB/s in 3.2s
2019-12-06 13:42:48 (27.9 MB/s) - ‘docker_monitor_node.tar.gz’ saved [94738432/94738432]
[root@docker01 ~]# docker load -i docker_monitor_node.tar.gz
975e03895fb7: Loading layer 4.688MB/4.688MB
f9fe8137e4e3: Loading layer 2.765MB/2.765MB
78f40987f0cd: Loading layer 16.88MB/16.88MB
Loaded image: quay.io/prometheus/node-exporter:latest
cd7100a72410: Loading layer 4.403MB/4.403MB
9ea477e6d99e: Loading layer 33.09MB/33.09MB
66b3c2e84199: Loading layer 32.88MB/32.88MB
Loaded image: google/cadvisor:latest
[root@docker01 ~]# #啟動node-exporter
[root@docker01 ~]# docker run -d -p 9100:9100 -v "/:/host:ro,rslave" --name=node_exporter quay.io/prometheus/node-exporter --path.rootfs /host
c50f6cad9512531bc6e432dae384d930d855c06139410a2124a82b896f98f752
[root@docker01 ~]#
[root@docker01 ~]# #啟動cadvisor
[root@docker01 ~]# docker run --volume=/:/rootfs:ro --volume=/var/run:/var/run:rw --volume=/sys:/sys:ro --volume=/var/lib/docker/:/var/lib/docker:ro --publish=8080:8080 --detach=true --name=cadvisor google/cadvisor:latest
5e80f5624dd5195ab5bd0b5c08fb011000d21333984e828492f32bf40a56079d
10.0.0.12
[root@docker02 ~]# wget http://192.168.37.200/191127/docker_monitor_node.tar.gz
--2019-12-06 13:42:52-- http://192.168.37.200/191127/docker_monitor_node.tar.gz
Connecting to 192.168.37.200:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 94738432 (90M) [text/html]
Saving to: ‘docker_monitor_node.tar.gz’
100%[==============================================>] 94,738,432 36.0MB/s in 2.5s
2019-12-06 13:42:54 (36.0 MB/s) - ‘docker_monitor_node.tar.gz’ saved [94738432/94738432]
[root@docker02 ~]# docker load -i docker_monitor_node.tar.gz
975e03895fb7: Loading layer 4.688MB/4.688MB
f9fe8137e4e3: Loading layer 2.765MB/2.765MB
78f40987f0cd: Loading layer 16.88MB/16.88MB
Loaded image: quay.io/prometheus/node-exporter:latest
cd7100a72410: Loading layer 4.403MB/4.403MB
9ea477e6d99e: Loading layer 33.09MB/33.09MB
66b3c2e84199: Loading layer 32.88MB/32.88MB
Loaded image: google/cadvisor:latest
[root@docker02 ~]# #啟動node-exporter
[root@docker02 ~]# docker run -d -p 9100:9100 -v "/:/host:ro,rslave" --name=node_exporter quay.io/prometheus/node-exporter --path.rootfs /host
eb77b902e05c221485592569a02f581cfd466c8d4d25ffc5de19c56aba75238e
[root@docker02 ~]# #啟動cadvisor
[root@docker02 ~]# docker run --volume=/:/rootfs:ro --volume=/var/run:/var/run:rw --volume=/sys:/sys:ro --volume=/var/lib/docker/:/var/lib/docker:ro --publish=8080:8080 --detach=true --name=cadvisor google/cadvisor:latest
77d7900a0bc0aafe99883ac202f1f92cb90e44105e84f19f2f0548ad2c01
10.0.0.13上傳prometheus包
[root@web03 ~]# rz -E
rz waiting to receive.
[root@web03 ~]# ls
anaconda-ks.cfg docker_progrium_consul.tar.gz
docker_alpine3.9.tar.gz prometheus-2.12.0.linux-amd64.tar.gz
[root@web03 ~]# mv prometheus-2.12.0.linux-amd64.tar.gz /opt/
[root@web03 ~]# cd /opt/
[root@web03 opt]# ls
containerd prometheus-2.12.0.linux-amd64.tar.gz
[root@web03 opt]# tar xf prometheus-2.12.0.linux-amd64.tar.gz
[root@web03 opt]# mv prometheus-2.12.0.linux-amd64 prometheus
[root@web03 opt]# cd prometheus/
[root@web03 prometheus]# ls
console_libraries consoles LICENSE NOTICE prometheus prometheus.yml promtool
[root@web03 prometheus]# vim prometheus.yml
......
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'cadvvisor'
static_configs:
- targets: ['10.0.0.11:8080','10.0.0.12:8080']
- job_name: 'node-exporter'
static_configs:
- targets: ['10.0.0.11:9100','10.0.0.12:9100']
###其余規則添加也是一樣的
......
[root@web03 prometheus]# ./prometheus --config.file="prometheus.yml" #啟動
# 訪問10.0.0.13:9090 界面有點丑
## 清華源:https://mirrors.tuna.tsinghua.edu.cn/grafana/yum/rpm/
[root@web03 ~]# wget http://192.168.37.200/191127/grafana-6.3.3-1.x86_64.rpm
--2019-12-06 14:07:09-- http://192.168.37.200/191127/grafana-6.3.3-1.x86_64.rpm
Connecting to 192.168.37.200:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 58546654 (56M) [application/x-redhat-package-manager]
Saving to: ‘grafana-6.3.3-1.x86_64.rpm’
100%[=============================================================================>] 58,546,654 20.2MB/s in 2.8s
2019-12-06 14:07:11 (20.2 MB/s) - ‘grafana-6.3.3-1.x86_64.rpm’ saved [58546654/58546654]
[root@web03 ~]# yum localinstall grafana-6.3.3-1.x86_64.rpm -y
Complete!
[root@web03 ~]# systemctl start grafana-server.service
[root@web03 ~]# systemctl enable grafana-server.service
Created symlink from /etc/systemd/system/multi-user.target.wants/grafana-server.service to /usr/lib/systemd/system/grafana-server.service.
瀏覽器訪問10.0.0.13:3000 賬號密碼均為admin
grafana:
插件:zabbix
數據源:zabbix
dashboard 米修斯官方默認支持
## 壓測
[root@docker02 ~]# yum install httpd-tools -y
[root@docker02 ~]# ab -n 10000 -c10 http://10.0.0.11/index.php
22.1、k8s的安裝方法
kubernetes 二進制安裝 安裝最新版,步驟繁瑣!!
https://github.com/minminmsn/k8s1.13/blob/master/kubernetes/kubernetes1.13.1%2Betcd3.3.10%2Bflanneld0.10%E9%9B%86%E7%BE%A4%E9%83%A8%E7%BD%B2.md
kubeadm 安裝(網絡原因)
https://www.qstack.com.cn/archives/425.html
minikube 安裝(網絡原因)
yum 安裝(最容易 1.5)
go編譯安裝(大神級別)
k8s-master 管理者
kubelet --docker 啟動容器
kubelet --docker
22.2、制作一個只支持sshd服務的鏡像
1):啟動一個容器,並修改
docker run -it -p 1022:22 centos:6.8 /bin/bash
yum install openssh-server -y
echo 'root:123456'|chpasswd
/etc/init.d/sshd start
測試:ssh遠程登錄
2):將修改后的容器,保存為鏡像
docker commit friendly_swartz centos6-ssh
3)測試新鏡像,sshd是否可用
docker run -d -p 1122:22 centos6-ssh:latest /usr/sbin/sshd -D
ssh root@10.0.0.11 -p 1122
22.3、制作了一個支持sshd和httpd雙服務的鏡像
1):啟動一個容器,並修改
docker run -d -p 1122:22 centos6-ssh:latest /usr/sbin/sshd -D
yum install httpd -y
/etc/init.d/httpd start
vi /init.sh
#!/bin/bash
/etc/init.d/httpd start
/usr/sbin/sshd -D
chmod +x /init.sh
2):將修改后的容器,保存為鏡像
docker commit 11bf5984784a centos6-httpd
3)測試新鏡像,檢測sshd和httpd是否可用
docker run -d -p 1222:22 -p 80:80 centos6-httpd:latest /init.sh
作業:使用Dockerfile完成kodexplorer網盤項目
課前回顧:
Linux容器是與系統其他部分隔離開的一系列進程,從另一個系統鏡像rootfs運行,並由該鏡像提供支持進程所需的全部文件。
容器鏡像包含了應用的所有依賴項,因而在從開發到測試再到生產的整個過程中,它都具有可移植性和一致性。
1:chroot,ldd
2:lxc namespace(6大命名空間)和cgroup
3:docker和kvm區別,docker鏡像基礎操作,docker容器日常操作,commit制作鏡像,dockfile來自動構建鏡像
22.4、docker私有倉庫registry
1)啟動registry容器
docker run -d -p 5000:5000 --restart=always --name registry -v /opt/myregistry:/var/lib/registry registry
2)修改/etc/docker/daemon.json配置文件
{
"registry-mirrors": ["https://registry.docker-cn.com"],
"insecure-registries": ["10.0.0.11:5000"]
}
3)重啟docker服務
systemctl restart docker
4)為鏡像打標簽
docker tag centos:6.8 10.0.0.11:5000/oldboy/centos:6.8
5)push推送鏡像
docker push 10.0.0.11:5000/oldboy/centos:6.8