Docker容器

Docker容器介紹

1.1 docker是什麼

Docker 是 Docker.Inc 公司開源的一個基於 LXC技術之上構建的Container容器引擎, 源代碼託管在 GitHub 上, 基於Go語言並聽從Apache2.0協議開源。
Docker是經過內核虛擬化技術(namespaces及cgroups等)來提供容器的資源隔離與安全保障等。因爲Docker經過操做系統層的虛擬化實現隔離,因此Docker容器在運行時,不須要相似虛擬機(VM)額外的操做系統開銷,提升資源利用率。php

namespace命名空間

Mount Namespace - 用於隔離文件系統的掛載點
UTS Namespace - 用於隔離 HostName 和 DomianName
IPC Namespace - 用於隔離進程間通訊
PID Namespace - 用於隔離進程

cgroups資源限制

控制組(cgroups)是 Linux 內核的一個特性,主要用來對共享資源進行隔離、限制、審計等。只有css

能控制分配到容器的資源,才能避免當多個容器同時運行時的對系統資源的競爭。html

控制組技術最先是由 Google 的程序員在 2006 年提出,Linux 內核自 2.6.24 開始支持。html5

控制組能夠提供對容器的內存、CPU、磁盤 IO 等資源的限制和審計管理。node

1.2 容器與虛擬機對比

img

img

1.3 docker的三個重要概念

Image(鏡像):
那麼鏡像究竟是什麼呢?Docker 鏡像能夠看做是一個特殊的文件系統,除了提供容器運行時所需的程序、庫、資源、配置等文件外,還包含了一些爲運行時準備的一些配置參數(如匿名卷、環境變量、用戶等)。
Container(容器)
容器(Container)的定義和鏡像(Image)幾乎如出一轍,也是一堆層的統一視角,惟一區別在於容器的最上面那一層是可讀可寫的。
Repository(倉庫)
鏡像倉庫是 Docker 用來集中存放鏡像文件的地方,相似於咱們以前經常使用的代碼倉庫。
一般,一個倉庫會包含同一個軟件不一樣版本的鏡像,而標籤就經常使用於對應該軟件的各個版本 。
咱們能夠經過 <倉庫名> : <標籤> 的格式來指定具體是這個軟件哪一個版本的鏡像。若是不給出標籤,將以 Latest 做爲默認標籤。 python

img

1.4 docker的組成部分

docker是傳統的CS架構分爲docker client和docker server
Docker 客戶端是 Docker 用戶與 Docker 交互的主要方式。當您使用 Docker 命令行運行命令時,Docker 客戶端將這些命令發送給服務器端,服務端將執行這些命令。
Docker 命令使用 Docker API 。Docker 客戶端能夠與多個服務端進行通訊。linux

img

組件:鏡像,容器,倉庫,網路,存儲nginx

鏡像:把系統文件打包git

虛擬化的幾種架構圖

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 root@10.0.0.12

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

配置源地址

下載


相關文章
相關標籤/搜索