1. 程式人生 > 實用技巧 >運維三劍客之--過濾命令

運維三劍客之--過濾命令

1 docker介紹,跟傳統虛擬機器的比較

0 各種軟體用什麼語言寫的
    zabbix(監控軟體):php
    ansible(批量管理主機,執行命令,無angent):python
    openstack(雲端計算,管理虛擬機器):python
    jekins(ci/di):自動化部署,java
    salstack(批量管理主機,執行命令,有angent):python
    普羅米修斯(Prometheus,監控):go寫的
    docker:go
    k8s:go


1 什麼是虛擬化?
    -vmware,kvm,openstack,docker,k8s
    -雲伺服器:vmware,kvm虛擬化出來的
    -阿里雲,騰訊雲:opensatck,阿里飛天,用來管理虛擬化出來的作業系統
    -docker:程序級別的隔離,裝在虛擬機器,雲伺服器上,一個雲服務上開業跑出成幾百個docker容器,成百上千的伺服器上,就會有個上萬個容器
    -k8s:不同機器的上萬個容器如何管理
    
    -虛擬化:打破實體結構間的不可切割的障礙
    
2 什麼是Docker?
    - Go語言實現,開源出來,很多人用
    - docker-ce(免費),docker-ee(收費)
    - 通過go語言對lxc技術的一個封裝

3 容器與虛擬機器比較
    -docker不需要虛擬硬體和作業系統,輕量級,佔用體積小,啟動快
    
4 Docker是一個客戶端-伺服器(C/S)架構程式(mysql,redis都是cs架構),整套 RESTful API

5 docker非常重要的概念:映象(image)與容器(container)
    映象        ---》容器
    執行映象得到容器(真正的執行單位)
    面向物件的類      物件
6 映象是從哪裡來的?
	-映象就是一堆檔案
	-從遠端倉庫獲取(拉取)

2 docker架構圖

3 docker安裝

3.1 windows安裝

windows安裝(不建議你裝)http://get.daocloud.io/

3.2 烏班圖

# 0 解除安裝
sudo apt-get remove docker docker-engine docker.io containerd runc
# 1 安裝必要工具
sudo apt-get update
sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common
# 2 安裝GPG證書
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# 換成阿里雲
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# 2 寫入軟體源資訊
#官方
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
#換成阿里雲
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"

# 3 更新並安裝docker-ce
sudo apt-get -y install docker-ce
# 4 開啟docker服務
systemctl status docker

3.3 centos上安裝(必須7.0以上)

# 6.8安裝docker,自行搜尋,升級核心版本
# docker是在linux3.1以上核心中寫出來的,在烏班圖下開發的,docker的新特性,烏班圖先看到,
# 官方建議docker執行在centos7 以上的系統

解除安裝 docker

yum remove docker docker-common  docker-selinux docker-engine
rm -rf /var/lib/docker

安裝 docker

1 更新yum
yum update
2 安裝需要的軟體包, yum-util 
yum install -y yum-utils device-mapper-persistent-data lvm2
3 執行(向你的yum源,增加一條記錄)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
4 安裝 
yum install docker-ce
5 驗證安裝(檢視版本)
docker -v  

# 自從分了docker-ce和docker-ee以後,以年份命名版本
Docker version 19.03.12, build 48a66213fe

啟動 ,停止 ,重啟 ,開機啟動 docker 及 檢視概要資訊

啟動,停止,重啟docker服務
systemctl start docker
systemctl stop docker
systemctl restart docker

開機啟動	
systemctl enable docker

檢視概要資訊
docker info

3.4 遠端倉庫

https://hub.docker.com/ 註冊,登入 
# 上傳,下載映象(類似於github),開源

# 配置加速(之前去https://hub.docker.com/),阿里雲,清華,做了一個備份

配置國內倉庫

vi /etc/docker/daemon.json  

{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}

4 映象操作

-1 hello-world
     docker run hello-world
    1 客戶端連到服務端,服務下載了hello-world映象
    2 通過映象跑起容器來
    3 容器輸出一些東西,通過服務端傳送給客戶端,客戶端展示在窗口裡了

0 查詢映象
方式一:https://hub.docker.com/ 點點點搜尋(用這種)
方式二:docker search 
1 拉取映象 
	docker pull hello-world  最新版本latest
	docker pull hello-world:nanoserver
2 檢視機器上有哪些映象
    docker images
    REPOSITORY  TAG   IMAGE ID   CREATED   SIZE
	映象名字     版本   id號       建立時間   大小
3 刪除映象
    docker rmi 映象名字/id號
    # 如果還有基於這個映象的容器,是不允許刪除映象的,先刪除容器,再刪除images
    
    
    
4 練習:拉取python3.6映象,redis最新映象,mysql5.7映象
    docker pull python:3.6
    docker pull redis
    docker pull mysql5.7
    docker pull centos:centos7
    
5 映象是什麼?
    -就是一堆檔案,這堆檔案通過docker跑起來,就是容器(centos+redis)
    -centos7的映象跑起來,容器你就當成在你宿主機上跑了一個centos7的作業系統(虛擬機器)
    
    
    
 6 補充(瞭解)
    docker image inspect 46ff56815c7c
    docker image ls
    docker image rm

5 容器操作

1 刪除容器
 docker rm 容器名字/容器id
    
2 啟動並執行容器
# 通過centos:centos7映象,建立一個容器名字叫mycentos,並且把它執行起來
    docker run -di --name=mycentos centos:centos7
    打印出容器的id號
3 檢視機器上正在執行的容器
	docker ps
4 檢視宿主機上所有的容器(包括停止的)
	docker ps -a
5 停止容器
	docker stop 容器名字/id號
6 啟動容器
	docker start 容器id/名字
    
7 容器的建立和啟動(******)
    -建立:docker create --name=xxx redis
    docker create --name=test-container centos:centos7 ps -A
    -啟動
    docker start test-container
    
    -容器一直執行的原因
    	-它有一條前臺程序,一直在執行
        -以後如果自己製作的映象,執行起容器,必須有個可以夯住的命令
        -如果該命令結束,該容器也就結束了
        
    -建立並啟動(run)
    -i:表示執行容器
    -t:表示容器啟動後會進入其命令列。加入這兩個引數後,容器建立就能登入進去。即分配一個偽終端。
    -d:在run後面加上-d引數,則會建立一個守護式容器在後臺執行(這樣建立容器後不會自動登入容器,如果只加-i -t兩個引數,建立後就會自動進去容器)。
    --name :為建立的容器命名。如果不寫,會自動分配一個名字(英文人名)
    -v:表示目錄對映關係(前者是宿主機目錄,後者是容器目錄,對映到宿主機上的目錄),可以使用多個-v做多個目錄或檔案對映。注意:最好做目錄對映,在宿主機上做修改,然後共享到容器上。
    -p:表示埠對映,前者是宿主機埠,後者是容器內的對映埠。可以使用多個-p做多個埠對映
    docker run -it --name=myredis redis
    	
 # 注意,docker run  映象 如果本地沒有,會先pull,再run

8 進入容器的幾種方式(並不是真進入)
    第一種:docker exec -it  容器id /bin/bash
    	docker exec 容器id ls 
        exec真正的作用是在容器內執行命令
    第二種:ssh連線(容器內部裝ssh服務端)
9 退出
    exit
    
10 檔案拷貝
    -從宿主機拷貝到容器內部
    	docker cp lqz.txt 容器id:/home
    -從容器內部拷貝到宿主機
    	docker cp 容器id:/home/lqz.txt /app
11 目錄掛載	
    docker run -di --name=mycentos99 -v /home/lqz:/home centos:centos7
    # 一旦掛載,以後宿主機目錄內修改,同樣影響容器內部
12 埠對映
    docker run -di -p 6377:6379 redis:latest
    # 瞭解:/usr/local/bin/docker-entrypoint.sh
    
13 檢視容器詳細資訊
    docker inspect f81
    # 檢視ip地址
    docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名稱(容器ID)

6 應用部署

# 在容器內部署mysql
# -e表示環境變數

docker run -di --name=mysql -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
# 官方提供的
docker run --name some-mysql -v /my/own/datadir:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
        
# 在容器內部署redis
docker run -di -p 6377:6379 redis:latest
        
# 在容器內部署nginx
docker run -di --name=mynginx -p 8080:80 nginx

部署應用對映外部目錄

# 部署redis,把配置檔案和資料目錄映射出來
    -1 mkdir /reids /redis/conf /redis/data
    
    -2 vim /redis/conf/redis.conf  # 設定配置檔案內容
        # 配置檔案
        bind 0.0.0.0
        daemonize NO
        protected-mode no
        requirepass 123456
        
    -3 建立並執行容器
    docker run -p 6378:6379 --name redis_6379 
        -v /redis/conf/redis.conf:/etc/redis/redis.conf 
            -v /redis/data:/data 
                -di redis 
                redis-server /etc/redis/redis.conf
                
# 本地window機器上遠端連線到了docker裡的redis

    # cmd視窗下
    	redis-cli -h 101.133.225.166 -p 6378
    # 認證
    	auth 123456

    # 儲存資料
    	save或者是bgsave
    # 在宿主機的/redis/data路徑下就能看到一個檔案 不管多少次重啟redis容器,資料都還在 原來的redis容器沒了,按照第三步再啟動一遍,資料都還在 因為映射了檔案

遷移與備份

2.0 其他操作

# 刪除所有容器()
docker rm `docker ps -a -q`
# 刪除所有映象
docker rmi `docker images -q`

# 通過自己構建的image啟動容器
docker run -id --name=mydjango -p 8088:8088  mydjango python /project/django_test/manage.py runserver 0.0.0.0:8088
               
# 檢視容器執行日誌
docker logs 容器id


# 操作步驟
    1 啟動一個python容器
    	docker run -di --name=lqz python:3.6
    2 進入裝軟體
    	docker exec -it lqz /bin/bash
        mkdir /project
        pip install django==1.11.1 -i https://pypi.douban.com/simple/
        退出
    3 把專案拷貝到容器內部
    	docker cp /opt/lqz/django_test lqz:/project
            
    4 把容器做成映象
    	docker commit lqz mydjango
    5 基於自己做的映象執行容器
    docker run -id --name=mydjango -p 8088:8088  mydjango python /project/django_test/manage.py runserver 0.0.0.0:8088

2.1 容器儲存為映象

docker commit 容器名字 映象名字
docker commit 19b mydjango

2.2 把映象打包成壓縮包

docker save -o mydjango.tar mydjango

2.3 把壓縮包回覆為映象

docker load -i mydjango.tar

3 Dockerfile(很重要)

1 dockerfile是什麼
	一個檔案,裡面一堆指令,通過這個檔案可以生成映象
2 dockerfile指令
	
    FROM image_name:tag	定義了使用哪個基礎映象啟動構建流程
    MAINTAINER user_name	宣告映象的建立者
    ENV key value	設定環境變數 (可以寫多條)
    RUN command	是Dockerfile的核心部分(可以寫多條)
    ADD source_dir/file dest_dir/file	將宿主機的檔案複製到容器內,如果是一個壓縮檔案,將會在複製後自動解壓
    COPY source_dir/file dest_dir/file	和ADD相似,但是如果有壓縮檔案並不能解壓
    WORKDIR path_dir	設定工作目錄
    
    
3 寫一個dockerfile(檔名字必須交Dockerfile)
vim dockerfile
    FROM python:3.6
    MAINTAINER lqz
    EXPOSE 8080
    ADD ./requirement.txt /home/
    RUN pip install -r /home/requirement.txt -i https://pypi.douban.com/simple/ 
    RUN pip install uwsgi -i https://pypi.douban.com/simple/
    VOLUME ["/home"]
    WORKDIR /home/django_test
    CMD ["uwsgi", "--ini", "/home/django_test/uwsgi.ini"] 
4 通過dockerfile構建出映象
	docker build -t='django_1.11.11' .
5 檢視映象
	docker images 
    
6 啟動容器
docker run -di --name=mydjango2 -v /opt/lqz/:/home -p 8080:8080 django_1.11.11

7 在外部訪問即可

8 配置nginx轉發
# 建立檔案件
mkdir -p /opt/nginx/conf /opt/nginx/html /opt/nginx/logs
# 新建配置檔案
vim nginx/conf/nginx.conf
# 寫入
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    upstream node	{
		server	101.133.225.166:8080;
		server	101.133.225.166:8081;
        server	101.133.225.166:8082;
	}
    server {
        listen       80;
        server_name  localhost;
        location / {
          #proxy_pass http://101.133.225.166:8080;
          #負載均衡配置
          proxy_pass http://node;
        }  
    }
}

# docker 中執行nginx
docker run --name nginx -id -p 8888:80 -v /opt/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /opt/nginx/html:/etc/nginx/html -v /opt/nginx/logs:/var/log/nginx nginx
                
9 配置負載均衡
# 修改nginx配置檔案
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    upstream node	{
		server	101.133.225.166:8080;
		server	101.133.225.166:8081;
        server	101.133.225.166:8082;
	}
    server {
        listen       80;
        server_name  localhost;
        location / {
          #proxy_pass http://101.133.225.166:8080;
          #負載均衡配置
          proxy_pass http://node;
        }  
    }
}
# 多啟動幾個docker容器
docker run -di --name=mydjango3 -v /opt/lqz/django_test2/:/home/django_test/ -p 8081:8080 django_1.11.11
docker run -di --name=mydjango3 -v /opt/lqz/django_test2/:/home/django_test/ -p 8082:8080 django_1.11.11
        
# 重啟nginx
# 假設8081的容器掛了,8080的容器掛了,正常提供服務,
# 再把docker容器啟動起來即可

上傳自己的映象

# 登入
	docker login  輸入使用者名稱密碼
    
# 給你要上傳的image打個標籤
    docker tag 5452fa6715c0 liuqingzheng/django1.11.9:v1
        
# 上傳
    docker images
    docker push liuqingzheng/django1.11.9:v1

私有倉庫

1 拉取私有倉庫映象
	docker pull registry
2 啟動容器
	docker run -di --name=registry -p 5000:5000 registry
3 開啟瀏覽器 輸入地址http://101.133.225.166:5000/v2/_catalog
  看到{"repositories":[]} 表示私有倉庫搭建成功並且內容為空
4 配置
	修改daemon.json
	vi /etc/docker/daemon.json
    新增以下內容,儲存退出
    {"insecure-registries":["101.133.225.166:5000"]} 
    此步用於讓 docker信任私有倉庫地址
5 重啟docker 服務
	systemctl restart docker
6 重啟容器
	docker start registry
7 打標籤
	docker tag 5452fa6715c0 101.133.225.166:5000/django1.11.11
8 上傳到私有倉庫
    docker push 101.133.225.166:5000/django1.11.11
    
9 從私有倉庫拉取映象
    docker pull 101.133.225.166:5000/django1.11.11

docker-compose

1 docker-compose:是一個單機情況下容器編排的工具
2 yml 檔案:通過yml檔案定義多個容器  ——預設名字docker-compose.yml


三個概念,Service  Networks ,Volumes
    一個service代表一個container,
    這個container可以從docker hub的image來建立,或者從本地dockerfile build的image來建立
    
version:有1,2,3版本,目前都用"3"


6 安裝
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

7 驗證安裝成功
docker-compose -v

部署多應用

# 部署flask redis
1 建立Dockerfile

vim Dockerfile

FROM python:3.6
COPY . /app
WORKDIR /app
RUN pip install flask redis
EXPOSE 5000
CMD [ "python", "app.py" ]

2 建立docker-compose檔案

vim docker-compose.yml

version: "3"
services:
  redis:
    image: redis
  web:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - 8080:5000
    environment:
      REDIS_HOST: redis
        
3 建立app.py

vim app.py

from flask import Flask
from redis import Redis
import os
import socket
app = Flask(__name__)
redis = Redis(host=os.environ.get('REDIS_HOST', '127.0.0.1'), port=6379)
@app.route('/')
def hello():
    redis.incr('hits')
    return '你好! 檢視 %s 次, hostname 是 %s.\n' % (redis.get('hits'),socket.gethostname())
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000, debug=True)
    
4 啟動--執行

docker-compose up
docker-compose.yml 如何寫

version: '3'
services:
  wordpress:
    image: wordpress
    ports:
      - 8080:80
    environment:
      WORDPRESS_DB_HOST: mysql
      WORDPRESS_DB_PASSWORD: root
    volumes:
      - mysql-data:/var/lib/mysql

多個容器直接通訊方式

1 埠對映到宿主機,直接訪問宿主機
2 通過ip地址訪問
3 run的時候指定 --link 容器 
docker run -di --name=centos1 centos:centos7
docker run -di --name=centos2 --link centos1 centos:centos7
    
進入到centos2中 ping centos1 可以ping通

# 跨主機的容器通訊
	-埠對映