Docker學習之數(shù)據(jù)卷和Dockerfile詳解
一、Docker數(shù)據(jù)管理
在生產環(huán)境中使用 Docker ,往往需要對數(shù)據(jù)進行持久化,或者需要在多個容器之間進行數(shù)據(jù)共享,這必然涉及容器的數(shù)據(jù)管理操作。
容器中的管理數(shù)據(jù)主要有兩種方式:
數(shù)據(jù)卷(Data Volumes):容器內數(shù)據(jù)直接映射到本地主機環(huán)境;
數(shù)據(jù)卷容器(Data Volume Containers): 使用特定容器維護數(shù)據(jù)卷;
如何使用docker cp命令在宿主機和docker容器之間復制文件:
docker cp 宿主機絕對路徑 容器id:路徑
二、數(shù)據(jù)卷
數(shù)據(jù)卷是 Docker容器中用于持久化數(shù)據(jù)的一種機制,它可以將容器內的數(shù)據(jù)存儲到宿主機中,以便在容器被刪除或重新創(chuàng)建時保留數(shù)據(jù)。
它可以提供很多有用的特性:
數(shù)據(jù)卷可以在容器之間共享和重用;
對數(shù)據(jù)卷的修改會立馬生效;
對數(shù)據(jù)卷的更新,不會影響鏡像;
數(shù)據(jù)卷默認會一直存在,即使容器被刪除;
注意:數(shù)據(jù)卷的生命周期獨立于容器的生命周期,因此即使容器被刪除,數(shù)據(jù)卷中的數(shù)據(jù)仍然可以被保留。
創(chuàng)建數(shù)據(jù)卷
docker volume create 數(shù)據(jù)卷名稱
此時,數(shù)據(jù)卷默認會放到 /var/lib/docker/volumes 路徑下,會發(fā)現(xiàn)所新建的數(shù)據(jù)卷位置,查看命令如下:
ls -1 /var/lib/docker/volumes
查看數(shù)據(jù)卷
查看所有的數(shù)據(jù)卷:
docker volume ls
查看指定數(shù)據(jù)卷的詳細信息(顯示一個 JSON 格式的數(shù)據(jù)):
docker volume inspect 數(shù)據(jù)卷名稱
刪除數(shù)據(jù)卷
docker volume rm 數(shù)據(jù)卷名稱
數(shù)據(jù)卷是被設計用來持久化數(shù)據(jù)的,它的生命周期獨立于容器,Docker不會在容器被刪除后自動刪除數(shù)據(jù)卷,并且也不存在垃圾回收這樣的機制來處理沒有任何容器引用的數(shù)據(jù)卷,無主的數(shù)據(jù)卷可能會占據(jù)很多空間,所以要及時刪除。
掛載數(shù)據(jù)卷
創(chuàng)建數(shù)據(jù)卷并掛載中指定容器:
docker run -d \ -it \ --name tomcat01 \ --mount source=my-vol,target=/webapp \ centos:latest
上述命令是將 my-vol 數(shù)據(jù)卷掛載中容器 tomcat01 中的 webapp 目錄。
注意: 1)my-vol 為要掛載的數(shù)據(jù)卷,如果數(shù)據(jù)卷不存在,docker 會自動創(chuàng)建;/webapp 為容器上目錄,如果目錄不存在, docker會自動創(chuàng)建。 2)加了“\”意為將最后的回車換行給注釋了,系統(tǒng)理解為命令還沒有結束,因而是繼續(xù)等待用戶進行輸入,直到讀到結束符,如回車。
使用自定義目錄充當數(shù)據(jù)卷并掛載到指定容器:
docker run -d \ -it \ --name tomcat02 \ --mount type=bind,source=/root/webapp02,target=/root/webapp02 \ centos:latest
--mount 選項的 type 參數(shù)支持三種類型的數(shù)據(jù)卷:
屬性 | 說明 |
---|---|
type=volume | 普通數(shù)據(jù)卷(默認即這種類型),映射到主機/var/lib/docker/volumes路徑下 例如:--mount type=volume,source=my-vol,target=/webapp |
type=bind | 綁定數(shù)據(jù)卷,映射到主機指定路徑下 例如:--mount type=bind,source=/webapp,target=/webapp2 |
type=tmpfs | 臨時數(shù)據(jù)卷,只存在于內存中 例如:--mount type=tmpfs,target=/app |
三、數(shù)據(jù)卷容器
數(shù)據(jù)卷容器是一個特殊的容器,它的主要目的是提供一個持久化的存儲空間,其他容器可以通過掛載這個容器中的數(shù)據(jù)卷來共享數(shù)據(jù)。數(shù)據(jù)卷容器本身不運行任何應用程序,它只是提供一個數(shù)據(jù)卷的存儲空間。
當我們需要在多個容器之間共享數(shù)據(jù)時,可以使用數(shù)據(jù)卷容器。我們可以在一個容器中創(chuàng)建一個數(shù)據(jù)卷容器,并將需要共享的數(shù)據(jù)卷掛載到該容器中,其他容器可以通過掛載該數(shù)據(jù)卷容器中的數(shù)據(jù)卷來訪問這些數(shù)據(jù)。
數(shù)據(jù)卷容器的好處是,它可以提供一個中心化的存儲空間,容器之間可以通過掛載數(shù)據(jù)卷容器中的數(shù)據(jù)卷來共享數(shù)據(jù),而不需要每個容器都去管理數(shù)據(jù)卷。此外,數(shù)據(jù)卷容器可以獨立于其他容器進行管理和維護,可以方便地備份和恢復數(shù)據(jù)。
創(chuàng)建數(shù)據(jù)卷容器
創(chuàng)建一個名為 db_data 的容器,并設定該容器中的數(shù)據(jù)卷為 db_data 目錄。
docker run -it -d --name db_data -v /db_data centos:latest
測試數(shù)據(jù)卷容器
創(chuàng)建一個名為 db1 的容器,并設定數(shù)據(jù)卷容器為 db_data
docker run -it -d --name db1 --volumes-from db_data centos:latest
進入 db1 容器,并在容器的數(shù)據(jù)卷中創(chuàng)建文件測試是否掛載成功:
# 進入db1容器 docker exec -it db1 bash # 切換進數(shù)據(jù)卷 cd db_data # 創(chuàng)建文件 echo "db1 beifen test" > db1_test.txt
這時,可以發(fā)現(xiàn)在容器 db1 中創(chuàng)建的文件,同時出現(xiàn)在了 db_data 容器中的 db_data 數(shù)據(jù)卷目錄中,則證明數(shù)據(jù)卷容器掛載測試成功。
備份數(shù)據(jù)卷容器
新建1個名為 beifen 的(暫時性,之后會刪除)容器,由于 volumes-from 了 db_data ,所以在根目錄下也會生成1個 db_data 文件夾,經過執(zhí)行命令后,將 db_data 文件下的數(shù)據(jù)壓縮在 kongkong 文件夾下,并存在宿主機上的 container_backup 下
docker run --rm --name beifen --volumes-from db_data -v /kongkong:/container_backup centos:latest tar cvf /container_backup/backup.tar /db_data
屬性介紹:
屬性 | 說明 |
---|---|
run | create+start |
--rm | 創(chuàng)建之后刪除容器 |
--name | 容器名稱 |
--volumes-from | 來自于哪個數(shù)據(jù)卷容器的容器NAME |
-v | 給容器掛載存儲卷,掛載到容器的某個目錄 |
還原數(shù)據(jù)卷容器
新建一個數(shù)據(jù)卷容器 db_data2 :
docker run -it -d --name db_data2 -v /db_data centos:latest
新建1個名為 huanyuan 的(暫時性,之后會刪除)容器,由于 volumes-from 了 db_data2,所以在根目錄下也會生成1個 db_data 文件夾,宿主機上的 host_backup 目錄映射到了容器中的 container_backup 文件夾下,并解壓至 db_data 文件夾下
docker run --rm --name huanyuan --volumes-from db_data2 -v ~/host_backup:/container_backup centos:latest tar xvf /container_backup/backup.tar -C /db_data
四、Dockerfile
什么是Dockerfile
Dockerfile 是用來構建 Docker 鏡像的文本格式的配置文件,是由一系列命令參數(shù)構成的腳本。
總之,用戶可以使用 Dockerfile 來快速創(chuàng)建自定義的鏡像。
基本結構
Dockerfile 由一行行命令語句組成, 并且支持以#開頭的注釋行,一般而言, Dockerfile 主體內容分為四部分: 基礎鏡像信息、 維護者信息、 鏡像操作指令和容器啟動時執(zhí)行指令。
部分 | 命令 |
---|---|
基礎鏡像信息 | FROM` |
維護者信息 | MAINTAINER` |
鏡像操作指令 | RUN、(COPY/ADD)、EXPOSE、WORKDIR、ONBUILD、USER、VOLUME等 |
容器啟動時執(zhí)行指令 | CMD、ENTRYPOINT |
常用指令
指令名稱 | 說明 | 格式示例 |
---|---|---|
FROM | 定義基礎鏡像 | FROM <image_name>:<tag> |
MAINTAINER` | 定義鏡像作者 | MAINTAINER <author_name> |
RUN | 在鏡像中執(zhí)行命令 | RUN <command> |
CMD | 定義容器啟動后默認執(zhí)行的命令 | CMD <command> |
EXPOS | 指定容器對外暴露的端口 | EXPOSE <port> |
ENV | 設置環(huán)境變量 | ENV <key> <value> |
ADD | 將本地文件添加到鏡像中 | ADD <source> <destination> |
COPY | 將本地文件復制到鏡像中 | COPY <source> <destination> |
WORKDIR | 指定容器內的工作目錄 | WORKDIR <path> |
注意:ADD和COPY的區(qū)別!ADD命令用于復制操作,但是會對壓縮文件(tar, gzip, bzip2, etc)做提取和解壓操作;而COPY僅限于復制。
快速入門
啟動虛擬機,進入 CentOS7 系統(tǒng)。創(chuàng)建文件夾上傳 jdk 的安裝包:
# 創(chuàng)建文件夾 mkdir -p /ceshi/java # 使用rz命令上傳jdk安裝包 rz jdk-8u221-linux-x64.tar.gz
將 jdk-8u221-linux-x64.tar.gz 上傳到 Linux 或者使用 cp 命令復制一個本地已經有的 jdk-8u221-linux-x64.tar.gz 文件到指定目錄中。
在同級目錄下創(chuàng)建 Dockerfile 文件。
touch Dockerfile
注意:Dockerfile 文件沒有后綴,文件名D必須是大寫。
編寫Dockerfile文件
指定基礎鏡像,并且必須是第一條指令:
FROM centos:latest
指明該鏡像的作者和其電子郵件:
MAINTAINER kongkong "kongkong@qq.com"
在構建鏡像時,指定鏡像的工作目錄,之后的命令都是基于此工作目錄,如果不存在,則會創(chuàng)建目錄:
WORKDIR /ceshi/java
把jdk
安裝文件復制到鏡像中,并完成解壓操作:
ADD jdk-8u151-linux-x64.tar.gz /ceshi/java/
注:如果在宿主機的當前路徑下,文件直接使用相對路徑即可;
配置環(huán)境變量:
ENV JAVA_HOME=/ceshi/java/jdk1.8.0_151 ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV PATH=$JAVA_HOME/bin:$PATH
構建鏡像并測試
docker build -t jdk8:v1.0 .
-t jdk8:v1.0 用于給新構建的鏡像取名為jdk8 , 并設定版本為 v1.0 ;注意最后有個點,代表使用當前路徑的 Dockerfile 進行構建 。
查看鏡像:
docker images
創(chuàng)建并啟動容器:
docker run -it jdk8:v1.0 /bin/bash
測試:
java -version
總結
到此這篇關于Docker學習之數(shù)據(jù)卷和Dockerfile的文章就介紹到這了,更多相關Docker數(shù)據(jù)卷和Dockerfile內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
如何使用docker創(chuàng)建minio鏡像并上傳文件并提供demo
這篇文章主要介紹了使用docker創(chuàng)建minio鏡像并上傳文件,提供demo,minio還是很方便的,從部署到使用,都可以非??焖俚拇罱?而且比較穩(wěn)定,需要的朋友可以參考下2023-09-09Docker?link實現(xiàn)容器互聯(lián)的方式
通過link方式創(chuàng)建容器,然后我們可以使用被link容器的別名進行訪問。本文重點給大家介紹Docker?link實現(xiàn)容器互聯(lián)的方式,感興趣的朋友一起看看吧2021-12-12Navicat 連接服務器端中的docker數(shù)據(jù)庫的方法
這篇文章主要介紹了Navicat 連接服務器端中的docker數(shù)據(jù)庫,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03Docker鏡像的遷移與備份及Dockerflie 使用方法詳解
遷移和備份主要有三個操作命令將容器保存為鏡像、備份鏡像(將鏡像導出為一個文件)、鏡像的遷移與恢復,這篇文章主要介紹了Docker鏡像的遷移與備份、Dockerflie 使用方法,需要的朋友可以參考下2022-07-07