參考資料
筆記二之后的Docker內容都參考嗶哩嗶哩的up主:狂神說Java的Docker視頻,在此貼出他的主頁,推薦去看看,講的是真的好
容器數據卷
什么是容器數據卷?先來看看目前Docker容器之間不方便的地方
不方便的數據共享和持久化
- Docker的容器和容器之間數據咋共享啊,我的前台和后台網站的圖片和數據庫都是共享的啊
- 容器中數據庫的數據怎么同步到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 主機目錄:容器目錄,這個是我們最常用的方式
匿名掛載
匿名掛載就是
- -v 容器目錄
- -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就是權限了
- ro : readonly只讀
- 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
- 主機上的/home/tomcat/webapps/test 映射容器的 /usr/local/tomcat/webapps/test
- 主機上的/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
