3、docker link
docker可以把乙個宿主機上的目錄掛載到映象裡。
docker run -it -v /localpath:
/images/path images /bin/bash
通過-v引數,冒號前為宿主機目錄,必須為絕對路徑,冒號後為映象內掛載的路徑。
目錄掛載最主要的使用場景就是通過docker映象使用mysql資料庫。
docker 映象方式使用mysql,當mysql容器重啟後,操作的映象mysql資料庫的資料就會丟失,所以此時需要通過掛載volume的方式來避免這種情況
[root@localhost /
]# docker pull mysql
拉去完成之後如下所示:
2、通過docker volume create建立乙個本地資料卷
[root@localhost semon]# docker volume create --name mysql_data
建立完成後,通過以下命令查詢卷是否建立成功
通過find命令找到建立的mysql_data檔案的位置
通過docker inspect 命令檢視mysql映象的工作卷路徑
確定了以上條件之後,啟動mysql映象
通過docker ps 查詢到mysql容器,那麼久啟動成功,每次運算元據庫之後,資料都會儲存到宿主機,重啟mysql資料映象,資料不丟失—mysql資料持久化
通過docker run命令的–link引數可以讓容器之間通過連線系統進行互動。
引數格式:–link name:alias ,name是要鏈結的容器名稱, alias是此連線的別名。
3.1、docker的link機制
同乙個宿主機上的多個docker容器之間如果想進行通訊,可以通過使用容器的ip位址來通訊,也可以通過宿主機的ip加上容器暴露出的埠號來通訊,前者會導致ip位址的硬編碼,不方便遷移,並且容器重啟後ip位址會改變,除非使用固定的ip,後者的通訊方式比較單一,只能依靠監聽在暴露出的埠的程序來進行有限的通訊。通過docker的link機制可以通過乙個name來和另乙個容器通訊,link機制方便了容器去發現其它的容器並且可以安全的傳遞一些連線資訊給其它的容器。其使用方式如下:
我們使用上面啟動了的mysql容器作為source container再啟動乙個nginx容器作為接收容器(received container):
上面通過–link連線名為learn_mysql的容器,並為其設定了別名為db,完成了上面的兩個步驟後,在nginx的容器中就可以使用learn_mysql或者db作為連線位址來連線mysql服務,即使容器重啟了,位址發生了變化,不會影響兩個容器之間的連線。
3.2、link機制的連線資訊傳遞
雖然通過使用link機制nginx可以和mysql進行通訊了,但是如何知道mysql的埠是多少呢,雖然說是固定的是 3306,但是也不排除更改埠號的問題,並且對應一些非固定埠的應用來說,只要要連線的容器的埠資訊也是尤為重要的,link機制通過環境變數的方式提供了這些資訊,除此之外像db的密碼這些資訊也會通過環境變數提供,docker將source container中定義的環境變數全部匯入到received container中,在received container中可以通過環境變數來獲取連線資訊。
3.2.1、下面是db中提供的環境變數:
通過"docker exec learn_mysql env" 命令檢視received container 的環境變數資訊
[root@localhost ***x]# docker exec learn_mysql env
path=
/usr/local/sbin:
/usr/local/bin:
/usr/sbin:
/usr/bin:
/sbin:
/bin
hostname=
57b677aa6ad5
mysql_root_password=
123456
gosu_version=
1.12
mysql_major=
8.0mysql_version=
8.0.20
-1debian10
home=
/root
[root@localhost ***x]#
3.2.2、下面我們來看看在web這個容器中,這些變數是如何被匯入的
[root@localhost ***x]# docker exec web env
path=
/usr/local/sbin:
/usr/local/bin:
/usr/sbin:
/usr/bin:
/sbin:
/bin
hostname=
96a44898bb48
db_port=tcp://
172.17
.0.4
:3306
db_port_3306_tcp=tcp://
172.17
.0.4
:3306
db_port_3306_tcp_addr=
172.17
.0.4
db_port_3306_tcp_port=
3306
db_port_3306_tcp_proto=tcp
db_port_33060_tcp=tcp://
172.17
.0.4
:33060
db_port_33060_tcp_addr=
172.17
.0.4
db_port_33060_tcp_port=
33060
db_port_33060_tcp_proto=tcp
db_name=
/web/db
db_env_mysql_root_password=
123456
db_env_gosu_version=
1.12
db_env_mysql_major=
8.0db_env_mysql_version=
8.0.20
-1debian10
nginx_version=
1.19
.0njs_version=
0.4.1
pkg_release=
1~buster
home=
/root
上面的變數被分成了五個部分:
<
alias
>_port__
<
alias
>_port___port
<
alias
>_port___proto
<
alias
>_port___addr
其中是在dockerfile中使用expose匯出的埠,還有docker run 的時候使用-p匯出的埠。則是這些埠對應的協議。 Docker掛載目錄 備份目錄
docker run p 80 name website v pwd website var www html website ro 172.17.0.2 5000 nginx nginx a p指定埠 b name重新命名容器的名稱 c v使用本地檔案掛載到容器 d 預設掛載的路徑許可權為讀寫。如...
Docker目錄掛載 Volume
3.使用 data container container 預設情況下,容器不使用任何 volume,此時,容器的資料被儲存在容器之內,它只在容器的生命週期內存在,會隨著容器的被刪除而被刪除。當然,也可以使用 docker commit 命令將它持久化為乙個新的映象。很多情況下我需要資料持續化儲存....
docker容器目錄掛載
我們可以在建立容器的時候,將宿主機的目錄與容器內的目錄進行對映,這樣我們就可以實現宿主機和容器目錄的雙向資料自動同步 我們cp命令來實現資料傳遞,這種方式比較麻煩 我們通過容器目錄掛載,能夠輕鬆實現 上傳,配置修改,日誌同步等需求 docker run it v 宿主機目錄 容器目錄 映象名dock...