av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁技術(shù)文章
文章詳情頁

Python開發(fā)加薪利器之Docker的使用實(shí)踐

瀏覽:100日期:2022-06-18 08:41:57
目錄1. Docker概述1.1 虛擬機(jī)技術(shù)VS容器化技術(shù)1.2 名詞概念2. Docker安裝2.1 環(huán)境查看2.2 卸載舊的版本2.3 安裝必要的包2.4 添加GPG密鑰2.6 安裝Docker引擎2.7 添加當(dāng)前用戶到 docker 用戶組2.9 配置阿里云鏡像加速3. Docker run 運(yùn)行流程圖4. Docker工作原理5. Docker常見命令5.1 幫助命令5.2 鏡像命令5.3 容器命令5.4 常見其他命令6. 實(shí)戰(zhàn)6.1 部署Nginx6.2 端口暴露(端口轉(zhuǎn)發(fā))6.3 部署Elasticsearch6.4 可視化 Portainer7. Docker鏡像講解7.1 鏡像是什么7.2 Docker鏡像加載原理7.3 分層理解7.4 commit鏡像總結(jié):8. 容器數(shù)據(jù)卷8.1 容器數(shù)據(jù)卷是什么8.2 使用數(shù)據(jù)卷8.3 實(shí)戰(zhàn):安裝MySQL8.4 匿名掛載和具名掛載1. Docker概述 Docker為什么火,因?yàn)槭值妮p巧。 Docker是基于Go語言開發(fā)的。1.1 虛擬機(jī)技術(shù)VS容器化技術(shù)

虛擬機(jī)技術(shù):

資源占用 多冗余步驟多 啟動(dòng)慢

容器化技術(shù):容器化技術(shù)不是模擬一個(gè)完整的操作系統(tǒng)。

1.2 名詞概念

鏡像(image)

docker鏡像好比是一個(gè)模版,可以通過這個(gè)模版來創(chuàng)建容器服務(wù),mysql鏡像==>run==>mysql01容器(提供服務(wù)),通過這個(gè)鏡像可以創(chuàng)建多個(gè)容器。

容器(container)

docker利用容器技術(shù),獨(dú)立運(yùn)行一個(gè)或者一組應(yīng)用。通過鏡像來創(chuàng)建的。

基本命令有啟動(dòng)、停止、刪除等。

目前可以把容器理解為就是一個(gè)簡易的Linux系統(tǒng)。

倉庫(repository)

倉庫就是存放鏡像的地方。倉庫分為公有倉庫和私有倉庫。默認(rèn)是國外的倉庫(DockerHub),國內(nèi)有阿里云等(配置鏡像加速)

2. Docker安裝2.1 環(huán)境查看

2.1.1 查看內(nèi)核版本

uname -r

Python開發(fā)加薪利器之Docker的使用實(shí)踐

2.1.2 查看系統(tǒng)信息

sudo cat /etc/os-release

Python開發(fā)加薪利器之Docker的使用實(shí)踐

2.2 卸載舊的版本

sudo apt-get remove docker docker-engine docker.io containerd runc

2.3 安裝必要的包

2.3.1 更新apt程序包索引

sudo apt-get update

2.3.2 安裝必要的包

sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release2.4 添加GPG密鑰

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

上面是官網(wǎng)提供的,但是速度很慢,建議使用阿里云的GPG Key。

curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -

2.5 添加穩(wěn)定Docker-ce軟件源

echo 'deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable' | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

上面是官網(wǎng)提供的,但是速度很慢,建議使用阿里云提供的。

sudo add-apt-repository 'deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable'

注意:添加錯(cuò)了可以用以下命令刪除

#查詢keyid,下圖sudo apt-key list#keyid 就是9DC8那一串sudo apt-key del <keyid>#加參數(shù)-r可以移除sudo add-apt-repository -r 'deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable'

Python開發(fā)加薪利器之Docker的使用實(shí)踐

2.6 安裝Docker引擎

2.6.1 安裝apt包索引

這樣就可以安裝Docker Engine和containerd的最新版本

sudo apt-get update

2.6.2 安裝

sudo apt-get install docker-ce docker-ce-cli containerd.io

如果要安裝指定版本的Docker引擎,在repo中列出可用版本,然后選擇安裝

apt-cache madison docker-ce

Python開發(fā)加薪利器之Docker的使用實(shí)踐

sudo apt-get install docker-ce=<VERSION_STRING> docker-ce-cli=<VERSION_STRING> containerd.io2.7 添加當(dāng)前用戶到 docker 用戶組

添加后,以后就可以不用 sudo 運(yùn)行 docker 了。

將當(dāng)前用戶添加到 docker 組

sudo gpasswd -a ${USER} docker

重新登錄或者用以下命令切換到docker組(建議重啟Ubuntu)

newgrp - docker

重啟docker服務(wù)

sudo service docker restart

不加sudo直接執(zhí)行docker命令檢查效果

docker ps

2.8 測試是否安裝成功

首先啟動(dòng)Docker

systemctl start docker

查看Docker版本來判斷是否安裝成功

docker version

Python開發(fā)加薪利器之Docker的使用實(shí)踐

2.9 配置阿里云鏡像加速

sudo mkdir -p /etc/dockersudo tee /etc/docker/daemon.json <<-’EOF’{ 'registry-mirrors': ['https://eko3tl65.mirror.aliyuncs.com']}EOFsudo systemctl daemon-reloadsudo systemctl restart docker3. Docker run 運(yùn)行流程圖

Python開發(fā)加薪利器之Docker的使用實(shí)踐

4. Docker工作原理

Docker是一個(gè)Client·Server結(jié)構(gòu)的系統(tǒng),Docker的守護(hù)進(jìn)程運(yùn)行在主機(jī)上,通過Socket從客戶端訪問,DockerServer接受到DockerClient的指令,就會(huì)去執(zhí)行這個(gè)指令。

Python開發(fā)加薪利器之Docker的使用實(shí)踐

5. Docker常見命令5.1 幫助命令

# 顯示docker的版本信息docker version# 顯示docker的系統(tǒng)信息 包括鏡像和容器的數(shù)量docker info# 幫助命令docker 命令 --help

幫助文檔地址:官方文檔

5.2 鏡像命令

5.2.1 docker images

查看所有本地的主機(jī)上的鏡像

malulu@malulu:~/桌面$ docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEnginx latest 519e12e2a84a 4 days ago 133MBhello-world latest d1165f221234 5 weeks ago 13.3kB# 解釋REPOSITORY鏡像的倉庫源TAG鏡像的標(biāo)簽IMAGE ID鏡像的IDCREATED鏡像的創(chuàng)建時(shí)間SIZE鏡像的大小# 可選項(xiàng) -a, --all # 列出所有鏡像 -q, --quiet # 只顯示鏡像的ID

5.2.2 docker search

搜索鏡像

Python開發(fā)加薪利器之Docker的使用實(shí)踐

# 可選項(xiàng)--filter=STARS=3000# 搜索出來的鏡像就是STARS大于3000的

Python開發(fā)加薪利器之Docker的使用實(shí)踐

5.2.3 docker pull

下載鏡像

# 下載鏡像docker pull 鏡像名[:tag]malulu@malulu:~/桌面$ docker pull mysqlUsing default tag: latest# 如果不寫tag(版本) 默認(rèn)就是latestlatest: Pulling from library/mysqlf7ec5a41d630: Already exists# 分層下載 docker image的核心 聯(lián)合文件系統(tǒng) 9444bb562699: Pull complete 6a4207b96940: Pull complete 181cefd361ce: Pull complete 8a2090759d8a: Pull complete 15f235e0d7ee: Pull complete d870539cd9db: Pull complete 5726073179b6: Pull complete eadfac8b2520: Pull complete f5936a8c3f2b: Pull complete cca8ee89e625: Pull complete 6c79df02586a: Pull complete Digest: sha256:6e0014cdd88092545557dee5e9eb7e1a3c84c9a14ad2418d5f2231e930967a38# 簽名Status: Downloaded newer image for mysql:latestdocker.io/library/mysql:latest# 真實(shí)地址# 下面兩條命令等價(jià)docker pull mysqldocker pull docker.io/library/mysql:latest# 指定版本下載 必須在倉庫有這個(gè)版本malulu@malulu:~/桌面$ docker pull mysql:5.75.7: Pulling from library/mysqlf7ec5a41d630: Already exists 9444bb562699: Already exists 6a4207b96940: Already exists 181cefd361ce: Already exists 8a2090759d8a: Already exists 15f235e0d7ee: Already exists d870539cd9db: Already exists 7310c448ab4f: Pull complete 4a72aac2e800: Pull complete b1ab932f17c4: Pull complete 1a985de740ee: Pull complete Digest: sha256:e42a18d0bd0aa746a734a49cbbcc079ccdf6681c474a238d38e79dc0884e0eccStatus: Downloaded newer image for mysql:5.7docker.io/library/mysql:5.7

5.2.4 docker rmi

刪除鏡像

# 刪除指定的鏡像docker rmi -f 鏡像ID# 刪除多個(gè)鏡像docker rmi -f 鏡像ID 鏡像ID 鏡像ID 鏡像ID # 刪除全部鏡像docker rmi -f $(docker images -aq)5.3 容器命令

說明:我們有了鏡像才可以創(chuàng)建容器。

這里下載一個(gè)centos鏡像來測試學(xué)習(xí)。

docker pull centos

5.3.1 新建容器并啟動(dòng)

docker run [可選參數(shù)] image# 參數(shù)說明--name='Name'# 容器名字 mysql01 mysql02 用來區(qū)分容器-d# 后臺方式運(yùn)行-it# 使用交互方式運(yùn)行(需要提供一個(gè)控制臺) 進(jìn)入容器查看內(nèi)容-p# 指定容器的端口 -p 8080:8080-p ip:主機(jī)端口:容器端口-p 主機(jī)端口:容器端口 (常用)-p 容器端口容器端口-P# 隨機(jī)指定端口# 測試# 啟動(dòng)并進(jìn)入容器malulu@malulu:~/桌面$ docker run -it centos /bin/bash[root@a8d9ce9627a4 /]# ls# 查看容器內(nèi)的centos 基礎(chǔ)鏡像 很多命令都是不完善的bin etc lib lost+found mnt proc run srv tmp vardev home lib64 media opt root sbin sys usr# 從容器中退回主機(jī)[root@a8d9ce9627a4 /]# exitexitmalulu@malulu:~/桌面$

5.3.2 列出所有的運(yùn)行的容器

# 列出當(dāng)前正在運(yùn)行的容器docker ps# 可選項(xiàng)-a# 列出當(dāng)前正在運(yùn)行的容器 + 歷史運(yùn)行過的容器-n=?# 顯示最近創(chuàng)建的n個(gè)容器-q# 只顯示容器的編號

Python開發(fā)加薪利器之Docker的使用實(shí)踐

5.3.3 退出容器

exit# 直接停止容器并退出ctrl+P+Q# 容器不停止退出

Python開發(fā)加薪利器之Docker的使用實(shí)踐

5.3.4 刪除容器

# 刪除指定的容器 不能刪除正在運(yùn)行的容器 強(qiáng)制刪除用rm -fdocker rm 容器ID# 刪除所有的容器# 方式一 常用docker rm -f $(docker ps -aq)# 方式二docker ps -a -q|xargs docker rm

5.3.5 啟動(dòng)和停止容器的操作

docker start 容器ID# 啟動(dòng)容器docker restart 容器ID# 重啟容器docker stop 容器ID# 停止當(dāng)前正在運(yùn)行的容器docker kill 容器ID# 強(qiáng)制刪除當(dāng)前容器5.4 常見其他命令

5.4.1 后臺啟動(dòng)容器

# 后臺啟動(dòng)容器docker run -d 鏡像名# 比如 后臺啟動(dòng)centosdocker run -d centos# 問題 docker ps 時(shí) 發(fā)現(xiàn) centos 停止了# 常見的坑:docker容器使用后臺運(yùn)行,就必須要有一個(gè)前臺進(jìn)程,docker發(fā)現(xiàn)沒有應(yīng)用,就會(huì)自動(dòng)停止# 比如nginx,容器啟動(dòng)后,發(fā)現(xiàn)自己沒有提供服務(wù),就會(huì)立刻停止,就是沒有程序了

Python開發(fā)加薪利器之Docker的使用實(shí)踐

5.4.2 查看日志

docker logs -f -t --tail number 容器ID# 可選項(xiàng) -tf# 顯示日志 --tail number# 要顯示日志條數(shù)# 自己編寫一段shell腳本docker run -d centos /bin/sh -c 'while true;do echo 666;sleep 1;done'

Python開發(fā)加薪利器之Docker的使用實(shí)踐

5.4.3 查看容器中進(jìn)程信息

docker top 容器ID

Python開發(fā)加薪利器之Docker的使用實(shí)踐

5.4.4 查看鏡像的元數(shù)據(jù)

docker inspect 容器ID

Python開發(fā)加薪利器之Docker的使用實(shí)踐

5.4.5 進(jìn)入當(dāng)前正在運(yùn)行的容器

我們通常容器都是使用后臺方式運(yùn)行的,有時(shí)需要進(jìn)入容器,修改一些配置

# 方式一# 命令docker exec -it 容器ID bashShell# 測試malulu@malulu:~/桌面$ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES9ff3b9c7ebd5 centos '/bin/sh -c ’while t…' 8 seconds ago Up 6 seconds lucid_wrightmalulu@malulu:~/桌面$ docker exec -it 9ff3b9c7ebd5 /bin/bash[root@9ff3b9c7ebd5 /]# lsbin etc lib lost+found mnt proc run srv tmp vardev home lib64 media opt root sbin sys usr[root@9ff3b9c7ebd5 /]# # 方式二docker attach 容器ID# 測試malulu@malulu:~/桌面$ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES9ff3b9c7ebd5 centos '/bin/sh -c ’while t…' 8 minutes ago Up 8 minutes lucid_wrightmalulu@malulu:~/桌面$ docker attach 9ff3b9c7ebd5666666666666666666# docker exec# 進(jìn)入容器后開啟一個(gè)新的終端 可以在里面操作(常用)# docker attach# 進(jìn)入容器正在執(zhí)行的終端 不會(huì)啟動(dòng)新的終端

5.4.6 從容器內(nèi)拷貝文件到主機(jī)

注意:是從容器內(nèi)拷貝到主機(jī)。

docker cp 容器Id:容器內(nèi)路徑 目的的主機(jī)路徑

只要容器存在就可以,跟容器是否運(yùn)行沒有關(guān)系。

拷貝是一個(gè)手動(dòng)過程,后面我們使用 -V 數(shù)據(jù)卷的技術(shù),可以實(shí)現(xiàn)自動(dòng)同步。

Python開發(fā)加薪利器之Docker的使用實(shí)踐

5.4.5 小結(jié)

Python開發(fā)加薪利器之Docker的使用實(shí)踐

attach Attach local standard input, output, and error streams to a running containerbuild Build an image from a Dockerfilecommit Create a new image from a container’s changescp Copy files/folders between a container and the local filesystemcreate Create a new containerdiffInspect changes to files or directories on a container’s filesystemevents Get real time events from the serverexecRun a command in a running containerexport Export a container’s filesystem as a tar archivehistory Show the history of an imageimages List imagesimport Import the contents from a tarball to create a filesystem imageinfoDisplay system-wide informationinspect Return low-level information on Docker objectskillKill one or more running containersloadLoad an image from a tar archive or STDINlogin Log in to a Docker registrylogout Log out from a Docker registrylogsFetch the logs of a containerpause Pause all processes within one or more containersportList port mappings or a specific mapping for the containerps List containerspullPull an image or a repository from a registrypushPush an image or a repository to a registryrename Rename a containerrestart Restart one or more containersrm Remove one or more containersrmi Remove one or more imagesrun Run a command in a new containersaveSave one or more images to a tar archive (streamed to STDOUT by default)search Search the Docker Hub for imagesstart Start one or more stopped containersstats Display a live stream of container(s) resource usage statisticsstopStop one or more running containerstag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGEtop Display the running processes of a containerunpause Unpause all processes within one or more containersupdate Update configuration of one or more containersversion Show the Docker version informationwaitBlock until one or more containers stop, then print their exit codes6. 實(shí)戰(zhàn)6.1 部署Nginx

第一步:搜索鏡像,建議去DockerHub搜索,可以看到幫助文檔

https://registry.hub.docker.com/search?q=nginx&type=image

Python開發(fā)加薪利器之Docker的使用實(shí)踐

第二步:拉取鏡像

malulu@malulu:~/桌面$ docker pull nginxUsing default tag: latestlatest: Pulling from library/nginxf7ec5a41d630: Already exists aa1efa14b3bf: Pull complete b78b95af9b17: Pull complete c7d6bca2b8dc: Pull complete cf16cd8e71e0: Pull complete 0241c68333ef: Pull complete Digest: sha256:75a55d33ecc73c2a242450a9f1cc858499d468f077ea942867e662c247b5e412Status: Downloaded newer image for nginx:latestdocker.io/library/nginx:latestmalulu@malulu:~/桌面$

第三步:運(yùn)行測試

# -d 后臺運(yùn)行# --name 給容器命名# -p 宿主機(jī)端口:容器內(nèi)部端口malulu@malulu:~/桌面$ docker run -d --name nginx01 -p 3344:80 nginx699b9cecd0a07f8db6e888722a2dada1c9b9be6d77efc7996c4b6758dd72f587malulu@malulu:~/桌面$ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES699b9cecd0a0 nginx '/docker-entrypoint.…' About a minute ago Up About a minute 0.0.0.0:3344->80/tcp nginx01malulu@malulu:~/桌面$ curl localhost:3344# 進(jìn)入容器malulu@malulu:~/桌面$ docker exec -it nginx01 /bin/bashroot@699b9cecd0a0:/# whereis nginxnginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginxroot@699b9cecd0a0:/# cd /etc/nginx/root@699b9cecd0a0:/etc/nginx# lsconf.dfastcgi_paramskoi-utf koi-win mime.types modules nginx.conf scgi_paramsuwsgi_params win-utfroot@699b9cecd0a0:/etc/nginx# exit

Python開發(fā)加薪利器之Docker的使用實(shí)踐

第四步:公網(wǎng)訪問

Python開發(fā)加薪利器之Docker的使用實(shí)踐

Python開發(fā)加薪利器之Docker的使用實(shí)踐

6.2 端口暴露(端口轉(zhuǎn)發(fā))

Python開發(fā)加薪利器之Docker的使用實(shí)踐

6.3 部署Elasticsearch

# es 暴露的端口很多# es 十分的耗內(nèi)存# es 數(shù)據(jù)一般需要放置到安全目錄 掛載docker run -d --name elasticsearch --net somenetwork -p 9200:9200 -p 9300:9300 -e 'discovery.type=single-node' elasticsearch:tag

# --net somenetwork 網(wǎng)絡(luò)配置# 啟動(dòng) Elasticsearchdocker run -d --name elasticsearch01 -p 9200:9200 -p 9300:9300 -e 'discovery.type=single-node' elasticsearch:7.12.0# 啟動(dòng)之后,服務(wù)器會(huì)特別卡# 所以需要增加內(nèi)存的限制# 修改配置文件 -e 環(huán)境配置修改docker run -d --name elasticsearch02 -p 9200:9200 -p 9300:9300 -e 'discovery.type=single-node' -e ES_JAVA_OPTS='-Xms64m -Xmx512m' elasticsearch:7.12.0

# 查看CPU使用情況docker stats 容器ID

Python開發(fā)加薪利器之Docker的使用實(shí)踐

# 測試es是否安裝成功curl localhost:9200

Python開發(fā)加薪利器之Docker的使用實(shí)踐

6.4 可視化 Portainer

Docker圖形化界面管理工具,提供一個(gè)后臺面板供我們操作。

訪問測試:

http://192.168.2.143:8088http://localhost:8088

為用戶 admin 設(shè)置密碼 admin123456

登錄成功后,選擇本地Docker環(huán)境

Python開發(fā)加薪利器之Docker的使用實(shí)踐

進(jìn)入之后的面板

Python開發(fā)加薪利器之Docker的使用實(shí)踐

Python開發(fā)加薪利器之Docker的使用實(shí)踐

可視化面板我們平時(shí)不會(huì)使用,用來測試玩玩。

7. Docker鏡像講解7.1 鏡像是什么

鏡像是一種輕量級、可執(zhí)行的獨(dú)立軟件包,用來打包軟件運(yùn)行環(huán)境和基于運(yùn)行環(huán)境開發(fā)的軟件,它包含運(yùn)行某個(gè)軟件所需的所有內(nèi)容,包括代碼、運(yùn)行所需庫、環(huán)境變量和配置文件。所有的應(yīng)用,直接打包docker鏡像,就可以直接跑起來。

如何獲取到鏡像:

從遠(yuǎn)程倉庫下載 朋友拷貝給你 自己制作一個(gè)鏡像DockerFile7.2 Docker鏡像加載原理

UnionFS(聯(lián)合文件系統(tǒng))

我們下載的時(shí)候看到的一層層就是這個(gè)!Union文件系統(tǒng)(UnionFS)是一種分層、輕量級并且高性能的文件系統(tǒng),它支持對文件系統(tǒng)的修改作為一次提交來一層層的疊加,同時(shí)可以將不同目錄掛載到同一個(gè)虛擬文件系統(tǒng)下(unite several directories into a single virtual filesystem)。Union文件系統(tǒng)是Docker鏡像的基礎(chǔ)。鏡像可以通過分層來進(jìn)行繼承,基于基礎(chǔ)鏡像(沒有父鏡像),可以制作各種具體的應(yīng)用鏡像。

特性:一次同時(shí)加載多個(gè)文件系統(tǒng),但從外面看起來,只能看到一個(gè)文件系統(tǒng),聯(lián)合加載會(huì)把各層文件系統(tǒng)疊加起來,這樣最終的文件系統(tǒng)會(huì)包含所有底層的文件和目錄。

Docker鏡像加載原理

Docker的鏡像實(shí)際上由一層層的文件系統(tǒng)組成,這種層級的文件系統(tǒng)叫做UnionFS。

系統(tǒng)啟動(dòng)需要引導(dǎo)加載。

bootfs(boot file system)主要包含bootloader(加載器)和kernel(內(nèi)核),bootloader主要是引導(dǎo)加載kernel,Linux剛啟動(dòng)時(shí)會(huì)加載bootfs文件系統(tǒng),在Docker鏡像的最底層是bootfs。這一層與我們典型的Linux/Unix系統(tǒng)是一樣的,包含boot加載器和內(nèi)核。當(dāng)boot加載完成之后整個(gè)內(nèi)核就都在內(nèi)存中了,此時(shí)內(nèi)存的使用權(quán)已由bootfs轉(zhuǎn)交給內(nèi)核,此時(shí)系統(tǒng)也會(huì)卸載bootfs。

rootfs(root file system),在bootfs之上,包含的就是典型Linux系統(tǒng)中的 /dev,/proc,/bin,/etc 等標(biāo)準(zhǔn)目錄和文件。rootfs就是各種不同的操作系統(tǒng)發(fā)行版,比如Ubuntu, Centos等等。容器就是一個(gè)小的虛擬機(jī)環(huán)境。

平時(shí)我們在虛擬機(jī)中安裝CentOs都是好幾個(gè)G,為什么在Docker里面才200多M?

Python開發(fā)加薪利器之Docker的使用實(shí)踐

對于一個(gè)精簡的OS,rootfs可以很小,只需要包含最基本的命令,工具和程序庫就可以了,因?yàn)榈讓又苯佑肏ost的kernel,自己只需要提供rootfs就可以了。由此可見對于不同的linux發(fā)行版,bootfs基本是一致的,rootfs會(huì)有差別,因此不同的發(fā)行版可以公用bootfs。

所以說,虛擬機(jī)是分鐘級別,容器是秒級別。是因?yàn)閱?dòng)虛擬機(jī)需要啟動(dòng)內(nèi)核引導(dǎo),非常慢,而容器底層還是使用主機(jī)的內(nèi)核。

7.3 分層理解

分層的鏡像

我們可以去下載一個(gè)鏡像,注意觀察下載的日志輸出,可以看到的是一層一層的在下載。

Python開發(fā)加薪利器之Docker的使用實(shí)踐

**思考:**為什么Docker鏡像要采用這種分層的結(jié)構(gòu)呢?最大的好處,我覺得莫過于是資源共享了。比如有多個(gè)鏡像都從相同的Base鏡像構(gòu)建而來,那么宿主機(jī)只需在磁盤上保留一份Base鏡像,同時(shí)內(nèi)存中也只需要加載一份Base鏡像,這樣就可以為所有的容器服務(wù)了,而且鏡像的每一層都可以被共享。查看鏡像分層的方式可以通過 docker image inspect 命令。

docker image inspect redis:latest

Python開發(fā)加薪利器之Docker的使用實(shí)踐

理解:

所有的Docker鏡像都起始于一個(gè)基礎(chǔ)鏡像層,當(dāng)進(jìn)行修改或增加新的內(nèi)容時(shí),就會(huì)在當(dāng)前鏡像層之上,創(chuàng)建新的鏡像層。舉一個(gè)簡單的例子,假如基于Ubuntu Linux 16.04創(chuàng)建一個(gè)新的鏡像,這就是新鏡像的第一層;如果在該鏡像中添加Python包,就會(huì)在基礎(chǔ)鏡像層之上創(chuàng)建第二個(gè)鏡像層;如果繼續(xù)添加一個(gè)安全補(bǔ)丁,就會(huì)創(chuàng)建第三個(gè)鏡像層。該鏡像當(dāng)前已經(jīng)包含3個(gè)鏡像層,如下圖所示(這只是一個(gè)用于演示的很簡單的例子)

Python開發(fā)加薪利器之Docker的使用實(shí)踐

在添加額外的鏡像層的同時(shí),鏡像始終保持是當(dāng)前所有鏡像的組合,理解這一點(diǎn)非常重要。下圖中舉了一個(gè)簡單的例子,每個(gè)鏡像層包含3個(gè)文件,而鏡像包含了來自兩個(gè)鏡像層的6個(gè)文件。

Python開發(fā)加薪利器之Docker的使用實(shí)踐

上圖中的鏡像層跟之前圖中的略有區(qū)別,主要目的是便于展示文件。下圖中展示了一個(gè)稍微復(fù)雜的三層鏡像,在外部看來整個(gè)鏡像只有6個(gè)文件,這是因?yàn)樽钌蠈又械奈募?是文件5的一個(gè)更新版本。

Python開發(fā)加薪利器之Docker的使用實(shí)踐

這種情況下,上層鏡像層中的文件覆蓋了底層鏡像層中的文件。這樣就使得文件的更新版本作為一個(gè)新鏡像層添加到鏡像當(dāng)中。Docker通過存儲引擎(新版本采用快照機(jī)制)的方式來實(shí)現(xiàn)鏡像層堆棧,并保證多鏡像層對外展示為統(tǒng)一的文件系統(tǒng)。Linux上可用的存儲引擎有AUFS、Overlay2、Device Mapper、Btrfs 以及ZFS。顧名思義,每種存儲引擎都基于Linux中對應(yīng)的文件系統(tǒng)或者塊設(shè)備技術(shù),并且每種存儲引擎都有其獨(dú)有的性能特點(diǎn)。Docker在Windows上僅支持windowsfilter一種存儲引擎。下圖展示了與系統(tǒng)顯示相同的三層鏡像。所有鏡像層堆疊并合并,對外提供統(tǒng)一的視圖。

Python開發(fā)加薪利器之Docker的使用實(shí)踐

特點(diǎn)

Docker鏡像都是只讀的,當(dāng)容器啟動(dòng)時(shí),一個(gè)新的可寫層被加載到鏡像的頂部。這一層就是我們通常說的容器層,容器之下的都叫鏡像層。

Python開發(fā)加薪利器之Docker的使用實(shí)踐

7.4 commit鏡像

如何提交一個(gè)自己的鏡像呢?

docker commit 提交容器成為一個(gè)新的鏡像docker commit -m='提交的描述信息' -a='作者' 容器Id 目標(biāo)鏡像名:[TAG]

實(shí)戰(zhàn)測試:

# 1.啟動(dòng)一個(gè)默認(rèn)的tomcat# 2.發(fā)現(xiàn)這個(gè)默認(rèn)的tomcat是沒有webapps應(yīng)用,是因?yàn)楣俜界R像默認(rèn)webapps下面是沒有文件的# 3.自己拷貝進(jìn)去了基本的文件

Python開發(fā)加薪利器之Docker的使用實(shí)踐

# 4.將我們操作過的容器通過commit提交為一個(gè)鏡像。我們以后就使用我們修改過的鏡像即可。

Python開發(fā)加薪利器之Docker的使用實(shí)踐

總結(jié):

如果你想要保存當(dāng)前容器的狀態(tài) ,就可以通過commit來提交,獲得一個(gè)鏡像。就好比虛擬機(jī)的快照。

8. 容器數(shù)據(jù)卷8.1 容器數(shù)據(jù)卷是什么

將應(yīng)用和環(huán)境打包成一個(gè)鏡像!

數(shù)據(jù)?如果數(shù)據(jù)都在容器中,那么我們?nèi)萜鲃h除,數(shù)據(jù)就會(huì)丟失!需求:數(shù)據(jù)可以持久化

MySQL,容器刪了,相當(dāng)于刪庫跑路!需求:MySQL數(shù)據(jù)可以存儲到本地

容器之間可以有一個(gè)數(shù)據(jù)共享的技術(shù)!Docker容器中產(chǎn)生的數(shù)據(jù),同步到本地!

這就是卷技術(shù)!相當(dāng)于目錄的掛載,將我們?nèi)萜鲀?nèi)的目錄,掛載到Linux上面!

**總結(jié):**為什么使用容器卷?為了容器的持久化和同步操作,容器間也是可以數(shù)據(jù)共享的(即多個(gè)容器使用同一個(gè)本地目錄)

8.2 使用數(shù)據(jù)卷

方式一:直接使用命令來掛載 -v

docker run -v 主機(jī)內(nèi)目錄:容器內(nèi)目錄

通過命令 docker inspect 來查看掛載信息,如下:

'Mounts': [ {'Type': 'bind','Source': '/home/ceshi',# 主機(jī)內(nèi)地址'Destination': '/home',# docker容器內(nèi)地址'Mode': '','RW': true,'Propagation': 'rprivate' }],

測試文件的同步:

Python開發(fā)加薪利器之Docker的使用實(shí)踐

8.3 實(shí)戰(zhàn):安裝MySQL

思考:MySQL的數(shù)據(jù)持久化問題。

# 獲取鏡像docker pull mysql:5.7# 運(yùn)行容器 需要做數(shù)據(jù)掛載# 注意: 安裝啟動(dòng)mysql時(shí) 需要配置密碼的# 官方測試(DockerHub) docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag# 啟動(dòng)docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=Malulu@960610 --name mysql01 mysql:5.7# 啟動(dòng)成功后 在使用Navicat來測試# Navicat連接到Ubuntu的3310 3310和容器內(nèi)的3306映射 此時(shí)我們就可以連接上了

Python開發(fā)加薪利器之Docker的使用實(shí)踐

假設(shè)我們將容器刪除,我們掛載到本地的數(shù)據(jù)卷依舊沒有丟失,這就實(shí)現(xiàn)了容器數(shù)據(jù)持久化的功能。

8.4 匿名掛載和具名掛載

8.4.1 匿名掛載

# 查看所有卷的信息docker volume ls# 匿名掛載-v 容器內(nèi)目錄docker run -d -P --name nginx -v /etc/nginx nginx# 這樣就屬于匿名掛載 在 -v 后只寫了容器內(nèi)目錄 沒有寫主機(jī)的目錄

Python開發(fā)加薪利器之Docker的使用實(shí)踐

8.4.2 具名掛載

docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx

Python開發(fā)加薪利器之Docker的使用實(shí)踐

通過 -v 卷名:容器內(nèi)目錄 的格式屬于具名掛載。

使用命令 docker volume inspect 卷名 來查看這個(gè)這個(gè)卷的信息。

Python開發(fā)加薪利器之Docker的使用實(shí)踐

所有的Docker容器內(nèi)的卷,在沒有指定目錄的情況下都是在主機(jī)的 /var/lib/docker/volumes/xxx/_data 目錄下。

Python開發(fā)加薪利器之Docker的使用實(shí)踐

我們通過具名掛載可以方便的找到我們的一個(gè)卷,大多數(shù)情況下使用具名掛載

如何確定是具名掛載還是匿名掛載還是指定路徑掛載?

-v 容器內(nèi)路徑 # 匿名掛載-v 卷名:容器內(nèi)路徑# 具名掛載-v /宿主機(jī)路徑:容器內(nèi)路徑 # 指定路徑掛載

擴(kuò)展:

# 通過 -v 容器內(nèi)路徑:ro rw 改變讀寫權(quán)限r(nóng)o readonly # 只讀rw readwrite# 可讀可寫# 一旦設(shè)置了這個(gè)權(quán)限 容器對我們掛載出來的內(nèi)容就有限定了docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginxdocker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx# ro 只要看到ro就說明這個(gè)路徑只能通過宿主機(jī)來操作 容器內(nèi)部是無法操作的

8.5 初識DockerFile

DockerFile就是用來構(gòu)建Docker鏡像的構(gòu)建文件,這個(gè)文件其實(shí)就是一個(gè)命令腳本。

通過這個(gè)腳本可以生成鏡像,鏡像是一層一層的,腳本是一個(gè)一個(gè)的命令,每個(gè)命令都是一層。

# 創(chuàng)建一個(gè)dockerfile文件 名字可以隨機(jī) 建議Dockerfile# 文件中的內(nèi)容 # 指令(大寫) 參數(shù)FROM centosVOLUME ['volume01','volume02']CMD echo '-----end-----'CMD /bin/bash# 這里的每個(gè)命令鏡像的一層

通過 docker build 來創(chuàng)建自己的命令。

docker build -f ./dockerfile1 -t malulu-centos:1.0 .

Python開發(fā)加薪利器之Docker的使用實(shí)踐

啟動(dòng)自己創(chuàng)建的鏡像

Python開發(fā)加薪利器之Docker的使用實(shí)踐

這兩個(gè)卷在外部一定有同步的目錄。

Python開發(fā)加薪利器之Docker的使用實(shí)踐

查看一下卷掛載的路徑。

Python開發(fā)加薪利器之Docker的使用實(shí)踐

Python開發(fā)加薪利器之Docker的使用實(shí)踐

然后測試一下剛才創(chuàng)建的兩個(gè)文件是否同步到宿主機(jī)。

Python開發(fā)加薪利器之Docker的使用實(shí)踐

這種方式我們以后用的非常多,因?yàn)槲覀兺ǔ?huì)構(gòu)建自己的鏡像。假設(shè)構(gòu)建鏡像時(shí)沒有掛載卷,就需要手動(dòng)掛載(具名掛載)。

未完待續(xù),值得期待!

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 国产伦精品一区二区三区在线 | 亚洲精品一区二区另类图片 | 国产精品精品视频一区二区三区 | 精品国产欧美一区二区三区不卡 | 99国产精品99久久久久久 | 国产一级特黄aaa大片评分 | 国产欧美精品一区二区 | 色影视 | 毛片在线看片 | 97超碰在线播放 | 亚洲高清在线免费观看 | 狠狠操av | 波多野吉衣在线播放 | 成人福利在线观看 | 久久久毛片 | 日韩精品一区二 | 日韩福利 | 精品久久九 | 国产网站在线 | 欧美精品中文字幕久久二区 | 久久精品色欧美aⅴ一区二区 | 欧美一区二区在线 | 激情五月婷婷综合 | 日本午夜精品 | 国产一级片 | 日本网站在线看 | 国产精品视频一区二区三区 | 美日韩免费 | 国产在线播放一区二区三区 | 性一交一乱一伦视频免费观看 | 亚洲男人的天堂网站 | 97影院在线午夜 | 久久中文字幕一区 | 亚洲视频免费在线看 | 欧美激情一区二区三级高清视频 | 日韩在线不卡 | 久久蜜桃资源一区二区老牛 | 亚洲热在线视频 | 999久久久久久久久 国产欧美在线观看 | 国产乱码精品1区2区3区 | 亚洲欧洲av在线 |