Docker容器資料卷、Dockerfile
由於我測試的環境是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 ....
小結:比較清楚的原理圖:
相關文章
- Docker資料管理(資料卷+資料卷容器)Docker
- Docker(六)容器資料卷Docker
- Docker容器的資料卷Docker
- docker - [10] 容器資料卷Docker
- Docker 容器資料卷 三Docker
- Docker 資料卷,資料卷容器詳細介紹Docker
- [Docker 系列]docker 學習 五,容器資料卷Docker
- [Docker 系列]docker 學習六,資料卷容器Docker
- 容器技術之Docker資料卷Docker
- 【Docker】資料卷及容器連線Docker
- docker容器dockerfile詳解Docker
- Docker學習筆記:映象、容器、資料卷Docker筆記
- Docker 入門系列二:容器的資料卷Docker
- 容器資料卷
- docker筆記12-容器資料卷volumesDocker筆記
- Docker容器學習梳理 - Volume資料卷使用Docker
- Docker資料卷Docker
- 『現學現忘』Docker基礎 — 28、Docker容器資料卷介紹Docker
- 『現學現忘』Docker基礎 — 29、Docker容器資料卷的應用Docker
- docker容器卷是什麼Docker
- 『現學現忘』Docker基礎 — 33、Docker資料卷容器的說明與共享資料原理Docker
- Docker容器學習梳理 - Dockerfile構建映象Docker
- docker資料卷概念以及刪除資料卷方法Docker
- 『現學現忘』Docker基礎 — 32、通過DockerFile的方式掛載資料卷Docker
- docker系列(四):資料卷Docker
- docker之資料卷管理Docker
- Docker學習總結(四)——容器間的通訊和資料卷Docker
- Docker小白到實戰之容器資料卷,整理的明明白白Docker
- docker資料卷(Data Volumes)Docker
- docker建立mysql、nginx資料卷DockerMySqlNginx
- Docker DockerfileDocker
- docker 資料卷掛載總結Docker
- Docker-nginx資料卷掛載DockerNginx
- Dockerfile指令與Docker-compose容器編排-搭建docker私有倉庫Docker
- docker容器卷一般放在什麼位置Docker
- Dockerfile與docker-compose容器編排(Docker系列第3章,共3章)Docker
- Docker進階與實踐之六:容器卷管理Docker
- 小白學Docker(九) Docker DockerfileDocker