python學習之容器化管理docker

Docker簡介

1.1 什麼是虛擬化
在計算機中,虛擬化(英文: Virtualization)是一種資源管理技術,是將計算機的各類實體資源(如: 服
務器、網絡、內存及存儲等)予以抽象、轉化後呈現出來, 打破實體間不可切割的障礙,使用戶能夠通
過更好的方式來應用這些資源。
在實際的生產環境中,虛擬化技術主要用來解決高性能的物理硬件產能過剩和老的舊的硬件產能過
低的重組重用,透明化底層物理硬件,從而最大化的利用物理硬件,對資源充分利用。
虛擬化的種類有不少,例如:
軟件虛擬化:Vmware軟件、KVM軟件、VirtualBox軟件等
硬件虛擬化: 磁盤陣列RAID、邏輯卷LVM、
內存虛擬化、網絡虛擬化、桌面虛擬化、服務虛擬化、虛擬機等。
1.2 什麼是Docker
Docker是一個開源的應用容器引擎, 誕生2013年,最初是dotCloud 公司內部的一個業餘項目。
它基於Google公司推出的Go語言實現。 項目後來加入Linux基金會,聽從了Apache2.0協議,源代碼託
管在 Github 進行維護。
Docker自開源後受到普遍的關注和討論,以致於dotcloud公司後來都更名爲Docker Inc。Redhat
已經在RHEL6.5中集成對Docker的支持, Google 也在Paas產品中普遍應用。
Docker項目的目標是實現輕量級的操做系統虛擬化解決方案。Docker的基礎是Linux容器(LXC)等
技術。在2018年以前是不支持在Windows系統部署Docker的。
在LXC的基礎上Docker作了進一步的封裝,讓用戶不須要去關心容器的管理,使操做更爲簡便。用
戶操做Docker的容器就像操做一個快速輕量級的虛擬機同樣簡單。html

爲何選擇Docker?
上手快
用戶只須要幾分鐘,就能夠把本身的程序"Docker化"。Docker依賴於"寫時複製"(copy-on-
write)模型,使修改應用程序也很是迅速,能夠說達到"爲所欲爲,代碼即改"的境界。隨後,就能夠建立容器來運行應用程序了。大多數Docker容器只須要不到1秒便可啓動。由
於去除了管理程序的開銷,Docker容器擁有很高的性能,同時同一臺宿主機中也能夠運行更
多的容器,使用戶儘量的充分利用系統資源。
在linux程序中,fork()會產生一個和父進程徹底相同的子進程,但子進程在此後多會
exec系統調用,出於效率考慮,linux中引入了「寫時複製」技術,也就是隻有進程空間的
各段的內容要發生變化時,纔將父進程的內容複製一份給子進程。python

職責的邏輯分類
使用Docker,開發人員只須要關心容器中優秀的應用程序,而運維人員只須要關心如何管理
容器。Docker設計的目的就是要增強開發人員寫代碼的開發環境與應用程序要部署的生產環
境一致性。從而下降那種"開發時一切正常,確定時運維的問題(測試環境都是正常的, 上線
後出了問題就歸結爲確定是運維的問題)"。mysql

快速高效的開發生命週期
Docker的目標之一就是縮短代碼從開發、測試到部署、上線運行的週期,讓你的應用程序具
備可移植性,易於構建,並易於協做。(通俗一點說,Docker就像一個盒子,裏面能夠裝不少
物件,若是須要這些物件的能夠直接將該大盒子拿走,而不須要從盒子裏一件一件的取)。linux

鼓勵使用面向服務的架構
Docker還鼓勵面向服務的體系結構和微服務架構。Docker推薦單個容器只運行一個應用程序
或者進程,這樣就造成了一個分佈式的應用程序模型,在這種模型下,應用程序或者服務都
能夠表示爲一系列內部互聯的容器。從而使分佈式部署應用程序,擴展和調試應用程序都變
得很是簡單,同時也提升了程序的內省性。(固然,一個程序中能夠運行多個應用程序)。nginx

1.3 容器與虛擬化的比較
下面的圖片比較了Docker和傳統的虛擬化方式的不一樣之處,可見容器在操做系統層面上實現虛擬化,直
接複用本地主機的操做系統,而傳統的虛擬化則是在硬件層面實現。
總結: 與傳統的虛擬機相比,Docker的優點體現爲啓動速度快、佔用體積小。知乎上看到一個更加形象的例子:
python學習之容器化管理docker
python學習之容器化管理docker
1.4 Docker組件
1.4.1 Docker服務器與客戶端
Docker是一個客戶端/服務器(C/S)架構的程序。Docker客戶端只需向Docker服務器或守護進程發出
請求,服務器或守護進程將完成全部工做並返回結果。
Docker提供了一個命令行工具docker以及一整套RESTful API來與守護進程交互。用戶能夠在同一臺宿主機上運行Docker守護進程和客戶端。
1.4.2 Docker鏡像與容器
倉庫:每一個倉庫存放某一類鏡像。
鏡像:相似虛擬機鏡像(eg:xxx.iso)。 eg: MySQL鏡像、Redis鏡像、2048鏡像
容器:相似linux系統環境,運行和隔離應用。容器從鏡像啓動的時候,docker會在鏡像的最上一
層建立一個可寫層,鏡像自己是隻讀的,保持不變。web

1.4.3 Registry(註冊中心)
Docker用Registry來保存用戶構建的鏡像。Registry分爲公有和私有兩種。
公有倉庫 :全部人能夠訪問下載鏡像的倉庫。Docker公司運營公共的Registry叫作Docker Hub。
私有倉庫: 規定範圍內能夠訪使用的庫。用戶能夠構建私有的Registry。
2 Docker的安裝與啓動
2.1 安裝Dockerredis

首先得安裝一下docker的環境,針對你的系統看一下docker的官網 吧, 下面是Linux系統的安裝步
驟。
方法一: 直接使用docker光放鏡像源安裝docker最新版本
(1) yum包更新到最新sql

阿里安裝軟件鏡像源下載

$ wget -O CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
$ yum makecache # 生成緩存
$ yum update # yum包更新
(2) 配置yum倉庫安裝Docker$ yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-
ce.repo
(3) 安裝Docker
$ yum install docker-ce -y
(4) 安裝後查看Docker版本
$ docker -vdocker

方法二: 官網下載軟件包, 自行安裝
$ yum install * -y
$ docker version
python學習之容器化管理docker數據庫

2.2 設置ustc的鏡像

ustc說老牌的linux鏡像服務提供者,ustc的docker鏡像加速器速度很快。ustc docker mirror的優點之
一就是不須要註冊,是真正的公共服務。
https://lug.ustc.edu.cn/wiki/
編輯該文件:
$ vim /etc/docker/daemon.json
編輯如下內容,保存退出。
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu..cn"],
}

2.3 Docker的啓動與中止

systemctl命令是系統服務管理器指令。
啓動Docker:
$ systemctl start
docker中止Docker:
$ systemctl start
docker
重啓Docker:
$ systemctl restart
docker
查看Docker狀態:
$ systemctl
status docker
開機啓動Docker:
$ systemctl
enable docker
查看Docker概要信息:
$ docker info
查看Docker幫助文檔:
$ docker --help

3 經常使用命令

3.1 鏡像相關命令
3.1.1 查看鏡像
$ docker load -i game2048.tar
$ docker pull
tensorflow/tensorflow
$ docker images
python學習之容器化管理docker
#從tar包載入鏡像
#從鏡像倉庫拉取鏡像
#查看鏡像
REPOSITORY: 鏡像名稱
TAG: 鏡像標籤
IMAGE ID: 鏡像ID
CREATED: 鏡像建立的時間(不是獲取該鏡像的日期)
SIZE: 鏡像大小
這些鏡像都是存儲在Docker宿主機的/var/lib/docker目錄下。

3.1.2 搜索鏡像

若是你須要從網絡中查找須要的鏡像,能夠經過下面命令搜索:
$ docker search 鏡像名稱3.1.3 拉取鏡像
python學習之容器化管理docker
拉取倉庫就是從鏡像倉庫中下載鏡像到本地。
$ docker pull 鏡像名稱
python學習之容器化管理docker

3.1.4 刪除鏡像

按ID刪除鏡像
$ docker rmi 鏡像ID
刪除全部鏡像(注意:`是反向單引號)<br/>$ docker rmidocker images -q`
python學習之容器化管理docker

3.2 容器相關命令

3.2.1 查看容器
查看全部正在運行的容器
$
docker ps
查看全部容器(即不管是否運行中)
$ docker ps -a
查看最後一次運行的容器$ docker ps -l
查看中止的容器
$ docker ps -f status=exited

3.2.2 建立與啓動容器

建立容器經常使用參數說明: docker run
-i, --interactive : 表示運行容器
-t, --tty : 表示容器啓動後進入其命令行(分配一個僞終端)
--name : 指定容器名稱
-v, --volume list : 表示一個/多個目錄映射關係(前者是宿主機目錄,後者是映射到宿主機上的
目錄)
-d, --detach : 建立一個守護進程在後臺運行
-p, --publish list : 表示一個/多個端口映射,前者是宿主機端口,後者是容器內的映射端口。
(1) 交互式建立容器
docker load -i ubuntu.tar
$ docker run -it --name=myubuntu
ubuntu /bin/bash
(2) 守護方式建立容器
$ docker run -di --name=容器名稱 鏡像名稱:標籤 # 建立容器
$ docker exec -it 容器名稱/容器ID # 登陸守護容器交互環境的方式
/bin/bash

建立容器, exit退出當前容器

查看容器

$ docker ps -a

加載鏡像

$ docker load -i ubuntu.tar
$ docker run -it --name=myubuntu
ubuntu /bin/bash

建立容器, exit退出當前容器

查看容器

$ docker ps -a
(2) 守護方式建立容器
$ docker run -di --name=容器名稱 鏡像名稱:標籤 # 建立容器
$ docker exec -it 容器名稱/容器ID # 登陸守護容器交互環境的方式
/bin/bash

項目案例: 基於Docker構建2048遊戲項目
$ docker load -i game2048.tar
$ docker run -d --name 2048 -p 127.0.0.1:8888:80 game2048
瀏覽器訪問網址: http://127.0.0.2:8888 , 訪問效果以下:
python學習之容器化管理docker

3.2.3 中止與啓動容器

中止容器:
$ docker stop 容器名稱(或者容器ID)
啓動容器:
$ docker start 容器名稱(或者容器ID)

3.2.4 文件拷貝

若是咱們須要將文件拷貝到容器內可使用cp命令
$ docker cp 須要拷貝的文件或者目錄 容器名稱:容器目錄
也能夠將目錄從容器內拷貝出來
$ docker cp 容器名稱:容器目錄 須要拷貝的文件或者目錄

項目案例: 基於Docker構建TF環境實現文件拷貝

docker pull tensorflow/tensorflow
$ docker run -di --name tf tensorflow/tensorflow
docker cp /etc/passwd tf:/mnt/ # 將文件拷貝到容器/mnt/目錄下
docker exec -it tf /bin/bash

3.2.5 目錄掛載

咱們能夠在建立容器的時候,將宿主機的目錄與容器內的目錄進行映射,這樣咱們就能夠經過修改宿主
主機某個目錄的文件從而影響容器。
建立容器,添加-v參數 後面爲 宿主機目錄: 容器目錄,
例如:
$ docker run -di -v /usr/local/myhtml:/usr/local/myhtml --name myubuntu1 ubuntu
$ docker exec -it myubuntu1 /bin/bash
root@8e80ee93f4e1:/# cd /usr/local/myhtml/
root@8e80ee93f4e1:/usr/local/myhtml# ls
test
若是你共享的是多級的目錄,可能會出現權限不足的提示。
這是由於Redhat7的安全模塊Selinux把權限禁掉了, 咱們須要添加參數 --privileged=true 來解決掛
載的目錄沒有權限的問題。

3.2.6 查看容器IP地址

咱們能夠經過如下命令查看容器運行的各類數據,myubuntu1是容器的名稱。
$ docker inspect myubuntu1
也能夠執行下面的命令直接輸出IP地址,myubuntu1是容器的名稱。
$ docker inspect --format='{{.NetworkSettings.IPAddress}}' myubuntu1

3.2.7 刪除容器

刪除指定的容器,若是刪除容器時,容器正在運行中,則先中止容器。
$ docker stop myubuntu1
$ docker rm myubuntu1

4 應用部署

4.1 MySQL部署

拉取MySQL鏡像
$ docker search mysql
$ docker pull mysql
建立容器
$ docker run -di --name mysql -p 3307:3306 -e MYSQL_ROOT_PASSWORD='123' mysql
#查看容器IP,IP: 172.17.0.2
$ docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql
-p 表明端口映射,格式爲 宿主機映射端口:容器運行端口。
-e 表明添加環境變量 MYSQL_ROOT_PASSWORD是root用戶的登陸密碼。
進入MySQL容器並登陸MySQL$ docker exec -it mysql /bin/bash
root@664bda0fe52a:/# mysql -uroot -p123
#建立用戶lvah,容許任意主機(%)遠程登錄,登錄密碼爲123.
mysql> create user lvah@'%' identified by '123';
#受權lvah@%用戶, 容許操做任意數據庫和任意數據表(.).
mysql> grant all privileges on . to 'lvah'@'%';
#修改帳戶密碼加密規則並更新用戶密碼。
mysql> alter 'lvah'@'%' identified with mysql_native_password by '123';
#從新加載用戶受權表。
mysql> flush privileges;
mysql> ^DBye
root@664bda0fe52a:/# exit
遠程登陸MySQL
$ mysql -ulvah -p123 -h172.17.0.2
報錯處理:
報錯顯示:
用戶在鏈接MySQL數據庫時會出現Authentication plugin 'caching_sha2_password' cannot be
loaded的錯誤。
[root@foundation0 ~]# mysql -ulvah -p123 -h172.17.0.2 -p3307
ERROR 2059 (HY000): Authentication plugin 'caching_sha2_password' cannot be
loaded: /usr/lib64/mysql/plugin/caching_sha2_password.so: cannot open shared
object file: No such file or directory
報錯緣由:
mysql8 以前的版本中加密規則是 mysql_native_password
而在mysql8以後,加密規則是 caching_sha2_password
解決方法: 修改帳戶密碼加密規則並更新用戶密碼
#修改加密規則

ALTER USER 'user'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE
NEVER;
#更新一下用戶的密碼
ALTER USER 'user'@'localhost' IDENTIFIED WITH mysql_native_password BY
'password';

4.2 Tomcat部署

拉取鏡像
$ docker search tomcat
$ docker pull
建立Nginx容器
tomcat$ docker run -di --name tomcat -p 8081:8080 -v
/usr/local/webapps:/usr/local/tomcat/webapps tomcat
$ docker inspect --format='{{.NetworkSettings.IPAddress}}' tomcat
$ ls /usr/local/webapps/
測試頁面訪問
4.3 Nginx部署
拉取鏡像
$ docker search nginx
$ docker pull
nginx
$ netstat -antlpe | grep 80
建立Nginx容器
$ docker run -di --name=nginx -p 81:80 nginx
#端口映射
$ docker inspect --format='{{.NetworkSettings.IPAddress}}' nginx
172.17.0.4
$ docker exec -it nginx /bin/bash
測試頁面訪問
4.4 Redis部署
拉取鏡像
$ docker search redis
$ docker pull
redis
$ docker images
建立Redis容器
$ docker run -di --name=redis -p 6380:6379 redis
$ docker inspect --format='{{.NetworkSettings.IPAddress}}' redis
客戶端測試
#$ redis-cli -h 172.17.0.5
2.17.0.5:6379> ping
PONG
5 遷移與備份

5.1 容器保存爲鏡像

咱們能夠經過如下命令將容器保存爲鏡像
$ docker commit mysql mysql:remote_login

5.2 鏡像備份

咱們能夠經過下面命令將鏡像保存爲tar文件
$ docker save -o mysqlRemoteLogin.tar mysql:remote_login

5.3 鏡像恢復與遷移

$ docker load -i mysqlRemoteLogin.tar
-i 輸入的文件
執行後再次查看鏡像,能夠看到鏡像已經恢復。

6 Dockerfile

6.1 什麼是Dockerfile

Dockerfile是由一系列命令和參數構成的腳本,這些命令應用於基礎鏡像並最終建立一個新的鏡像。
對於開發人員:能夠爲開發團隊提供一個徹底一致的開發環境。
對於測試人員: 能夠直接拿開發時所構建的鏡像或者經過Dockerfile文件構建一個新的鏡像開始工
做了。
對於運維人員: 在部署時,能夠實現應用的無縫移植。

6.2 經常使用命令

命令 做用
FROM Image_name:tag 定義了使用哪一個基礎鏡像啓動構建流程
MAINTAINER user_name 聲明鏡像的建立者
RUN command 執行命令,是Dockerfile的核心部分(能夠寫多條)
COPY source_dir/file dest_dir/file 和ADD相似, 若是是壓縮文件,不會自動解壓
ENV key value 設定環境變量
WORKDIR path_dir 設置工做目錄

7 Docker私有倉庫

7.1 私有倉庫搭建和配置

拉取私有倉庫鏡像
$ docker pull registry
啓動私有倉庫容器
$ docker run -di --name registry -p 5000:5000 registry
#172.17.0.7
http://172.17.0.7:5000
$ docker inspect --format='{{.NetworkSettings.IPAddress}}'
registry
測試頁面訪問: http://172.17.0.7:5000/v2/_catalog, 不是私有倉庫搭建成功而且內容爲空。
修改daemon.json
$ vim /etc/docker/daemon.json
編輯如下內容,保存退出。
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu..cn"],
"insecure-registries": ["172.17.0.7:5000"]
}
重啓docker服務
$ systemctl restart
docker

7.2 鏡像上傳至私有倉庫

標記鏡像爲私有倉庫的鏡像$ docker tagmysql:remote_login 172.17.0.7:5000/remote_login上傳標記的鏡像$ docker push 172.17.0.7:5000/remote_login

相關文章
相關標籤/搜索