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的容器就像操作一個快速輕量級的虛擬機一樣簡單。

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

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

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

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

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會在鏡像的最上一
層創建一個可寫層,鏡像本身是隻讀的,保持不變。

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

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

阿里安裝軟件鏡像源下載

$ 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 -v

方法二: 官網下載軟件包, 自行安裝
$ 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 tag
mysql:remote_login 172.17.0.7:5000/remote_login
上傳標記的鏡像
$ docker push 172.17.0.7:5000/remote_login

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章