Docker筆記三:Docker數據卷和DockerFile


參考資料

筆記二之后的Docker內容都參考嗶哩嗶哩的up主:狂神說Java的Docker視頻,在此貼出他的主頁,推薦去看看,講的是真的好

狂神說Java

容器數據卷

什么是容器數據卷?先來看看目前Docker容器之間不方便的地方

不方便的數據共享和持久化

  1. Docker的容器和容器之間數據咋共享啊,我的前台和后台網站的圖片和數據庫都是共享的啊
  2. 容器中數據庫的數據怎么同步到linux主機上

以上兩個問題,很不方便,所以容器數據卷可以解決這些數據的問題

例如我的mysql也是使用docker容器運行的,那我的網站產生的數據都在mysql容器里面

萬一某一天誰不小心把mysql這個容器刪除了,那我的數據豈不是全沒了????

真刪容器跑路

所以數據這一塊,基本都是數據庫這里,我們需要使用容器數據卷,也就是把容器中的mysql之類的數據庫,把數據地址掛載到linux主機上,實現數據的持久化,這樣就安全多了

容器數據卷命令

使用-v來掛載,-p都知道吧暴露的主機端口:軟件的默認端口,-v也是一樣

#運行容器的時候直接使用數據卷掛載
docker run -v 主機目錄:容器目錄 .......

使用容器數據卷使Mysql數據掛載到主機

#mysql的配置文件
/etc/mysql/conf.d
#mysql的數據
/var/lib/mysql

使用的命令還是run的時候起效的

docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql

已經啟動的Mysql可以使用 待補充

具名掛載和匿名掛載

先回顧一下掛載, -v 主機目錄:容器目錄

具名掛載

具名掛載就是-v 主機目錄:容器目錄,這個是我們最常用的方式

匿名掛載

匿名掛載就是

  1. -v 容器目錄
  2. -v 卷名:容器目錄

第一種是沒有直接指定我的主機目錄,相當於讓Docker自動給我分配了主機目錄

第二種也是沒有指定主機目錄,但是我起了個名字,還是讓Docker自動給我分配了主機目錄

注意,起名字的時候不要帶斜杠 vae是名字 /vae就是目錄了

這就是匿名掛載

可以使用

docker volume ls #查看所有的掛載
docker volume inspect #查看掛載的具體信息

通過查看可以發現,在使用匿名掛載的情況下,Docker自動分配的主機目錄都是在

/var/lib/docker/volumes/.....

下面的

數據卷的權限

docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d:ro
docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d:rw

在容器目錄后面加冒號加ro或者rw就是權限了

  1. ro : readonly只讀
  2. rw : read write可讀可寫

數據卷實戰一:tomcat webapps和log映射

拉取一個tomcat鏡像,然后來使用數據卷映射一下webapps文件夾和logs文件夾,映射到我們的主機上的home目錄下

這樣我們以后發布的時候直接發布到linux主機上即可,容器內也會有這些文件

docker run -d -p 8080:8080 --name tomcat -v /home/tomcat/webapps/test:/usr/local/tomcat/webapps/test  -v /home/tomcat/logs/:/usr/local/tomcat/logs tomcat
  1. 主機上的/home/tomcat/webapps/test 映射容器的 /usr/local/tomcat/webapps/test
  2. 主機上的/home/tomcat/logs/ 映射容器的 /usr/local/tomcat/logs

我們新建一個web.xml和index.jsp在主機上的/home/tomcat/webapps/test

web.xml

 <?xml version="1.0" encoding="UTF-8"?>
  <web-app xmlns="http://java.sun.com/xml/ns/javaee"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                               http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
           version="2.5">
  </web-app>

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>shuyunquan</title>
</head>
<body>
Hello World!<br/>
蜀雲泉
    
<%
System.out.println("Hello,我是蜀雲泉 !");
%>
</body>
</html>

然后直接運行 http://192.168.28.128:8080/test/ 換成你們自己的ip + 8080/test

可以看到訪問成功

我們也可以進入到tomcat容器里面

docker exec -it tomcat bash

然后進入到webapps/test下面,創建一個文件啥的,你可以看到主機上的test文件夾也是有的,這兩個地方通過我們的數據卷同步了

DockerFile文件

編寫DockerFile

先熟記指令,必須是大寫,不能寫成小寫

FROM            #指定基礎鏡像
MAINTAINER      #鏡像的作者,一般是 姓名+郵箱
RUN             #運行鏡像
ADD		#添加依賴內容,例如我這個鏡像需要tomcat,就ADD一個tomcat
COPY		#類似ADD,講文件內容拷貝到鏡像中
WORKDIR 	#設置當前的工作目錄
VOLUME		#掛載目錄,和上面的工作目錄不一樣
EXPOSE		#暴露端口,不然run的時候你得-p指定暴露,這里寫了就不需要-p
CMD		#指定容器運行時需要運行的命令,會被替換
ENTRYPOINT	#指定容器運行時需要運行的命令,會被追加
ONBUILD         #繼承DockerFile的時候觸發指令
ENV		#構建的時候設置環境變量

Docker build 構建鏡像

docker build -t mycentos .

Docker run 運行鏡像

docker run -d -p 80:80 --name xxx 鏡像Id

Docker push 發布鏡像

發布到DockerHub

首先得注冊一個賬號,然后

#登錄,回車輸密碼
docker login -u vae
#發布鏡像到Dockerhub,帶上自己的名字和鏡像加版本號
docker push vae/mytomcat:1.0

但是有一個問題,DockerHub畢竟在國外,速度可能有時候還是很慢,可以選擇發布阿里雲

發布到阿里雲

注冊一個阿里雲賬號,然后搜索容器鏡像服務,點進來之后新建命名空間,注意,命名空間最多只能建立3個

然后建立鏡像倉庫,比如我建立的是redis鏡像倉庫

然后下一步,選擇本地倉庫即可

操作阿里雲講的很清楚,你點擊創建的鏡像倉庫會有一些基礎的文檔,很詳細了

$ sudo docker login --username= 
$ sudo docker tag [ImageId] //:[鏡像版本號]
$ sudo docker push //:[鏡像版本號]

DockerFile生成新的Centos鏡像,包含vim,網絡基礎組件

Docker下載的默認的CentOS是精簡版的,沒有vim,沒有ll,沒有ifconfig

可以寫一個DockerFile生成一個新的CentOs鏡像,把這些都加進去,如下

FROM centos
MAINTAINER  Vae<shuyunquan@qq.com>

ENV MYPATH /user/local  #設置環境變量為/user/local
WORKDIR $MYPATH         #設置工作目錄為/user/local

#安裝vim和網絡的基礎組件,比如ifconfig
RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80

CMD echo $MYPATH
CMD echo "---end---"
CMD /bin/bash

執行此DockerFile

docker build -t mycentos .

查看鏡像生成的步驟

docker history 鏡像Id


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM