SQL注入(一)
阿新 • • 發佈:2020-12-31
1拉取映象
docker pull mysql
2執行容器(同時設定密碼和讓資料庫名生效)
docker run --name mysqldock -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=inst1 -d -p 3306:3306 mysql
3進入容器
docker exec -it mysqldock bash
4進入mysql:
mysql -uroot -p
5檢視資料表(發現inst1已經在容器初始化時建立)
show databases;
6使用Navicat連上mysql後崽建立一個庫inst2並在xshell終端執行show databases;檢視庫是否建立成功
7將容器儲存為新映象
docker commit mysqldock
8刪除所有容器
docker rm -f $(docker ps -aq)
9使用新映象執行容器並進入容器,然後登陸資料庫後執行查表操作(此時發現裡面只有一張表inst1),然後使用Navicat檢視inst1表的內容是空的
docker run --name mysqldock2 -e MYSQL_ROOT_PASSWORD=123456 -d -p 3360:3360 7796d57a6427 docker exec -it mysqldock2 bash mysql -uroot -p show databases;
以上說明一個問題:資料掛載在容器的資料卷中,使用commit命令生成新的映象後,資料並不能保留在資料內,
10執行exit退出資料庫登陸後,檢視mysql預設的掛載路徑:docker inspect mysqldock2
"Mounts": [
{
"Type": "volume",
"Name": "92c09f84682667cc743a3a0d0cdd48354ebd63e20bd6f0e2a267910c23eba33b",
"Source": "/var/lib/docker/volumes/92c09f84682667cc743a3a0d0cdd48354ebd63e20bd6f0e2a267910c23eba33b/_data",
"Destination": "/var/lib/mysql ",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
結論:
在宿主機建立一個專門存放資料資料夾路徑,新建容器的時候對映該路徑到容器,俗稱資料掛載,這樣可以很好解決資料丟失的問題
那對於上面的情況,既已經有一個容器使用了volume(docker預設掛載),想把volume裡的資料在新的容器中使用怎麼辦呢?
我們可以先把mysqldock容器中所需要的檔案拷貝出來到本地的/var/own/mysqldata
docker cp mysqldock:/var/lib/mysql /var/own/mysqldata
然後在建立新的mysql容器時,掛載該檔案即可
docker run -v /var/own/mysqldata:/var/lib/mysql --name mysqlnew -d mysql
這樣新的容器就可以保留mysqldock中的資料了
11除了建立容器時指定掛載目錄這個方法外,還有一種方法就是使用--volumes-from引數指定其它容器的volume
docker run --name mysql3 --volumes-from mysqldock -d mysql