Docker一般用於以下場景:html
關於容器、鏡像、倉庫等基本概念見Docker gitbook--基本概念mysql
容器是鏡像的運行實例。Docker鏡像是一個特殊的文件系統,除了提供容器運行時所需的程序、庫、資源、配置等文件外,還包含了一些爲運行時準備的一些配置參數(如匿名卷、環境變量、用戶等)。 鏡像不包含任何動態數據,其內容在構建以後也不會被改變。---- http://dockone.io/article/6051git
Docker 鏡像是怎麼實現增量的修改和維護的?web
每一個鏡像都由不少層次構成,Docker 使用 Union FS 將這些不一樣的層結合到一個鏡像中去。sql
一般 Union FS 有兩個用途, 一方面能夠實現不借助 LVM、RAID 將多個 disk 掛到同一個目錄下,另外一個更經常使用的就是將一個只讀的分支和一個可寫的分支聯合在一塊兒,Live CD 正是基於此方法能夠容許在鏡像不變的基礎上容許用戶在其上進行一些寫操做。docker
Docker 在 AUFS 上構建的容器也是利用了相似的原理。關於聯合文件系統UFS可見http://www.dockerinfo.net/175...數據庫
Docker設計時,就充分利用Union FS的技術,將其設計爲分層存儲的架構。 鏡像實際是由多層文件系統聯合組成。ubuntu
鏡像構建時,會一層層構建,前一層是後一層的基礎。每一層構建完就不會再發生改變,後一層上的任何改變只發生在本身這一層。好比,刪除前一層文件的操做,實際不是真的刪除前一層的文件,而是僅在當前層標記爲該文件已刪除。在最終容器運行的時候,雖然不會看到這個文件,可是實際上該文件會一直跟隨鏡像。所以,在構建鏡像的時候,須要額外當心,每一層儘可能只包含該層須要添加的東西,任何額外的東西應該在該層構建結束前清理掉。segmentfault
docker search mysql
docker pull image_name:tag // 如 docker pull mysql:5.7
docker rmi image_name:tag docker rmi image_id
docker image prune // or : docker rmi $(docker images -aq -f dangling=true)
有時候咱們須要將本身構造的鏡像分享給別人,但又不想放在倉庫上,那麼就能夠將鏡像導出爲文件,而後copy給別人,再由其導入便可分享給他人使用。安全
docker save image_name -o /home/xxx/tar_name.tar docker load -i /home/xxx/tar_name.tar
docker run [options] image [command] options: -i: 讓容器的標準輸入保持打開 -t: 讓docker 分配一個僞終端pseudo-tty -d: 後臺運行並返回一個惟一的id。要獲取容器的輸出信息,能夠經過 docker [container] logs [container ID or NAMES] 命令。
當利用 docker run 來建立容器時,Docker 在後臺運行的標準操做包括:
啓動已經終止的容器
docker start container
容器的核心爲所執行的應用程序,所須要的資源都是應用程序運行所必需的。除此以外,並無其它的資源。能夠在僞終端中利用 ps 或 top 來查看進程信息
docke r [container] stop contain_id_or_name // 中止全部的容器 // docker ps -a 的做用是列出全部的容器,-q 的做用是取出容器的id docker stop $(docker ps -aq)
刪除容器
docker [container] rm container_id
刪除終止的容器
docker rm $(docker ps -aq)
在使用 -d 參數時,容器啓動後會進入後臺模式運行。
某些時候須要進入容器進行操做,包括使用 docker attach 命令或 docker exec 命令,推薦你們使用 docker exec 命令,緣由會在下面說明。
docker attach container_id
注意: 若是從這個 stdin 中 exit,會致使容器的中止。
docker exec [options] container_id command options: -i: 輸出 -t: 終端 如: docker exec -it 69d1 bash
stdin 中 exit,不會致使容器的中止。這就是爲何推薦你們使用 docker exec 的緣由。
更多參數說明請使用 docker exec --help 查看。
有時候咱們會須要將本身機器的容器按期保存下來或者分享給其餘人,那麼就可使用導入/導出的功能
docker export container_id > your_container_file example: docker export fe3 > ubuntu
這樣將導出容器快照到本地文件。
cat you_container_file > docker import - yourlibrary/your_image:tag
可使用 docker import 從容器快照文件中再導入爲鏡像。
此外,也能夠經過指定 URL 或者某個目錄來導入,例如
docker import http://example.com/exampleimage.tgz example/imagerepo
用戶既可使用 docker load 來導入鏡像存儲文件到本地鏡像庫,也可使用 docker import 來導入一個容器快照到本地鏡像庫。這二者的區別在於容器快照文件將丟棄全部的歷史記錄和元數據信息( 即僅保存容器當時的快照狀態) ,而鏡像存儲文件將保存完整記錄,體積也要大。此外,從容器快照文件導入時能夠從新指定標籤等元數據信息
數據卷 是一個可供一個或多個容器使用的特殊目錄,它繞過 UFS,能夠提供不少有用的特性:
注意: 數據卷 的使用,相似於 Linux 下對目錄或文件進行 mount,鏡像中的被指定爲掛載點的目錄中的文件會隱藏掉,能顯示看的是掛載的 數據卷 。所以你的容器目錄dir有一個文件爲temp.data,若是你在dir掛載了一個數據卷,那麼你就不再能讀取temp.data,除非你移除該數據卷。
docker volume create volume_name
docker volume ls // 列出數據卷列表 docker volume inspect volume_name //查看指定的數據卷信息 -------------------------------------------------------------- 輸出: [ { "Driver": "local", "Labels": {}, "Mountpoint": "/var/lib/docker/volumes/my-vol/_data", "Name": "my-vol", "Options": {}, "Scope": "local" } ]
docker run [options] --name container_name --mount source=volume_name,targe=path_in_container image_name_or_id [command]
查看掛載信息,在輸出的信息的Mount字段包含了掛載信息
docker inspect container_name result: "Mounts": [ { "Type": "volume", "Name": "my-vol", "Source": "/var/lib/docker/volumes/my-vol/_data", "Destination": "/app", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" } ]
docker volume rm volume_name
刪除無主數據卷:即沒有被容器使用的數據卷
docker volume prune
docker run [option] [--name container_name] -- mount type=bind,source=host_path,target=container_path image_name [command]
上面的命令加載主機的 /src/webapp 目錄到容器的 /opt/webapp 目錄。這個功能在進行測試的時候十分方便,好比用戶能夠放置一些程序到本地目錄中,來查看容器是否正常工做。本地目錄的路徑必須是絕對路徑,之前使用 -v 參數時若是本地目錄不存在 Docker 會自動爲你建立一個文件夾,如今使用 --mount 參數時若是本地目錄不存在,Docker 會報錯。
也能夠爲docker數據卷指定讀寫權限
-- mount type=bind,source=host_path,target=container_path,readonly
這樣你就不能在容器中寫container_path的目錄了
也能夠掛載文件
-- mount type=bind,source=host_path,target=container_path