1. 程式人生 > 資訊 >四川特產,譚八爺冷吃兔 / 牛肉 / 麻辣肉食 4 袋 49.9 元

四川特產,譚八爺冷吃兔 / 牛肉 / 麻辣肉食 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

!