運維三劍客之--過濾命令
阿新 • • 發佈:2020-09-02
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通
# 跨主機的容器通訊
-埠對映