一、單容器
1.1概念簡介
Docker三個重要概念:
- 倉庫(Repository);?
- 鏡像(Image);?
- 容器(Container).?*Docker的三個重要概念是倉庫(Repository)、鏡像(Image)和容器(Container)**。具體如下:
- ?**鏡像(Image)**:Docker鏡像是創建容器的基礎,它類似于虛擬機的鏡像,是一個只讀的模板,包含了操作系統、軟件運行環境以及用戶應用程序。鏡像是用于創建Docker容器的藍圖,通過版本管理和增量文件系統,Docker提供了一套簡單的機制來創建和更新現有的鏡像。
- ?**容器(Container)**:Docker容器是從鏡像創建的應用運行實例。容器可以啟動、開始、停止和刪除,而且它們之間是相互隔離的,互不影響。容器利用了Linux內核的特性來實現應用的運行和隔離,因此相比傳統的虛擬化技術,容器更加輕量級,啟動速度快,資源消耗少。可以把容器看作是由鏡像這個“類”實例化出的一個獨立運行的“對象”。
- ?**倉庫(Repository)**:Docker倉庫用來集中存放和管理鏡像文件,類似于代碼倉庫。倉庫分為公共倉庫和私有倉庫。公共倉庫如Docker Hub提供了大量的官方和第三方鏡像供用戶下載使用。私有倉庫則是企業內部用于存儲自己創建的鏡像的地方,通常用于提高鏡像下載的速度和安全性。
1.2底層原理
Docker是一個Client-Server結構的系統,Docker的守護進程運行在主機上。通過Socket從客戶端訪問!
DockerServer接收到Docker-Client的指令,就會執行這個命令!
1.3Docker基本命令?
Docker指令處理單條使?外,還?持賦值、解析變量、嵌套使?.
Docker指令的基本?法?
docker + 命令關鍵字(COMMAND) + 參數?
docker pull <image>
:從注冊表(如Docker Hub)下載映像。docker build -t <image_name> <path>
:從Dockerfile構建映像,其中<path>
是包含Dockerfile的目錄。docker image ls
:列出本地計算機上可用的所有映像。docker run -d -p <host_port>:<container_port> --name <container_name> <image>
:從映像運行容器,將主機端口映射到容器端口。docker container ls
:列出所有正在運行的容器。docker container stop <container>
:停止正在運行的容器。docker container rm <container>
:從本地計算機中刪除已停止的容器。docker image rm <image>
:從本地計算機中刪除映像。
-----幫助命令-----
docker version ?# docker版本信息
docker info ? ? # 系統級別的信息,包括鏡像和容器的數量
docker 命令 --help?
docker info
docker info
命令用于獲取Docker的系統信息,包括版本、容器數量、存儲驅動、網絡配置等。以下是一些常見的輸出信息:
Containers:
?當前運行的容器數量。Images:
?當前存在的鏡像數量。Storage Driver:
?使用的存儲驅動名稱和版本號。System Time:
?系統時間。ID:
?Docker守護進程的ID。Logging Driver:
?日志驅動程序的名稱和版本號。Cgroup Driver:
?Cgroup驅動程序的名稱和版本號。Operating System:
?操作系統的名稱和版本號。Kernel Version:
?內核版本號。Architecture:
?CPU架構(x86_64)。CPUs:
?CPU核心數。Total Memory:
?總內存大小。Name:
?Docker主機名。Labels:
?Docker主機標簽。
-----鏡像命令-----
docker search
docker search
命令用于在Docker Hub上搜索鏡像。以下是一些常見的輸出信息:
NAME
: 鏡像名稱。DESCRIPTION
: 鏡像描述。STARs
: 該鏡像的收藏數·。IS FOR
: 該鏡像適用的平臺。OFFICIAL
: 是否為官方鏡像。AUTOMATION
: 是否支持自動化構建。LAST UPDATED
: 最后更新時間。
docker images
docker images
命令用于列出本地主機上的所有Docker鏡像。以下是一些常見的輸出信息:
REPOSITORY
: 鏡像倉庫名稱。TAG
: 鏡像標簽。IMAGE ID
: 鏡像ID。CREATED
: 創建時間。SIZE
: 鏡像大小。
docker rmi
`docker rmi`命令用于刪除本地的一個或多個Docker鏡像。
以下是一些常見的用法示例:
1. 刪除單個鏡像:
?docker rmi myimage:latest
2. 同時刪除多個鏡像:
?docker rmi myimage:latest myrepo/myotherimage:v1.0
3. 強制刪除鏡像(包括正在運行的容器所使用的鏡像):
?docker rmi -f myimage:latest
4. 刪除所有未使用的鏡像:
?docker image prune -a
在執行`docker rmi`命令時,需要注意以下幾點:
- ?如果指定的鏡像正在被容器使用或存在依賴關系,則無法直接刪除。在這種情況下,可以先停止并刪除相關容器,然后再嘗試刪除鏡像。
- ?使用`-f`選項可以強制刪除鏡像,但這可能會導致數據丟失,因此請謹慎使用。
- -`docker rmi`命令與`docker rm`命令不同,`docker rm`用于刪除容器,而`docker rmi`用于刪除鏡像。
??docker pull
`docker pull`命令用于從Docker Hub或其他Docker鏡像倉庫下載一個或多個鏡像到本地。
以下是一些常見的用法示例:
1. 下載單個鏡像:
?docker pull nginx
2. 同時下載多個鏡像:
?docker pull nginx redis
3. 指定版本號下載鏡像:
?docker pull nginx:1.19.0
4. 使用標簽(tag)下載鏡像:
?docker pull nginx:alpine
5. 從私有倉庫下載鏡像:
?docker pull myregistry.com/myrepo/myimage:latest
6. 在下載過程中顯示進度信息:
?docker pull --progress nginx
7. 指定下載時的代理服務器:
docker pull --proxy=http://myproxy.com:8080 nginx
-----容器命令-----
docker ps
docker ps
命令用于列出當前運行的Docker容器。以下是一些常見的輸出信息:
CONTAINER ID
: 容器ID。IMAGE
: 鏡像名稱和標簽。COMMAND
: 啟動容器時執行的命令。CREATED
: 容器創建時間。STATUS
: 容器狀態,如“Up”表示正在運行,“Exited”表示已停止。PORTS
: 容器暴露的端口號和綁定的主機端口號。NAMES
: 容器名稱。
docker ps —no-trunc
`docker ps --no-trunc`命令用于列出所有正在運行的Docker容器,并顯示完整的容器信息。
?docker run
?`docker run`命令用于從Docker鏡像創建并啟動一個新的容器。
以下是一些常見的用法示例:
1. 運行一個基于Ubuntu的容器,并在其中執行bash shell:
?docker run -it ubuntu bash
2. 運行一個基于Nginx的容器,并將主機的80端口映射到容器的80端口:
?docker run -d -p 80:80 --name mynginx nginx
3. 運行一個基于Python的容器,并將當前目錄掛載到容器的/app目錄:
?docker run -v $(pwd):/app python myscript.py
4. 運行一個基于Node.js的容器,并將容器的8080端口映射到主機的8080端口:
?docker run -d -p 8080:8080 --name mynodejs node myapp.js
在執行`docker run`命令時,需要注意以下幾點:
- `-d`選項表示以后臺模式運行容器。
- `-p`選項用于將主機的端口映射到容器的端口。
- `--name`選項用于指定容器的名稱。
- `-v`選項用于將主機的目錄或文件掛載到容器中。
- `CMD`和`ENTRYPOINT`指令用于指定容器啟動時要執行的命令。
?docker run運行原理
docker start/stop
docker start 容器id ? ? ? ? ? # 啟動容器
docker restart 容器id ? ? ? ? # 重啟容器
docker stop 容器id ? ? ? ? ? ?# 停止當前正在運行的容器
docker kill 容器id ? ? ? ? ? ?# 強制停止當前的容器
退出容器
exit ? ? ? ? ? ?# 直接退出容器并關閉
Ctrl + P + Q ? ?# 容器不關閉退出
后臺啟動容器
# 命令 docker run -d 鏡像名
[root@iZ2zeg4ytp0whqtmxbsqiiZ /]# docker run -d centos
?
# 問題 docker ps, 發現centos停止了
?
# 常見的坑, docker 容器使用后臺運行, 就必須要有一個前臺進程,docker發現沒有應用,就會自動停止
# nginx, 容器啟動后,發現自己沒有提供服務,就會立即停止,就是沒有程序了
總結
每個容器被創建之后,都會分配?個ContainerID作為容器的唯?標識,后續對容器的啟動、停?、修改、刪除等操作,都可以通過這個ID來完成.
?1.4常見單容器命令
查看日志
docker logs -tf --tail number 容器id
?查看容器中進程信息ps
# 命令 docker top 容器id
具體來說:
- UID: 用戶ID,表示啟動該進程的用戶。
- PID: 進程ID,是操作系統中唯一標識一個進程的數字。
- PPID: 父進程ID,即創建當前進程的進程的ID。
- C: CPU使用率,顯示了進程自創建以來占用CPU的時間。
- STIME: 進程開始時的系統時間。
- TTY: 終端類型,? 表示沒有關聯到特定的終端設備。
- TIME: 進程消耗的CPU時間總和。
- CMD: 啟動進程的命令行。
查看鏡像的元數據
docker inspect 容器id
?進入當前正在運行的容器
# 我們通常容器使用后臺方式運行的, 需要進入容器,修改一些配置
?
# 命令
docker exec -it 容器id /bin/bash
?從容器中拷貝文件到主機
docker cp 容器id:容器內路徑 目的地主機路徑[root@iZ2zeg4ytp0whqtmxbsqiiZ /]# docker cp 7af535f807e0:/home/Test.java /home
1.5docker run的參數和選項
?
?二、docker-compose介紹
2.1基礎介紹
?個項?的完整環境包括:
- 應?(app);?
- 數據庫(MySQL);?
- 緩存(Redis).?
例如?
docker-compose
?容器編排?具,允許?戶在?個模版(YAML格式)中定義?組相關聯的容器,會根據--link等參數對啟動的優先級進?排序.?
2.2主從架構
讀寫分離實現?式
基于程序實現;?
基于MySQL?帶主從同步機制.
節點說明
binlog?
- 記錄master節點‘增刪改查’語句;?
relaybinlog?
- 記錄從master復制過來的SQL語句;?
I/O Thread?
- ?于與master節點通信,傳輸SQL語句信息;?
SQL Thread?
- ?于從relaybinlog?件中讀取SQL,并在salve中執?.
2.3binary log相關命令?
?2.4主從同步的作?
1.實時災備;?
2.?于故障切換;?
3.讀寫分離負載均衡;?
4.業務隔離.
主從同步可能引發的問題
1.數據?致性問題;?
2.從庫更新延遲問題.?
MySQL可選的主從架構
三、?Docker鏡像特性
3.1Docker鏡像特性?
- 容器創建時需要制定鏡像,每個鏡像都有唯?的標示Image ID;?
- 與Container ID類似,默認都是128位的,可以使?前16位縮略形式;?
- 也可以使?鏡像名與版本號(TAG)兩部分組成唯?標識,如果忽略TAG,默認使?latest.?
?鏡像的分層?
- 已有的分層只能讀不能修改;
- 上層鏡像優先級?于底層鏡像.
3.2Docker鏡像加載原理
3.3Dockerfile?
dockerfile是用來構建dokcer鏡像的文件!命令參數腳本!
Dockerfile由?條?條的指令組成,每條指令都對應Linux下的?條命令. Docker程序將這些Dockerfile指令翻譯成真正的Linux命令. Dockerfile有??書寫的格式和?持的命令,Docker程序解決這些命令間的依賴關系,類似于Makefile. Docker程序讀取Dockerfile,根據指令?成定制的image.?
docker build -t lowyard/jdk-tomcat .
另外一種方法
容器 -> 鏡像?
docker commit ContainerID?
ImageName:ImageTag???作在前臺的進程(?少?個)!!!
構建步驟:
1、編寫一個dockerfile文件
2、docker build構建成為一個鏡像
3、docker run運行鏡像
4、docker push發布鏡像(DockerHub、阿里云鏡像倉庫!)
基礎知識:
1、每個保留關鍵字(指令)都是必須是大寫字母
2、執行從上到下順序執行
3、#表示注釋
4、每一個指令都會創建提交一個新的鏡像層,并提交!?
基礎指令
CMD和ENTRYPOINT的區別
追加命令,是直接拼接在我們的ENTRYPOINT命令的后面
?3.3實戰構建cenos
編寫一個dockerfile文件
docker build構建成為一個鏡像
docker build -f mydockerfile-cento-test -t mycentos:0.1 .
?docker run運行鏡像
?3.4實戰構建tomcat
基礎知識TomCat目錄結構說明
#TomCat目錄結構說明:
bin:該目錄存放TomCat二進制可執行文件,常用的有startup.bat和shutdown.bat文件,startup.bat用來啟動Tomcat,shutdown.bat用來停止Tomcat;
conf:TomCat服務器的配置目錄,主要有server.xml(配置服務器信息,如修改端口號,添加虛擬主機等)、tomcat-users.xml(TomCat用戶與角色信息,對TomCat后臺管理)和web.xml(Web項目部署描述符文件);
lib:Tomcat所需的jar包; logs:存放TomCat的日志文件;
temp:存放Tomcat的臨時文件; webapps:存放所部署的Web項目; work:存放Web項目部署運行時生成的文件,如java和class文件; RUNNING.txt:可查看如何配置TomCat環境變量。
1、準備鏡像文件tomcat壓縮包,jdk的壓縮包!
2、編寫dockerfile.文件
FROM centos:7
MAINTAINER yanyu<1994124137@qq.com>ADD jdk-8u201-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.86.tar.gz /usr/local/RUN yum -y install vimENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_201
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarENV CATALINA_HOME /usr/local/apache-tomcat-9.0.86
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.86
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/binEXPOSE 8080CMD /usr/local/apache-tomcat-9.0.86/bin/startup.sh &tail -F /usr/local/apache-tomcat-9.0.86/logs/catalina.out
?3、構建鏡像
?4.測試運行
docker run -d -p 8088:8080 --name diytomcat -v /home/yanyu/build/tomcat/test:/usr/local/apache-tomcat-9.0.86/webapps/test -v /home/yanyu/build/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.86/logs diytomcat
在Docker中運行一個名為diytomcat的鏡像,并將容器命名為diytomcat。容器的8088端口映射到主機的8088端口。同時將主機上的/home/yanyu/build/tomcat/test目錄掛載到容器中的/usr/local/apache-tomcat-9.0.86/webapps/test目錄,將主機上的/home/yanyu/build/tomcat/tomcatlogs/目錄掛載到容器中的/usr/local/apache-tomcat-9.0.86/logs目錄。
注意防火墻8088端口開啟和8080是tomcat默認端口
-
訪問測試
-
發布項目(由于做了卷掛載, 我們直接在本地編寫項目就可以發布了)
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"></web-app>
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>hello. xiaofan</title>
</head>
<body>
Hello World!<br/>
<%
System.out.println("-----my test web logs------");
%>
</body>
</html>
發現:項目部署成功, 可以直接訪問ok!
我們以后開發的步驟:需要掌握Dockerfile的編寫! 我們之后的一切都是使用docker進行來發布運行的!
四、容器數據卷
4.1?docker的理解回顧
將應用和環境打包成一個鏡像!
數據?如果數據都在容器中,那么我們容器刪除,數據就會丟失!需求:數據可以持久化
MySQL,容器刪了,刪庫跑路!需求:MySQL數據可以存儲在本地!
容器之間可以有一個數據共享技術!Docker容器中產生的數據,同步到本地!
這就是卷技術,目錄的掛載,將我們容器內的目錄掛載到linux目錄上面!
**總結: **容器的持久化和同步操作!容器間數據也是可以共享的!
4.2?使用數據卷
直接使用命令來掛載 -v
docker run -it -v 主機目錄:容器目錄
實戰:安裝MySQL
1.獲取鏡像
2.運行容器
docker run -d -p 3304:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456b --name diymysql mysql
-d ? ? ?# 后臺運行
-p ? ? ?# 端口隱射
-v ? ? ?# 卷掛載
-e ? ? ?# 環境配置
--name ?# 容器的名字
匿名和具名掛載
匿名掛載
-v 容器內路徑
docker run -d -P --name nginx01 -v /etc/nginx nginx # -P 隨機指定端口
這種情況就是匿名掛載,我們在-v 后面只寫了容器內的路徑,沒有寫容器外的路徑!
查看所有volume的情況
docker volume
命令用于管理Docker卷
Docker卷是Docker容器中持久化存儲數據的一種方式,它允許在容器之間共享和重用數據。使用Docker卷,可以將容器內的數據與宿主機進行分離,實現數據的持久化和遷移。
以下是一些常用的
docker volume
命令:
創建卷:使用
docker volume create
命令可以創建一個新卷。例如,要創建一個名為myvolume
的卷,可以使用以下命令:docker volume create myvolume
列出卷:使用
docker volume ls
命令可以列出所有可用的卷。例如,要列出所有的卷,可以使用以下命令:docker volume ls
查看卷信息:使用
docker volume inspect
命令可以查看指定卷的詳細信息。例如,要查看名為myvolume
的卷的信息,可以使用以下命令:docker volume inspect myvolume
刪除卷:使用
docker volume rm
命令可以刪除一個或多個卷。例如,要刪除名為myvolume
的卷,可以使用以下命令:docker volume rm myvolume
掛載卷到容器:使用
docker run
命令時,可以通過-v
選項將卷掛載到容器中。例如,要將名為myvolume
的卷掛載到容器的/data
目錄,可以使用以下命令:docker run -d --name mycontainer -v myvolume:/data myimage
通過使用
docker volume
命令,你可以方便地管理Docker卷,并在容器之間共享和重用數據。
具名掛載
所有docker容器內的卷,沒有指定目錄的情況下都是在
/var/lib/docker/volumes/xxxxx/_data
我們通過具名掛載可以方便的找到我們的一個卷,大多數情況下使用的是
具名掛載
總結
# 如何確定是具名掛載還是匿名掛載,還是指定路徑掛載!
-v 容器內路徑 # 匿名掛載
-v 卷名:容器內路徑 # 具名掛載
-v /主機路徑:容器內路徑 # 指定路徑掛載
拓展
# 通過 -v 容器內容路徑 ro rw 改變讀寫權限
ro readonly # 只讀
rw readwrite # 可讀可寫?
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx
?
# ro 只要看到ro就說明這個路徑只能通過宿主機來操作,容器內容無法操作
DockerFile容器
數據卷容器
多個mysql同步數據!
--volumes-from
`--volumes-from` 是一個在 Docker 命令中使用的標志,它允許你從一個或多個容器掛載(共享)卷。使用這個標志,你可以讓新的容器訪問其他容器中已經定義的卷,從而重用數據和配置。
以下是 `--volumes-from` 標志的一些典型用途:
1. **創建新容器時掛載現有容器的卷**:
? ?當你運行一個新容器時,可以使用 `--volumes-from` 標志來指定一個或多個現有容器的名字,從而掛載那些容器的卷到新容器中。
? ?
? ?例如,如果你有一個名為 `my_existing_container` 的容器,并且你想創建一個新的容器 `my_new_container` 來共享 `my_existing_container` 的卷,你可以運行以下命令:
? ??docker run -d --name my_new_container --volumes-from my_existing_container my_image
? ?這將會啟動 `my_new_container` 并掛載 `my_existing_container` 的所有卷到新容器中。
2. **管理卷的生命周期**:
? ?由于卷是獨立于容器的生命周期的,使用 `--volumes-from` 可以幫助你在容器之間遷移數據,甚至在容器被刪除后保留數據。3. **實現容器間的數據共享**:
? ?如果你想要在多個容器之間共享數據,而不是通過外部存儲或者網絡,`--volumes-from` 提供了一種方便的機制來實現這一點。需要注意的是,從 Docker 1.9 開始,`--volumes-from` 的功能被 `--mount` 標志所取代,后者提供了更加靈活和強大的卷掛載選項。因此,對于較新版本的 Docker,建議使用 `--mount` 而不是 `--volumes-from`。
例如,使用 `--mount` 的替代命令可能是這樣的:
docker run -d --name my_new_container \ --mount source=my_existing_container,target=/data,type=volume my_image
在這個命令中,`source` 參數指定了現有容器的名字,`target` 參數指定了在新容器中掛載的路徑,`type` 參數指定了掛載類型為 `volume`。
結論
容器之間配置信息的傳遞, 數據卷容器的聲明周期一直持續到沒有容器使用為止。
但是一旦你持久化到了本地,這個時候,本地的數據是不會刪除的!
五、Docker倉庫
Docker Hub
?1.地址?注冊自己的賬號
2.確定這個賬號可以登錄
3.在我們的服務器上提交自己的鏡像
阿里云鏡像
- 登錄阿里云
- 找到容器鏡像服務
- 創建命名空間
commit鏡像
docker commit 提交容器成為一個新的版本# 命令和git 原理類似
docker commit -m="提交的描述信息" -a="作者" 容器id 目標鏡像名:[TAG]docker commit -a="xiaofan" -m="add webapps app" d798a5946c1f tomcat007:1.0