引言
傳統部署環境逐漸不適應現在的企業開發,為了追求更加輕量,更加容易管理項目,引入了docker容器化技術去實現更加高效的部署環境。
一.docker風光下的內核功能和常用命令
1.docker容器和虛擬機的區別
我們在底層和應用層之間引入了一層docker engine 代替了 guest os ,同時Hypervisor會對硬 件資源進行虛擬化,docker直接使用硬件資源,所以資源利用率相對docker低
?2.docker 的整體架構圖
1. 鏡像(Image ): Docker 鏡像是用于創建 Docker 容器的模板,比如 Ubuntu 系統2. 容器(Container ):容器是獨立運行的一個或一組應用,是鏡像運行時的實體3. 客戶端(client ): Docker 客戶端通過命令行或者其他工具使用 Docker SDK( https://docs.docker.com/develop/sdk/) ) 與 Docker 的守護進程通信4. 主機(host ):一個物理或者虛擬的機器用于執行 Docker 守護進程和容器5. 注冊中心(Registry ): Docker 倉庫用來保存鏡像,可以理解為代碼控制中的代碼倉庫。 DockerHub( https://hub.docker.com) ) 提供了龐大的鏡像集合供使用。6. Docker Machine:Docker Machine 是一個簡化 Docker 安裝的命令行工具,通過一個簡單的命令行即可在相應的平臺上安裝 Docker 。
?3.容器之間的隔離性
Docker 容器之間的隔離性體現在以下幾個方面:
進程隔離:
每個容器內部運行的進程只屬于該容器,容器之間的進程互不可見,互不影響。文件系統隔離:
每個容器有獨立的文件系統,默認情況下,容器之間無法直接訪問對方的文件和數據。網絡隔離:
容器有獨立的網絡命名空間,IP、端口等互不沖突。容器之間默認不能直接通信,除非通過 Docker 網絡(如 bridge、overlay)進行連接。資源隔離:
可以為每個容器分配 CPU、內存等資源限制,防止資源爭搶。用戶隔離:
容器內的用戶和主機或其他容器的用戶相互獨立。
總結:
Docker 利用 Linux 的命名空間(namespace)和控制組(cgroup)技術,實現了進程、文件、網絡、資源等多方面的隔離,保證了容器之間的安全和獨立運行。
4 docker常用基礎命令
systemctl start docker //啟動docker
docker --help //查看docker幫助文檔
docker pull 鏡像名字 //拉取鏡像到本地
docker images //顯示docker pull的鏡像資源
docker info //顯示 Docker 系統信息,包括鏡像和容器數。
docker version //顯示 Docker 版本信息。
docker events //從服務器獲取實時事件
docker logs //獲取容器的日志
docker history //查看指定鏡像的創建歷史。
docker create //創建一個新的容器但不啟動它
docker run :創建一個新的容器并運行一個命令
docker run -it -d -p 81:80 --name nginx01 nginx //啟動一個nginx服務# -it 以互動方式啟動# -d 以后臺方式啟動# --name 命名# -p 端口號映射 本機端口號81隱射nginx服務端口號80
docker start 容器ID或者容器名字 //啟動容器
docker restart 容器ID或容器名字 //重啟容器
docker stop 容器ID或容器名字 //停止容器運行
docker kill 容器ID或容器名字 //強制殺死該容器
docker rm 容器ID或容器名字 //刪除容器
docker logs 容器ID或容器名字 //查看容器日志信息
docker top 容器ID或容器名字 //查看容器運行的進程信息
docker inspect 容器ID或容器名字 //查看容器內部細節信息
//進入容器并交互
docker exec -it 容器ID或容器名字 bash
docker attach 容器ID或容器名字
二.docker 鏡像操作和容器管理
1.鏡像是什么,鏡像的原理是什么?為什么會有鏡像?
鏡像就好比一個類,容器就好比一個對象,鏡像是構建容器的基礎。
?鏡像擁有一個最底層,我們可以在最底層上面構造一層又一層的方法對它進行增加服務內容
?2.鏡像管理命令
docker build //命令用于使用 Dockerfile 創建鏡像。
docker rmi // 刪除本地一個或多個鏡像。
docker commit //從容器創建一個新的鏡像。
3.dockerfile
dockerfile是構建鏡像的文本文件,是一條條命令和參數所寫的腳本
?構建的三個步驟
①編寫dockerfile文件
②docker build 命令構建鏡像
③docker run 鏡像運行容器實例
dockerfile的基礎知識
①每條保留字指令都必須為大寫字母且后面要跟隨至少一個參數
②指令執行順序從上到下,順序執行
③#表示注釋
④每條指令都會創建一個新的鏡像并對鏡像提交
關鍵字
FROM :? ? ? ? ? ? 設置鏡像使用的基礎鏡像MAINTAINER:? 設置鏡像的作者? //已被棄用 用label代替RUN:? ? ? ? ? ? ? ?? 編譯鏡像時運行的腳步CMD :? ? ? ? ? ? ?? 設置容器的啟動命令LABEL :? ? ? ? ?? 設置鏡像標簽EXPOSE?:? ? ? ? 設置鏡像暴露的端口ENV :? ? ? ? ? ? ?? 設置容器的環境變量ADD :? ? ? ? ? ? ??? 編譯鏡像時復制上下文中文件到鏡像中COPY :? ? ? ? ? ?? 編譯鏡像時復制上下文中文件到鏡像中ENTRYPOINT : 設置容器的入口程序VOLUME :? ? ? ?? 設置容器的掛載卷USER :? ? ? ? ? ? ? 設置運行 RUN CMD ENTRYPOINT 的用戶名WORKDIR :? ? ? 設置 RUN CMD ENTRYPOINT COPY ADD 指令的工作目錄ARG?:? ? ? ? ? ? ? ? 設置編譯鏡像時加入的參數ONBUILD:? ? ? ?? 設置鏡像的 ONBUILD 指令STOPSIGNAL:? 設置容器的退出信號量
?寫一個簡單的dockerfile例子
FROM ubuntu
LABEL name="lion" RUN apt-get update && apt-get install -y vim
RUN echo "hello World" > /hello.txt
RUN mkdir /app
CMD [ "bin/bash" ]ENV MY_VAR=helloEXPOSE 8080
WORKDIR /appVOLUME [ "/data1","/data2" ]
docker build -t ubuntu01 -f dockerfile .
?4.docker數據卷
數據據的命令介紹
docker volume create //創建數據卷docker volume inspect //查看數據卷的信息docker volume ls //展示所有的數據卷docker volume prune //刪除容器未使用的數據卷docker volume rm //刪除指定的數據據
映射案例 在宿主機的文件修改會映射到容器內的文件?
?三.docker網絡
1,docker 網絡是什么,有什么作用?,解決了什么問題?
Docker 網絡是容器間及與外部通信的虛擬網絡。作用是讓容器能互訪、連外網、安全隔離。解決了容器間通信難、跨主機組網、動態分配 IP、流量隔離及負載均衡等問題,簡化微服務網絡管理。
2.docker網絡的常用命令
//連接一個容器到一個網絡
docker network connect //Connect a container to a network
//創建一個網絡
docker network create //Create a network
//將容器從一個網絡中斷開
docker network disconnect //Disconnect a container from a network
//查看網絡的詳細信息
docker network inspect //Display detailed information on one or more networks
//查看網絡列表
docker network ls //List networks
//移除所有未使用的網絡
docker network prune //Remove all unused networks
//移除一個或多個網絡
docker network rm //Remove one or more networks
容器之間通信方式一
通過docker 自帶的網橋
?
通過容器的ip地址可以ping通
但是通過容器名則不行
?
容器之間通信方式二
通過自己創立的network
?
?
通過容器的ip地址和容器名都可以ping通
四.docker容器編排?
1.什么是docker容器編排
容器編排通俗來說一堆容器一起配合工作并且互不干擾
build :? 構建或重新構建服務的鏡像config : 解析、解析并呈現規范格式的 compose 文件,即檢查配置文件cp :? ? ?? 在服務容器和本地文件系統之間復制文件 / 文件夾create : 為服務創建容器down :? 停止并移除容器、網絡events : 從容器接收實時事件exec :? ? 在正在運行的容器中執行命令images? ? 列出創建的容器使用的鏡像kill :? ? ?? 強制停止服務容器logs :? ? 查看容器的輸出ls :? ? ? ? 列出正在運行的 compose 項目pause:? 暫停服務port :??? 打印端口綁定的公共端口ps? ? ?:? 列出容器pull :? ? 拉取服務鏡像push :? 推送服務鏡像restart :? 重啟服務容器rm? :?? 刪除已停止的服務容器run :?? 對服務運行一次性命令start :? 啟動服務stop :? 停止服務top :? ? 顯示運行的進程unpause : 取消暫停up :?? 創建并啟動容器version : 顯示 docker compose 版本信息
?2.dockercompose案例演示
dockerfile文件編寫
FROM gcc:latest
WORKDIR /app
COPY main.cc .
RUN g++ main.cc -o server
EXPOSE 8080
CMD [ "./server" ]
docker-compose.yml文件編寫
version: '3.8'
services:cpp-server:build: .ports:- "8080:8080"openresty:image: openresty/openresty:alpineports:- "8081:80"volumes:- ./nginx:/etc/nginx/conf.d
openresty_conf文件編寫
server {listen 80;server_name localhost;location / {default_type text/html;content_by_lua_block {ngx.say("Hello from OpenResty!")}}
}
通過docker compose up --build命令執行
?
?
?