[Docker核心之容器、資料庫檔案的匯入匯出]
使用 Docker 容器
在 Docker 中,真正對外提供服務的還是容器,容器是對外提供服務的例項,容器的本質是程式。
執行一個容器
docker run [引數] [映象名稱|ID] [啟動容器執行的命令]
引數:使用什麼引數在新增什麼引數。
映象名稱|ID:可以使用映象名稱,也可以使用映象ID
啟動命令:不指定則執行預設的啟動命令,指定則執行指定的命令。
docker容器啟動的前提
至少有一個應用程式執行在前臺。
啟動流程
1、檢查本地是否存在需要被使用的映象,如果存在則直接使用,如果不存在則去公網下載。
2、根據映象來建立容器
docker run 引數
-d : 以守護程式方式執行 # 通俗說就是後臺執行
-p : (固定)埠對映 # 把容器裡面的埠對映到宿主主機,可以通過訪問主機埠訪問容器埠
-P : (隨機)埠對映 # 小p可以設定宿主主機的埠,大P隨機一個宿主主機埠對映
-i : 保持標準輸入開啟
-t : 建立一個偽終端 # 一般都是 -it 一塊使用,建立了一個可以輸入的偽終端,約等於終端
-v : 將宿主主機上的目錄對映到容器中 # 兩者類似硬連結關係,在任意一方操作,兩者都生效此操作。可以理解為磁碟掛載了宿主本機的目錄和容器裡面的目錄,修改宿主本機的目錄內容或者修改容器裡面的目錄內容都是在修改這個磁碟的檔案內容。
--rm : 當容器的生命週期結束時立即刪除容器 # 容器生命週期結束會儲存容器,docker ps -a 可以查到,這個設定是容器生命週期結束會立即刪除,docker ps -a 裡面查不到,即立即刪除不存在。
--name : 將容器自定義一個容器名稱, 將容器的名稱加入DNS解析 # 給容器起個名字,不能重複
-e : 設定容器內部的環境變數 # 有的容器需要設定一些環境變數才可以啟動。比如 mysql
-h : 設定容器內部的主機名 #
docker create + docker start = docker run
docker create (映象)
根據映象建立一個容器,容器的狀態是 Created 。如果映象不存在,和run一樣會下載,但是run下載之後會啟動映象,生成一個容器並且執行。create只會下載,建立一個容器,狀態 Created ,不會執行。
docker start (容器)
啟動容器,這個容器可以是建立的,也可以是一個之前已經執行結束的。
docker run (映象)
根據映象建立一個容器,存在則直接執行。如果映象不存在,下載,然後執行。
以上幾個執行映象(容器)都可以執行幾個,空格隔開
docker create|start|run 映象(容器)1 映象(容器)2 映象(容器)3
容器複製
1、將檔案複製到容器內
docker cp [宿主主機檔案路徑] [容器名稱|ID]:[容器內路徑]
2、將容器內檔案複製到宿主主機
docker cp [容器名稱|ID]:[容器內路徑] [宿主主機檔案路徑]
停止容器
docker stop 容器ID|容器名
docker stop 容器(ID|名)1 容器(ID|名)2 容器(ID|名)3 # 批量停止容器
docker stop ` docker ps -q ` # 停止所有的容器
關於容器和虛擬機器網路小記
127.0.0.1
# 迴環網路,誰用指定的就是誰,容器使用,指向的就是容器,虛擬機器(宿主)使用,就是指向的虛擬機器(宿主)本機
172.16.1.100
# 內部網路,也就是區域網。 docker 開啟的幾個容器可以理解為同一個區域網內開了幾個電腦,而 docke 啟動就會在宿主機虛擬一個 Docker 容器網橋(docker0)Docker 啟動一個容器時會 根據 Docker 網橋的網段分配給容器一個 IP 地址,稱為 Container-IP,同時 Docker 網橋是每個容器的預設閘道器。幾個容器就是連線 docker 這個閘道器的幾個電腦。後面詳細介紹。
192.168.177.100
# 對外的ip地址,表示的就是宿主(虛擬機器)主機的 IP ,任何人都能訪問
docker ps 展示容器列表
docker ps # 預設情況下展示當前系統上所有的正在執行的容器
-a : 展示所有的容器
-q : 僅僅展示容器的ID
解釋:
CONTAINER ID:容器ID
IMAGE :映象ID|映象名稱
COMMAND :容器啟動執行的命令
CREATED :建立距離現在的時間
STATUS :狀態
PORTS :埠資訊
NAMES :容器的名稱
刪除容器
docker rm [容器的名稱|ID]
引數:
-f : 強制刪除 # 執行中的也能刪除
docker rm -f $(docker ps -a -q) # 刪除所有容器
docker rm -f ` docker ps -a -q ` # 刪除所有容器
進入容器
1、attach進入容器
docker attach 容器名|容器ID
建立一個宿主主機到容器中pid為1的程式上的一個管道,但是一旦attach斷開連線,docker容器隨即退出。
如果有一個容器在後臺執行,而 attach 方法就是通過某些手段連線 容器 的 pid 為 1 的程式,進入容器來操作。而 attach 操作使用的容器 pid 為 1 的程式在 attach 退出之後,pid 程式 1 也就關閉,docker容器只有一個pid為1的程式,現在因為attach退出而關閉容器內pid為1的程式而導致容器中沒有程式存在,容器就會也跟著退出結束。
2、exec進入容器(推薦)
docker exec -it relaxed_bhabha bash(也可以是其他指令)
使用 exec 可以在宿主主機上執行一個容器內部的命令,比如ls啊之類的,也可以執行一個 bash 命令達到進入容器的效果。# ————> 區別在下圖可以看,原理就是下面這段。
原理就是新建一個程式連線容器,進入容器之後,來執行一些命令操作容器。這個程式由於是新建的,不會影響到容器內 pid 為 1 的程式,命令執行結束退出容器也只是新建的程式消失,不會影響到容器的正常執行。
3、nsenter進入容器
建立一個宿主主機和容器之間的一個管道,和exec一樣,也是容器內新建了一個程式,連線容器內新程式操作容器。
需要配合 docker inspect 來使用(早期沒有 exec 命令時,企業當中最長用的方式之一),Docker 是用 golang 語言開發,所以它也支援 go 語言的模版語法。
nsenter --target $( docker inspect -f {{.State.Pid}} elegant_margulis ) --mount --uts --ipc --net --pid
# {{.State.Pid}} elegant_margulis : 獲取當前容器(elegant_margulis)的 ID
4、ssh進入容器
???
# 暫時沒接觸
進入容器的幾種方式小結
docker run -it 映象 bash ,直接啟動映象執行容器(容器啟動後預設會有一個 pid 為 1 的程式),就生成了一個偽終端,而我們所有在偽終端上的操作就是在基於 pid 為 1 的 程式 操作這個映象,如果退出,程式消失,則容器也結束。
attach 就是操作的容器pid為1的程式。
exec 和 nsenter 一樣,exec 可以看作是 nsenter 的升級版本,他們進入容器的方式都是先在容器中建立了新的程式,然後連線容器的新程式從而進行容器的內部指令操作。
大概可以這麼理解:# 明白進入容器的方式就不要看這段,劉鵬飛覺得理解起來不太合適。
你做了一個蛋糕,而 -it + bash 則表示,你做好之後直接執行一些命令,比如可以做好蛋糕之後直接執行吃了它的命令。而 -d 表示後臺執行,也就是說,蛋糕做好之後,可以先放在別的地方,比如放在了冰箱,想用的時候再拿來用。如果我們現在想拿出來蛋糕吃,用 attach 方法,就是直接暴力給冰箱開了個口,把冰箱拆了,拿到了蛋糕,蛋糕只能一次吃完,吃不完也沒有冰箱再存放了,這就等於 attach 進入容器內,執行了命令,只能把工作做完,一旦退出,容器就結束了。但是 nsenter 和 exec 方法,就是以柔和的手段正常開啟冰箱,拿了蛋糕,切了一塊拿來吃,沒有吃完還能放回去,不影響冰箱的繼續執行,等於說 nsenter 和 exec 方法 進入容器之後,不執行命令了,可以先退出,容器會繼續在後臺執行,不受到影響。
新增資料庫使用者
# 建立使用者並授權
GRANT ALL PRIVILEGES ON *.* TO 'username'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
# 重新整理許可權
FLUSH PRIVILEGES;
m
mysql資料庫source命令匯出資料庫、匯入sql檔案
mysql匯出所有資料庫
在cmd終端中輸入: # ↓ 這是匯出所有 可指定資料庫名
mysqldump -uroot -p123456 --all-databases > /home/aa.sql
# 固定寫法 使用者名稱 密碼 指定匯出的資料庫 匯出至那個資料夾
-----------------------------------------------------------------------------------
在匯入大的sql檔案時,使用視覺化工具匯入往往效率極低,此時,我們常常使用在cmd中執行source命令的方式、將整個檔案匯入
第一步,開啟cmd命令視窗,進入資料庫
# 可在linux下使用 用法一樣 進入mysql即可按如下操作
mysql -u使用者名稱 -p
輸入密碼
第二步,切換資料庫 # 想將檔案匯入那個庫下指定那個即可
mysql> use test; (其中test為要匯入的資料庫名)
第三步,匯入sql檔案
mysql> source E:/pro_sql/test.sql (source後邊為sql檔案存放位置)
# 注意 檔案必須為sql結尾
操作完以上步驟,等待命令執行完成即可
————————————————
容器和映象的匯入與匯出
容器的匯出
docker export -o [打包的檔名] [容器ID或名稱]
docker export -o django.tar elegant_margulis
# 一個容器裡面安裝了自己需要的一些包,不想下次啟動再重新安裝包,就可以通過容器的匯出方式來儲存。只要下次使用的時候匯入 之前打包好的容器檔案 ,就可以繼上次操作繼續使用 而不需要再安裝包。
容器的匯入
docker import [檔名] [映象名及版本號]
docker import django.tar django:v1
映象的匯出
docker save -o [打包的檔名1] 映象名稱及版本號 映象名稱2及版本號
docker save > [打包的檔名1] 映象名稱及版本號 映象名稱2及版本號
docker save -o python.tar python:3.6.8 alvinos/django:v3
映象的匯入
docker load -i [打包的檔名]
docker load < [打包的檔名]
docker load < python.tar
容器和映象匯入匯出的區別
1、容器 import 匯入可以自定義映象名稱,映象 load 匯入則不行
2、映象 save 匯出可以同時儲存多個映象,容器 export 匯出則不能一次儲存多個容器
3、映象 save 匯出儲存的映象體積要大於容器 export 匯出儲存的映象體積
4、兩者之間互不能匯入