Python3 - 深入学习Docker容器管理
文章目錄
- 一、Docker簡(jiǎn)介
- 1.1 為什么選擇docker?
- 1.1.1 docker更高效的利用系統(tǒng)資源
- 1.1.2 更快的啟動(dòng)時(shí)間
- 1.1.3 持續(xù)交付和部署
- 1.1.4 更輕松的遷移
- 1.2 Docker能做什么?
- 1.3 Docker最核心的組件
- 二、Docker安裝部署
- 2.1 基礎(chǔ)環(huán)境配置
- 2.2 安裝docker
- 2.2.1 docker必須安裝在centos7平臺(tái), 內(nèi)核不低于3.10
- 2.2.2 開啟linux內(nèi)核的流量轉(zhuǎn)發(fā)
- 2.2.3 重新加載內(nèi)核參數(shù)
- 2.2.4 安裝docker-ce社區(qū)版
- 2.2.5 鏡像加速器
- 三、啟動(dòng)第一個(gè)docker容器
- 3.1 docker流程示意圖
- 3.2 Docker運(yùn)行nginx
- 3.3 端口映射示意圖
- 四、docker生命周期
- 4.1 詳細(xì)圖解:
- 五、徹底學(xué)明白, docker鏡像的原理
- 5.1 分層拉取鏡像
- 5.2 利用docker獲取不同發(fā)行版鏡像
- 5.3 docker具體解決了什么問(wèn)題
- 5.4 理解什么是docker鏡像
- 5.5 Docker 鏡像的原理學(xué)習(xí)(一)
- 5.6 Docker 鏡像原理學(xué)習(xí)(二)
- 5.7 Docker為什么分層鏡像
- 5.8 可寫的容器層
- 六、Docker鏡像的實(shí)際使用學(xué)習(xí)
- 6.1 獲取鏡像
- 6.1.1 從dockerhub獲取鏡像
- 6.1.2 本地鏡像導(dǎo)出、導(dǎo)入
- 6.1.3 從私有部署獲取鏡像
- 6.2 查看鏡像
- 6.3 刪除鏡像
- 6.4 鏡像管理
- 七、Docker容器管理
- 八、Dockerfile構(gòu)建與使用
- 8.1 dockerfile主要組成部分:
- 8.2 dockerfile指令
- 8.3 dockerfile其他指令:
- 8.4 dockerfile實(shí)踐
- 8.5 ENTRYPOINT和CMD的玩法
- 8.6 ARG和ENV指令
- 8.7 VOLUME
- 8.8 EXPOSE
- 8.9 WORKDIR
- 8.10 USER
- 十、構(gòu)建一個(gè)網(wǎng)站鏡像
- 10.1 部署全流程
- 10.2 如何修改該網(wǎng)站的內(nèi)容
- 10.3 再次強(qiáng)調(diào)docker的好處, 用法
- 十一、總結(jié)
- docker容器管理總結(jié)
- 文章就到這里, 喜歡的話點(diǎn)個(gè)關(guān)注和贊吧?~
學(xué)習(xí)目標(biāo):
本篇博文意在學(xué)習(xí)Docker原理, 深入理解docker容器管理, 鏡像管理, 學(xué)會(huì)自定義鏡像Dockerfile, 以及部署項(xiàng)目全流程, 靈活掌握Dockerfile關(guān)鍵字; 目標(biāo)人群適合有一定的Python基礎(chǔ)和Linux基礎(chǔ)的人群。
篇幅較長(zhǎng), 大約需要10分鐘, 實(shí)踐大約需要4h, 大家根據(jù)自己的需要來(lái)學(xué)習(xí)~
聲明: 本篇博文為作者原創(chuàng), 未經(jīng)作者允許請(qǐng)勿轉(zhuǎn)載!
一、Docker簡(jiǎn)介
1.1 為什么選擇docker?
1.1.1 docker更高效的利用系統(tǒng)資源
容器不需要進(jìn)行硬件虛擬化以及進(jìn)行一個(gè)完整操作系統(tǒng)的額外開銷, docker對(duì)系統(tǒng)資源的利用率更高, 無(wú)論是應(yīng)用執(zhí)行, 文件存儲(chǔ), 還是在內(nèi)存消耗等方面, 都比傳統(tǒng)的虛擬機(jī)更高效。因?yàn)橐粋€(gè)同樣配置的主機(jī), 可以運(yùn)行處更多數(shù)量的容器實(shí)例。
1.1.2 更快的啟動(dòng)時(shí)間
傳統(tǒng)的虛擬機(jī)啟動(dòng)時(shí)間長(zhǎng), docker容器則是直接運(yùn)行在宿主機(jī)的內(nèi)核上, 無(wú)需啟動(dòng)一個(gè)完整的操作系統(tǒng), 因此可以達(dá)到秒級(jí)啟動(dòng), 大大解決開發(fā), 測(cè)試, 部署的時(shí)間。
1.1.3 持續(xù)交付和部署
對(duì)于開發(fā)和運(yùn)維人員, 最關(guān)心的環(huán)境部署遷移別處的問(wèn)題, 利用docker可以定制鏡像, 以達(dá)到持續(xù)集成, 持續(xù)交付和部署。通過(guò)Dockerfile來(lái)進(jìn)行鏡像構(gòu)建, 系統(tǒng)集成測(cè)試, 運(yùn)維進(jìn)行環(huán)境部署。且Dockerfile可以使鏡像構(gòu)建透明化, 方便技術(shù)團(tuán)隊(duì)快速理解運(yùn)行環(huán)境部署的流程。
1.1.4 更輕松的遷移
Docker可以在很多平臺(tái)上運(yùn)行, 無(wú)論是物理機(jī), 虛擬機(jī), 云服務(wù)器等環(huán)境, 運(yùn)行結(jié)果都是一致的。用于可以輕松將一個(gè)平臺(tái)的應(yīng)用, 遷移到另外一個(gè)平臺(tái), 而不用擔(dān)心環(huán)境的變化, 導(dǎo)致程序無(wú)法運(yùn)行。
1.2 Docker能做什么?
- 可以把應(yīng)用程序及運(yùn)行依賴環(huán)境打包成鏡像, 作為交付介質(zhì), 在各環(huán)境中部署
- 可以將鏡像(image)啟動(dòng)成為容器(container), 并且提供多容器的生命周期進(jìn)行管理(啟、停、刪)
- container容器之間相互隔離, 且每個(gè)容器可以設(shè)置資源限額
- 提供輕量級(jí)虛擬化功能, 容器就是在宿主機(jī)中的一個(gè)個(gè)虛擬的空間, 彼此相互隔離, 完全獨(dú)立
1.3 Docker最核心的組件
-
image鏡像, 構(gòu)建容器 (我們將程序運(yùn)行所需的環(huán)境, 打包為鏡像文件)
-
Container, 容器 (你的應(yīng)用程序, 就跑在容器中)
-
鏡像倉(cāng)庫(kù) (保存鏡像文件, 提供上傳, 下載鏡像) 作用好比github
-
Dockerfile, 將你部署項(xiàng)目的操作,寫成一個(gè)部署腳本, 這就是dockerfile, 且該腳本還能構(gòu)建出鏡像文件
- FROM 定義基礎(chǔ)鏡像
- MAINTAINER 作者
- RUN 運(yùn)行Linux命令
- ADD 添加文件/目錄
- ENV 環(huán)境變量
- CMD 運(yùn)行進(jìn)程
創(chuàng)建容器的過(guò)程
- 獲取鏡像, 如: docker pull centos, 從鏡像倉(cāng)庫(kù)拉取
- 使用鏡像創(chuàng)建容器
- 分配文件系統(tǒng), 掛載一個(gè)讀寫層, 在讀寫層加載鏡像
- 分配網(wǎng)絡(luò)/網(wǎng)橋接口, 創(chuàng)建一個(gè)網(wǎng)絡(luò)接口, 讓容器和宿主機(jī)通信
- 容器獲取IP地址
- 執(zhí)行容器命令, 如: /bin/bash
- 反饋容器啟動(dòng)結(jié)果
二、Docker安裝部署
提前準(zhǔn)備好一個(gè)宿主機(jī)(VMware去創(chuàng)建一個(gè)linux機(jī)器, 然后安裝docker去使用)
2.1 基礎(chǔ)環(huán)境配置
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repowget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repoyum clean allyum makecacheyum install -y bash-completion vim lrzsz wget expect net-tools nc nmap tree dos2unix htop iftop iotop unzip telnet sl psmisc nethogs glances bc ntpdate openldap-devel2.2 安裝docker
2.2.1 docker必須安裝在centos7平臺(tái), 內(nèi)核不低于3.10
uname -r # 3.10.0-1160.59.1.el7.x86_64sudo yum -y upgrade # 更新yum源2.2.2 開啟linux內(nèi)核的流量轉(zhuǎn)發(fā)
# 寫入 cat <<EOF > /etc/sysctl.d/docker.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.conf.default.rp_filter = 0 net.ipv4.conf.all.rp_filter = 0 net.ipv4.ip_forward=1 EOF2.2.3 重新加載內(nèi)核參數(shù)
modprobe br_netfilter # 如果下面的命令報(bào)錯(cuò), 先執(zhí)行此條命令 sysctl -p /etc/sysctl.d/docker.conf要保持本地軟件源較新, 可以用阿里云yum源更新軟件
2.2.4 安裝docker-ce社區(qū)版
利用yum快速安裝docker
# 提前配置yum倉(cāng)庫(kù) # 1.阿里云自帶倉(cāng)庫(kù) 2.阿里云提供的docker專屬repo倉(cāng)庫(kù)curl -o /etc/yum.repos.d/Centos-7.repo http://mirrors.aliyun.com/repo/Centos-7.repocurl -o /etc/yum.repos.d/docker-ce.repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo## 更新yum緩存并重新緩存 yum clean all && makecache## 查看源中可用版本 sudo yum list docker-ce --showduplicates | sort -r## 如果需要安裝舊版本 sudo yum install -y docker-ce-18.09.9## yum 安裝 sudo yum install docker-ce-20.10.6 -y## 查看docker版本 rpm -qa | grep docker## 如果要卸載 sudo yum remove docker-xxxx-centos.x86_64[harry@iZ8vbbip4bxxx60rxxuZ ~]$ rpm -qa | grep docker docker-scan-plugin-0.17.0-3.el7.x86_64 docker-ce-cli-20.10.14-3.el7.x86_64 docker-ce-20.10.6-3.el7.x86_64 docker-ce-rootless-extras-20.10.14-3.el7.x86_64## 嘗試啟動(dòng)docker2.2.5 鏡像加速器
使用docker受邀操作就是獲取鏡像文件, 默認(rèn)下載是從Docker Hub下載, 網(wǎng)速很慢, 國(guó)內(nèi)很多云服務(wù)商都提供了加速器服務(wù), 阿里云加速器, Daocloud加速器, 靈雀云加速器等。
### 檢查是否有這個(gè)文件, 沒有就創(chuàng)建一個(gè) ### vim /etc/docker/daemon.json ### 寫入 {"registry-mirrors": ["https://8xpk5wnt.mirror.aliyuncs.com"] }### 啟動(dòng)docker systemctl daemon-reload systemctl enable docker systemctl restart docker### 查看docker是否正確安裝[harry@iZ8xxx4bq97z0o60rq3uZ ~]$ sudo docker version [sudo] password for harry: Client: Docker Engine - CommunityVersion: 20.10.14API version: 1.41Go version: go1.16.15Git commit: a224086Built: Thu Mar 24 01:49:57 2022OS/Arch: linux/amd64Context: defaultExperimental: trueServer: Docker Engine - CommunityEngine:Version: 20.10.6API version: 1.41 (minimum version 1.12)Go version: go1.13.15Git commit: 8728dd2Built: Fri Apr 9 22:43:57 2021OS/Arch: linux/amd64Experimental: falsecontainerd:Version: 1.5.11GitCommit: 3df54a852345ae127d1fa3092b95168e4a88e2f8runc:Version: 1.0.3GitCommit: v1.0.3-0-gf46b6badocker-init:Version: 0.19.0GitCommit: de40ad0 [harry@iZ8vbbipxxx0o60rq3uZ ~]$三、啟動(dòng)第一個(gè)docker容器
3.1 docker流程示意圖
# 1.獲取鏡像 # 2.運(yùn)行鏡像, 生成容器, 你想要的容器, 就運(yùn)行在容器中以往需求: Nginx web服務(wù)器, 運(yùn)行出一個(gè)80端口的網(wǎng)站
# 在宿主機(jī)上, 運(yùn)行nginx 1.開啟服務(wù)器 2.在服務(wù)器上安裝好運(yùn)行nginx所需的依賴關(guān)系 3.安裝nginx yum install nginx -y 4.修改nginx配置文件 5.啟動(dòng)nginx 6.客戶端去訪問(wèn)nginx比較耗時(shí)~~如果讓你用docker運(yùn)行nginx, 該怎么玩?
3.2 Docker運(yùn)行nginx
1.獲取鏡像, 獲取是從你配置好的docker鏡像中, 去拉取nginx鏡像 # 先搜索一下, 鏡像文件, 是否存在 docker search nginx # 拉取, 下載鏡像 docker pull nginx # 查看本地的docker鏡像都有哪些 [harry@iZ8vbbxxxz0o60rq3uZ ~]$ sudo docker image ls -a REPOSITORY TAG IMAGE ID CREATED SIZE jupyter-centos 1.0 2aeba7cbf80d 2 days ago 658MB star7th/showdoc latest e06fda0e7caa 9 days ago 589MB nginx latest 605c77e624dd 2 months ago 141MB# 刪除鏡像的命令 sudo docker rmi 鏡像id# 運(yùn)行該nginx鏡像, 運(yùn)行出具體的容器, 然后這個(gè)容器中就跑著一個(gè)nginx服務(wù)了 # 運(yùn)行鏡像的命令, 參數(shù)如下 docker run 參數(shù) 鏡像的名字/id# -d 后臺(tái)運(yùn)行容器 # -p 80:80 端口映射, 宿主機(jī)端口:容器內(nèi)端口, 訪問(wèn)宿主機(jī)端口也就訪問(wèn)到容器內(nèi)的端口 sudo docker run -d -p 80:80 nginx# 查看端口netstat -tunlp# 運(yùn)行結(jié)果如下, docker run命令, 會(huì)返回一個(gè)容器id [harry@iZ8vbbxxx60rq3uZ ~]$ sudo docker run -d -p 80:80 nginx c526cbb32432532be79218480fba837a0e88a2e9756de510fa19b10e3236500f# 此時(shí)可以訪問(wèn)宿主機(jī)的80端口, 查看到容器內(nèi)的80端口的應(yīng)用是什么了 # 查看正在運(yùn)行的容器 sudo docker ps[harry@iZ8vbbip4bq97z0o60rq3uZ ~]$ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c526cbb32432 nginx "/dock" 18 seconds ago Up 12 seconds 80/tcp, 0.0.0.0:80->80/tcp, :::80->80/tcp mystifying_ganguly# 可以嘗試停止容器 sudo docker stop 容器id # 停止具體的容器進(jìn)程 sudo docker stop c526cbb32432[harry@iZ8vbbixxx7z0o60rq3uZ ~]$ sudo docker stop c526cbb32432 c526cbb32432# [harry@iZ8vxxxz0o60rq3uZ ~]$ sudo docker start 3599e7f5d321 3599e7f5d3213.3 端口映射示意圖
四、docker生命周期
學(xué)習(xí)docker的核心要素、搞明白、鏡像image、容器!
4.1 詳細(xì)圖解:
五、徹底學(xué)明白, docker鏡像的原理
5.1 分層拉取鏡像
我們?cè)讷@取redis鏡像的時(shí)候, 發(fā)現(xiàn)是下載了多行信息, 最終又得到了一個(gè)完整的鏡像文件
[harry@iZ8vbbip4bq97z0o60rq3uZ ~]$ sudo docker pull redis Using default tag: latest latest: Pulling from library/redis a2abf6c4d29d: Already exists c7a4e4382001: Pull complete 4044b9ba67c9: Pull complete c8388a79482f: Pull complete 413c8bb60be2: Pull complete 1abfd3011519: Pull complete Digest: sha256:db485f2e245b5b3329fdc7eff4eb00f913e09d8feb9ca720788059fdc2ed8339 Status: Downloaded newer image for redis:latest docker.io/library/redis:latest5.2 利用docker獲取不同發(fā)行版鏡像
快速實(shí)踐, 使用docker, 來(lái)切換不同的發(fā)行版, 內(nèi)核使用的都是宿主機(jī)的內(nèi)核:
# 查看系統(tǒng)的兩大部分 宿主機(jī)Centos內(nèi)核+上層發(fā)行版 [harry@iZ8vbxxxx60rq3uZ ~]$ cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) [harry@iZ8vxxx7z0o60rq3uZ ~]$ [harry@iZ8vxxx4z0o60rq3uZ ~]$ uname -r 3.10.0-1160.59.1.el7.x86_64 # 利用docker獲取不同發(fā)行版鏡像 docker pull centos:7.8.2003docker pull ubuntu# 確認(rèn)當(dāng)前的宿主機(jī)發(fā)行版 [harry@iZ8xxx7z0o60rq3uZ ~]$ cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core)# 運(yùn)行centos7.8.2003發(fā)行版 # 運(yùn)行容器, 且進(jìn)入容器內(nèi) # 參數(shù) 解釋 # -i 交互式命令操作 # -t 開啟一個(gè)終端 # afb6fca791e0 鏡像的id # bash bash解釋器 [harry@iZ8vbbip4bq97z0o60rq3uZ ~]$ docker run -it afb6fca791e0 bash root@0o60rq3uZ: /# root@0o60rq3uZ: /# cat /etc/redhat-release CentOS Linux release 7.8.2003 (Core)# 想玩玩Ubuntu # 直接去獲取Ubuntu鏡像即可 [harry@iZ8vbbxxx0o60rq3uZ ~]$ sudo docker run -it ubuntu bash root@wqdf24s1e212131: /# root@wqdf24s1e212131: /# # 查看容器內(nèi)的發(fā)行版 root@wqdf24s1e212131: /# cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=20.4 DISTRIB.CODENAME=focal DISTRIB_DESCRIPTION="Ubuntu 20.04.2 LTS"圖解以上操作:
總結(jié):
1.一個(gè)完整的系統(tǒng), 是由linux的內(nèi)容+發(fā)行版, 才組成了一個(gè)可以使用的完整的系統(tǒng)
2.利用docker容器, 可以獲取不同的發(fā)型版鏡像, 然后基于該鏡像, 運(yùn)行出各種容器去使用
5.3 docker具體解決了什么問(wèn)題
一個(gè)工程師, 寫代碼, mysql, etcd, redis, elk 等等…在機(jī)器上, 直接安裝了這些工具, win mac
5.4 理解什么是docker鏡像
docker images搜索地址: https://hub.docker.com/_/centos?tab=tags&page=1&ordering=last_updated
1、一個(gè)完整的docker鏡像可以創(chuàng)建出docker容器的運(yùn)行, 例如一個(gè)centos:7.8.2003鏡像文件, 我們獲取的是centos7這個(gè)版本, 這個(gè)鏡像文件是不包含linux內(nèi)核的
[harry@iZ8xxxz0o60rq3uZ ~]$ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 605c77e624dd 3 months ago 141MB redis latest 7614ae9453d1 3 months ago 113MB centos 7 eeb6ee3f44bd 6 months ago 204MBdocker的架構(gòu), 鏡像就是一個(gè) [發(fā)行版] 的作用, 你需要準(zhǔn)備好一個(gè)linux內(nèi)核, 然后上層使用不同的 [發(fā)行版] 就好了, 這樣你就可以自由的使用各種版本系統(tǒng), 兼容多種環(huán)境。
5.5 Docker 鏡像的原理學(xué)習(xí)(一)
圖解注釋:
5.6 Docker 鏡像原理學(xué)習(xí)(二)
# 進(jìn)入到正在運(yùn)行的容器內(nèi)(nginx), 命令是 docker exec [harry@iZ8vbbixxxx0o60rq3uZ ~]$ sudo docker exec -it 3599e7f5d321 bash root@3599e7f5d321:/# root@3599e7f5d321:/# cat /etc/os-release PRETTY_NAME="Debian GNU/Linux 11 (bullseye)" NAME="Debian GNU/Linux" VERSION_ID="11" VERSION="11 (bullseye)" VERSION_CODENAME=bullseye ID=debian HOME_URL="https://www.debian.org/" SUPPORT_URL="https://www.debian.org/support" BUG_REPORT_URL="https://bugs.debian.org/" root@3599e7f5d321:/#5.7 Docker為什么分層鏡像
鏡像分享一大好處就是共享資源, 例如有多個(gè)鏡像都來(lái)自于同一個(gè)base鏡像, 那么在docker host只需要存儲(chǔ)一份base鏡像。
內(nèi)存里也只需要加載一份host, 即可為多個(gè)容器服務(wù)。
即使多個(gè)容器共享一個(gè)base鏡像, 某個(gè)容器修改了base鏡像的內(nèi)容, 例如修改/etc/下配置文件, 其他容器的/etc/下內(nèi)容是不會(huì)被修改的, 修改動(dòng)作只限制在某個(gè)容器內(nèi), 這就是容器的寫入時(shí)復(fù)制性特性(Copy-on-write)。
5.8 可寫的容器層
當(dāng)容器啟動(dòng)后, 一個(gè)新的可寫層被加載到鏡像的頂部, 這一層通常被稱為容器層, 容器層下的都稱為鏡像層。
所有容器的修改動(dòng)作, 都只會(huì)發(fā)生在容器層里, 只有容器層是可寫的, 其余鏡像層都是只讀的。
| 添加文件 | 在容器中創(chuàng)建文件時(shí), 新文件被添加到容器層中。 |
| 讀取文件 | 在容器中讀取某個(gè)文件時(shí), Docker會(huì)從上往下依次在各鏡像層中查找此文件。一旦找到, 立即將其復(fù)制到容器層, 然后打開并讀入內(nèi)存。 |
| 修改文件 | 在容器中修改已存在的文件時(shí), Docker會(huì)從上往下依次在各個(gè)鏡像層中查找此文件。一旦找到, 立即將其復(fù)制到容器層, 然后修改之。 |
| 刪除文件 | 在容器中刪除文件時(shí), Docker也是從上往下依次在鏡像層中查找此文件。找到后, 會(huì)在容器層中記錄下刪除操作。(只是記錄刪除操作) |
只有當(dāng)需要修改時(shí)才賦值一份數(shù)據(jù), 這種特性被稱作Copy-on-Write。可見, 容器層保存的鏡像變化的部分, 不會(huì)對(duì)鏡像本身進(jìn)行任何修改。
這樣就解釋了我們前面提出的問(wèn)題: 鏡像層記錄對(duì)鏡像的修改, 所有鏡像層都是只讀的, 不會(huì)被容器修改, 所以鏡像可以被多個(gè)容器共享。
六、Docker鏡像的實(shí)際使用學(xué)習(xí)
日常開發(fā)中, 需要安裝很多第三方工具, 比如etcd, kafka等
開發(fā)機(jī)器: mac, windows, 我又不想搞亂當(dāng)前機(jī)器的環(huán)境
mac裝一個(gè)nginx, 二進(jìn)制安裝, 編譯安裝, brew install nginx…
1.下載安裝docker工具
2.獲取該軟件的docker鏡像(你以后想要用的各種工具, 基本上都能夠搜索到合適的鏡像去用)
nginx鏡像docker pull nginx
3.運(yùn)行該鏡像, 然后就啟動(dòng)了一個(gè)容器, 這個(gè)nginx服務(wù)就運(yùn)行在容器中
4.停止容器, 刪除該鏡像, ok, 你的電腦上, 就好像沒有使用過(guò)nginx一樣
類似沙箱一樣的環(huán)境
基于鏡像的增、刪、改、查維護(hù)
6.1 獲取鏡像
6.1.1 從dockerhub獲取鏡像
6.1.2 本地鏡像導(dǎo)出、導(dǎo)入
6.1.3 從私有部署獲取鏡像
# 1.獲取鏡像, 鏡像與歐冠倉(cāng)庫(kù), 好比yum源一樣 # 默認(rèn)的docker倉(cāng)庫(kù), dockerhub, 有大量的優(yōu)質(zhì)鏡像, 以及用戶自己上傳的鏡像, centos容器中安裝 vim nginx ... 提交為鏡像, 上傳到dockerhubdocker search 鏡像名:tag # tag就是具體的標(biāo)題版本docker search centos# 查看本地的鏡像文件有哪些 [harry@iZ8vbbbq97z0o60rq3uZ ~]$ sudo docker images [harry@iZ8vbbbq97z0o60rq3uZ ~]$ sudo docker image ls# 下載docker鏡像 docker pull centos # 默認(rèn)的是 centos:latest docker pull centos:7.8.2003# 查看docker鏡像的存儲(chǔ)路徑 Docker Root Dir: /var/lib/docker[harry@iZ7z0o60rq3uZ ~]$ sudo ls /var/lib/docker/image/overlay2/imagedb/content/sha256/ -l total 44 -rw------- 1 root root 7656 Mar 29 20:40 605c77e624ddb75e6110f997c58876baa13f8754486b461117934b24a9dc3a85 -rw------- 1 root root 7700 Mar 29 21:34 7614ae9453d1d87e740a2056257a6de7135c84037c367e1fffa92ae922784631 -rw------- 1 root root 23304 Mar 23 14:51 e06fda0e7caa83f226f077d7f2b6a419c1a03e91af31ee7fe23a6482534fe146 -rw------- 1 root root 2754 Mar 27 19:10 eeb6ee3f44bd0b5103bb561b4c16bcb82328cfe5809ab675bb17ab3a16c517c9[harry@iZ8vo60rq3uZ ~]$ sudo cat /var/lib/docker/image/overlay2/imagedb/content/sha256/605c77e624ddb75e6110f997c58876baa13f8754486b461117934b24a9dc3a85# 該文件作用是 記錄 鏡像 和 容器 的配置關(guān)系 # 使用不同的鏡像, 生成容器 # -it 開啟一個(gè)交互式的終端 --rm 容器退出時(shí)刪除該容器 [harry@iZ897z0o60rq3uZ ~]$ sudo docker run -it --rm centos:7.8.2003 bash[root@dc1ef93a01be /]# cat /etc/redhat-release CentOS Linux release 7.8.2003 (Core)# 如何查看centos的標(biāo)簽信息 https://hub.docker.com/_/centos6.2 查看鏡像
[harry@iZ8vbq97z0o60rq3uZ ~]$ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE star7th/showdoc latest e06fda0e7caa 9 days ago 589MB nginx latest 605c77e624dd 3 months ago 141MB redis latest 7614ae9453d1 3 months ago 113MB centos 7 eeb6ee3f44bd 6 months ago 204MB centos 7.8.2003 afb6fca791e0 23 months ago 203MB# 查看具體的鏡像 [harry@iZ97z0o60rq3uZ ~]$ sudo docker images nginx [sudo] password for harry: REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 605c77e624dd 3 months ago 141MB# 可以指定具體tag [harry@iZ8v0o60rq3uZ ~]$ sudo docker images centos:7.8.2003 REPOSITORY TAG IMAGE ID CREATED SIZE centos 7.8.2003 afb6fca791e0 23 months ago 203MB# 只列出鏡像的id -q --quiet # 只列出id [harry@iZ8v60rq3uZ ~]$ sudo docker images -q e06fda0e7caa e06fda0e7caa 605c77e624dd 7614ae9453d1 eeb6ee3f44bd afb6fca791e0# 格式化顯示鏡像 # 這是docker的模板語(yǔ)言, --format [harry@iZ8bq90rq3uZ ~]$ sudo docker images --format "{{.ID}}--{{.Repository}}" e06fda0e7caa--star7th/showdoc e06fda0e7caa--registry.cn-shenzhen.aliyuncs.com/star7th/showdoc 605c77e624dd--nginx 7614ae9453d1--redis eeb6ee3f44bd--centos afb6fca791e0--centos# 以表格形式顯示, 美化 sudo docker images --format "table{{.ID}}\t{{.Repository}}\t{{.Tag}}" [harry@iZ8v60rq3uZ ~]$ sudo docker images --format "table{{.ID}}\t{{.Repository}}\t{{.Tag}}" IMAGE ID REPOSITORY TAG e06fda0e7caa star7th/showdoc latest e06fda0e7caa registry.cn-shenzhen.aliyuncs.com/star7th/showdoc latest 605c77e624dd nginx latest 7614ae9453d1 redis latest eeb6ee3f44bd centos 7 afb6fca791e0 centos 7.8.2003# 搜索鏡像 # docker search 鏡像名 [harry@iZ87z0o60rq3uZ ~]$ sudo docker search centos NAME DESCRIPTION STARS OFFICIAL AUTOMATED centos The official build of CentOS. 7082 [OK] centos/systemd systemd enabled base container. 107 [OK] centos/mysql-57-centos7 MySQL 5.7 SQL database server 926.3 刪除鏡像
[harry@iZ8vbbip4bq60rq3uZ ~]$ curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io docker version >= 1.12 {"registry-mirrors": ["http://f1361db2.m.daocloud.io"] } Success. You need to restart docker to take effect: sudo systemctl restart docker [harry@iZ8vbbo60rq3uZ ~]$ sudo systemctl restart docker # 下載 docker pull hello-world# 根據(jù)鏡像的 id, 名字, 摘要 docker rmi hello-world [harry@iZ8vb97z0o60rq3uZ ~]$ sudo docker rmi hello-world Untagged: hello-world:latest Untagged: hello-world@sha256:bfea6278a0a267fad2634554f4f0c6f31981eea41c553fdf5a83e95a41d40c38 Deleted: sha256:feb5d9fea6a5e9606aa995e879d862b825965ba48de054caab5ef356dc6b3412 Deleted: sha256:e07ee1baac5fae6a26f30cabfe54a36d3402f96afda318fe0a96cec4ca393359# Error response from daemon: conflict: unable to remove repository reference "hello-world" (must force) - container e2970e766c01 is using its referenced image feb5d9fea6a5 如果出現(xiàn)這個(gè)錯(cuò)誤, 則先執(zhí)行下面的命令# 刪除容器記錄 docker rm 容器id [harry@iZ8vb7z0o60rq3uZ ~]$ sudo docker rm e2970e766c01# 指定id的前三位即可 docker rmi d11?
6.4 鏡像管理
[harry@iZ8vbb0o60rq3uZ ~]$ sudo docker images -aq e06fda0e7caa e06fda0e7caa 605c77e624dd 7614ae9453d1 eeb6ee3f44bd afb6fca791e0# 批量刪除鏡像的用法, rm # 批量刪除鏡像, 慎用 sudo docker rmi `docker images -aq`# 批量刪除容器 sudo docker rm `docker ps -aq`# 導(dǎo)出鏡像 # 比如默認(rèn)運(yùn)行的centos鏡像, 不提供vim功能, 運(yùn)行該容器后, 在容器內(nèi)安裝vim # 然后提交該鏡像, 再導(dǎo)出該鏡像為壓縮文件, 可以發(fā)給其他人用 # 放在容器管理篇學(xué)習(xí) docker commit# 導(dǎo)出鏡像的命令 [root@iZ8vbb0rq3uZ ~]$ sudo docker image save centos:7.8.2003 > /opt/centos7.8.2003.tgz# 導(dǎo)入鏡像的命令 [root@iZ8v0o60rq3uZ ~]$ sudo docker image load -i /opt/centos7.8.2003.tgz fb82b029bea0: Loading layer [==================================================>] 211.1MB/211.1MB Loaded image: centos:7.8.2003# 查看鏡像詳細(xì)信息 # 查看docker服務(wù)的信息 docker info # 查看鏡像詳細(xì)信息 docker image inspect 鏡像id docker image inspect afb七、Docker容器管理
docker run 等于創(chuàng)建+啟動(dòng)
docker run 鏡像名, 如果鏡像不存在本地, 則會(huì)在線去下載該鏡像
**注意: 容器內(nèi)的進(jìn)程必須處于前臺(tái)運(yùn)行, 否則容器就會(huì)直接退出,**自己部署一個(gè)容器運(yùn)行, 命令不得后臺(tái)運(yùn)行, 前臺(tái)運(yùn)行即可
如果容器內(nèi), 什么事兒也沒做, 容器也會(huì)掛掉。 容器內(nèi), 必須有一個(gè)進(jìn)程在前臺(tái)進(jìn)行
我們運(yùn)行nginx基礎(chǔ)鏡像, 沒有運(yùn)行任何程序, 因此容器直接掛掉
# 運(yùn)行容器的玩法 # 1.運(yùn)行一個(gè)掛掉的容器 (從錯(cuò)誤師范來(lái)學(xué)docker容器) docker run centos:7.8.2003 這個(gè)寫法, 會(huì)產(chǎn)生多個(gè)獨(dú)立的容器記錄, 且容器內(nèi)沒有程序在跑, 因此掛了 [harry@iZ8vz0o60rq3uZ ~]$ sudo docker run afb6fca791e0 [harry@iZ8vz0o60rq3uZ ~]$ sudo docker run afb6fca791e0 [harry@iZ8vz0o60rq3uZ ~]$ sudo docker run afb6fca791e0 [harry@iZ8vz0o60rq3uZ ~]$ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 40003a3f5c7e afb6fca791e0 "/bin/bash" 14 seconds ago Exited (0) 10 seconds ago sleepy_moore e7f13b99ff15 afb6fca791e0 "/bin/bash" 21 seconds ago Exited (0) 16 seconds ago happy_newton 7a618ef8376d afb6fca791e0 "/bin/bash" 29 seconds ago Exited (0) 24 seconds ago practical_torvalds# 2.運(yùn)行容器, 且進(jìn)入容器內(nèi), 且在容器內(nèi)執(zhí)行某個(gè)命令 [harry@iZ8vbbip4b0rq3uZ ~]$ sudo docker run -it centos:7.8.2003 sh sh-4.2# sh-4.2# # 3.開啟一個(gè)容器, 讓它幫你運(yùn)行某個(gè)程序, 屬于前臺(tái)運(yùn)行, 會(huì)卡住一個(gè)終端 [harry@iZ8vbbi3uZ ~]$ sudo docker run centos:7.8.2003 ping baidu.com 64 bytes from 220.181.38.251 (220.181.38.251): icmp_seq=1 ttl=52 time=7.81 ms 64 bytes from 220.181.38.251 (220.181.38.251): icmp_seq=2 ttl=52 time=7.76 ms# 4.運(yùn)行一個(gè)活著的容器, docker ps 可以看到的容器 # -d 參數(shù), 讓容器在后臺(tái)跑著 (針對(duì)宿主機(jī)而言) # 返回容器id [harry@iZ8vbbio60rq3uZ ~]$ sudo docker run -d centos:7.8.2003 ping baidu.com e346320e4740b47025dd97bc7c511a02f23480429114d048935af08199798c02# 5.豐富docker運(yùn)行的參數(shù) # -d 后臺(tái)運(yùn)行 # --rm 容器掛掉后自動(dòng)被刪除 # --name 給容器起個(gè)名字[harry@iZ8vb0rq3uZ ~]$ sudo docker run -d --rm --name pythontest centos:7.8.2003 ping baidu.com bdd9e13fd341f0c548260dfbfd90fb7cd32e3bd0b532952faccd0da7c839e9d9 [harry@iZ8vb0oq3uZ ~]$ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bdd9e13fd341 centos:7.8.2003 "ping baidu.com" 18 seconds ago Up 15 seconds pythontest# 6.查看容器日志的玩法, 刷新日志 # -f 實(shí)時(shí)刷新日志 [harry@iZ8o60rq3uZ ~]$ sudo docker logs 容器id [harry@iZ8o60rq3uZ ~]$ sudo docker logs -f 容器id [harry@iZ8o60rq3uZ ~]$ sudo docker logs -f 容器id | tail -5# 7.進(jìn)入正在運(yùn)行的容器空間內(nèi) # exec指令用于進(jìn)入容器空間內(nèi) [harry@iZ8vbbz0o60rq3uZ ~]$ sudo docker exec -it 64d2af1f679e bash [root@64d2af1f679e /]# # 8.查看容器的詳細(xì)信息, 用于高級(jí)調(diào)試 [harry@iZ8vbbi0o60rq3uZ ~]$ sudo docker container inspect 容器id# 9.容器的端口映射 # 后臺(tái)運(yùn)行nginx容器, 且起個(gè)名字, 且端口映射宿主機(jī)的777端口, 訪問(wèn)到容器內(nèi)的80端口 [harry@iZ8v0rq3uZ ~]$ sudo docker run -d --name harry_nginx -p 777:80 nginx # 查看容器 [harry@iZ0o60rq3uZ ~]$ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 73d306b1b3bf nginx "/docker-entrypoint.…"48 seconds ago Up 41 seconds 0.0.0.0:777->80/tcp, :::777->80/tcp harry_nginx# 9.1 查看容器的端口轉(zhuǎn)發(fā)情況 docker port 容器id [harry@iZ8v0o60rq3uZ ~]$ sudo docker port 73d306b1b3bf 80/tcp -> 0.0.0.0:777 80/tcp -> :::777# 隨機(jī)端口映射 -P 隨機(jī)訪問(wèn)一個(gè)宿主機(jī)的空閑端口, 映射到容器內(nèi)打開的端口 [harry@iZ8v0rq3uZ ~]$ sudo docker run -d --name harry_nginx -P nginx# 10.容器的提交 # 運(yùn)行基礎(chǔ)的centos:7.8.2003, 在容器內(nèi)安裝vim, 然后提交新的鏡像 # 新的鏡像, 再運(yùn)行出的容器, 默認(rèn)就攜帶vim了 [harry@iZ8vbbip4o60rq3uZ ~]$ sudo docker run -it centos:7.8.2003 bash [root@17773e3413fc /]# yum install vim# 提交容器 docker commit 容器id 新的鏡像名 [harry@iZ8vo60rq3uZ ~]$ sudo docker commit 17773e3413fc harry88995/centos-vim-7.8.2003 # 查看容器是否有提交的容器 [harry@iZ87s60rq3uZ ~]$ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE harry88995/centos-vim-7.8.2003 latest fccbf515c086 11 seconds ago 419MB # 運(yùn)行提交的新容器, 看下是否可以使用vim了~ [harry@iZ8vb7z0oswZ ~]$ sudo docker run -it harry88995/centos-vim-7.8.2003 bash [root@864c47af69c4 /]# vim hello.txt [root@864c47af69c4 /]# cat hello.txt Hello world! Good bye!八、Dockerfile構(gòu)建與使用
鏡像時(shí)多層存儲(chǔ), 每一層在前一層的基礎(chǔ)上進(jìn)行修改;
容器也是多層存儲(chǔ), 以鏡像為基礎(chǔ)層, 在其基礎(chǔ)上加一層作為容器運(yùn)行時(shí)的存儲(chǔ)層。
剛才說(shuō)了, 創(chuàng)建鏡像的兩個(gè)方法
- 手動(dòng)修改容器內(nèi)容, 然后docker commit 提交容器為新的鏡像
- 通過(guò)在dockerfile中定義一系列的命令和參數(shù)構(gòu)成的腳本, 然后這些命令應(yīng)用于基礎(chǔ)鏡像, 依次添加層, 最終生成一個(gè)新的鏡像。極大的簡(jiǎn)化了部署的工作。
官方提供的dockerfile實(shí)例
https://github.com/CentOS/CentOS-Dockerfiles
8.1 dockerfile主要組成部分:
基礎(chǔ)鏡像信息 FROM centos:7.9
制作鏡像操作指令 RUN yum install openssh-server -y
容器啟動(dòng)時(shí)執(zhí)行命令 CMD["/bin/bash"]
8.2 dockerfile指令
FROM 這個(gè)鏡像的媽媽是誰(shuí)? (指的是基礎(chǔ)鏡像)MAINTAINER 告訴別人, 誰(shuí)負(fù)責(zé)養(yǎng)它? (指定維護(hù)者信息, 可以沒有)RUN 你想讓它干啥 (在命令前面加上RUN即可)ADD 添加宿主機(jī)的文件到容器內(nèi), **還多一個(gè)解壓的功能**#RUN tar -zxf /opt/xx.tgz # 報(bào)錯(cuò) ! 該tgz文件不存在COPY 作用和ADD是一樣的, 都是拷貝宿主機(jī)的文件到容器內(nèi), COPY就是僅僅拷貝WORKDIR 我是cd, 今天剛化了妝 (設(shè)置當(dāng)前工作目錄)VOLUME 給它一個(gè)存放姓李的地方 (設(shè)置卷, 掛載主機(jī)目錄)EXPOSE 它要打開的門是啥 (指定對(duì)外的端口), 在容器內(nèi)暴露一個(gè)窗口, 端口 EXPORT 80CMD 奔跑吧, 兄弟! (指定容器啟動(dòng)后的要干的事情)VOLUME 與 EXPOSE 數(shù)據(jù)目錄與端口映射原理圖解:
8.3 dockerfile其他指令:
COPY 復(fù)制指令ENV 環(huán)境變量ENTRYPOINT 容器啟動(dòng)后執(zhí)行的命令8.4 dockerfile實(shí)踐
想自定義鏡像, 就得自己寫腳本, 也就是dockerfile了
需求, 通過(guò)dockerfile, 構(gòu)建nginx鏡像, 且運(yùn)行容器后, 生成的界面, 是"Hello, good bye!"
# 1. 創(chuàng)建Dockerfile, 注意文件名, 必須是這個(gè) [harry@iZ860rq3uZ learn_docker]$ pwd /home/harry/learn_docker [harry@iZ860rq3uZ learn_docker]$ cat Dockerfile FROM nginx RUN echo '<meta charset=utf8>Hello, good bye!' > /usr/share/nginx/html/index.html [harry@iZ860rq3uZ learn_docker]$# 2. 構(gòu)建dockerfile docker build . [harry@iZ860rq3uZ learn_docker]$ sudo docker build . Sending build context to Docker daemon 2.048kB Step 1/2 : FROM nginx---> 605c77e624dd Step 2/2 : RUN echo '<meta charset=utf8>Hello, good bye!' > /usr/share/nginx/html/index.html---> Running in 9652b79e621a Removing intermediate container 9652b79e621a---> fc6bf2cfb402 Successfully built fc6bf2cfb402 [harry@iZ860rq3uZ learn_docker]$ chmod +x Dockerfile # 3. 修改鏡像名 [harry@iZ8vb learn_docker]$ sudo docker tag fc6bf2cfb402 my_nginx# 構(gòu)建出的鏡像如下 [harry@iZ83u learn_docker]$ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE my_nginx latest fc6bf2cfb402 2 minutes ago 141MB# 4. 運(yùn)行該鏡像 sudo docker run -d -p 777:80 my_nginx [harry@iZ8vbbiuZ learn_docker]$ sudo docker run -d -p 777:80 my_nginx 993f992a96cefb785a83487d3fd5d292d373546ddbc1a953d4313ce448588a4b# 4. 查看宿主機(jī)的777端口 http://39.101.240.154:777/ Hello, good bye!如下指令該怎么用?
# COPY copy harry.py /home/# 支持多個(gè)文件, 以及通配符形式賦復(fù)制, 語(yǔ)法要滿足Golang的filepath.Match copy harry* /tmp/cc?.txt. /home/# ADD ADD harry.tgz /home/ RUN linux命令 (XXX修改命令)# CMD在容器內(nèi)運(yùn)行某個(gè)指令, 啟動(dòng)程序 # 該鏡像在運(yùn)行容器實(shí)例的時(shí)候, 執(zhí)行的具體參數(shù)是什么CMD ["參數(shù)1","參數(shù)2"]CMD ["/bin/bash"]# 該容器運(yùn)行時(shí), 執(zhí)行的命令 # 等同于命令行的直接操作 docker run -it centos cat /etc/os-release CMD ["cat", "/etc/os-release"]# CMD 有關(guān)啟動(dòng)程序的坑!把宿主機(jī)安裝, 啟動(dòng)nginx的理念放入dockerfile
8.5 ENTRYPOINT和CMD的玩法
作用和cmd一樣, 都是在指定容器啟動(dòng)程序以及參數(shù)。當(dāng)指定了 ENTRYPOINT 之后, CMD指令的語(yǔ)義就有了變化, 而是把CMD的內(nèi)容當(dāng)做參數(shù)傳遞給 ENTRYPOINT 指令。CMD xxx ENTRYPOINT xxx# 1.準(zhǔn)備一個(gè)Dockerfile FROM centos:7.8.2003 RUN rpm --rebuilddb && yum install epel-release -y RUN rpm --rebuilddb && yum install curl -y CMD ["curl","-s","http://ipinfo.io/ip"]# 用法如下 docker run my_centos curl -s http://ipinfo.io/ip # docker run centos_curl# 2.構(gòu)建鏡像 sudo docker buld .# 3.查看結(jié)果 Successfully built 66f71c370c5a# 4.檢查鏡像 [harry@iZ8vbq3uZ learn_docker]$ sudo docker tag 66f71c370c5a centos_curl [harry@iZ8vbq3uZ learn_docker]$ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos_curl latest 66f71c370c5a 2 minutes ago 537MB# 5.運(yùn)行鏡像, 生成容器記錄, 沒有前臺(tái)運(yùn)行, 因此立即掛了 [harry@iZ8vbbip4buZ learn_docker]$ sudo docker run centos_curl 39.101.240.154[harry@iZ8vbbip4buZ learn_docker]$ # 6.上述運(yùn)行準(zhǔn)確, 但是我想再傳入一個(gè)參數(shù), 該怎么辦 # 發(fā)現(xiàn)是無(wú)法直接傳入?yún)?shù)的, 該形式是覆蓋鏡像中的CMD # 就好比把docker鏡像, 當(dāng)做一個(gè)環(huán)境, 去執(zhí)行后面的命令 [harry@iZ8vbbip4buZ learn_docker]$ sudo docker run centos_curl pwd / [harry@iZ8vbbip4buZ learn_docker]$ sudo docker run centos_curl -I docker: Error response from daemon: failed to create shim: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "-I": executable file not found in $PATH: unknown.# 7.想要正確的給容器傳入一個(gè) -I 參數(shù), 該怎么辦? # 希望容器內(nèi)能正確完成, 這個(gè)命令的執(zhí)行 curl -s http://ipinfo.io/ip -I# 8.解決辦法1 # 給容器傳入新的, 完整的命令 # 這是一個(gè)投機(jī)取巧的辦法, 不合適 [harry@iZ8vbbip4buZ learn_docker]$ sudo docker run centos_curl curl -s http://ipinfo.io/ip -I HTTP/1.1 200 OK access-control-allow-origin: * content-type: text/html; charset=utf-8 content-length: 14 date: Thu, 31 Mar 2022 01:47:27 GMT x-envoy-upstream-service-time: 1 Via: 1.1 google# 9.正確的姿勢(shì)應(yīng)該是使用 ENTRYPOINT # 修改Dockerfile如下 FROM centos:7.8.2003 RUN rpm --rebuilddb && yum install epel-release -y RUN rpm --rebuilddb && yum install curl -y ENTRYPOINT ["curl","-s","http://ipinfo.io/ip"]# 10.重新構(gòu)建鏡像 sudo docker build .# 11.重新運(yùn)行該鏡像, 看結(jié)果, 以及傳入新的參數(shù) [harry@iZ8vbbiZ learn_docker]$ sudo docker tag d7de8a9749dd centos_curl_new# 此時(shí)發(fā)現(xiàn), 傳入的CMD指令, 當(dāng)做了ENTRYPOINT的參數(shù) # 其實(shí)容器內(nèi), 執(zhí)行的完整命令是: curl -s http://ipinfo.io/ip -I [harry@iZ8vbbiZ learn_docker]$ sudo docker run centos_curl_new -I HTTP/1.1 200 OK access-control-allow-origin: * content-type: text/html; charset=utf-8 content-length: 14 date: Thu, 31 Mar 2022 02:02:37 GMT x-envoy-upstream-service-time: 1 Via: 1.1 google8.6 ARG和ENV指令
設(shè)置環(huán)境變量
容器1 nginx
容器2 php-fpm
容器3 mysql
dockerfile 腳本, shell腳本ENV NAME="harry" ENV AGE="18" ENV MYSQL_VERSION=5.6后續(xù)所有的操作, 通過(guò) $NAME 可以直接獲取變量值了, 維護(hù)dockerfile腳本更友好, 方便使用 ADD COPY EXPOSEARG和ENV一樣, 設(shè)置環(huán)境變量 區(qū)別在于ENV 無(wú)論是在鏡像構(gòu)建時(shí), 還是容器運(yùn)行, 該變量都可以使用 ARG只是用于構(gòu)建鏡像需要設(shè)置的變量, 容器運(yùn)行時(shí)就消失了8.7 VOLUME
容器在運(yùn)行時(shí), 應(yīng)該保證在存儲(chǔ)層不寫入任何數(shù)據(jù), 運(yùn)行在容器內(nèi)產(chǎn)生的數(shù)據(jù), 我們推薦十掛載, 寫入到宿主機(jī)上, 進(jìn)行維護(hù)。
# mount /mnt 掛載VOLUME /data # 將容器內(nèi)的/data文件夾, 在容器運(yùn)行時(shí), 該目錄自動(dòng)掛載為匿名卷, 任何向該目錄中寫入數(shù)據(jù)的操作, 都不會(huì)被容器記錄, 保證的容器存儲(chǔ)層無(wú)狀態(tài)理念# Dockerfile1 FROM centos MAINTAINER harry VOLUME ["/data1","/data2"]# 該容器運(yùn)行的時(shí)候, 這2個(gè)目錄自動(dòng)和宿主機(jī)的目錄做好映射關(guān)系 sudo docker build . # 運(yùn)行該鏡像 sudo docker run b18be2a2c940 # 查看生成的容器信息 [harry@iZ8vbbip4bq97z0o60rq3uZ learn_docker]$ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE <none> <none> b18be2a2c940 11 seconds ago 203MB# docker inspect命令查看 docker inspect 8f2b0de0df41"Volumes": {"/data1": {},"/data2": {}},"Mounts": [{"Type": "volume","Name": "a1bdf01b92de0684f03b49023778a0c026e40ee32ccec285e9c46bacd29ebaee","Source": "/var/lib/docker/volumes/a1bdf01b92de0684f03b49023778a0c026e40ee32ccec285e9c46bacd29ebaee/_data","Destination": "/data1","Driver": "local","Mode": "","RW": true,"Propagation": ""},{"Type": "volume","Name": "1429e5198d7bb297ee3ded977a4cae6ab63312950ecb3d2a76bec7b814944f02","Source": "/var/lib/docker/volumes/1429e5198d7bb297ee3ded977a4cae6ab63312950ecb3d2a76bec7b814944f02/_data","Destination": "/data2","Driver": "local","Mode": "","RW": true,"Propagation": ""}],1.容器數(shù)據(jù)掛載的方式, 通過(guò)dockerfile, 指定VOLUME目錄
2.通過(guò)docker run -v 參數(shù), 直接設(shè)置需要映射掛載的目錄
8.8 EXPOSE
指定容器運(yùn)行時(shí)對(duì)外提供的端口服務(wù),
-
幫助使用該鏡像的人, 快速理解該容器的一個(gè)端口業(yè)務(wù)
- docker port 容器 docker run -p 宿主機(jī)端口:容器端口 docker run -P # 作用是隨機(jī)宿主機(jī)端口:容器內(nèi)端口
8.9 WORKDIR
用在dockerfile中, 目錄的切換, 更換工作目錄
WORKDIR /opt8.10 USER
用于改變環(huán)境, 用于切換用戶
USER root USER harry十、構(gòu)建一個(gè)網(wǎng)站鏡像
1.nginx, 修改首頁(yè)內(nèi)容, html網(wǎng)站就跑起來(lái)了, web server , 提供web服務(wù), 提供代理轉(zhuǎn)發(fā), 提供網(wǎng)關(guān), 限流托等 …apache
2.web framework, web框架, 一般由開發(fā), 通過(guò)某個(gè)開發(fā)語(yǔ)言, 基于某個(gè)web框架, 自己去開發(fā)一個(gè)web站點(diǎn), python, diango框架
1.用python語(yǔ)言, 基于flask wen框架, 開發(fā)一個(gè)自己的網(wǎng)站, 寫了一個(gè)后端的網(wǎng)站代碼
2.開發(fā)dockerfile, 部署該代碼, 生成鏡像
3.其他人基于該鏡像, docker run就可以在電腦跑起來(lái)這個(gè)網(wǎng)站
10.1 部署全流程
# 1.在宿主機(jī)下, 準(zhǔn)備一個(gè)目錄, 準(zhǔn)備好dockerfile, 你的代碼 # 寫一個(gè)flask的python代碼 [harry@iZ8vbbip4bq9q3uZ learn_docker]$ vim harry_flask.py [harry@iZ8vbbip4bq9q3uZ learn_docker]cat harry_flask.py # coding:utf8 from flask import Flask app = Flask(__name__) @app.route('/hello') def hell():return "hello docker, i am harry."if __name__ == "__main__":app.run(host='0.0.0.0', post=777)# 2.編寫dockerfile touch Dockerfile# 3.檢查代碼文件環(huán)境, 以及內(nèi)容 [harry@iZ8vbbip4uZ learn_docker]$ ls Dockerfile harry_flask.py [harry@iZ8vbbip4uZ learn_docker]$ cat Dockerfile FROM centos:7.8.2003 RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo; RUN curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo; RUN yum makecache fast; RUN yum install python3-devel python3-pip -y RUN pip3 install -i https://pypi.douban.com/simple flask COPY harry_flask.py /opt WORKDIR /opt EXPOSE 777 CMD ["python3","harry_flask.py"] [harry@iZ8vbbip4uZ learn_docker]$# 4.構(gòu)建鏡像 # --no-cache 不用緩存 sudo docker build --no-cache -t 'harry777/my_flask_web' . # 最后的結(jié)果類似如下, 才是正確 Removing intermediate container e8e9da66a65d---> b4ba1cb087a9 Successfully built b4ba1cb087a9 Successfully tagged harry777/my_flask_web:latest[harry@iZ8vuZ learn_docker]$ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE harry777/my_flask_web latest b4ba1cb087a9 36 seconds ago 715MB# 5.運(yùn)行鏡像, 生成容器 docker run -d --name my_flask_web -p 777:777 harry777/my_flask_web # 6.訪問(wèn)宿主機(jī), 看容器內(nèi)的flask web 網(wǎng)頁(yè) http://39.101.240.154:777/hello hello docker, i am harry.# 7.如何修改網(wǎng)站的內(nèi)容, 這個(gè)程序時(shí)跑在容器里了10.2 如何修改該網(wǎng)站的內(nèi)容
1.修改宿主機(jī)的代碼, 以及Dockerfile, 重建應(yīng)用
2.你可以進(jìn)入到以及運(yùn)行的容器內(nèi), 重啟容器即可
# 1.進(jìn)入容器 docker exec -it 容器id bash# 2.修改容器內(nèi)的程序 vim harry_flask.py# 3.退出容器, 重啟容器 exit docker restart 容器id docker ps # 看下是否存活10.3 再次強(qiáng)調(diào)docker的好處, 用法
比如安裝一個(gè)etcd, nacos, 都是比較復(fù)雜的一些軟件
需要依賴于go語(yǔ)言環(huán)境, 比如需要依賴于java環(huán)境, 在自己的機(jī)器上安裝好對(duì)應(yīng)的開發(fā)環(huán)境, 以及對(duì)應(yīng)的版本, 以及各種依賴
tomcat, jdk環(huán)境
當(dāng)你有了docker
docker pull tomcat # 這些主流的鏡像都是可以直接找到, 并且該鏡像中, 就已經(jīng)打包好了java環(huán)境
docker pull nacos # 打包好了各種環(huán)境依賴
docker run tomcat xxx … # 直接就可以訪問(wèn)tomcat了
十一、總結(jié)
容器是docker的核心概念, 容器是一個(gè)或者一組應(yīng)用, 它的運(yùn)行狀態(tài)如下:
- docker利用容器運(yùn)行應(yīng)用程序
- 容器是鏡像的運(yùn)行實(shí)例, 可以被run、start、stop、rm
- 每個(gè)容器都是相互隔離的, 保證平臺(tái)安全
- 容器可以看做一個(gè)簡(jiǎn)易版Linux環(huán)境(有root權(quán)限、進(jìn)程、用戶空間、網(wǎng)絡(luò))
- 鏡像是只讀的, 容器在啟動(dòng)的時(shí)候創(chuàng)建一層可寫層。
dockerfile面向開發(fā), docker image 作為交付標(biāo)準(zhǔn), docker container涉及部署和運(yùn)維, 三者結(jié)合起來(lái)完成docker體系。
上圖可以理解
FROM centos:7.8.2003 選擇基礎(chǔ)鏡像 ADD run.sh 添加文件進(jìn)鏡像, 這一層鏡像只有一個(gè)內(nèi)容, 就是這個(gè)文件 VOLUME /data 設(shè)定存儲(chǔ)目錄, 并未添加文件, 只是更新了鏡像的json文件, 便于啟動(dòng)的時(shí)候讀取該層信息 CMD ["./run.sh"] 更新json文件, 設(shè)定程序入口docker容器管理總結(jié)
# 運(yùn)行容器, 且進(jìn)入容器內(nèi) docker run -it ubuntu bash# 容器運(yùn)行web程序 # 注意端口的使用, 數(shù)字大一點(diǎn), 8000以后開始使用 docker run --name my_nginx_9000 -d --restart=always -p 9000:80 nginx# docker run 鏡像id 這是前臺(tái)運(yùn)行容器# 查看容器內(nèi)日志, 實(shí)時(shí)刷新 docker logs -f # 查看運(yùn)行時(shí), 以及掛掉的日志 docker ps 在運(yùn)行的容器 #等同于 docker container lsdocker ps -a 掛掉以及活著的容器 docker container ls -a# 停止啟動(dòng) docker start docker stop# 進(jìn)入容器內(nèi) docker exec -it 容器id bash# 刪除容器 docker rm 容器id docker rm `docker ps -aq` # 強(qiáng)制殺死容器 docker rm -f 容器id# 查看容器進(jìn)行進(jìn)程信息 docker top 容器id# 查看容器內(nèi)資源 docker status 容器id# 查看容器的具體信息 docker inspect 容器id# 獲取容器內(nèi)的ip地址, 容器的格式化參數(shù) docker inspect 容器id | grep ip段 # 拿到容器內(nèi)ip docker inspect --format '{{.NetworkSettings.IPAddress}}' 容器iddocker run 啟動(dòng)容器的時(shí)候, docker后臺(tái)操作流程是
- 檢車本地是否有該鏡像, 沒有就下載
- 利用鏡像創(chuàng)建且啟動(dòng)一個(gè)容器
- 分配容器文件系統(tǒng), 在只讀的鏡像層掛載讀寫層
- 宿主機(jī)的網(wǎng)橋接口會(huì)分配一個(gè)虛擬接口到容器中
- 容器獲得地址池里的ip地址
- 執(zhí)行用戶指定的程序
- 若程序里沒有進(jìn)程在運(yùn)行, 容器執(zhí)行完畢后立即終止
總結(jié):
#mermaid-svg-hbQbZ9Mavy1zNfYD {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-hbQbZ9Mavy1zNfYD .error-icon{fill:#552222;}#mermaid-svg-hbQbZ9Mavy1zNfYD .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-hbQbZ9Mavy1zNfYD .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-hbQbZ9Mavy1zNfYD .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-hbQbZ9Mavy1zNfYD .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-hbQbZ9Mavy1zNfYD .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-hbQbZ9Mavy1zNfYD .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-hbQbZ9Mavy1zNfYD .marker{fill:#333333;stroke:#333333;}#mermaid-svg-hbQbZ9Mavy1zNfYD .marker.cross{stroke:#333333;}#mermaid-svg-hbQbZ9Mavy1zNfYD svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-hbQbZ9Mavy1zNfYD .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-hbQbZ9Mavy1zNfYD .cluster-label text{fill:#333;}#mermaid-svg-hbQbZ9Mavy1zNfYD .cluster-label span{color:#333;}#mermaid-svg-hbQbZ9Mavy1zNfYD .label text,#mermaid-svg-hbQbZ9Mavy1zNfYD span{fill:#333;color:#333;}#mermaid-svg-hbQbZ9Mavy1zNfYD .node rect,#mermaid-svg-hbQbZ9Mavy1zNfYD .node circle,#mermaid-svg-hbQbZ9Mavy1zNfYD .node ellipse,#mermaid-svg-hbQbZ9Mavy1zNfYD .node polygon,#mermaid-svg-hbQbZ9Mavy1zNfYD .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-hbQbZ9Mavy1zNfYD .node .label{text-align:center;}#mermaid-svg-hbQbZ9Mavy1zNfYD .node.clickable{cursor:pointer;}#mermaid-svg-hbQbZ9Mavy1zNfYD .arrowheadPath{fill:#333333;}#mermaid-svg-hbQbZ9Mavy1zNfYD .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-hbQbZ9Mavy1zNfYD .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-hbQbZ9Mavy1zNfYD .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-hbQbZ9Mavy1zNfYD .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-hbQbZ9Mavy1zNfYD .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-hbQbZ9Mavy1zNfYD .cluster text{fill:#333;}#mermaid-svg-hbQbZ9Mavy1zNfYD .cluster span{color:#333;}#mermaid-svg-hbQbZ9Mavy1zNfYD div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-hbQbZ9Mavy1zNfYD :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}docker什么是容器容器VS虛擬機(jī)docker優(yōu)點(diǎn)高效的利用系統(tǒng)資源更快啟動(dòng)時(shí)間一致性環(huán)境輕松交付,部署主流公司都在用docker核心組成安裝部署鏡像加速器生命周期UnionFS鏡像管理容器管理倉(cāng)庫(kù)管理dockerfile實(shí)踐構(gòu)建docker鏡像部署一個(gè)用于運(yùn)行你所需的容器環(huán)境相當(dāng)于一個(gè)腳本,通過(guò)dockerfile自己的命令,來(lái)構(gòu)建軟件依賴,文件依賴,存儲(chǔ)等等....指令合集FROM MAINTAINR RUN ADD WORKDIR VOLUME EXPOSE CMD ENTRYPOINT ENV USER 還有很多, 根據(jù)需要學(xué)習(xí)存儲(chǔ)、網(wǎng)絡(luò)、REST、API容器編排docker生產(chǎn)實(shí)踐文章就到這里, 喜歡的話點(diǎn)個(gè)關(guān)注和贊吧?~
總結(jié)
以上是生活随笔為你收集整理的Python3 - 深入学习Docker容器管理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C#读取Excel表格去掉空行
- 下一篇: 冯诺依曼计算机和现代,为什么现代计算机被