Docker容器介紹
1.1 docker是什么
Docker 是 Docker.Inc 公司開源的一個基于 LXC技術之上構建的Container容器引擎, 源代碼托管在 GitHub 上, 基于Go語言并遵從Apache2.0協議開源,
Docker是通過內核虛擬化技術(namespaces及cgroups等)來提供容器的資源隔離與安全保障等,由于Docker通過作業系統層的虛擬化實作隔離,所以Docker容器在運行時,不需要類似虛擬機(VM)額外的作業系統開銷,提高資源利用率,
namespace命名空間
Mount Namespace - 用于隔離檔案系統的掛載點
UTS Namespace - 用于隔離 HostName 和 DomianName
IPC Namespace - 用于隔離行程間通信
PID Namespace - 用于隔離行程
cgroups資源限制
控制組(cgroups)是 Linux 內核的一個特性,主要用來對共享資源進行隔離、限制、審計等,只有
能控制分配到容器的資源,才能避免當多個容器同時運行時的對系統資源的競爭,
控制組技術最早是由 Google 的程式員在 2006 年提出,Linux 內核自 2.6.24 開始支持,
控制組可以提供對容器的記憶體、CPU、磁盤 IO 等資源的限制和審計管理,
1.2 容器與虛擬機對比


1.3 docker的三個重要概念
Image(鏡像):
那么鏡像到底是什么呢?Docker 鏡像可以看作是一個特殊的檔案系統,除了提供容器運行時所需的程式、庫、資源、配置等檔案外,還包含了一些為運行時準備的一些配置引數(如匿名卷、環境變數、用戶等),
Container(容器)
容器(Container)的定義和鏡像(Image)幾乎一模一樣,也是一堆層的統一視角,唯一區別在于容器的最上面那一層是可讀可寫的,
Repository(倉庫)
鏡像倉庫是 Docker 用來集中存放鏡像檔案的地方,類似于我們之前常用的代碼倉庫,
通常,一個倉庫會包含同一個軟體不同版本的鏡像,而標簽就常用于對應該軟體的各個版本 ,
我們可以通過<倉庫名>:<標簽>的格式來指定具體是這個軟體哪個版本的鏡像,如果不給出標簽,將以 Latest 作為默認標簽,

1.4 docker的組成部分
docker是傳統的CS架構分為docker client和docker server
Docker 客戶端是 Docker 用戶與 Docker 互動的主要方式,當您使用 Docker 命令列運行命令時,Docker 客戶端將這些命令發送給服務器端,服務端將執行這些命令,
Docker 命令使用 Docker API ,Docker 客戶端可以與多個服務端進行通信,

組件:鏡像,容器,倉庫,網路,存盤
鏡像:把系統檔案打包
虛擬化的幾種架構圖

Docker安裝部署
2.1 國內源安裝docker-ce
這里我們使用清華源:
https://mirrors.tuna.tsinghua.edu.cn/help/docker-ce/
操作步驟:
yum remove docker docker-common docker-selinux docker-engine
yum install -y yum-utils device-mapper-persistent-data lvm2
wget -O /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo
sed -i 's#download.docker.com#mirrors.tuna.tsinghua.edu.cn/docker-ce#' /etc/yum.repos.d/docker-ce.repo
#更新yum快取
yum makecache fast
yum install docker-ce -y
docker version
systemctl start docker
上傳安裝包,
yum localinstall '*.rpm'
2.2 國內遠鏡像加速配置
官網地址
https://www.daocloud.io/mirror
加速命令
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
需要重啟docker
阿里鏡像加速地址
https://cr.console.aliyun.com/cn-hangzhou/instances/repositories
加速命令
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://ig2l319y.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker
2.3 快速安裝
思路:
1.開啟yum快取
2.全新環境安裝docker
3.將快取的包全部打包出來
4.安裝的時候使用rpm -ivh *.rpm方式安裝
2.4 運行第一個容器
運行一個Hello world
docker run alpine /bin/echo "Hello world"
Docker鏡像和容器管理
3.1 鏡像相關命令
3.1.1 搜索鏡像
選擇鏡像建議:
1.優先選擇官方的
2.選擇星星多的
docker search centos
#搜索鏡像所有的版本號.jq是一個json格式化工具
yum install jq
curl -s https://registry.hub.docker.com/v1/repositories/centos/tags|jq
3.1.2 獲取鏡像(沒有指定版本,默認最新)
docker pull centos
docker pull busybox
docker pull busybox:1.29
3.1.3 查看鏡像
docker images
3.1.4 洗掉鏡像(首先洗掉容器,再洗掉鏡像)
docker rmi centos:7
docker images|awk 'NR>1{print "docker rmi "$3}'|bash
docker rmi $(docker images|awk 'NR>1{print $3}')
docker rmi $(docker images -q)
3.1.5 匯出鏡像
docker save -o centos.tar centos:latest
3.1.6 匯入鏡像
docker load < centos.tar
3.2 容器相關命令
3.2.1 啟動容器
docker run -d -p 80:80 nginx
#啟動一個容器并保持不退出 并自定義命名
docker run --name mydocker -t -i centos /bin/bash
#啟動一個容器并保持不退出
docker run -it -d centos:7 /bin/bash
#啟動并進入容器,啟動一個終端,pid為1
docker run -it centos:7 /bin/bash
#啟動一個已經停止的容器
docker start 容器ID
-d放后臺
-p埠映射
#system管理啟動
docker run -d -it --privileged nginx-1 /usr/sbin/init
3.2.2 停止容器
docker stop 容器的ID
#批量停止所有運行的容器
docker stop $(docker ps -q)
3.2.3 查看容器
#查看當前正在運行的容器
docker ps
#查看正在運行以及停止運行的容器
docker ps -a
docker ps -q
docker ps -aq
#查看容器的詳細資訊
docker inspect 容器ID
3.2.4 進入容器
docker exec會分配一個新的終端tty
#進入已經運行的容器
docker exec -it 容器ID /bin/bash
#啟動并進入容器,啟動一個終端,pid為1
docker run -it centos:7 /bin/bash
docker attach會使用同一個終端
docker attach 容器ID
3.2.5 洗掉容器
洗掉單個容器
docker rm 容器ID
批量洗掉容器
docker rm $(docker ps -aq)
Docker網路管理
4.1 隨機映射埠
docker run -P :80 -d nginx:latest
4.2 指定映射埠
-p 宿主機埠:容器埠
docker run -p 8080:80 -d nginx:latest
-p 80:80 -p 443:443
-p 宿主機IP:宿主機埠:容器埠
如果想多個容器使用8080埠,可以通過添加多個IP地址實作
ifconfig eth0:1 10.0.1.13 up
docker run -d -p 10.0.1.11:8080:80 nginx:latest
docker run -d -p 10.0.1.13:8080:80 nginx:latest
進入容器里修改站點目錄,然后訪問測驗
docker exec -it bdb2a4e7e24d /bin/bash
echo "web01" > /usr/share/nginx/html/index.html
docker exec -it 31c1de138dda /bin/bash
echo "web02" > /usr/share/nginx/html/index.html
訪問測驗:
[root@docker01 ~]# curl 10.0.1.11:8080
web02
[root@docker01 ~]# curl 10.0.1.13:8080
web01

Docker資料卷管理
5.1 持久化資料卷
-v 宿主機目錄:容器內目錄
下面我們來創建一個html5小游戲
5.1.1 創建游戲代碼目錄
mkdir /data/xiaoniao -p
cd /data/
unzip xiaoniaofeifei.zip -d xiaoniao /
5.1.2 創建容器并映射資料卷
docker run -d -p 80:80 -v /data/xiaoniao:/usr/share/nginx/html nginx:latest
docker ps
5.1.3 訪問游戲頁面
10.0.1.11
5.2 持久化資料卷容器
--volumes-from (跟某一個已經存在的容器掛載相同的卷)
查看當前容器有哪些卷
docker volume ls
下面我們利用容器卷創建一個小游戲
5.2.1 創建一個容器卷
docker run -d -p 8080:80 --volume xiaoniao:/usr/share/nginx/html nginx:latest
docker volume ls
5.2.2 查看卷的目錄
docker volume inspect xiaoniao
5.2.3 復制代碼目錄到容器卷目錄
\cp -a /data/xiaoniao/* /var/lib/docker/volumes/xiaoniao/_data/
5.2.4 使用容器卷創建新容器
docker run -d -p 8090:80 --volume xiaoniao:/usr/share/nginx/html nginx:latest
5.3 專案實戰-訪問不同埠展示不同頁面
前提:基于自定義鏡像c7_nginx:v1
基于Centos7創建自定義nginx鏡像
1.拉取一個基礎鏡像
docker run --name myc7 -it centos:7 /bin/bash
2.安裝nginx
cat > /etc/yum.repos.d/nginx.repo<<EOF
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/\$releasever/\$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/\$releasever/\$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
EOF
yum install nginx
3.基于自定義的容器生成新的鏡像
docker commit myc7 c7_nginx:v1
4.查看是否生成新鏡像
docker images
5.基于自定義的nginx鏡像創建新的容器并指定映射埠
docker run --name mynginx -itd -p 80:80 c7_nginx:v1 nginx -g "daemon off;"
6.查看容器是否運行并在windows訪問測驗
docker ps
10.0.0.51
7.進入容器查看行程
docker exec -it mynginx /bin/bash
ps aux
nginx -s stop
8.重啟啟動容器測驗是否可以訪問
docker start mynginx
10.0.0.51
有報錯,可以換國內源安裝
docker cp /etc/yum.repos.d/CentOS-Base.repo b1965575341b:/etc/yum.repos.d/
docker cp /etc/yum.repos.d/CentOS-epel.repo b1965575341b:/etc/yum.repos.d/
專案要求:
一個容器實作:
訪問8080埠跳轉到xiaoniao
訪問8090跳轉到game
資料目錄,組態檔,日志檔案都以映射掛載的方式實作
1.創建資料目錄
mkdir /code
cd /code
2.撰寫Nginx組態檔
cat >game.conf<<EOF
server {
listen 8080;
server_name localhost;
location / {
root /opt/xiaoniao/;
index index.html index.htm;
}
}
server {
listen 8090;
server_name localhost;
location / {
root /opt/game/;
index index.html index.htm;
}
}
EOF
3.上傳代碼目錄并解壓
tar zxf xiaoniao.tar.gz
tar zxf game.tar.gz
4.關鍵容器并掛載
docker run -d \
-p 8080:8080 \
-p 8090:8090 \
-v /code/game/:/opt/game/ \
-v /code/xiaoniao/:/opt/xiaoniao/ \
-v /code/game.conf:/etc/nginx/conf.d/game.conf \
-v /var/log/nginx/:/var/log/nginx/ \
c7_nginx:v1 \
nginx -g "daemon off;"
5.訪問測驗
10.0.0.51:8080
10.0.0.52:8090
Docker鏡像手動構建
6.1 手動制作游戲鏡像(沒測驗)
下面我們基于centos容器制作一個新鏡像,并安裝nginx服務
docker run -it centos:7 /bin/bash
yum install wget install openssh-clients -y
rm -rf /etc/yum.repos.d/*
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
cat >/etc/yum.repos.d/nginx.repo<<EOF
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/\$releasever/\$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/\$releasever/\$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
EOF
yum makecache fast
yum install nginx -y
scp -r 10.0.1.51:/data/* /opt/
mv /opt/game.conf /etc/nginx/conf.d/
docker ps
docker commit 容器ID game:v1
docker images
docker save game:v1 > game-v1.tar
docker load < game-v1.tar
docker run -p 8080:8080 -p 8090:8090 -d game:v1 nginx -g 'daemon off;'
6.2 手動制作云盤鏡像
制作成容器:
docker run -it -d -p 80:80 centos:7 /bin/bash
docker exec -it ed90a5662ac4 /bin/bash
容器內正常安裝
0.初始化
使用阿里源
groupadd www -g 1000
useradd www -u 1000 -g 1000 -M -s /sbin/nologin
rm -rf /etc/yum.repos.d/*
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
1.安裝依賴環境 nginx+php
cat>/etc/yum.repos.d/nginx.repo<<EOF
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/\$releasever/\$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/\$releasever/\$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
EOF
yum makecache fast
yum install nginx php-fpm php-mbstring php-gd unzip -y
2.配置Nginx和php
rm -rf /etc/nginx/conf.d/default.conf
sed -i '/^user/c user www;' /etc/nginx/nginx.conf
sed -i '/^user/c user = www' /etc/php-fpm.d/www.conf
sed -i '/^group/c group = www' /etc/php-fpm.d/www.conf
sed -i '/daemonize/s#no#yes#g' /etc/php-fpm.conf
cat >/etc/nginx/conf.d/kod.conf<<EOF
server {
server_name localhost;
listen 80;
root /code;
index index.php index.html;
location ~ \.php\$ {
root /code;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name;
include fastcgi_params;
}
}
EOF
3.配置代碼
mkdir /code
cd /code
curl -o kodexplorer4.40.zip http://static.kodcloud.com/update/download/kodexplorer4.40.zip
unzip kodexplorer4.40.zip
chown -R www:www /code
4.啟動腳本
cd /root
cat >init.sh<<EOF
#!/bin/bash
php-fpm -c /etc/php.ini -y /etc/php-fpm.conf
nginx -g 'daemon off;'
EOF
chmod +x init.sh
5.測驗
方法一:
#若前面沒有映射埠,執行腳本用curl測驗
sh init.sh
重開埠測驗
[root@d0c987bcefa2 code]# curl -I 127.0.0.1
方法二:
登錄web 10.0.0.51測驗
6.宿主機操作
#生成鏡像
docker commit ed90a5662ac4 my_kod:v1
#基于新生成的鏡像.啟動容器
docker run -p 80:80 -d my_kod:v1 /bin/bash /root/init.sh
Dockerfile自動構建Docker鏡像
7.1 Dockerfile操作命令說明
Docker通過對于在Dockerfile中的一系列指令的順序決議實作自動的image的構建
通過使用build命令,根據Dockerfiel的描述來構建鏡像
通過源代碼路徑的方式
通過標準輸入流的方式
Dockerfile指令:
只支持Docker自己定義的一套指令,不支持自定義
大小寫不敏感,但是建議全部使用大寫
根據Dockerfile的內容順序執行
FROM:
FROM {base鏡像}
必須放在DOckerfile的第一行,表示從哪個baseimage開始構建
MAINTAINER:
可選的,用來標識image作者的地方
RUN:
每一個RUN指令都會是在一個新的container里面運行,并提交為一個image作為下一個RUN的base
一個Dockerfile中可以包含多個RUN,按定義順序執行
RUN支持兩種運行方式:
RUN <cmd> 這個會當作/bin/sh -c “cmd” 運行
RUN [“executable”,“arg1”,,,],Docker把他當作json的順序來決議,因此必須使用雙引號,而且executable需要是完整路徑
RUN 都是啟動一個容器、執行命令、然后提交存盤層檔案變更,第一層 RUN command1 的執行僅僅是當前行程,一個記憶體上的變化而已,其結果不會造成任何檔案,而到第二層的時候,啟動的是一個全新的容器,跟第一層的容器更完全沒關系,自然不可能繼承前一層構建程序中的記憶體變化,而如果需要將兩條命令或者多條命令聯合起來執行需要加上&&,如:cd /usr/local/src && wget xxxxxxx
CMD:
CMD的作用是作為執行container時候的默認行為(容器默認的啟動命令)
當運行container的時候宣告了command,則不再用image中的CMD默認所定義的命令
一個Dockerfile中只能有一個有效的CMD,當定義多個CMD的時候,只有最后一個才會起作用
CMD定義的三種方式:
CMD <cmd> 這個會當作/bin/sh -c "cmd"來執行
CMD ["executable","arg1",....]
CMD ["arg1","arg2"],這個時候CMD作為ENTRYPOINT的引數
EXPOSE 宣告埠
格式為 EXPOSE <埠1> [<埠2>...],
EXPOSE 指令是宣告運行時容器提供服務埠,這只是一個宣告,在運行時并不會因為這個宣告應用就會開啟這個埠的服務,在 Dockerfile 中寫入這樣的宣告有兩個好處,一個是幫助鏡像使用者理解這個鏡像服務的守護埠,以方便配置映射;另一個用處則是在運行時使用隨機埠映射時,也就是 docker run -P 時,會自動隨機映射 EXPOSE 的埠,
entrypoint:
entrypoint的作用是,把整個container變成了一個可執行的檔案,這樣不能夠通過替換CMD的方法來改變創建container的方式,但是可以通過引數傳遞的方法影響到container內部
每個Dockerfile只能夠包含一個entrypoint,多個entrypoint只有最后一個有效
當定義了entrypoint以后,CMD只能夠作為引數進行傳遞
entrypoint定義方式:
entrypoint ["executable","arg1","arg2"],這種定義方式下,CMD可以通過json的方式來定義entrypoint的引數,可以通過在運行container的時候通過指定command的方式傳遞引數
entrypoint <cmd>,當作/bin/bash -c "cmd"運行命令
ADD & COPY:
當在源代碼構建的方式下,可以通過ADD和COPY的方式,把host上的檔案或者目錄復制到image中
ADD和COPY的源必須在context路徑下
當src為網路URL的情況下,ADD指令可以把它下載到dest的指定位置,這個在任何build的方式下都可以work
ADD相對COPY還有一個多的功能,能夠進行自動解壓壓縮包
ENV:
ENV key value
用來設定環境變數,后續的RUN可以使用它所創建的環境變數
當創建基于該鏡像的container的時候,會自動擁有設定的環境變數
WORKDIR:
用來指定當前作業目錄(或者稱為當前目錄)
當使用相對目錄的情況下,采用上一個WORKDIR指定的目錄作為基準
USER:
指定UID或者username,來決定運行RUN指令的用戶
ONBUILD:
ONBUILD作為一個trigger的標記,可以用來trigger任何Dockerfile中的指令
可以定義多個ONBUILD指令
當下一個鏡像B使用鏡像A作為base的時候,在FROM A指令前,會先按照順序執行在構建A時候定義的ONBUILD指令
ONBUILD <DOCKERFILE 指令> <content>
VOLUME:
用來創建一個在image之外的mount point,用來在多個container之間實作資料共享
運行使用json array的方式定義多個volume
VOLUME ["/var/data1","/var/data2"]
或者plain text的情況下定義多個VOLUME指令
7.2 使用Dockerfile創建云盤
7.2.1 準備需要的檔案
1.創建目錄
mkdir /root/dockerfile_kod/{code,conf,repo} -p
2.拷貝檔案到指定目錄
docker cp afc35bc7f8a1:/root/init.sh /root/dockerfile_kod/conf/
#構建好的目錄結構
[root@db01 ~]# tree dockerfile_kod/
dockerfile_kod/
├── build.sh
├── code
│ └── kodexplorer4.40.zip
├── conf
│ ├── init.sh
│ ├── kod.conf
│ ├── nginx.conf
│ ├── php-fpm.conf
│ └── www.conf
├── dockerfile
└── repo
├── CentOS-Base.repo
├── epel.repo
└── nginx.repo
7.2.2 撰寫dockerfile
[root@db01 dockerfile_kod]# cat dockerfile
#0.基礎鏡像
FROM centos:7
#1.初始化操作
RUN groupadd www -g 1000
RUN useradd www -u 1000 -g 1000 -M -s /sbin/nologin
RUN rm -rf /etc/yum.repos.d/*
ADD repo/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo
ADD repo/epel.repo /etc/yum.repos.d/epel.repo
ADD repo/nginx.repo /etc/yum.repos.d/nginx.repo
#2.安裝依賴環境 nginx+php
RUN yum makecache fast
RUN yum install nginx php-fpm php-mbstring php-gd unzip -y
RUN yum clean all
#3.配置Nginx和php
RUN rm -rf /etc/nginx/conf.d/default.conf
ADD conf/nginx.conf /etc/nginx/nginx.conf
ADD conf/kod.conf /etc/nginx/conf.d/kod.conf
ADD conf/php-fpm.conf /etc/php-fpm.conf
ADD conf/www.conf /etc/php-fpm.d/www.conf
#4.配置代碼
RUN mkdir /code
WORKDIR /code
ADD code/kodexplorer4.40.zip /code/kodexplorer4.40.zip
RUN unzip kodexplorer4.40.zip
RUN chown -R www:www /code
#5.復制啟動腳本
ADD conf/init.sh /root/init.sh
#6.啟動命令
CMD ["/bin/bash","/root/init.sh"]
7.2.3 構建新鏡像
[root@docker01 ~/dockerfile/kod]# docker build --network=host -t centos_kod:v1 .
[root@docker01 ~/dockerfile/kod]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos_kod v1 87071ea7c86b 2 minutes ago 465MB
7.2.4 基于新鏡像運行容器
[root@docker01 ~/dockerfile/kod]# docker run -d -p 80:80 centos_kod:v1
4d1007d7194d434248762e5aca76070206643f0f0f533f2112d0359b25fe7ba0
7.2.5撰寫構建,啟動腳本
[root@db01 dockerfile_kod]# cat build.sh
#!/bin/bash
docker stop $(docker ps -qa)
docker rm $(docker ps -qa)
docker build --network=host -t my_kod:v2 .
docker run -p 80:80 -d my_kod:v2
Docker私有倉庫
8.1 普通的docker registry
8.2 帶認證的docker registry
8.3 企業級的docker-harbor
8.3.1 部署思路
第一步:安裝docker和docker-compose
第二步:下載harbor-offline-installer-v1.9.0-rc1.tgz
第三步:上傳到/opt,并解壓
第四步:修改harbor.yml組態檔 hostname = 10.0.0.11 harbor_admin_password = 123456
第五步:執行install.sh
8.3.2 安裝私有倉庫
1.下載軟體包
cd /opt
wget https://github.com/goharbor/harbor/releases/download/v1.9.3/harbor-offline-
installer-v1.9.3.tgz
上傳包
tar xf harbor-offline-installer-v1.9.0-rc1.tgz
2.修改配置
vim harbor.yml
hostname: 10.0.0.51
harbor_admin_password: 123456
3.下載docker-compose,編排工具
yum install docker-compose -y
4.安裝harbor
停止80埠執行
./install.sh
查看編排狀態
cd /opt/harbor
docker-compose ps
登錄:web 10.0.0.51 創建linux專案
5.修改鏡像名稱(鏡像的ID)
docker tag ae21150e3af8 10.0.0.51/linux/my_kod:v2
docker images
6.修改docker配置添加信任倉庫
cat >/etc/docker/daemon.json<<EOF
{
"registry-mirrors": ["https://ig2l319y.mirror.aliyuncs.com"],
"insecure-registries": ["http://10.0.0.51"]
}
EOF
#重啟docker
systemctl restart docker
docker-compose ps
docker-compose stop
docker-compose up -d
7.docker登錄到harbor
docker login 10.0.0.51
8.上傳鏡像到私有倉庫
docker push 10.0.0.51/linux/my_kod:v2
9.客戶端使用倉庫下載鏡像
洗掉已有的:注意.先停容器,在洗掉容器,鏡像
docker pull 10.0.0.51/linux/my_kod:v2

8.3.3 其他主機上下載鏡像
[root@docker02 ~]# cat /etc/docker/daemon.json
{
"registry-mirrors": ["http://hub-mirror.c.163.com"],
"insecure-registries": ["http://10.0.1.11"],
"insecure-registries": ["https://10.0.1.11"]
}
[root@docker02 ~]# docker pull 10.0.1.11/linux/centos_kod:v1
容器的基本架構圖

專案實戰:制作kvm管理工具容器
前提:新起一個容器,容器內操作
1.初始化
rm -rf /etc/yum.repos.d/*
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
2.安裝python依賴
yum -y install git python-pip libvirt-python libxml2-python python-websockify supervisor gcc python-devel
python -m pip install --upgrade --force pip -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install setuptools==33.1.1 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple
3.安裝python的Django環境
cd /opt/
git clone git://github.com/retspen/webvirtmgr.git
cd webvirtmgr
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
[root@402aca4eaa81 webvirtmgr]# chmod +x manage.py
./manage.py syncdb
./manage.py collectstatic
4.安裝Nginx
cat>/etc/yum.repos.d/nginx.repo<<EOF
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/\$releasever/\$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/\$releasever/\$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
EOF
yum makecache fast
yum install nginx -y
yum clean all
5.配置Nginx和代碼
mkdir /code
mv /opt/webvirtmgr /code/
chown -R nginx:nginx /code
rm -rf /etc/nginx/conf.d/default.conf
cat >/etc/nginx/conf.d/webvirtmgr.conf<<EOF
server {
listen 80 default_server;
server_name localhost;
access_log /var/log/nginx/webvirtmgr_access_log;
location /static/ {
root /code/webvirtmgr;
expires max;
}
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header X-Real-IP \$remote_addr;
proxy_set_header X-Forwarded-for \$proxy_add_x_forwarded_for;
proxy_set_header Host \$host:\$server_port;
proxy_set_header X-Forwarded-Proto \$scheme;
proxy_connect_timeout 600;
proxy_read_timeout 600;
proxy_send_timeout 600;
client_max_body_size 1024M;
}
}
EOF
nginx -t
nginx
ss -lntup
6.配置Supervisor
cat >/etc/supervisord.d/webvirtmgr.ini<<EOF
[program:webvirtmgr]
command=/usr/bin/python /code/webvirtmgr/manage.py run_gunicorn -c /code/webvirtmgr/conf/gunicorn.conf.py
directory=/code/webvirtmgr
autostart=true
autorestart=true
logfile=/var/log/supervisor/webvirtmgr.log
log_stderr=true
user=nginx
[program:webvirtmgr-console]
command=/usr/bin/python /code/webvirtmgr/console/webvirtmgr-console
directory=/code/webvirtmgr
autostart=true
autorestart=true
stdout_logfile=/var/log/supervisor/webvirtmgr-console.log
redirect_stderr=true
user=nginx
[program:nginx]
command=nginx -g 'daemon off;'
autostart=true
autorestart=true
stdout_logfile=/var/log/supervisor/nginx.log
redirect_stderr=true
EOF
sed -i "s#nodaemon=false#nodaemon=true#g" /etc/supervisord.conf
supervisord -c /etc/supervisord.conf
supervisorctl status
7.創建用戶
mkdir /var/cache/nginx/.ssh/ -p
chown -R nginx:nginx /var/cache/nginx/
su - nginx -s /bin/bash
ssh-keygen
touch ~/.ssh/config && echo -e "StrictHostKeyChecking=no\nUserKnownHostsFile=/dev/null" >> ~/.ssh/config
chmod 0600 ~/.ssh/config
ssh-copy-id [email protected]
8.提交新鏡像
docker commit 402aca4eaa81 mykvm:v1
9.運行新容器,注意:其他埠有時會跳轉,
docker run --name mykvm3 -p 80:80 -it -d mykvm:v1 supervisord -c /etc/supervisord.conf
docker監控

1.docker自帶的監控命令
docker container ps :查看正在運行的容器
docker container top +容器的id :知道某個容器運行了哪些行程
docker container stats +容器的id :顯示每個容器各種資源使用情況
2.cAdvisor+ prometheus+ grafana組件介紹
組件介紹: 在不同頁面之間跳轉,并且只能監控一個host,這不免讓人質疑他的實用性,但cAdvisor有一個亮點是可以將監控到的資料匯出給第三方工具,有這些工具進一步加工處理,
所以我們可以把cAdvisor定位為一個監控資料收集器,收集和匯出資料是他的強項,而非展示資料,
cAdvisor支持很多第三方工具,其中就包含prometheus
#prometheus
Prometheus是一個非常優秀的監控工具,提供了監控資料搜集,存盤,處理,可視化和告警一系列完整的解決方案,包含組件
Node Exporter :負責收集host硬體和作業系統資料,以容器的形式運行在所有host上
cAdvisor :負責收集容器資料,以容器的形式運行在所有host上
#grafana
grafana是一款支持多種資料源的圖形展示工具
3.部署
#地址規劃:
10.0.0.51 cAdvisor+ Node Exporter +prometheus+ grafana
10.0.0.52 cAdvisor+ Node Exporter
#docker01的組態檔:
mkdir prometheus
cd prometheus
#上傳壓縮包
docker load < 壓縮包
cat >docker-compose.yml<<EOF
version: '3.2'
services:
prometheus:
image: prom/prometheus:latest
container_name: prometheus
ports:
- 9090:9090
command:
- --config.file=/etc/prometheus/prometheus.yml
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml:ro
depends_on:
- cadvisor
node-exporter:
image: prom/node-exporter:latest
container_name: node_exporter
ports:
- 9100:9100
cadvisor:
image: google/cadvisor:latest
container_name: cadvisor
ports:
- 8080:8080
volumes:
- /:/rootfs:ro
- /var/run:/var/run:rw
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
grafana:
image: grafana/grafana:latest
container_name: grafana
ports:
- 3000:3000
EOF
#prometheus組態檔
cat >prometheus.yml <<EOF
scrape_configs:
- job_name: cadvisor
scrape_interval: 5s
static_configs:
- targets:
- 10.0.0.51:8080
- 10.0.0.52:8080
- job_name: prometheus
scrape_interval: 5s
static_configs:
- targets:
- 10.0.0.51:9090
- job_name: node_exporter
scrape_interval: 5s
static_configs:
- targets:
- 10.0.0.51:9100
- 10.0.0.52:9100
EOF
#docker02組態檔:
cat >docker-compose.yml<<EOF
version: '3.2'
services:
node-exporter:
image: prom/node-exporter:latest
container_name: node_exporter
ports:
- 9100:9100
cadvisor:
image: google/cadvisor:latest
container_name: cadvisor
ports:
- 8080:8080
volumes:
- /:/rootfs:ro
- /var/run:/var/run:rw
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
EOF
4.運行
ntpdate time1.aliyun.com
docker-compose up -d
5.檢查
http://10.0.0.51:8080/metrics
http://10.0.0.51:9100/metrics
http://10.0.0.51:9090
http://10.0.0.51:3000
登錄:10.0.0.51:3000
賬號:admin 密碼;admin
配置源地址

下載








轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/45386.html
標籤:其他
下一篇:期末作業
