Docker容器資料卷、Dockerfile

pin-csdn發表於2020-09-29

由於我測試的環境是win10,掛載的目錄發現有些限制(例如:測試發現掛載不到D盤)

1、【容器資料卷】

容器之間可以有一個資料共享的技術!Docker容器中產生的資料,同步到本地!
這就是卷技術!目錄的掛載,將我們容器內的目錄,掛載到Linux上面(或window上面)!
在這裡插入圖片描述

【docker run -it -v /c/Users/gaoqiang/docker.sync.folder/:/home centos /bin/bash】

在window中測試,只能掛載盤到使用者的目錄,例如:docker@default:/c/Users/gaopinqiang$ 測試如果
-v /d/test 只是掛載到docker主機裡面的目錄。window本機目錄並不會建立這個檔案。 這個時候我們在容器中的/home目錄建立檔案,window本機中的這個目錄也會同步

可以通過 【docker inspect 容器id】 檢視是否掛載成功。

"Mounts": [
	{
		"Type": "bind",
		"Source": "/c/Users/gaopinqiang/docker.sync.folder",
		"Destination": "/home",
		"Mode": "",
		"RW": true,
		"Propagation": "rprivate"
	}
],

停止容器,在本機修改檔案,啟動容器後仍然是同步的。

[root@947bc6d88b40 home]# cat test.java
modify by window
[root@947bc6d88b40 home]#

好處:我們以後修改只需要在本地修改即可,容器內會自動同步!

2、【實戰:安裝MySQL】

【docker run -e MYSQL_ROOT_PASSWORD=123456 -v /c/Users/gwx284438/mysql/conf:/etc/mysql/conf.d -p 3307:3306  -d mysql:5.7】
發現將/var/lib/mysql掛載到我們本地會出現啟動mysql失敗問題。掛載到docker的目錄不會。

【docker run -e MYSQL_ROOT_PASSWORD=123456 -v /c/Users/gwx284438/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -p 3307:3306  -d mysql:5.7】
這個時候mysql的資料會同步到docker的/home/mysql/data目錄

備註:即使刪除了mysql容器。後面再建立掛載相同的data目錄的話,表資料還在。

3、【具名和匿名掛載】
匿名掛載:-v 容器內路徑

	docker run -d -P --name nginx01 -v /etc/nginx nginx

	# 檢視所有的volume的情況
	➜  ~ docker volume ls    
	DRIVER              VOLUME NAME
	local               33ae588fae6d34f511a769948f0d3d123c9d45c442ac7728cb85599c2657e50d
	local            
	# 這裡發現,這種就是匿名掛載,我們在 -v只寫了容器內的路徑,沒有寫容器外的路徑!

具名掛載:通過 -v 卷名:容器內路徑

	➜  ~ docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
	➜  ~ docker volume ls                  
	DRIVER              VOLUME NAME
	local               juming-nginx

	# 通過 -v 卷名:容器內路徑
	# 檢視一下這個卷【docker volume inspect juming_nginx】
	$ docker volume inspect juming_nginx
	[
		{
			"CreatedAt": "2020-09-27T06:24:10Z",
			"Driver": "local",
			"Labels": null,
			"Mountpoint": "/mnt/sda1/var/lib/docker/volumes/juming_nginx/_data",
			"Name": "juming_nginx",
			"Options": null,
			"Scope": "local"
		}
	]

所有的docker容器內的卷,沒有指定目錄的情況下都是在/var/lib/docker/volumes/xxxx/_data下。

如果指定了目錄,docker volume ls 是檢視不到的(例如我們之前寫的 -v /home/nginx:/etc/nginx nginx)

三種掛載: 匿名掛載、具名掛載、指定路徑掛載

-v 容器內路徑			#匿名掛載
-v 卷名:容器內路徑		#具名掛載
-v /宿主機路徑:容器內路徑 #指定路徑掛載 docker volume ls 是檢視不到的,已斜杆開始

4、【資料卷容器】–volumes-from
一個容器直接使用另一個容器的資料卷,可以讓多個MySQL同步資料!
在這裡插入圖片描述

例如:

啟動第一個mysql容器,埠3307
	【docker run -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -p 3307:3306  -d mysql:5.7】
加上--volumes-from引數啟動第二個mysql ,埠3308
	【docker run -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 -p 3308:3306 --volumes-from mysql01 -d mysql:5.7】

window上測試的時候能正常啟動2個mysql,但是第二個mysql使用HeidiSQL工具連線不上問題。

結論:
容器之間的配置資訊的傳遞,資料卷容器的生命週期一直持續到沒有容器使用為止。
但是一旦你持久化到了本地,這個時候,本地的資料是不會刪除的!

5、【DockerFile介紹】
dockerfile是用來構建docker映象的檔案!命令引數指令碼!
構建步驟:

1、 編寫一個dockerfile檔案
2、 docker build 構建稱為一個映象
3、 docker run執行映象
4、 docker push釋出映象(DockerHub 、阿里雲倉庫)

DockerFile構建過程:

1、每個保留關鍵字(指令)都是必須是大寫字母
2、執行從上到下順序
3、#表示註釋
4、每一個指令都會建立提交一個新的映象曾,並提交!

在這裡插入圖片描述

【DockerFile的指令】

FROM				# 基礎映象,一切從這裡開始構建
MAINTAINER			# 映象是誰寫的, 姓名+郵箱
RUN					# 映象構建的時候需要執行的命令
ADD					# 步驟,tomcat映象,這個tomcat壓縮包!新增內容 新增同目錄
WORKDIR				# 映象的工作目錄
VOLUME				# 掛載的目錄
EXPOSE				# 保留埠配置
CMD					# 指定這個容器啟動的時候要執行的命令,只有最後一個會生效,可被替代。
ENTRYPOINT			# 指定這個容器啟動的時候要執行的命令,可以追加命令
ONBUILD				# 當構建一個被繼承 DockerFile 這個時候就會執行ONBUILD的指令,觸發指令。
COPY				# 類似ADD,將我們檔案拷貝到映象中
ENV					# 構建的時候設定環境變數!

【Dockerfile實戰測試】建立自己的centos

# 1、編寫Dockerfile檔案
	FROM centos
	MAINTAINER gaoqiang<gaoqiang@huawei.com>

	ENV MYPATH /usr/local
	WORKDIR $MYPATH

	EXPOSE 80

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

# 2、通過這個檔案構建映象(特別注意後面有個.)
	# 命令 docker build -f 檔案路徑 -t 映象名:[tag] .
	【docker build -f mydockerfile-centos -t qiang_centos:1.0 .】
	成功會有下面的列印:
		Successfully built c1cdfa249f94
		Successfully tagged qiang_centos:1.0
	
# 3、測試執行。啟動我們的centos,可以看到WORKDIR $MYPATH這個生效了。
	$ docker run -it qiang_centos:1.0
	[root@8c156c8536e5 local]# pwd
	/usr/local
	[root@8c156c8536e5 local]#

通過【docker history id】可以檢視構建的歷史
	$ docker history qiang_centos:1.0
	IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
	c1cdfa249f94        6 minutes ago       /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "/bin   0B
	02641c0cd60b        6 minutes ago       /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo   0B
	13820e2c4c5f        6 minutes ago       /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo   0B
	ac4421f35831        6 minutes ago       /bin/sh -c #(nop)  EXPOSE 80                    0B
	7720b56e0b43        6 minutes ago       /bin/sh -c #(nop) WORKDIR /usr/local            0B
	12c15d13d87f        6 minutes ago       /bin/sh -c #(nop)  ENV MYPATH=/usr/local        0B
	082e5849d94b        6 minutes ago       /bin/sh -c #(nop)  MAINTAINER gaoqiang<gaoqi   0B
	0d120b6ccaa8        6 weeks ago         /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B
	<missing>           6 weeks ago         /bin/sh -c #(nop)  LABEL org.label-schema.sc   0B
	<missing>           6 weeks ago         /bin/sh -c #(nop) ADD file:538afc0c5c964ce0d   215MB

6、【Dockerfile中的CMD 和 ENTRYPOINT區別】

CMD					# 指定這個容器啟動的時候要執行的命令,只有最後一個會生效,可被替代。
ENTRYPOINT			# 指定這個容器啟動的時候要執行的命令,可以追加命令

測試CMD:

	# 編寫dockerfile檔案
		$ vim dockerfile-test-cmd
		FROM centos
		CMD ["ls","-a"]
		
	# 構建映象
		$ docker build -f dockerfile-test-cmd -t cmd-test:0.1 .
		
	# 執行映象
		$ docker run cmd-test:0.1
		.
		..
		.dockerenv
		bin
		dev

	# 想追加一個命令  -l 成為ls -al
		$ docker run cmd-test:0.1 -l
		docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"-l\":
		 executable file not found in $PATH": unknown.
		ERRO[0000] error waiting for container: context canceled 
		
	# cmd的情況下 -l 替換了CMD["ls","-l"]。 -l 不是命令所以報錯了。

測試ENTRYPOINT:

	# 編寫dockerfile檔案
		$ vim dockerfile-test-entrypoint
		FROM centos
		ENTRYPOINT ["ls","-a"]

	# 我們的命令,是直接拼接在我們得ENTRYPOINT命令後面的
		$ docker run entrypoint-test:0.1 -l
		total 56
		drwxr-xr-x   1 root root 4096 May 16 06:32 .
		drwxr-xr-x   1 root root 4096 May 16 06:32 ..
		-rwxr-xr-x   1 root root    0 May 16 06:32 .dockerenv
		lrwxrwxrwx   1 root root    7 May 11  2019 bin -> usr/bin
		drwxr-xr-x   5 root root  340 May 16 06:32 dev
		drwxr-xr-x   1 root root 4096 May 16 06:32 etc
		drwxr-xr-x   2 root root 4096 May 11  2019 home
		lrwxrwxrwx   1 root root    7 May 11  2019 lib -> usr/lib
		lrwxrwxrwx   1 root root    9 May 11  2019 lib64 -> usr/lib64 ....

小結:比較清楚的原理圖:
在這裡插入圖片描述

相關文章