docker 保存 环境持久化_18、docker的持久化存储和数据共享
18.1 Data Volume
Docker持久化數(shù)據(jù)方案
基于本地文件系統(tǒng)的Volume
可以在執(zhí)行docker create或者docker run的時(shí)候,通過-v參數(shù)將主機(jī)的目錄作為容器的數(shù)據(jù)卷。這部分功能便是基于本地文件系統(tǒng)的Volume管理。
基于plugin的Volume
支持第三方的存儲(chǔ)方案,比如NAS、AWS等。
Data Volume 類型
受管理的data volume,由docker后臺(tái)自動(dòng)創(chuàng)建
綁定掛載的volume,具體掛載位置可以由用戶指定
通過例子來查看
以MySQL為例,可以查看官方的Dockerfile,當(dāng)中用到了Volume。
# 查看volume
[root@docker ~]# docker volume ls
[root@docker ~]#
# 創(chuàng)建一個(gè)MySQL的容器
[root@docker ~]# docker run -d --name mysql1 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql
# 查看MySQL容器跑起來之后的volume
[root@docker ~]# docker volume ls
DRIVER VOLUME NAME
local e3c54bb7b620d86524b6cebc4c28568a2a81a104871a5baf41e22c02bd8d7bac
[root@docker ~]#
# 查看這個(gè)volume的想象信息
[root@docker ~]# docker volume inspect e3c54bb7b620d86524b6cebc4c28568a2a81a104871a5baf41e22c02bd8d7bac
[
{
"CreatedAt": "2018-06-07T09:13:24Z",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/e3c54bb7b620d86524b6cebc4c28568a2a81a104871a5baf41e22c02bd8d7bac/_data",
"Name": "e3c54bb7b620d86524b6cebc4c28568a2a81a104871a5baf41e22c02bd8d7bac",
"Options": null,
"Scope": "local"
}
]
[root@docker ~]#
可以看到,這個(gè)volume并不在容器當(dāng)中,而是掛載到了宿主機(jī)的/var/lib/docker/volumes/e3c54bb7b620d86524b6cebc4c28568a2a81a104871a5baf41e22c02bd8d7bac/_data目錄下。
再創(chuàng)建一個(gè)mysql2的容器:
[root@docker ~]# docker run -d --name mysql2 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql
[root@docker ~]# docker volume ls
DRIVER VOLUME NAME
local a3c730f24ca254cabbd328b4c5a6e7fa1822d7e1b2e54c9ac9104839295e5225
local e3c54bb7b620d86524b6cebc4c28568a2a81a104871a5baf41e22c02bd8d7bac
[root@docker ~]# docker volume inspect a3c730f24ca254cabbd328b4c5a6e7fa1822d7e1b2e54c9ac9104839295e5225
[
{
"CreatedAt": "2018-06-07T09:22:18Z",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/a3c730f24ca254cabbd328b4c5a6e7fa1822d7e1b2e54c9ac9104839295e5225/_data",
"Name": "a3c730f24ca254cabbd328b4c5a6e7fa1822d7e1b2e54c9ac9104839295e5225",
"Options": null,
"Scope": "local"
}
]
[root@docker ~]#
刪除這兩個(gè)容器:
[root@docker ~]# docker stop mysql1 mysql2
[root@docker ~]# docker rm mysql1 mysql2
[root@docker ~]# docker volume ls
DRIVER VOLUME NAME
local a3c730f24ca254cabbd328b4c5a6e7fa1822d7e1b2e54c9ac9104839295e5225
local e3c54bb7b620d86524b6cebc4c28568a2a81a104871a5baf41e22c02bd8d7bac
[root@docker ~]#
可以發(fā)現(xiàn),volume在容器刪除之后也不會(huì)被刪除,可以防止容器刪除之后數(shù)據(jù)也不存在了的問題。但是volume的名字非常不友好,不方便我們使用,但是我們可以在創(chuàng)建或者啟動(dòng)容器的時(shí)候給volume設(shè)置別名來方便我們使用。
給volume起別名
重新創(chuàng)建mysql1容器,在啟動(dòng)的時(shí)候給volume設(shè)置別名
[root@docker ~]# sudo docker run -d -v mysql:/var/lib/mysql --name mysql1 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql
[root@docker ~]# docker volume ls
DRIVER VOLUME NAME
local mysql
[root@docker ~]# docker volume inspect mysql
[
{
"CreatedAt": "2018-06-07T09:30:33Z",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/mysql/_data",
"Name": "mysql",
"Options": null,
"Scope": "local"
}
]
[root@docker ~]#
驗(yàn)證一下這個(gè)mysql的volume是否已經(jīng)被使用:進(jìn)入mysql1容器,創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)
[root@docker ~]# docker exec -it mysql1 /bin/bash
root@5aa496b309cc:/# mysql -uroot
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.11 MySQL Community Server - GPL
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.01 sec)
mysql> create database docker;
Query OK, 1 row affected (0.07 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| docker |
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
mysql> \q
Bye
root@5aa496b309cc:/# exit
[root@docker ~]# 停止mysql1容器,并刪除mysql1容器
[root@docker ~]# docker stop mysql1
[root@docker ~]# docker rm mysql1
[root@docker ~]# 創(chuàng)建一個(gè)新的mysql2的容器,急需使用mysql這個(gè)volume
[root@docker ~]# sudo docker run -d -v mysql:/var/lib/mysql --name mysql2 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql
[root@docker ~]# 進(jìn)入mysql2查看是否存在之前的數(shù)據(jù)
[root@docker ~]# docker exec -it mysql2 /bin/bash
root@cf1cc3ad331e:/# mysql -uroot
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.11 MySQL Community Server - GPL
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| docker |
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
mysql> \q
Bye
root@cf1cc3ad331e:/# exit
可以發(fā)現(xiàn),volume中的數(shù)據(jù)并不會(huì)因?yàn)槿萜鞯膭h除二消失,實(shí)現(xiàn)了數(shù)據(jù)持久化的目標(biāo)。但是這種方式的volume需要在Dockerfile中使用VOLUME來預(yù)先指定容器中的數(shù)據(jù)存放路徑。
18.2 Bind Mounting
Bind Mounting跟上面的方式不一樣,可以動(dòng)態(tài)的指定容器內(nèi)文件存放路徑和宿主機(jī)上的數(shù)據(jù)庫(kù)卷目錄。
構(gòu)建一個(gè)docker-nginx的鏡像:
# Dockerfile
[root@docker docker-nginx]# cat Dockerfile
# this same shows how we can extend/change an existing official image from Docker Hub
FROM nginx:latest
# highly recommend you always pin versions for anything beyond dev/learn
WORKDIR /usr/share/nginx/html
# change working directory to root of nginx webhost
# using WORKDIR is prefered to using 'RUN cd /some/path'
COPY index.html index.html
# I don't have to specify EXPOSE or CMD because they're in my FROM
[root@docker docker-nginx]# cat index.html
helloHello Docker!
[root@docker docker-nginx]# 構(gòu)建鏡像
[root@docker docker-nginx]# docker build -t staryjie/docker-nginx .
[root@docker docker-nginx]# 創(chuàng)建容器
[root@docker docker-nginx]# docker run -d -p 80:80 --name web staryjie/docker-nginx
[root@docker docker-nginx]# 本地訪問
[root@docker docker-nginx]# curl 127.0.0.1
helloHello Docker!
[root@docker docker-nginx]#
但是index.html文件是無法更改的,如果要更改必須要重新構(gòu)建鏡像,這樣非常不便。
[root@docker docker-nginx]# 強(qiáng)制刪除web容器
[root@docker docker-nginx]# docker rm -f web
[root@docker docker-nginx]# 重新創(chuàng)建一個(gè)容器,指定宿主機(jī)上index.html的目錄到容器中nginx的html目錄
[root@docker docker-nginx]# docker exec -it web1 /bin/bash
root@18af473954f1:/usr/share/nginx/html# ls
Dockerfile index.html
root@18af473954f1:/usr/share/nginx/html# touch test.txt
root@18af473954f1:/usr/share/nginx/html# exit
[root@docker docker-nginx]# ls
Dockerfile index.html test.txt
[root@docker docker-nginx]# curl 127.0.0.1
helloHello Docker!
[root@docker docker-nginx]# 修改index.html
[root@docker docker-nginx]# cat index.html
helloHello Docker!
Hello, I have changed this file!
[root@docker docker-nginx]# curl 127.0.0.1
helloHello Docker!
Hello, I have changed this file!
[root@docker docker-nginx]#
采用Bind Mounting的方式實(shí)現(xiàn)volume的話,容器內(nèi)外的數(shù)據(jù)是同步的,只需要修改一個(gè)地方,容器內(nèi)或者容器外都會(huì)同步修改,非常的方便快捷。
采用Bind Mounting的方式,將docker作為開發(fā)環(huán)境可以使我們的開發(fā)環(huán)境和生產(chǎn)環(huán)境保持一致,這也是實(shí)現(xiàn)DevOps的第一步。(很多開發(fā)使用的都是Windows的系統(tǒng),但是服務(wù)器一般都是Linux的,無法保持環(huán)境的一致性,影響開發(fā)效率。)
總結(jié)
以上是生活随笔為你收集整理的docker 保存 环境持久化_18、docker的持久化存储和数据共享的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 同一行 绝对定位_电路改造10大点:定位
- 下一篇: oracle 动态sql列转行_orac