宣城網(wǎng)站建設(shè)足球世界排名國(guó)家
Docker 基本概述
Docker 是一個(gè)開源的應(yīng)用容器引擎,它讓開發(fā)者可以打包他們的應(yīng)用以及依賴包到一個(gè)可移植的鏡像中,然后發(fā)布到任何流行的 Linux 或 Windows 操作系統(tǒng)的機(jī)器上,也可以實(shí)現(xiàn)虛擬化。容器是完全使用沙箱機(jī)制,相互之間不會(huì)有任何接口。
Docker 官網(wǎng):https://www.docker.com
Docker 有助于更快地交付應(yīng)用,它可將應(yīng)用程序和基礎(chǔ)設(shè)施層隔離,并且能將基礎(chǔ)設(shè)施當(dāng)作程序一樣進(jìn)行管理。使用 Docker 可更快地打包、測(cè)試以及部署應(yīng)用程序,并可以縮短從編寫到部署運(yùn)行代碼的周期。
Docker 中的隔離機(jī)制是如何實(shí)現(xiàn)的?
Docker 主要借助 Linux 內(nèi)核技術(shù) Namespace 來實(shí)現(xiàn)隔離。Namespace 是 Linux 內(nèi)核的一種功能,它能夠?qū)⑦M(jìn)程及其相關(guān)的資源(如文件系統(tǒng)、網(wǎng)絡(luò)等)隔離在一個(gè)獨(dú)立的、互不干擾的環(huán)境中,使得每個(gè)進(jìn)程都有其獨(dú)立的視角。
Namespace 應(yīng)用方面
PID命名空間
:這是隔離進(jìn)程的關(guān)鍵,它使得每個(gè)容器都有其獨(dú)立的進(jìn)程空間,無法影響其他容器或主機(jī)的進(jìn)程。
文件系統(tǒng)命名空間
:這是用來隔離文件系統(tǒng)的。每個(gè)容器都有其獨(dú)立的文件系統(tǒng),包括 /dev、/proc、/bin、/etc、/lib、/usr 等目錄,這些都是容器啟動(dòng)時(shí)由宿主機(jī)提供的。Docker 使用的是 overlay 或 overlay2 存儲(chǔ)驅(qū)動(dòng),它將不同容器的文件系統(tǒng)疊加在一起,但每個(gè)容器都有其獨(dú)立的視角。
網(wǎng)絡(luò)命名空間
:這是用來隔離網(wǎng)絡(luò)資源的,每個(gè)容器都有其獨(dú)立的網(wǎng)絡(luò)環(huán)境,包括 IP 地址、端口等。
用戶命名空間
:這是用來隔離用戶和權(quán)限的,每個(gè)容器都有其獨(dú)立的安全上下文,包括用戶、密碼、權(quán)限等。
總的來說,Docker通過使用Linux Namespace和相關(guān)的技術(shù),為容器提供了隔離后的執(zhí)行環(huán)境,使得每個(gè)容器都有其獨(dú)立的視角和資源。
Docker 基本概念
鏡像(image):一個(gè)只讀的模板,可以用來創(chuàng)建 Docker 容器。類似于 Student 類。容器(Container):容器是鏡像創(chuàng)建的運(yùn)行實(shí)例。容器是鏡像運(yùn)行時(shí)的實(shí)體,為鏡像提供了一個(gè)標(biāo)準(zhǔn)的和隔離的運(yùn)行環(huán)境。它可以被啟動(dòng)、停止、刪除,每個(gè)容器之間都是隔離的。類似于 stu 實(shí)例對(duì)象。倉庫(repository):存放鏡像文件的地方。比如 maven 倉庫是存放 jar 包的地方。
Windows 安裝 Docker
首先進(jìn)行下載 windows 版本的 installer 安裝包
安裝完成提示:You must restart Windows to complete installation.
初次啟動(dòng) Docker Desktop 時(shí),您可能需要登錄到 Docker Hub https://hub.docker.com/ 的帳戶。特別注意:和 Docker 官網(wǎng)不同,注冊(cè)頁面在國(guó)內(nèi)訪問需要加速器。
環(huán)境問題
解決方案:更新 wsl
C:\Users\Administrator>wsl --update
正在安裝: 適用于 Linux 的 Windows 子系統(tǒng)
已安裝 適用于 Linux 的 Windows 子系統(tǒng)。
Windows Subsystem for Linux(WSL)是一個(gè)在 Windows 10 上能夠運(yùn)行原生 Linux 二進(jìn)制可執(zhí)行文件的兼容層。它是由微軟和 Canonical 公司合作開發(fā),其目標(biāo)是使純正的 Ubuntu、Debian 等映像能下載和解壓到用戶的本地計(jì)算機(jī),并且映像內(nèi)的工具和實(shí)用工具能在此子系統(tǒng)上原生運(yùn)行。如果使用 Windows 10 2004 以上,可以通過 WSL 2 來窗口化運(yùn)行桌面應(yīng)用,也不需要另外安裝其他的 X 服務(wù)器。
Welcome-To-Docker
當(dāng)你成功安裝 docker 后會(huì)發(fā)現(xiàn)有自帶的容器 welcome-to-docker
(展示如下)
Container 容器暴露的端口 Port 是 80,映射到 windows 的端口是 8088
配置 Docker 鏡像
“registry-mirrors” 是 Docker 的一個(gè)配置項(xiàng),它的中文意思是“注冊(cè)表鏡”。這個(gè)配置項(xiàng)主要被用來修改 Docker 在啟動(dòng)過程中加載的鏡像。當(dāng) Docker 啟動(dòng)時(shí),它會(huì)自動(dòng)從 Docker Hub 上拉取鏡像來使用。通過使用 “registry-mirrors”
,你可以指定一個(gè)或多個(gè)鏡像存儲(chǔ)庫作為拉取鏡像的鏡像源,以替代默認(rèn)的 Docker Hub。這樣可以提高拉取鏡像的速度,并且可以在網(wǎng)絡(luò)連接不好的情況下使用緩存的鏡像。需要注意的是,如果使用registry-mirrors,需要在啟動(dòng) Docker 時(shí)加上 --registry-mirror
參數(shù),例如 “docker -d --registry-mirror=http://<your-mirror-domain>”
。
"registry-mirrors": ["https://registry.docker-cn.com","http://hub-mirror.c.163.com","https://docker.mirrors.ustc.edu.cn","https://cr.console.aliyun.com","https://mirror.ccs.tencentyun.com"
]
Docker 組成
Kubernetes 基本概述
首先介紹下 Kubernetes,它是一個(gè)開源的容器集群管理系統(tǒng),它用于在多個(gè)主機(jī)上自動(dòng)化部署、維護(hù)和擴(kuò)展容器化的應(yīng)用。Kubernetes 的目標(biāo)是簡(jiǎn)化和高效地實(shí)現(xiàn)容器化的應(yīng)用部署,它提供了應(yīng)用部署、規(guī)劃、更新和維護(hù)的一種機(jī)制。
Kubernetes 系統(tǒng)有什么樣的應(yīng)用場(chǎng)景?
自動(dòng)化容器部署:Kubernetes可以自動(dòng)化容器的部署、管理和擴(kuò)展,從而使應(yīng)用程序能夠更快速、高效地運(yùn)行。
水平擴(kuò)展和自動(dòng)負(fù)載均衡:Kubernetes可以自動(dòng)擴(kuò)展容器實(shí)例的數(shù)量,并使用負(fù)載均衡器將流量分配到這些實(shí)例之間,以實(shí)現(xiàn)高可用性和更好的性能。
無縫的應(yīng)用程序更新:Kubernetes可以實(shí)現(xiàn)滾動(dòng)更新,從而在不中斷應(yīng)用程序服務(wù)的情況下更新應(yīng)用程序版本。
彈性伸縮:Kubernetes可以根據(jù)需要自動(dòng)伸縮應(yīng)用程序,以應(yīng)對(duì)峰值流量或負(fù)載波動(dòng)。
容器存儲(chǔ)管理:Kubernetes可以管理容器的存儲(chǔ)需求,從而幫助應(yīng)用程序訪問數(shù)據(jù)存儲(chǔ)。
跨云平臺(tái)應(yīng)用程序部署:Kubernetes可以在多個(gè)云平臺(tái)之間輕松部署和管理應(yīng)用程序,從而幫助企業(yè)實(shí)現(xiàn)多云策略。
Docker CMD
Common Commands
run Create and run a new container from an image
exec Execute a command in a running container
ps List containers
build Build an image from a Dockerfile
pull Download an image from a registry
push Upload an image to a registry
images List images
login Log in to a registry
logout Log out from a registry
search Search Docker Hub for images
version Show the Docker version information
info Display system-wide information
Commands
attach Attach local standard input, output, and error streams to a running container
commit Create a new image from a container's changes
cp Copy files/folders between a container and the local filesystem
create Create a new container
diff Inspect changes to files or directories on a container's filesystem
events Get real time events from the server
export Export a container's filesystem as a tar archive
history Show the history of an image
import Import the contents from a tarball to create a filesystem image
inspect Return low-level information on Docker objects
kill Kill one or more running containers
load Load an image from a tar archive or STDIN
logs Fetch the logs of a container
pause Pause all processes within one or more containers
port List port mappings or a specific mapping for the container
rename Rename a container
restart Restart one or more containers
rm Remove one or more containers
rmi Remove one or more images
save Save one or more images to a tar archive (streamed to STDOUT by default)
start Start one or more stopped containers
stats Display a live stream of container(s) resource usage statistics
stop Stop one or more running containers
tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
top Display the running processes of a container
Docker 安裝 Redis
Docker 官方鏡像倉庫 Redis:https://hub.docker.com/
C:\Users\Administrator>docker run -d -p 6379:6379 --name redis redis:latest
Unable to find image 'redis:latest' locally
latest: Pulling from library/redis
360eba32fa65: Pull complete
64b323c8825b: Pull complete
383536099eae: Pull complete
e3f0c12dcc8e: Pull complete
2d2142a35b4d: Pull complete
b4cada01e6a7: Pull complete
Digest: sha256:f92a0be0ba8c085e6a5e2d2bea386365443485bcd67ced5ca8ddcdacdd4656d2
Status: Downloaded newer image for redis:latest
14598998f360e144a95f985ceca7af77d0a27941eb46e2a73d5c798ce4a04430
在 Docker Desktop Container 查看已經(jīng)運(yùn)行的 redis 容器
測(cè)試 Redis 數(shù)據(jù)庫
選擇 Exec 打開 / Open in external terminal? 開啟終端
# redis-cli
127.0.0.1:6379> set name 'wrist'
OK
127.0.0.1:6379> get name
"wrist"
Docker 安裝 WordPress
WordPress 是一個(gè)使用 PHP 語言開發(fā)的博客平臺(tái),用戶可以在支持 PHP 和 MySQL 數(shù)據(jù)庫的服務(wù)器上架設(shè)屬于自己的網(wǎng)站,也可以將其作為內(nèi)容管理系統(tǒng)(CMS)來使用。WordPress 是一款個(gè)人博客系統(tǒng),并逐步演化成一款內(nèi)容管理系統(tǒng)軟件,它是使用PHP語言和MySQL數(shù)據(jù)庫開發(fā)的,用戶可以在支持 PHP 和 MySQL 數(shù)據(jù)庫的服務(wù)器上使用自己的博客。
WordPress 擁有成千上萬個(gè)各式插件和不計(jì)其數(shù)的主題模板樣式,同時(shí)還有許多第三方開發(fā)的免費(fèi)模板,安裝方式簡(jiǎn)單易用。WordPress 官方支持中文版,同時(shí)有愛好者開發(fā)的第三方中文語言包,如 wopus 中文語言包。使用 WordPress 可以快速搭建獨(dú)立的 Blog 網(wǎng)站,而且它不僅僅是一個(gè) blog 程序,也是一個(gè)優(yōu)秀的小型 CMS,很多非 blog 網(wǎng)站也是用 WordPress 搭建的。它的功能包括文章發(fā)布、分類、歸檔,提供文章、評(píng)論、分類等多種形式的 RSS 聚合,鏈接的添加、歸類功能,評(píng)論的管理,垃圾信息過濾功能等。
Docker Compose
Docker Compose 是一個(gè)工具,可以用于在單個(gè)主機(jī)上編排多個(gè) Docker 容器。它允許您通過一個(gè) YAML 文件來定義應(yīng)用程序的服務(wù)、配置和環(huán)境,并將其作為一個(gè)整體進(jìn)行管理。使用 Docker Compose,您可以輕松地定義和運(yùn)行多個(gè)容器,并使這些容器能夠相互通信和協(xié)調(diào)。它是在開發(fā)和生產(chǎn)環(huán)境中使用 Docker 容器的一種高效方式。
C:\Users\Administrator\Desktop\HackerWaking>docker-compose up -d
no configuration file provided: not found
需要 configuration file 就是 docker-compose.yml 配置文件
docker-compose.yml
version: '3.1'services:wordpress:image: wordpressrestart: alwaysports:- 8080:80environment:WORDPRESS_DB_HOST: dbWORDPRESS_DB_USER: exampleuserWORDPRESS_DB_PASSWORD: examplepassWORDPRESS_DB_NAME: exampledbvolumes:- wordpress:/var/www/htmldb:image: mysql:5.7restart: alwaysenvironment:MYSQL_DATABASE: exampledbMYSQL_USER: exampleuserMYSQL_PASSWORD: examplepassMYSQL_RANDOM_ROOT_PASSWORD: '1'volumes:- db:/var/lib/mysqlvolumes:wordpress:db:
在 docker-compose.yml 配置文件所在的目錄開啟 cmd terminal 終端進(jìn)行執(zhí)行 docker-compose
C:\Users\Administrator\Desktop\HackerWaking>docker-compose up -d
容器名稱就是目錄名稱
打開 wordpress 頁面
配置 Dockerfile
Dockerfile 是 Docker 用來創(chuàng)建 Docker 鏡像的文本文件。Dockerfile 由一系列的命令和參數(shù)構(gòu)成,這些命令應(yīng)用于基礎(chǔ)鏡像并最終創(chuàng)建一個(gè)新的鏡像。他們自動(dòng)化了 Docker 應(yīng)用程序鏡像的構(gòu)建過程。
Dockerfile 基本結(jié)構(gòu)
FROM:這是 Dockerfile 中的第一條指令,指定一個(gè)基礎(chǔ)鏡像作為后續(xù)所有指令的基礎(chǔ)。
RUN:在鏡像上運(yùn)行命令。
WORKDIR:設(shè)置工作目錄。
COPY:復(fù)制文件。
ADD:更高級(jí)的復(fù)制文件。
ENV:設(shè)置環(huán)境變量。
EXPOSE:聲明端口。
CMD:提供默認(rèn)的執(zhí)行參數(shù)。
ENTRYPOINT:設(shè)置容器啟動(dòng)時(shí)運(yùn)行的命令。
ONBUILD:當(dāng)構(gòu)建一個(gè)被繼承的 Dockerfile 時(shí)運(yùn)行命令。
LABEL:添加元數(shù)據(jù)到鏡像。
STOPSIGNAL:設(shè)置停止容器的信號(hào)。
HEALTHCHECK:設(shè)置健康檢查。
SHELL:設(shè)置默認(rèn) shell。
保存 Docker 鏡像
docker save
命令用于將指定的 Docker 鏡像保存為 tar 歸檔文件。若沒有指定路徑信息,導(dǎo)出目錄就是當(dāng)前 Bash 目錄。
docker save --helpUsage: docker save [OPTIONS] IMAGE [IMAGE...]Save one or more images to a tar archive (streamed to STDOUT by default)Aliases:docker image save, docker saveOptions:-o, --output string Write to a file, instead of STDOUT
制作 Docker 鏡像
Flask app.py 簡(jiǎn)單案例
from flask import Flask
import os
from dotenv import load_dotenv
load_dotenv()app = Flask(__name__)@app.route("/")
def indexPage():return "hello world"if __name__ == "__main__":app.run(host=os.getenv("HOST"), port=os.getenv("PORT"))
環(huán)境變量 .env 配置文件
HOST=0.0.0.0
PORT=8080
requirements.txt 包版本控制
requirements.txt
是一個(gè)用于指定 Python 項(xiàng)目依賴的文件。在 requirements.txt
文件中,您可以列出項(xiàng)目所需的所有依賴包及其對(duì)應(yīng)的版本。這樣,您可以輕松地與他人共享項(xiàng)目,并確保他們?cè)诎惭b依賴時(shí)獲得與您相同的版本。
使用 pip freeze > requirements.txt
命令將當(dāng)前環(huán)境中已安裝的依賴包及其版本導(dǎo)出到 requirements.txt
文件中。這將幫助您輕松地創(chuàng)建一個(gè) requirements.txt
文件,以便與他人共享您的項(xiàng)目。
Flask~=2.2.2
python-dotenv~=0.21.0
Dockerfile 鏡像配置文件
FROM python:3.8WORKDIR /appADD . /appRUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simpleEXPOSE 8080CMD ["python", "app.py"]
制作 Docker 鏡像
PS E:\docker-flask> docker build -f Dockerfile -t flask-test:1.0.0
ERROR: "docker buildx build" requires exactly 1 argument.
See 'docker buildx build --help'.
解決方案 Bash:docker buildx build . -t flask-test:1.0.0
CMD 運(yùn)行鏡像(推薦)
docker run -p 8080:8080 flask-test:1.0.0
Docker Desktop 運(yùn)行鏡像
Centos 安裝 Docker
CentOS 基本概述
CentOS 是 Linux 發(fā)行版之一,它是來自于 Red Hat Enterprise Linux 依照開放源代碼規(guī)定釋出的源代碼所編譯而成。由于出自同樣的源代碼,因此有些要求高度穩(wěn)定性的服務(wù)器以 CentOS 替代商業(yè)版的 Red Hat Enterprise Linux 使用。
Yum 基本概述
Yum(Yellowdog Updater, Modified)是一個(gè)在 Fedora 和 RedHat 以及 CentOS 中的 Shell 前端軟件包管理器,基于 RPM 包管理,能夠自動(dòng)處理依賴性關(guān)系,并且可以自動(dòng)查找包的依賴性關(guān)系。
安裝軟件包:yum install package_name
更新軟件包:yum update package_name
卸載軟件包:yum remove package_name
搜索軟件包:yum search package_name
列出已安裝的軟件包:yum list installed
列出所有可用的軟件包:yum list all
清除Yum緩存:yum clean cache
檢查更新 yum
sudo yum update
安裝 yum-utils 軟件包(用于處理倉庫和依賴關(guān)系)
sudo yum install -y yum-utils
啟用 Docker
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
安裝 Docker
sudo yum install docker-ce docker-ce-cli containerd.io
查看 Docker 版本
[root@VM-4-17-centos ~]# docker --version
Docker version 24.0.6, build ed223bc
Centos 運(yùn)行鏡像
docker load -i tar包 名稱
[root@VM-4-17-centos docker]# docker images
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
遇到的問題是 Docker daemon 沒有運(yùn)行,這導(dǎo)致你不能與 Docker daemon 進(jìn)行交互。首先,你需要確定 Docker daemon 是否正在運(yùn)行。通過運(yùn)行下面的命令 sudo systemctl status docker
來檢查 Docker daemon 的狀態(tài)。如果 Docker daemon 沒有運(yùn)行,你會(huì)看到類似 “inactive (dead)” 的消息。
運(yùn)行 Docker daemon
sudo systemctl start docker
拉取鏡像 / 上傳鏡像
加載 鏡像 tar 歸檔文件
docker load -i flask-test.tar
docker load
[root@VM-4-17-centos docker]# docker load --helpUsage: docker load [OPTIONS]Load an image from a tar archive or STDINAliases:docker image load, docker loadOptions:-i, --input string Read from tar archive file, instead of STDIN-q, --quiet Suppress the load output
查看鏡像
[root@VM-4-17-cdocker images
REPOSITORY TAG IMAGE ID CREATED SIZE
flask-test 1.0.0 2cace70f5bb6 3 hours ago 1.01GB
Shell 運(yùn)行鏡像(推薦)
[root@VM-4-17-centos docker]# docker run -p -d 8080:8080 flask-test:1.0.0
[root@VM-4-17-centos docker]# 2a8b3febd9d82718541d9292332c90200c4b3ce0d6a0f6f5ec5ee5867d368fe7
background task 后臺(tái)運(yùn)行?docker run --help
查看
-d, --detach Run container in background and print container ID
常見問題:端口沖突
[root@VM-4-17-centos docker]# docker run -p 8080:8080 flask-test:1.0.0 --name flask-project
docker: Error response from daemon: driver failed programming external connectivity on endpoint strange_merkle (40bb0c551f08c91dabdabea1d11f8b165995408702a79462f2313cbca30f45c8): Error starting userland proxy: listen tcp4 0.0.0.0:8080: bind: address already in use.
ERRO[0000] error waiting for container:
在 Linux 上使用 netstat 命令或 lsof 命令來查看指定端口的進(jìn)程:
使用 netstat
sudo netstat -tuln | grep 8080
使用 lsof
sudo lsof -i :8080
這兩個(gè)命令都需要使用 root 權(quán)限(使用sudo)。它們將顯示監(jiān)聽或連接到 8080 端口的進(jìn)程的詳細(xì)信息,包括進(jìn)程 ID(PID)、用戶、進(jìn)程名等。
lsof 是一個(gè)用于列出當(dāng)前系統(tǒng)打開文件的實(shí)用程序。通過使用不同的參數(shù),lsof 可以提供有關(guān)文件、進(jìn)程、用戶和目錄的豐富信息。
查看正在運(yùn)行的 container 容器
docker ps
docker ps 命令將返回所有正在運(yùn)行的容器的列表,包括其 ID、名稱、鏡像、運(yùn)行時(shí)間、狀態(tài)等信息。
測(cè)試結(jié)果 訪問:服務(wù)器 IP:8080 => hello world 成功!!!!