[阶段4 企业开发进阶] 8. Docker
文章目錄
- 1 Docker簡介
- 1.1 概述
- 1.2 應用場景
- 1.3 Docker優點
- 1.4 Docker能做什么
- 1.5 Docker架構
- 1.6 安裝Docker
- 1.7 Run的運行流程
- 1.8 Docker底層原理
- 2 Docker常用命令
- 2.1 幫助命令
- 2.2 鏡像命令
- 2.3 容器命令
- 2.4 其他命令
- Docker安裝Nginx
- Docker安裝Tomcat
- 可視化工具Portainer
- 3 Docker鏡像
- 3.1 鏡像的概念
- 3.2 Docker鏡像加載原理
- 3.3 分層理解
- 3.4 Commit鏡像
- 4 容器數據卷
- 4.1 概念
- 4.2 使用數據卷
- Docker安裝MySQL
- 具名掛載和匿名掛載
- 數據卷容器
- 4.3 Dockerfile
- Dockerfile指令
- Dockerfile實戰
- 創建個性化的centos
- 創建個性化的Tomcat
- 發布鏡像
Docker學習
- Docker概述
- Docker安裝
- Docker命令
- 鏡像命令
- 容器命令
- 操作命令
- …
- Docker鏡像
- 容器數據卷
- DockerFile
- Docker網絡原理
- 整合Docker
- Docker Compose
- Docker Swarm
- CI/CD jenkins
1 Docker簡介
1.1 概述
Docker官網
Docker官方文檔
Docker源碼
Docker 是一個開源的應用容器引擎,基于 Go 語言 并遵從 Apache2.0 協議開源。
Docker 可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然后發布到任何流行的 Linux 機器上,也可以實現虛擬化。
容器是完全使用沙箱機制,相互之間不會有任何接口(類似 iPhone 的 app),更重要的是容器性能開銷極低。
1.2 應用場景
- Web 應用的自動化打包和發布。
- 自動化測試和持續集成、發布。
- 在服務型環境中部署和調整數據庫或其他的后臺應用。
- 從頭編譯或者擴展現有的 OpenShift 或 Cloud Foundry 平臺來搭建自己的 PaaS 環境。
1.3 Docker優點
Docker 是一個用于開發,交付和運行應用程序的開放平臺。Docker 使您能夠將應用程序與基礎架構分開,從而可以快速交付軟件。借助 Docker,您可以與管理應用程序相同的方式來管理基礎架構。通過利用 Docker 的方法來快速交付,測試和部署代碼,您可以大大減少編寫代碼和在生產環境中運行代碼之間的延遲。
1、快速,一致地交付您的應用程序
Docker 允許開發人員使用您提供的應用程序或服務的本地容器在標準化環境中工作,從而簡化了開發的生命周期。
容器非常適合持續集成和持續交付(CI / CD)工作流程,請考慮以下示例方案:
- 您的開發人員在本地編寫代碼,并使用 Docker 容器與同事共享他們的工作。
- 他們使用 Docker 將其應用程序推送到測試環境中,并執行自動或手動測試。
- 當開發人員發現錯誤時,他們可以在開發環境中對其進行修復,然后將其重新部署到測試環境中,以進行測試和驗證。
- 測試完成后,將修補程序推送給生產環境,就像將更新的鏡像推送到生產環境一樣簡單。
2、響應式部署和擴展
Docker 是基于容器的平臺,允許高度可移植的工作負載。Docker 容器可以在開發人員的本機上,數據中心的物理或虛擬機上,云服務上或混合環境中運行。
Docker 的可移植性和輕量級的特性,還可以使您輕松地完成動態管理的工作負擔,并根據業務需求指示,實時擴展或拆除應用程序和服務。
3、在同一硬件上運行更多工作負載
Docker 輕巧快速。它為基于虛擬機管理程序的虛擬機提供了可行、經濟、高效的替代方案,因此您可以利用更多的計算能力來實現業務目標。Docker 非常適合于高密度環境以及中小型部署,而您可以用更少的資源做更多的事情。
1.4 Docker能做什么
比較Docker和虛擬機技術
- 傳統虛擬機,虛擬出一條硬件,運行一個完整的操作系統,在該系統上運行和安裝軟件
- 容器內的應用直接運行在宿主機的內核,容器本身沒有內核
- 每個容器間相互隔離,每個容器內部有屬于自己的文件系統,互不影響
DevOps(開發、運維)
應用更快速的交付和部署
傳統:一堆幫助文檔和安裝程序
Docker:打包鏡像發布測試,一鍵運行
更便捷的升級和擴縮容
使用Docker后,容易部署項目
項目打包為一個鏡像,擴展服務器A 服務器B
更簡單的系統運維
在容器化之后,開發和測試環境高度一致
更高效的計算資源利用
Docker是內核級別的虛擬化,可以在物理機上運行多個容器實例
1.5 Docker架構
Docker 包括三個基本概念:
- 鏡像(Image):Docker 鏡像是用于創建 Docker 容器的模板,通過模板創建容器服務,容器可以創建多個
- 容器(Container):鏡像和容器的關系,就像是面向對象程序設計中的類和實例一樣,鏡像是靜態的定義,容器是鏡像運行時的實體。容器可以被創建、啟動、停止、刪除、暫停等。
- 倉庫(Repository):倉庫可看成一個代碼控制中心,用來保存鏡像。
Docker 使用客戶端-服務器 (C/S) 架構模式,使用遠程API來管理和創建Docker容器。
Docker 容器通過 Docker 鏡像來創建。
容器與鏡像的關系類似于面向對象編程中的對象與類。
| 容器 | 對象 |
| 鏡像 | 類 |
| Docker 鏡像(Images) | Docker 鏡像是用于創建 Docker 容器的模板,比如 Ubuntu 系統。 |
| Docker 容器(Container) | 容器是獨立運行的一個或一組應用,是鏡像運行時的實體。 |
| Docker 客戶端(Client) | Docker 客戶端通過命令行或者其他工具使用 Docker SDK (https://docs.docker.com/develop/sdk/) 與 Docker 的守護進程通信。 |
| Docker 主機(Host) | 一個物理或者虛擬的機器用于執行 Docker 守護進程和容器。 |
| Docker Registry | Docker 倉庫用來保存鏡像,可以理解為代碼控制中的代碼倉庫。Docker Hub(https://hub.docker.com) 提供了龐大的鏡像集合供使用。一個 Docker Registry 中可以包含多個倉庫(Repository);每個倉庫可以包含多個標簽(Tag);每個標簽對應一個鏡像。通常,一個倉庫會包含同一個軟件不同版本的鏡像,而標簽就常用于對應該軟件的各個版本。我們可以通過 <倉庫名>:<標簽> 的格式來指定具體是這個軟件哪個版本的鏡像。如果不給出標簽,將以 latest 作為默認標簽。 |
| Docker Machine | Docker Machine是一個簡化Docker安裝的命令行工具,通過一個簡單的命令行即可在相應的平臺上安裝Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。 |
1.6 安裝Docker
Windows環境安裝Docker
Linux環境安裝Docker
Docker 鏡像加速
1.7 Run的運行流程
1.8 Docker底層原理
Docker是一個Client-Server結構的系統,Docker的守護進程運行在主機上,通過Socket從客戶端訪問,DockerServer接受到Docker-Client的指令,就會執行該命令
Docker為什么比虛擬機快?
2 Docker常用命令
2.1 幫助命令
docker version # 顯示docker的版本信息 docker info # 顯示docker的系統信息,包括鏡像和容器的數量 docker 命令 --help # 幫助命令幫助文檔
2.2 鏡像命令
docker images 查看所有本地的主機上的鏡像
docker images [OPTIONS] [REPOSITORY[:TAG]] REPOSITORY TAG IMAGE ID CREATED SIZE <none> <none> 77af4d6b9913 19 hours ago 1.089 GB committ latest b6fa739cedf5 19 hours ago 1.089 GB <none> <none> 78a85c484f71 19 hours ago 1.089 GB docker latest 30557a29d5ab 20 hours ago 1.089 GB <none> <none> 5ed6274db6ce 24 hours ago 1.089 GB postgres 9 746b819f315e 4 days ago 213.4 MB postgres 9.3 746b819f315e 4 days ago 213.4 MB postgres 9.3.5 746b819f315e 4 days ago 213.4 MB postgres latest 746b819f315e 4 days ago 213.4 MB解釋
| REPOSITORY | 鏡像倉庫源 |
| TAG | 鏡像標簽 |
| IMAGE ID | 鏡像ID |
| CREATED | 鏡像創建時間 |
| SIZE | 鏡像大小 |
可選項
| --all , -a | Show all images (default hides intermediate images) |
| --digests | Show digests |
| --filter , -f | Filter output based on conditions provided |
| --format | Pretty-print images using a Go template |
| --no-trunc | Don’t truncate output |
| --quiet , -q | Only show image IDs |
docker search 搜索鏡像
docker search [OPTIONS] TERM可選項
| --filter , -f | Filter output based on conditions provided | |
| --format | Pretty-print search using a Go template | |
| --limit | 25 | Max number of search results |
| --no-trunc | Don’t truncate output |
docker pull 下載鏡像
docker pull [OPTIONS] NAME[:TAG|@DIGEST] docker pull debianUsing default tag: latest # 若不寫tag 默認 latest latest: Pulling from library/debian fdd5d7827f33: Pull complete a3ed95caeb02: Pull complete Digest: sha256:e7d38b3517548a1c71e41bffe9c8ae6d6d29546ce46bf62159837aad072c90aa Status: Downloaded newer image for debian:latestdocker rmi 刪除鏡像
docker rmi [OPTIONS] IMAGE [IMAGE...]可選項
| --force , -f | Force removal of the image |
| --no-prune | Do not delete untagged parents |
2.3 容器命令
docker run 新建并啟動容器
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]參數說明
| --name="Name" | 容器名稱 |
| -d | 后臺方式運行 |
| -it | 使用交互方式運行,進入容器查看內容 |
| -p | 指定容器的端口 |
| -P | 隨機指定端口 |
實例
# 獲取centos鏡像 docker pull centos # 啟動容器 docker run -it centos /bin/bash # 查看容器內的centos ls # 從容器中退回主機 exitdocker ps列出所有運行的容器
docker ps [OPTIONS]可選項
| `` | 列出當前正在運行的容器 |
| -a | Show all containers (default shows just running) |
| -n=? | 顯示最近創建的容器 |
| -q | 只顯示容器的編號 |
退出容器
| exit | 停止容器,并退出 |
| Ctrl+P+Q | 不停止容器,退出 |
docker rm 刪除容器
docker rm [OPTIONS] CONTAINER [CONTAINER...] docker rm 容器id # 刪除指定的容器,不能刪除正在運行的容器,如果強制刪除 rm -f docker rm -f $(docker ps -aq) # 刪除所有的容器 docker ps -a -q|xargs docker rm # 刪除所有的容器啟動和停止容器
docker start 容器id # 啟動容器 docker restart 容器id # 重啟容器 docker stop 容器id # 停止當前正在運行的容器 docker kill 容器id # 強制停止當前容器2.4 其他命令
后臺啟動容器
# 命令 docker run -d 鏡像名; # 問題 docker ps 發現centos停止了 # 常見的坑 docker容器使用后臺運行,就必須要有一個前臺進程,若docker發現沒有應用,就會自動停止 # 如 nginx 容器啟動后,發現自己沒有提供服務,就會立即停止查看日志
docker logs -f -t --tail查看容器中的進程信息
docker top 容器ID查看鏡像的元數據
docker inspect 容器id進入當前正在運行的容器
# 容器通常都是后臺方式運行的,需要進入容器,修改些配置 # 命令 # 方式1 docker exec -it 容器id bashShell # 方式2 docker attach 容器id兩種方式區別
- docker exec 表示 進入容器后開啟一個新的終端,可以在里面操作(常用)
- docker attach 表示進入容器正在執行的終端,不會啟動新的進程
從容器內拷貝文件到主機上
docker cp 容器id:容器內路徑 目的主機路徑小結
Docker安裝Nginx
# 1. 搜索鏡像 search # 2. 下載鏡像 pull # 3. 運行測試 docker images# -d 后臺運行 # --name 容器命名 # -p 宿主機端口:容器內部端口 docker run -d --name nginx01 -p 3344:80 nginx # 測試本機 curl localhost:3344端口暴露
Docker安裝Tomcat
# 官方用法 (用完即刪) docker run -it --rm tomcat:9.0 # 下載鏡像 docker pull tomcat:9.0 # 查看鏡像 docker images # 運行容器 docker run -d -p 3355:8080 --name tomcat01 tomcat可視化工具Portainer
3 Docker鏡像
3.1 鏡像的概念
鏡像概念
鏡像是一種輕量級、可執行的獨立軟件包,用來打包軟件運行環境和基于運行環境開發的軟件,它包含運行某個軟件所需的所有內容,包括代碼、運行時,庫、環境變量和配置文件。
所有的應用,直接打包docker撓像,就可以直接跑起來!
得到鏡像
- 從遠程倉庫下載
- 拷貝
- 自制鏡像DockerFile
3.2 Docker鏡像加載原理
UnionFS (聯合文件系統)
Union文件系統是一種分層、輕量級并且高性能的文件系統,它支持對文件系統的修改作為一次提交來一層層的疊加,同時可以將不同目錄掛載到同一個虛擬文件系統下。 Union 文件系統是Docker鏡像的基礎。鏡像可以通過分層來進行繼承,基于基礎鏡像(沒有父鏡像),可以制作各種具體的應用鏡像。
特性:
一次同時加載多個文件系統,但從外面看起來,只能看到一個文件系統,聯合加載會把各層文件系統疊加起來,最終的文件系統會包含所有底層的文件和目錄
Docker鏡像加載原理
docker的鏡像實際上由一層一層的文件系統組成,bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引導加載kernel,Linux剛啟動時會加載bootfs文件系統,在Docker鏡像的最底層是bootfs。這一層與我們典型的Linux/Unix系統是一樣的,包含boot加載器和內核。當boot加載完成之后整個內核就都在內存中了,此時內存的使用權已由bootfs轉交給內核,此時系統也會卸款bootfs。
rootfs (root file system) , 在bootfs之上包含的就是典型Linux系統中的/dev,/proc,/bin, /etc等標準目錄和文件。rootfs就是各種不同的操作系統發行版,比如Ubuntu , Centos等等。
對于一個精簡的OS,rootfs可以很小,只需要包含最基本的命令,工具和程序,因為底層直接用主機的kernel,自己只需要提供rootfs,由此可見對于不同的Linux發行版,bootfs基本一致,rootfs會有差距,rootfs會有差別,因此不同的發行版可以共用bootfs
3.3 分層理解
分層的鏡像
下載Redis鏡像,觀察日志輸出,發現是分層下載
鏡像分層
所有的Docker鏡像最開始起于基礎鏡像層,當進行修改或增加新的內容,便會在當前鏡像層上,創建新的鏡像層
下圖展示與系統顯示相同的三層鏡像,所有鏡像層堆疊合并,對外提供統一的視圖
特點
Docker鏡像都是只讀的,當容器啟動時,一個新的可寫層加載到鏡像的頂部,該層就是容器層,容器層下面稱鏡像層
3.4 Commit鏡像
docker commit # 提交容器成為一個副本 # 命令和git原理類似 docker commit -m="提交的描述信息" -a="作者" 容器id 目標鏡像名:[TAG]4 容器數據卷
4.1 概念
容器間的數據共享,將Docker容器產生的數據,同步到本地。容器的持久化和同步操作,容器間可以數據共享
4.2 使用數據卷
方式1 使用命令掛載 -v
docker run -it -v 主機目錄:容器內目錄docker run -it -v /home/ceshi:/home centos /bin/bashDocker安裝MySQL
# 獲取mysql鏡像 docker pull mysql:5.7 # 查看鏡像 docker images # 啟動容器,進行掛載 # -d 后臺運行 # -p 端口映射 # -v 卷掛載 # -e 環境配置 # --name 容器名字 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=root --name mysql01 mysql:5.7具名掛載和匿名掛載
匿名掛載
# 匿名掛載, -v只寫容器內的路徑,沒有寫容器外的路徑 -v 容器內路徑 docker run -d -P --name nginx01 -v /etc/nginx nginx# 查看所有volume情況 docker volume具名掛載
# 具名掛載, -v 卷名:容器內路徑 docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx所有docker容器內的卷,沒有指定目錄的情況下都是在/var/lib/docker/volumes/xxx/_data
拓展
通過 -v 容器內路徑 ro rw 改變讀寫權限
docker run -d -P --name nginx01 -v juming-nginx:/etc/nginx:ro nginx docker run -d -P --name nginx01 -v juming-nginx:/etc/nginx:rw nginx注意 ro說明該路徑只能通過宿主機操作,容器內部無法操作
數據卷容器
容器之間的配置消息的傳遞,數據卷容器的生命周期一直持續到沒有容器使用為止,但是一但持久化到本地,本地的數據是不會刪除的
4.3 Dockerfile
Dockerfile是用來構建docker鏡像的文件,命令參數腳本
構建步驟
構建過程
基礎知識
Dockerfile指令
| FROM | 指定基礎鏡像 |
| MAINTAINER | 指定維護者信息 |
| RUN | 鏡像構建時要運行的命令 |
| ADD | 添加內容 |
| WORKDIR | 設置當前工作目錄 |
| VOLUME | 設置卷,掛載主機目錄 |
| EXPOSE | 指定對外的端口 |
| CMD | 指定容器啟動時運行的命令(只有最后一個會生效,可被替代) |
| ENTRYPOINT | 指定容器啟動時運行的命令(可以追加命令) |
| ONBUILD | 觸發指令 |
| COPY | 文件拷貝到鏡像 |
| ENV | 構建時設置環境變量 |
Dockerfile實戰
創建個性化的centos
1.編寫Dockerfile文件
FROM centos MAINTAINER Cyan-ChauENV MYPATH /usr/local WORKDIR $MYPATHRUN yum -y install vim RUN yun -y install net-toolsEXPOSE 80CMD echo $MYPATH CMD echo "----end----" CMD /bin/bash2.通過文件構建鏡像
# docker build -f dockerfile文件路徑 -t 鏡像名:[tag] docker build -f myfile -t mycnetos:0.1補充命令
# 鏡像的歷史變更記錄 docker history 鏡像ID創建個性化的Tomcat
準備鏡像文件tomcat壓縮包,jdk的壓縮包
編寫Dockerfile文件
vim Dockerfile FROM centos MAINTAINER Cyan-ChauCOPY readme.txt /usr/local/readme.txtADD jdk-8u11-linux-x64.tar.gz /usr/local ADD apache-tomcat-9.0.22.tar.gz /usr/localRUN yum -y install vimENV MYPATH /usr/local WORKDIR $MYPATHENV JAVA_HOME /usr/local/jdk1.8.0_11 ENV CLASSPATH $JAVA_HOME/lib/dt.jar;$JAVA_HOME/lib/tools.jar ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.22 ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.22 ENV PATH $PATH:$JAVA_HOME/bin;$CATALINA_HOME/lib;CATALINA_HOME/binEXPOSE 8080CMD /usr/local/apache-tomcat-9.0.22/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.22/bin/logs/catalina.out # 構建鏡像 docker build -t mytomcat .發布鏡像
DockerHub
注冊賬號
登錄賬號
docker login --helpdocker login -u xxx提交鏡像(帶上版本號)
docker push xxx:version總結
以上是生活随笔為你收集整理的[阶段4 企业开发进阶] 8. Docker的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OBCE首位认证 实力与颜值并存 | 9
- 下一篇: 神经网络之激活函数