Python3 - 深入学习Docker容器管理
文章目錄
- 一、Docker簡介
- 1.1 為什么選擇docker?
- 1.1.1 docker更高效的利用系統資源
- 1.1.2 更快的啟動時間
- 1.1.3 持續交付和部署
- 1.1.4 更輕松的遷移
- 1.2 Docker能做什么?
- 1.3 Docker最核心的組件
- 二、Docker安裝部署
- 2.1 基礎環境配置
- 2.2 安裝docker
- 2.2.1 docker必須安裝在centos7平臺, 內核不低于3.10
- 2.2.2 開啟linux內核的流量轉發
- 2.2.3 重新加載內核參數
- 2.2.4 安裝docker-ce社區版
- 2.2.5 鏡像加速器
- 三、啟動第一個docker容器
- 3.1 docker流程示意圖
- 3.2 Docker運行nginx
- 3.3 端口映射示意圖
- 四、docker生命周期
- 4.1 詳細圖解:
- 五、徹底學明白, docker鏡像的原理
- 5.1 分層拉取鏡像
- 5.2 利用docker獲取不同發行版鏡像
- 5.3 docker具體解決了什么問題
- 5.4 理解什么是docker鏡像
- 5.5 Docker 鏡像的原理學習(一)
- 5.6 Docker 鏡像原理學習(二)
- 5.7 Docker為什么分層鏡像
- 5.8 可寫的容器層
- 六、Docker鏡像的實際使用學習
- 6.1 獲取鏡像
- 6.1.1 從dockerhub獲取鏡像
- 6.1.2 本地鏡像導出、導入
- 6.1.3 從私有部署獲取鏡像
- 6.2 查看鏡像
- 6.3 刪除鏡像
- 6.4 鏡像管理
- 七、Docker容器管理
- 八、Dockerfile構建與使用
- 8.1 dockerfile主要組成部分:
- 8.2 dockerfile指令
- 8.3 dockerfile其他指令:
- 8.4 dockerfile實踐
- 8.5 ENTRYPOINT和CMD的玩法
- 8.6 ARG和ENV指令
- 8.7 VOLUME
- 8.8 EXPOSE
- 8.9 WORKDIR
- 8.10 USER
- 十、構建一個網站鏡像
- 10.1 部署全流程
- 10.2 如何修改該網站的內容
- 10.3 再次強調docker的好處, 用法
- 十一、總結
- docker容器管理總結
- 文章就到這里, 喜歡的話點個關注和贊吧?~
學習目標:
本篇博文意在學習Docker原理, 深入理解docker容器管理, 鏡像管理, 學會自定義鏡像Dockerfile, 以及部署項目全流程, 靈活掌握Dockerfile關鍵字; 目標人群適合有一定的Python基礎和Linux基礎的人群。
篇幅較長, 大約需要10分鐘, 實踐大約需要4h, 大家根據自己的需要來學習~
聲明: 本篇博文為作者原創, 未經作者允許請勿轉載!
一、Docker簡介
1.1 為什么選擇docker?
1.1.1 docker更高效的利用系統資源
容器不需要進行硬件虛擬化以及進行一個完整操作系統的額外開銷, docker對系統資源的利用率更高, 無論是應用執行, 文件存儲, 還是在內存消耗等方面, 都比傳統的虛擬機更高效。因為一個同樣配置的主機, 可以運行處更多數量的容器實例。
1.1.2 更快的啟動時間
傳統的虛擬機啟動時間長, docker容器則是直接運行在宿主機的內核上, 無需啟動一個完整的操作系統, 因此可以達到秒級啟動, 大大解決開發, 測試, 部署的時間。
1.1.3 持續交付和部署
對于開發和運維人員, 最關心的環境部署遷移別處的問題, 利用docker可以定制鏡像, 以達到持續集成, 持續交付和部署。通過Dockerfile來進行鏡像構建, 系統集成測試, 運維進行環境部署。且Dockerfile可以使鏡像構建透明化, 方便技術團隊快速理解運行環境部署的流程。
1.1.4 更輕松的遷移
Docker可以在很多平臺上運行, 無論是物理機, 虛擬機, 云服務器等環境, 運行結果都是一致的。用于可以輕松將一個平臺的應用, 遷移到另外一個平臺, 而不用擔心環境的變化, 導致程序無法運行。
1.2 Docker能做什么?
- 可以把應用程序及運行依賴環境打包成鏡像, 作為交付介質, 在各環境中部署
- 可以將鏡像(image)啟動成為容器(container), 并且提供多容器的生命周期進行管理(啟、停、刪)
- container容器之間相互隔離, 且每個容器可以設置資源限額
- 提供輕量級虛擬化功能, 容器就是在宿主機中的一個個虛擬的空間, 彼此相互隔離, 完全獨立
1.3 Docker最核心的組件
-
image鏡像, 構建容器 (我們將程序運行所需的環境, 打包為鏡像文件)
-
Container, 容器 (你的應用程序, 就跑在容器中)
-
鏡像倉庫 (保存鏡像文件, 提供上傳, 下載鏡像) 作用好比github
-
Dockerfile, 將你部署項目的操作,寫成一個部署腳本, 這就是dockerfile, 且該腳本還能構建出鏡像文件
- FROM 定義基礎鏡像
- MAINTAINER 作者
- RUN 運行Linux命令
- ADD 添加文件/目錄
- ENV 環境變量
- CMD 運行進程
創建容器的過程
- 獲取鏡像, 如: docker pull centos, 從鏡像倉庫拉取
- 使用鏡像創建容器
- 分配文件系統, 掛載一個讀寫層, 在讀寫層加載鏡像
- 分配網絡/網橋接口, 創建一個網絡接口, 讓容器和宿主機通信
- 容器獲取IP地址
- 執行容器命令, 如: /bin/bash
- 反饋容器啟動結果
二、Docker安裝部署
提前準備好一個宿主機(VMware去創建一個linux機器, 然后安裝docker去使用)
2.1 基礎環境配置
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平臺, 內核不低于3.10
uname -r # 3.10.0-1160.59.1.el7.x86_64sudo yum -y upgrade # 更新yum源2.2.2 開啟linux內核的流量轉發
# 寫入 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 重新加載內核參數
modprobe br_netfilter # 如果下面的命令報錯, 先執行此條命令 sysctl -p /etc/sysctl.d/docker.conf要保持本地軟件源較新, 可以用阿里云yum源更新軟件
2.2.4 安裝docker-ce社區版
利用yum快速安裝docker
# 提前配置yum倉庫 # 1.阿里云自帶倉庫 2.阿里云提供的docker專屬repo倉庫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## 嘗試啟動docker2.2.5 鏡像加速器
使用docker受邀操作就是獲取鏡像文件, 默認下載是從Docker Hub下載, 網速很慢, 國內很多云服務商都提供了加速器服務, 阿里云加速器, Daocloud加速器, 靈雀云加速器等。
### 檢查是否有這個文件, 沒有就創建一個 ### vim /etc/docker/daemon.json ### 寫入 {"registry-mirrors": ["https://8xpk5wnt.mirror.aliyuncs.com"] }### 啟動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 ~]$三、啟動第一個docker容器
3.1 docker流程示意圖
# 1.獲取鏡像 # 2.運行鏡像, 生成容器, 你想要的容器, 就運行在容器中以往需求: Nginx web服務器, 運行出一個80端口的網站
# 在宿主機上, 運行nginx 1.開啟服務器 2.在服務器上安裝好運行nginx所需的依賴關系 3.安裝nginx yum install nginx -y 4.修改nginx配置文件 5.啟動nginx 6.客戶端去訪問nginx比較耗時~~如果讓你用docker運行nginx, 該怎么玩?
3.2 Docker運行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# 運行該nginx鏡像, 運行出具體的容器, 然后這個容器中就跑著一個nginx服務了 # 運行鏡像的命令, 參數如下 docker run 參數 鏡像的名字/id# -d 后臺運行容器 # -p 80:80 端口映射, 宿主機端口:容器內端口, 訪問宿主機端口也就訪問到容器內的端口 sudo docker run -d -p 80:80 nginx# 查看端口netstat -tunlp# 運行結果如下, docker run命令, 會返回一個容器id [harry@iZ8vbbxxx60rq3uZ ~]$ sudo docker run -d -p 80:80 nginx c526cbb32432532be79218480fba837a0e88a2e9756de510fa19b10e3236500f# 此時可以訪問宿主機的80端口, 查看到容器內的80端口的應用是什么了 # 查看正在運行的容器 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 # 停止具體的容器進程 sudo docker stop c526cbb32432[harry@iZ8vbbixxx7z0o60rq3uZ ~]$ sudo docker stop c526cbb32432 c526cbb32432# [harry@iZ8vxxxz0o60rq3uZ ~]$ sudo docker start 3599e7f5d321 3599e7f5d3213.3 端口映射示意圖
四、docker生命周期
學習docker的核心要素、搞明白、鏡像image、容器!
4.1 詳細圖解:
五、徹底學明白, docker鏡像的原理
5.1 分層拉取鏡像
我們在獲取redis鏡像的時候, 發現是下載了多行信息, 最終又得到了一個完整的鏡像文件
[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獲取不同發行版鏡像
快速實踐, 使用docker, 來切換不同的發行版, 內核使用的都是宿主機的內核:
# 查看系統的兩大部分 宿主機Centos內核+上層發行版 [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獲取不同發行版鏡像 docker pull centos:7.8.2003docker pull ubuntu# 確認當前的宿主機發行版 [harry@iZ8xxx7z0o60rq3uZ ~]$ cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core)# 運行centos7.8.2003發行版 # 運行容器, 且進入容器內 # 參數 解釋 # -i 交互式命令操作 # -t 開啟一個終端 # 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: /# # 查看容器內的發行版 root@wqdf24s1e212131: /# cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=20.4 DISTRIB.CODENAME=focal DISTRIB_DESCRIPTION="Ubuntu 20.04.2 LTS"圖解以上操作:
總結:
1.一個完整的系統, 是由linux的內容+發行版, 才組成了一個可以使用的完整的系統
2.利用docker容器, 可以獲取不同的發型版鏡像, 然后基于該鏡像, 運行出各種容器去使用
5.3 docker具體解決了什么問題
一個工程師, 寫代碼, mysql, etcd, redis, elk 等等…在機器上, 直接安裝了這些工具, win mac
5.4 理解什么是docker鏡像
docker images搜索地址: https://hub.docker.com/_/centos?tab=tags&page=1&ordering=last_updated
1、一個完整的docker鏡像可以創建出docker容器的運行, 例如一個centos:7.8.2003鏡像文件, 我們獲取的是centos7這個版本, 這個鏡像文件是不包含linux內核的
[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的架構, 鏡像就是一個 [發行版] 的作用, 你需要準備好一個linux內核, 然后上層使用不同的 [發行版] 就好了, 這樣你就可以自由的使用各種版本系統, 兼容多種環境。
5.5 Docker 鏡像的原理學習(一)
圖解注釋:
5.6 Docker 鏡像原理學習(二)
# 進入到正在運行的容器內(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為什么分層鏡像
鏡像分享一大好處就是共享資源, 例如有多個鏡像都來自于同一個base鏡像, 那么在docker host只需要存儲一份base鏡像。
內存里也只需要加載一份host, 即可為多個容器服務。
即使多個容器共享一個base鏡像, 某個容器修改了base鏡像的內容, 例如修改/etc/下配置文件, 其他容器的/etc/下內容是不會被修改的, 修改動作只限制在某個容器內, 這就是容器的寫入時復制性特性(Copy-on-write)。
5.8 可寫的容器層
當容器啟動后, 一個新的可寫層被加載到鏡像的頂部, 這一層通常被稱為容器層, 容器層下的都稱為鏡像層。
所有容器的修改動作, 都只會發生在容器層里, 只有容器層是可寫的, 其余鏡像層都是只讀的。
| 添加文件 | 在容器中創建文件時, 新文件被添加到容器層中。 |
| 讀取文件 | 在容器中讀取某個文件時, Docker會從上往下依次在各鏡像層中查找此文件。一旦找到, 立即將其復制到容器層, 然后打開并讀入內存。 |
| 修改文件 | 在容器中修改已存在的文件時, Docker會從上往下依次在各個鏡像層中查找此文件。一旦找到, 立即將其復制到容器層, 然后修改之。 |
| 刪除文件 | 在容器中刪除文件時, Docker也是從上往下依次在鏡像層中查找此文件。找到后, 會在容器層中記錄下刪除操作。(只是記錄刪除操作) |
只有當需要修改時才賦值一份數據, 這種特性被稱作Copy-on-Write??梢? 容器層保存的鏡像變化的部分, 不會對鏡像本身進行任何修改。
這樣就解釋了我們前面提出的問題: 鏡像層記錄對鏡像的修改, 所有鏡像層都是只讀的, 不會被容器修改, 所以鏡像可以被多個容器共享。
六、Docker鏡像的實際使用學習
日常開發中, 需要安裝很多第三方工具, 比如etcd, kafka等
開發機器: mac, windows, 我又不想搞亂當前機器的環境
mac裝一個nginx, 二進制安裝, 編譯安裝, brew install nginx…
1.下載安裝docker工具
2.獲取該軟件的docker鏡像(你以后想要用的各種工具, 基本上都能夠搜索到合適的鏡像去用)
nginx鏡像docker pull nginx
3.運行該鏡像, 然后就啟動了一個容器, 這個nginx服務就運行在容器中
4.停止容器, 刪除該鏡像, ok, 你的電腦上, 就好像沒有使用過nginx一樣
類似沙箱一樣的環境
基于鏡像的增、刪、改、查維護
6.1 獲取鏡像
6.1.1 從dockerhub獲取鏡像
6.1.2 本地鏡像導出、導入
6.1.3 從私有部署獲取鏡像
# 1.獲取鏡像, 鏡像與歐冠倉庫, 好比yum源一樣 # 默認的docker倉庫, dockerhub, 有大量的優質鏡像, 以及用戶自己上傳的鏡像, centos容器中安裝 vim nginx ... 提交為鏡像, 上傳到dockerhubdocker search 鏡像名:tag # tag就是具體的標題版本docker search centos# 查看本地的鏡像文件有哪些 [harry@iZ8vbbbq97z0o60rq3uZ ~]$ sudo docker images [harry@iZ8vbbbq97z0o60rq3uZ ~]$ sudo docker image ls# 下載docker鏡像 docker pull centos # 默認的是 centos:latest docker pull centos:7.8.2003# 查看docker鏡像的存儲路徑 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# 該文件作用是 記錄 鏡像 和 容器 的配置關系 # 使用不同的鏡像, 生成容器 # -it 開啟一個交互式的終端 --rm 容器退出時刪除該容器 [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的標簽信息 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的模板語言, --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# 根據鏡像的 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 如果出現這個錯誤, 則先執行下面的命令# 刪除容器記錄 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`# 導出鏡像 # 比如默認運行的centos鏡像, 不提供vim功能, 運行該容器后, 在容器內安裝vim # 然后提交該鏡像, 再導出該鏡像為壓縮文件, 可以發給其他人用 # 放在容器管理篇學習 docker commit# 導出鏡像的命令 [root@iZ8vbb0rq3uZ ~]$ sudo docker image save centos:7.8.2003 > /opt/centos7.8.2003.tgz# 導入鏡像的命令 [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# 查看鏡像詳細信息 # 查看docker服務的信息 docker info # 查看鏡像詳細信息 docker image inspect 鏡像id docker image inspect afb七、Docker容器管理
docker run 等于創建+啟動
docker run 鏡像名, 如果鏡像不存在本地, 則會在線去下載該鏡像
**注意: 容器內的進程必須處于前臺運行, 否則容器就會直接退出,**自己部署一個容器運行, 命令不得后臺運行, 前臺運行即可
如果容器內, 什么事兒也沒做, 容器也會掛掉。 容器內, 必須有一個進程在前臺進行
我們運行nginx基礎鏡像, 沒有運行任何程序, 因此容器直接掛掉
# 運行容器的玩法 # 1.運行一個掛掉的容器 (從錯誤師范來學docker容器) docker run centos:7.8.2003 這個寫法, 會產生多個獨立的容器記錄, 且容器內沒有程序在跑, 因此掛了 [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.運行容器, 且進入容器內, 且在容器內執行某個命令 [harry@iZ8vbbip4b0rq3uZ ~]$ sudo docker run -it centos:7.8.2003 sh sh-4.2# sh-4.2# # 3.開啟一個容器, 讓它幫你運行某個程序, 屬于前臺運行, 會卡住一個終端 [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.運行一個活著的容器, docker ps 可以看到的容器 # -d 參數, 讓容器在后臺跑著 (針對宿主機而言) # 返回容器id [harry@iZ8vbbio60rq3uZ ~]$ sudo docker run -d centos:7.8.2003 ping baidu.com e346320e4740b47025dd97bc7c511a02f23480429114d048935af08199798c02# 5.豐富docker運行的參數 # -d 后臺運行 # --rm 容器掛掉后自動被刪除 # --name 給容器起個名字[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 實時刷新日志 [harry@iZ8o60rq3uZ ~]$ sudo docker logs 容器id [harry@iZ8o60rq3uZ ~]$ sudo docker logs -f 容器id [harry@iZ8o60rq3uZ ~]$ sudo docker logs -f 容器id | tail -5# 7.進入正在運行的容器空間內 # exec指令用于進入容器空間內 [harry@iZ8vbbz0o60rq3uZ ~]$ sudo docker exec -it 64d2af1f679e bash [root@64d2af1f679e /]# # 8.查看容器的詳細信息, 用于高級調試 [harry@iZ8vbbi0o60rq3uZ ~]$ sudo docker container inspect 容器id# 9.容器的端口映射 # 后臺運行nginx容器, 且起個名字, 且端口映射宿主機的777端口, 訪問到容器內的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 查看容器的端口轉發情況 docker port 容器id [harry@iZ8v0o60rq3uZ ~]$ sudo docker port 73d306b1b3bf 80/tcp -> 0.0.0.0:777 80/tcp -> :::777# 隨機端口映射 -P 隨機訪問一個宿主機的空閑端口, 映射到容器內打開的端口 [harry@iZ8v0rq3uZ ~]$ sudo docker run -d --name harry_nginx -P nginx# 10.容器的提交 # 運行基礎的centos:7.8.2003, 在容器內安裝vim, 然后提交新的鏡像 # 新的鏡像, 再運行出的容器, 默認就攜帶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 # 運行提交的新容器, 看下是否可以使用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構建與使用
鏡像時多層存儲, 每一層在前一層的基礎上進行修改;
容器也是多層存儲, 以鏡像為基礎層, 在其基礎上加一層作為容器運行時的存儲層。
剛才說了, 創建鏡像的兩個方法
- 手動修改容器內容, 然后docker commit 提交容器為新的鏡像
- 通過在dockerfile中定義一系列的命令和參數構成的腳本, 然后這些命令應用于基礎鏡像, 依次添加層, 最終生成一個新的鏡像。極大的簡化了部署的工作。
官方提供的dockerfile實例
https://github.com/CentOS/CentOS-Dockerfiles
8.1 dockerfile主要組成部分:
基礎鏡像信息 FROM centos:7.9
制作鏡像操作指令 RUN yum install openssh-server -y
容器啟動時執行命令 CMD["/bin/bash"]
8.2 dockerfile指令
FROM 這個鏡像的媽媽是誰? (指的是基礎鏡像)MAINTAINER 告訴別人, 誰負責養它? (指定維護者信息, 可以沒有)RUN 你想讓它干啥 (在命令前面加上RUN即可)ADD 添加宿主機的文件到容器內, **還多一個解壓的功能**#RUN tar -zxf /opt/xx.tgz # 報錯 ! 該tgz文件不存在COPY 作用和ADD是一樣的, 都是拷貝宿主機的文件到容器內, COPY就是僅僅拷貝WORKDIR 我是cd, 今天剛化了妝 (設置當前工作目錄)VOLUME 給它一個存放姓李的地方 (設置卷, 掛載主機目錄)EXPOSE 它要打開的門是啥 (指定對外的端口), 在容器內暴露一個窗口, 端口 EXPORT 80CMD 奔跑吧, 兄弟! (指定容器啟動后的要干的事情)VOLUME 與 EXPOSE 數據目錄與端口映射原理圖解:
8.3 dockerfile其他指令:
COPY 復制指令ENV 環境變量ENTRYPOINT 容器啟動后執行的命令8.4 dockerfile實踐
想自定義鏡像, 就得自己寫腳本, 也就是dockerfile了
需求, 通過dockerfile, 構建nginx鏡像, 且運行容器后, 生成的界面, 是"Hello, good bye!"
# 1. 創建Dockerfile, 注意文件名, 必須是這個 [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. 構建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# 構建出的鏡像如下 [harry@iZ83u learn_docker]$ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE my_nginx latest fc6bf2cfb402 2 minutes ago 141MB# 4. 運行該鏡像 sudo docker run -d -p 777:80 my_nginx [harry@iZ8vbbiuZ learn_docker]$ sudo docker run -d -p 777:80 my_nginx 993f992a96cefb785a83487d3fd5d292d373546ddbc1a953d4313ce448588a4b# 4. 查看宿主機的777端口 http://39.101.240.154:777/ Hello, good bye!如下指令該怎么用?
# COPY copy harry.py /home/# 支持多個文件, 以及通配符形式賦復制, 語法要滿足Golang的filepath.Match copy harry* /tmp/cc?.txt. /home/# ADD ADD harry.tgz /home/ RUN linux命令 (XXX修改命令)# CMD在容器內運行某個指令, 啟動程序 # 該鏡像在運行容器實例的時候, 執行的具體參數是什么CMD ["參數1","參數2"]CMD ["/bin/bash"]# 該容器運行時, 執行的命令 # 等同于命令行的直接操作 docker run -it centos cat /etc/os-release CMD ["cat", "/etc/os-release"]# CMD 有關啟動程序的坑!把宿主機安裝, 啟動nginx的理念放入dockerfile
8.5 ENTRYPOINT和CMD的玩法
作用和cmd一樣, 都是在指定容器啟動程序以及參數。當指定了 ENTRYPOINT 之后, CMD指令的語義就有了變化, 而是把CMD的內容當做參數傳遞給 ENTRYPOINT 指令。CMD xxx ENTRYPOINT xxx# 1.準備一個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.構建鏡像 sudo docker buld .# 3.查看結果 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.運行鏡像, 生成容器記錄, 沒有前臺運行, 因此立即掛了 [harry@iZ8vbbip4buZ learn_docker]$ sudo docker run centos_curl 39.101.240.154[harry@iZ8vbbip4buZ learn_docker]$ # 6.上述運行準確, 但是我想再傳入一個參數, 該怎么辦 # 發現是無法直接傳入參數的, 該形式是覆蓋鏡像中的CMD # 就好比把docker鏡像, 當做一個環境, 去執行后面的命令 [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.想要正確的給容器傳入一個 -I 參數, 該怎么辦? # 希望容器內能正確完成, 這個命令的執行 curl -s http://ipinfo.io/ip -I# 8.解決辦法1 # 給容器傳入新的, 完整的命令 # 這是一個投機取巧的辦法, 不合適 [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.正確的姿勢應該是使用 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.重新構建鏡像 sudo docker build .# 11.重新運行該鏡像, 看結果, 以及傳入新的參數 [harry@iZ8vbbiZ learn_docker]$ sudo docker tag d7de8a9749dd centos_curl_new# 此時發現, 傳入的CMD指令, 當做了ENTRYPOINT的參數 # 其實容器內, 執行的完整命令是: 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指令
設置環境變量
容器1 nginx
容器2 php-fpm
容器3 mysql
dockerfile 腳本, shell腳本ENV NAME="harry" ENV AGE="18" ENV MYSQL_VERSION=5.6后續所有的操作, 通過 $NAME 可以直接獲取變量值了, 維護dockerfile腳本更友好, 方便使用 ADD COPY EXPOSEARG和ENV一樣, 設置環境變量 區別在于ENV 無論是在鏡像構建時, 還是容器運行, 該變量都可以使用 ARG只是用于構建鏡像需要設置的變量, 容器運行時就消失了8.7 VOLUME
容器在運行時, 應該保證在存儲層不寫入任何數據, 運行在容器內產生的數據, 我們推薦十掛載, 寫入到宿主機上, 進行維護。
# mount /mnt 掛載VOLUME /data # 將容器內的/data文件夾, 在容器運行時, 該目錄自動掛載為匿名卷, 任何向該目錄中寫入數據的操作, 都不會被容器記錄, 保證的容器存儲層無狀態理念# Dockerfile1 FROM centos MAINTAINER harry VOLUME ["/data1","/data2"]# 該容器運行的時候, 這2個目錄自動和宿主機的目錄做好映射關系 sudo docker build . # 運行該鏡像 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.容器數據掛載的方式, 通過dockerfile, 指定VOLUME目錄
2.通過docker run -v 參數, 直接設置需要映射掛載的目錄
8.8 EXPOSE
指定容器運行時對外提供的端口服務,
-
幫助使用該鏡像的人, 快速理解該容器的一個端口業務
- docker port 容器 docker run -p 宿主機端口:容器端口 docker run -P # 作用是隨機宿主機端口:容器內端口
8.9 WORKDIR
用在dockerfile中, 目錄的切換, 更換工作目錄
WORKDIR /opt8.10 USER
用于改變環境, 用于切換用戶
USER root USER harry十、構建一個網站鏡像
1.nginx, 修改首頁內容, html網站就跑起來了, web server , 提供web服務, 提供代理轉發, 提供網關, 限流托等 …apache
2.web framework, web框架, 一般由開發, 通過某個開發語言, 基于某個web框架, 自己去開發一個web站點, python, diango框架
1.用python語言, 基于flask wen框架, 開發一個自己的網站, 寫了一個后端的網站代碼
2.開發dockerfile, 部署該代碼, 生成鏡像
3.其他人基于該鏡像, docker run就可以在電腦跑起來這個網站
10.1 部署全流程
# 1.在宿主機下, 準備一個目錄, 準備好dockerfile, 你的代碼 # 寫一個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.檢查代碼文件環境, 以及內容 [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.構建鏡像 # --no-cache 不用緩存 sudo docker build --no-cache -t 'harry777/my_flask_web' . # 最后的結果類似如下, 才是正確 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.運行鏡像, 生成容器 docker run -d --name my_flask_web -p 777:777 harry777/my_flask_web # 6.訪問宿主機, 看容器內的flask web 網頁 http://39.101.240.154:777/hello hello docker, i am harry.# 7.如何修改網站的內容, 這個程序時跑在容器里了10.2 如何修改該網站的內容
1.修改宿主機的代碼, 以及Dockerfile, 重建應用
2.你可以進入到以及運行的容器內, 重啟容器即可
# 1.進入容器 docker exec -it 容器id bash# 2.修改容器內的程序 vim harry_flask.py# 3.退出容器, 重啟容器 exit docker restart 容器id docker ps # 看下是否存活10.3 再次強調docker的好處, 用法
比如安裝一個etcd, nacos, 都是比較復雜的一些軟件
需要依賴于go語言環境, 比如需要依賴于java環境, 在自己的機器上安裝好對應的開發環境, 以及對應的版本, 以及各種依賴
tomcat, jdk環境
當你有了docker
docker pull tomcat # 這些主流的鏡像都是可以直接找到, 并且該鏡像中, 就已經打包好了java環境
docker pull nacos # 打包好了各種環境依賴
docker run tomcat xxx … # 直接就可以訪問tomcat了
十一、總結
容器是docker的核心概念, 容器是一個或者一組應用, 它的運行狀態如下:
- docker利用容器運行應用程序
- 容器是鏡像的運行實例, 可以被run、start、stop、rm
- 每個容器都是相互隔離的, 保證平臺安全
- 容器可以看做一個簡易版Linux環境(有root權限、進程、用戶空間、網絡)
- 鏡像是只讀的, 容器在啟動的時候創建一層可寫層。
dockerfile面向開發, docker image 作為交付標準, docker container涉及部署和運維, 三者結合起來完成docker體系。
上圖可以理解
FROM centos:7.8.2003 選擇基礎鏡像 ADD run.sh 添加文件進鏡像, 這一層鏡像只有一個內容, 就是這個文件 VOLUME /data 設定存儲目錄, 并未添加文件, 只是更新了鏡像的json文件, 便于啟動的時候讀取該層信息 CMD ["./run.sh"] 更新json文件, 設定程序入口docker容器管理總結
# 運行容器, 且進入容器內 docker run -it ubuntu bash# 容器運行web程序 # 注意端口的使用, 數字大一點, 8000以后開始使用 docker run --name my_nginx_9000 -d --restart=always -p 9000:80 nginx# docker run 鏡像id 這是前臺運行容器# 查看容器內日志, 實時刷新 docker logs -f # 查看運行時, 以及掛掉的日志 docker ps 在運行的容器 #等同于 docker container lsdocker ps -a 掛掉以及活著的容器 docker container ls -a# 停止啟動 docker start docker stop# 進入容器內 docker exec -it 容器id bash# 刪除容器 docker rm 容器id docker rm `docker ps -aq` # 強制殺死容器 docker rm -f 容器id# 查看容器進行進程信息 docker top 容器id# 查看容器內資源 docker status 容器id# 查看容器的具體信息 docker inspect 容器id# 獲取容器內的ip地址, 容器的格式化參數 docker inspect 容器id | grep ip段 # 拿到容器內ip docker inspect --format '{{.NetworkSettings.IPAddress}}' 容器iddocker run 啟動容器的時候, docker后臺操作流程是
- 檢車本地是否有該鏡像, 沒有就下載
- 利用鏡像創建且啟動一個容器
- 分配容器文件系統, 在只讀的鏡像層掛載讀寫層
- 宿主機的網橋接口會分配一個虛擬接口到容器中
- 容器獲得地址池里的ip地址
- 執行用戶指定的程序
- 若程序里沒有進程在運行, 容器執行完畢后立即終止
總結:
#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虛擬機docker優點高效的利用系統資源更快啟動時間一致性環境輕松交付,部署主流公司都在用docker核心組成安裝部署鏡像加速器生命周期UnionFS鏡像管理容器管理倉庫管理dockerfile實踐構建docker鏡像部署一個用于運行你所需的容器環境相當于一個腳本,通過dockerfile自己的命令,來構建軟件依賴,文件依賴,存儲等等....指令合集FROM MAINTAINR RUN ADD WORKDIR VOLUME EXPOSE CMD ENTRYPOINT ENV USER 還有很多, 根據需要學習存儲、網絡、REST、API容器編排docker生產實踐文章就到這里, 喜歡的話點個關注和贊吧?~
總結
以上是生活随笔為你收集整理的Python3 - 深入学习Docker容器管理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#读取Excel表格去掉空行
- 下一篇: win98装python_Windows