四川特產,譚八爺冷吃兔 / 牛肉 / 麻辣肉食 4 袋 49.9 元
Docker
概述
Docker 是一個開源的、輕量級的容器引擎,主要運行於 Linux 和 Windows,用於建立、管理和編排容器。
和 VMware 虛擬機器相比,Docker 使用容器承載應用程式,而不使用作業系統,所以它的開銷很少,效能很高。但是,Docker 對應用程式的隔離不如虛擬機器徹底,所以它並不能完全取代 VMware。
組成
映象
docker映象 相當於一個模板, 通過這個模板來建立容器服務,可以建立多個容器
聯合檔案系統
下載B映象時,如果已下載映象A有部分內容重複,那麼這部分內容將複用,複用的部分稱為映象的映象層,而下載的部分為容器層
容器
docker利用容器技術,獨立執行一組應用
啟動 停止 刪除 基本命令
理解為一個簡易的linux系統
倉庫
公有倉庫和私有倉庫 docker hub(預設是國外的)
阿里雲 有容器伺服器(映象加速)
存放映象!
安裝
解除安裝舊的
yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
在linux上安裝docker
軟體包
sudo yum install -y yum-utils
//設定映象倉庫 阿里雲 預設是國外的
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
更新軟體包索引
yum makecache fast
安裝docker
sudo yum install docker-ce docker-ce-cli containerd.io
命令
啟動
systemctl start dockers systemctl start docker.service
檢視版本
docker version
執行hello-world映象
docker run centeros /bin/echo "Hello world"
# Docker 以 ubuntu15.10 映象建立一個新容器,然後在容器裡執行 bin/echo "Hello world",然後輸出結果。
檢視映象
docker images
解除安裝
sudo yum remove docker-ce docker-ce-cli containerd.io
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
幫助命令
幫助文件 https://docs.docker.com/reference/
docker version # 顯示docker版本資訊
docker info # docker系統資訊 包括映象和容器數量
docker 命令 --help #幫助命令
映象命令
docker images 檢視所有本地主機上的映象
#解釋
REPOSITORY 映象的倉庫源
TAG 映象的標籤
IMAGE ID 映象id
CREATED 映象的建立時間
SIZE 映象大小
# 可選項
-a --all # 列出所有映象
-q --quiet # 只顯示id
docker serach 搜尋映象名(如mysql)
--filter=STARS=3000 搜素出來的映象starts大於3000的
例子 docker search mysql --filter=stars=5000
docker pull 下載映象
docker pull 映象名:版本
docker pull mysql等價於
docker pull mysql docker.io/libray/mysql:latest
docker rmi 刪除映象
docker rmi -f 映象id 刪除容器
docker rmi -f 映象id 映象id 映象id 刪除多個容器
docker rmi -f $(docker images -aq) 刪除全部容器
容器命令
有了映象後 才能建立容器
下一個centeros
docker pull centos
新建容器並啟動 ,操作物件是映象, 進入後可修改映象內的檔案
docker run [可選引數] image
#引數
-t 在新容器內指定一個偽終端或終端。
-i 允許你對容器內的標準輸入 (STDIN) 進行互動。
--name="Name" 容器名字
-d 以後臺方式執行 nohup
-it 使用互動方式執行
-p 指定容器的埠 -p 8080:8080
-P 隨機指定埠
--restart alway # always容器退出時重啟 on-failure:容器故障退出(返回值非零)時重啟 no:容器退出時不重啟
-v 宿主機目錄:容器目錄 #
30 [OK]
# 啟動並進入容器
docker run -it centos /bin/bash
exit 會退出並停止容器執行
列出所有執行的容器
docker ps
docker ps #當前正在執行的
-a #加上歷史執行過的
-n=? #顯示最近執行過的
-q #只顯示容器id
退出容器 啟動容器
exit # 停止並退出
Ctrl + P + Q #不停止退出
docker stop 容器id # 退出後 停止執行容器
docker start 容器id
docker restart 容器id
docker kill 容器id #強制..
刪除容器
docker rm 容器id #刪除指定容器
docker rm -f $(docker ps -aq) #刪除所有容器
啟動容器和停止容器
docker start 容器id
docker restart 容器id
docker stop 容器id
docker kill 容器id
進入正在執行的容器
#退出當前容器
exit
# 進入容器 並新起命令列
docker exec -it 容器id bash
#進入正在執行的命令列
docker attach 容器id bash
docker run 和docker exec的區別
- docker run 根據映象建立一個容器,然後操作映象
- docker exec 是進入一個正在執行的容器
根據容器建立一個新映象
docker run -it -p xxx #啟動容器
修改容器內的內容
新開一個視窗
docker commit -m="一次提交的資訊" [要修改的容器id] 新的映象名 #提交映象
docker commit -a='yc9064' -m='docker新映象提交測試' 96dd74b37e87 mynginx:v1
docker images #檢視重新打好的映象
docker run -d -p 8080:80 --name mynginx01 --restart always -v /root/nginx/html:/usr/share/nginx/html mynginx:v1
- -a :提交的映象作者;
- -c :使用Dockerfile指令來建立映象;
- -m :提交時的說明文字;
- -p :在commit時,將容器暫停。
常用其他命令
後臺啟動
docker run -d centos
#發現問題
docker ps 發現停止了
後臺執行 必要有一個前臺程序 docker發現沒有應用會自動停止
常看日誌
例
#執行迴圈指令碼
docker run -d centos /bin/sh -c "while true;do echo hi;sleep 5;donre"
#檢視容器id
docker ps
#檢視輸出的日誌
docker logs -tf --tail 100 容器id
檢視容器中程序資訊
docker top 容器id
3.檢視容器的元資料
docker inspect 容器id
從容器內拷貝檔案到主機
docker cp 容器id:容器內檔案路徑 目的主機的路徑
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-xxSBlhvO-1640666584521)(.\img\1.png)]
阿里雲映象加速
登入阿里雲找到容器映象服務
找到映象加速地址
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://5gw6wzma.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
使用映象
安裝nginx
docker pull nginx
#檢視開放的埠號
firewall-cmd --list-ports
#開放8080埠
firewall-cmd --zone=public --add-port=8080/tcp --permanent
#重啟
firewall-cmd --reload
#-p暴露埠(容器的) -d 後臺執行 -name 給容器取名
#執行 nginx容器, 名字為nginx01 使用機器的8080埠對映到容器的80埠
# --restart always重啟docker後啟動容器
[root@masterServr ~]# docker run -d -p 8080:80 --name nginx01 --restart always -v /root/nginx/html:/usr/share/nginx/html nginx
WARNING: IPv4 forwarding is disabled. Networking will not work.
b435252b28d1b6a6bf944d470102371658744e10f948b6632249d3e59a0b9311
[root@masterServr ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b435252b28d1 nginx "/docker-entrypoint.…" 15 seconds ago Up 14 seconds 0.0.0.0:3344->80/tcp, :::3344->80/tcp nginx01
f67252424cc0 centos "/bin/bash" 18 hours ago Up 18 hours silly_zhukovsky
安裝tomcat
# --rm 停止就刪除 用來測試
docker run -it --rm tomcat:9.0
開放埠號
docker pull tomcat:9.0
docker runn -d -p ...
訪問url,得到tomcat 404頁面
進入容器中的webapp目錄 發現為空
說明tomcat映象被縮減
原因:預設是最小映象,所有不必要的東西都剔除
容器資料卷
問題:如果資料存在容器中,那麼我們刪除容器,資料也一併被刪除了.
需求: 資料可以持久化.
將容器內的目錄掛載到主機上即可
總結: 為了容器的持久化和同步操作,容器間目錄也可以共享
命令 -v 主機目錄:容器目錄
例:
docker run -d -p 8080:80 --name nginx01 --restart always -v /root/nginx/html:/usr/share/nginx/html nginx
具名和匿名掛載
docker run ... -v [容器內目錄] ... # 匿名
docker run ... -v [取個名字]:[容器內目錄]:[檔案許可權 ro/rw] ... # 具名 ro是容器檔案只讀許可權,要改變文字需要走宿主機
docker volume ls # 檢視所有掛載
docker inspect [volumeName]
容器間檔案同步
容器間資訊的傳遞, 比如mysq容器的l資料同步
docker run -it --name docker01 xxx:1.0
#把dcoker02 繫結到docker01 資料同步
docker run -it --name docker02 --volumes-from dcoker01 xxx:1.0
docker run -it --name docker01 mycentos:v1 bash
docker run -it --name docker02 --volumes-from docker01 mycentos:v1 bash
DockerFile
用來構建docker映象的構建檔案,一段命令指令碼
所以 我們不僅可以通過修改容器並commit構建新的映象到本地 ,也可以通過 docker build [dockerfile檔案] 的方式來構建映象
DockerFile構建過程
我們以後釋出專案 ,做映象 就要編寫dockerfile
基礎知識:
1.每個保留關鍵字(指令)必須大寫
2.從上到下執行
3.#表示註釋
4.每一個指令都會建立提交一個新的映象層,並提交
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-RPCpp8pD-1640666584523)(.\img\2.jpg)]
Dockerfile指令詳解
-
FROM
基礎映象, FROM centos
-
MAINTAINER
標註作者和郵箱 FROM liuyinchuan [email protected]
-
RUN
此操作會影響映象
-
RUN [command]
shell中使用/bin/sh執行command 比如 RUN echo '這個容器的映象是通過dockerfile構建的' > readMe.txt
-
RUN ['指定程式','引數1','引數2']
RUN["/bin/bash","-c","echo hello"]
-
-
CMD
CMD用於指定容器啟動時執行的命令,每個Dockerfile只能有一個CMD命令,
構建映象後,若容器啟動時指定了執行的命令,則會覆蓋掉CMD中指定的命令
CMD ['指定程式','引數1','引數2']
-
ENTRYPOINT
與CMD類似
構建映象後,若容器啟動時指定了執行的命令,則會在原來的指令中追加
-
EXPOSE
暴露埠配置 也可 run的時候加上 -p 【埠號】
-
ADD
加入檔案到映象內 如果是壓縮包 會解壓縮
ADD [原始檔路徑] [映象內路徑]
-
COPY
與ADD類似 不會解壓檔案
-
ENV
設定容器環境變數
ENV JAVA_HOME=/usr/local/jdk_1.8.201/
-
WORKDIR
為後續的RUN CMD ENTRYPOINT指定配置工作目錄,可以使用多個WORKDIR指令,若後續指令用得是相對路徑,則會基於之前的命令指定路徑。
WORKDIR /path
FROM #基礎映象,一切從這裡開始構建
MAINTAINER #映象是誰寫的,姓名+郵箱
RUN #映象構建的時候需要執行的命令
ADD #步驟,tomcat映象,這個tomcat的壓縮包!新增內容
WORKDIR #映象的工作目錄
VOLUME #匿名掛載的目錄
EXPOSE #暴露埠配置 也可 run的時候加上 -p 【埠號】
CMD #指定這個容器啟動的時候要執行的命令,只有最後一個會生效,可被替代
ENTRYPOINT #指定這個容器啟動的時候要執行的命令,可以追加命令
ONBUILD #當構建一個被繼承 Dockerfile 這個時候就會執行ONBUILD 的指令
COPY #類似ADD,將我們檔案拷貝到映象中
例:
新建一個dockerfile1
上傳 jdk-8u281-linux-x64.tar.gz
vim dockerfile1
FROM centos # 使用centos作為基礎映象
MAINTAINER OBy [email protected]
ENV MYPATH=/usr/local
WORKDIR $MYPATH
VOLUME ["volume01","volume02","volume03"] #匿名掛載目錄
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo
CMD echo "---end---"
CMD /bin/bash
docker build -f dockerfile1 -t mycentos:v1 . #使用當前目錄的dockerfile構建v1版的mycentos
docker run -it my
構建映象
編寫好dockerfile後, 可構建映象到本地
docker build -t nginx:v3 .
docker build -f dockerfileName -t /filepath .
上下文路徑,是指 docker 在構建映象,有時候想要使用到本機的檔案(比如複製),docker build 命令得知這個路徑後,會將路徑下的所有內容打包。
實戰
Centos
建立名為Dockerfile的檔案,這樣不輸入檔名build的時候會 找到這個檔案
FROM centos:7
MAINTAINER OBy [email protected]
ENV MYPATH=/usr/local
WORKDIR $MYPATH
VOLUME ["volume01","volume02","volume03"]
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo "---end---"
CMD /bin/bash
構建:
docker build -f mydockerfile-centeros -t mycentos:0.1
Tomcat
Dockfile
FROM centos
#作者
MAINTAINER yc [email protected]
#拷貝tomcat jdk 到映象並解壓
ADD apache-tomcat-8.5.73.tar.gz /usr/local/tomcat
ADD jdk-8u281-linux-x64.tar.gz /usr/local/jdk
RUN yum -y install vim
#定義互動時登入路徑
ENV MYPATH /usr/local
WORKDIR $MYPATH
#配置jdk 和tomcat環境變數
ENV JAVA_HOME /usr/local/jdk/jdk1.8.0_281
ENV CATALINA_HOME /usr/local/tomcat/apache-tomcat-8.5.73
ENV CATALINA_BASE /usr/local/tomcat/apache-tomcat-8.5.73
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#設定暴露的埠
EXPOSE 8080
#執行tomcat
CMD /usr/local/tomcat/apache-tomcat-8.5.73/bin/startup.sh && tail -f /usr/local/tomcat/apache-tomcat-8.5.73/logs/catalina.out
docker run -d -p 8080:8080 --name mytomcat -v /usr/local/tomcat/logs:/usr/local/tomcat/apache-tomcat-8.5.73/logs/ -v /usr/local/tomcat/webapps:/usr/local/tomcat/apache-tomcat-8.5.73/webapps/ diytomcat
!