Docker 是一個開源的應用容器引擎,基於 Go 語言 並聽從 Apache2.0 協議開源。php
Docker 可讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,而後發佈到任何流行的 Linux 機器上,也能夠實現虛擬化。html
容器是徹底使用沙箱機制,相互之間不會有任何接口 (相似 iPhone 的 app),更重要的是容器性能開銷極低。前端
Docker 引擎是一個包含如下主要組件的客戶端服務器應用程序。java
Docker 引擎組件的流程以下圖所示:python
雖然Docker提供了不少功能,但這裏只列出了一些主要功能,以下所示:mysql
這是Docker的一個主要功能,可幫助咱們輕鬆快速地配置系統。能夠在更少的時間和精力的狀況下部署代碼。 因爲Docker能夠在各類各樣的環境中使用,基礎架構再也不要求與應用程序的環境相關聯。linux
經過放寬技術配置和應用的快速部署。 毫無疑問,它節約了時間提升了生產率。 Docker不只有助於在孤立環境中執行應用程序,並且還減小了資源。nginx
Docker提供用於在隔離環境中運行應用程序的容器。 每一個容器獨立於另外一個容器,並容許執行任何類型的應用程序。git
它是Docker容器的集羣和調度工具。 Swarm(是Docker的集羣調度工具,使用Swarm控制和管理Docker的集羣)使用Docker API做爲其前端,這有助於咱們使用各類工具來控制它。 它還能夠將Docker主機集羣控制爲一個虛擬主機。 這是一個用於啓用可插拔後端的自組織引擎組。web
它將可用節點上已發佈端口的傳入請求路由到活動容器。 即便節點上沒有任務正在運行,此功能也能夠實現鏈接。
服務是容許指定集羣內的容器狀態的任務列表。 每一個任務表示一個應該運行的容器的一個實例,而且Swarm在節點之間調度它們。
它容許將保密數據保存到雲羣 (swarm) 中,而後選擇給予服務訪問某些保密數據。它包括一些重要的命令給引擎,如保密數據檢查,保密數據建立等。
Docker 使用客戶端-服務器 (C/S) 架構模式,使用遠程 API 來管理和建立 Docker 容器。
Docker 容器經過 Docker 鏡像來建立。
容器與鏡像的關係相似於面向對象編程中的對象與類。
根據鏡像實例化一個或多個容器,全部的操做都會在容器上進行
Docker |
面向對象 |
容器 |
對象 |
鏡像 |
類 |
這裏須要你們進行理解
標題 |
說明 |
鏡像(Images) |
Docker 鏡像是用於建立 Docker 容器的模板。 |
容器(Container) |
容器是獨立運行的一個或一組應用。 |
客戶端(Client) |
Docker 客戶端經過命令行或者其餘工具使用 Docker API (https://docs.docker.com/reference/api/docker_remote_api) 與 Docker 的守護進程通訊。 |
主機(Host) |
一個物理或者虛擬的機器用於執行 Docker 守護進程和容器。 |
倉庫(Registry) |
Docker 倉庫用來保存鏡像,能夠理解爲代碼控制中的代碼倉庫。Docker Hub(https://hub.docker.com) 提供了龐大的鏡像集合供使用。 |
Docker Machine |
Docker Machine是一個簡化Docker安裝的命令行工具,經過一個簡單的命令行便可在相應的平臺上安裝Docker,好比VirtualBox、 Digital Ocean、Microsoft Azure。 |
能夠在任何操做系統上安裝 Docker,不管是 Mac,Windows,Linux 仍是任何雲服務器。Docker 引擎在 Linux 發行版上運行。 在這裏,咱們將以 Linux Ubuntu Server 16.04 做爲演示安裝 Docker 引擎的過程。
Docker 須要兩個重要的安裝要求:
要查看當前的內核版本,請打開終端並鍵入uname -r
命令以查看內核版本:
suchuanqi@UbuntuBase:~$uname -r
4.4.0-21-generic
查看操做系統是32位仍是64位:
suchuanqi@UbuntuBase:~$uname --m
x86_64
vi /etc/apt/sources.list 修改的配置文件
修改的阿里源(注意把配置文件裏面的內容所有替換掉)
deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
執行阿里源的更新
apt-get update
使用在線安裝腳本
curl -sSL https://get.daocloud.io/docker | sh
執行後會自動下載並安裝 Docker 及依賴包
suchuanqi@UbuntuBase:~$ curl -sSL https://get.daocloud.io/docker | sh
# Executing docker install script, commit: 49ee7c1
+ sudo -E sh -c apt-get update -qq >/dev/null
+ sudo -E sh -c apt-get install -y -qq apt-transport-https ca-certificates curl software-properties-common >/dev/null
+ sudo -E sh -c curl -fsSL "https://download.docker.com/linux/ubuntu/gpg" | apt-key add -qq - >/dev/null
+ sudo -E sh -c echo "deb [arch=amd64] https://download.docker.com/linux/ubuntu xenial edge" > /etc/apt/sources.list.d/docker.list
+ [ ubuntu = debian ]
+ sudo -E sh -c apt-get update -qq >/dev/null
+ sudo -E sh -c apt-get install -y -qq --no-install-recommends docker-ce >/dev/null
+ sudo -E sh -c docker version
Client:
Version: 17.10.0-ce
API version: 1.33
Go version: go1.8.3
Git commit: f4ffd25
Built: Tue Oct 17 19:04:16 2017
OS/Arch: linux/amd64
Server:
Version: 17.10.0-ce
API version: 1.33 (minimum version 1.12)
Go version: go1.8.3
Git commit: f4ffd25
Built: Tue Oct 17 19:02:56 2017
OS/Arch: linux/amd64
Experimental: false
If you would like to use Docker as a non-root user, you should now consider
adding your user to the "docker" group with something like:
sudo usermod -aG docker lusifer
Remember that you will have to log out and back in for this to take effect!
WARNING: Adding a user to the "docker" group will grant the ability to run
containers which can be used to obtain root privileges on the
docker host.
Refer to https://docs.docker.com/engine/security/security/#docker-daemon-attack-surface
for more information.
完成後有個提示
If you would like to use Docker as a non-root user, you should now consider
adding your user to the "docker" group with something like:
sudo usermod -aG docker suchuanqi
Remember that you will have to log out and back in for this to take effect!
當要以非 root 用戶能夠直接運行 docker 時,須要執行 sudo usermod -aG docker suchuanqi(
執行該命令必須
root
用戶下
)
命令,而後從新登錄,不然會有以下報錯,該命令在普通用戶下操做
docker version 查看當前用戶版本,若是沒有上面那句話普通用戶是不到版本的因此要使用上面的命令,讓普通用戶也能訪問docker
suchuanqi@UbuntuBase:~$ docker run hello-world
docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.33/containers/create: dial unix /var/run/docker.sock: connect: permission denied.
See 'docker run --help'.
service docker start啓動docker 從新啓動docker----service docker restart
suchuanqi@UbuntuBase:~$ docker version
Client:
Version: 17.10.0-ce
API version: 1.33
Go version: go1.8.3
Git commit: f4ffd25
Built: Tue Oct 17 19:04:16 2017
OS/Arch: linux/amd64
Server:
Version: 17.10.0-ce
API version: 1.33 (minimum version 1.12)
Go version: go1.8.3
Git commit: f4ffd25
Built: Tue Oct 17 19:02:56 2017
OS/Arch: linux/amd64
Experimental: false
因爲網絡緣由,咱們在 pull Image 的時候,從 Docker Hub
上下載會很慢... 因此,國內的 Docker 愛好者們就添加了一些國內的鏡像 (mirror),方便你們使用。
修改配置文件
vi /lib/systemd/system/docker.service
添加 --registry-mirror=https://jxus37ac.mirror.aliyuncs.com
到 ExecStart:
會顯示ExecStart=/usr/bin/dockerd -H fd:// 把-H fd://去掉添加上上面的一句話便可,以下所示:
ExecStart=/usr/bin/dockerd --registry-mirror=https://jxus37ac.mirror.aliyuncs.com
保存配置:systemctl daemon-reload
重啓服務:service docker restart
而後再次查看
docker
的運行狀態:
systemctl status docker
直接使用docker命令輸入的引擎在它的下面有好多命令
好比docker run表示運行docker的程序
Docker 容許你在容器內運行應用程序,使用 docker run 命令來在容器內運行一個應用程序。
輸出 Hello Docker:
suchuanqi@UbuntuBase:~$ docker run ubuntu:15.10 /bin/echo "Hello Docker" 這裏的意思就是你要經過ubuntu:15.10這個版本打印一句話hello Docker
Hello Docker 這裏的hello Docker是經過ubuntu:15.10這個鏡像建立了一個字節的容器而後打印Hello Docker, 注意不是本地計算機打印出來的
上面的語句可能會出現問題由於docker run 後面的 ubuntu:15.10這個版本ubuntu在docker容器中是沒有該版本的因此當你執行命令後他會發如今它的容器中並無該版本,那麼他會經過咱們設置的阿里雲去下載ubuntu,而後執行, 固然若是這個容器存在的話他就不會去下載,上來就直接打印
既然已經下載好了鏡像咱們能夠經過 docker images來進行全部鏡像的顯示操做,以下所示:
咱們可使用 docker ps -a 命令來查看當前全部的運行的容器(包括運行過的容器),以下所示:
咱們也能夠刪除被啓動的容器,使用命令 docker rm 容器的惟一id
在這裏咱們就看到咱們把容器刪除掉了, (其實在這裏咱們能夠更加深入的理解咱們的容器,和鏡像, 容器就是咱們的對象, 鏡像就至關於咱們的類)
參數解釋:
以上命令完整的意思能夠解釋爲:Docker 以 ubuntu15.10 鏡像建立一個新容器,而後在容器裏執行 bin/echo "Hello Docker",而後輸出結果。
咱們經過 docker 的兩個參數 -i -t,讓 docker 運行的容器實現"對話"的能力,也就是咱們能夠進入到容器內進行操做
suchuanqi@UbuntuBase:~$ docker run -it ubuntu:15.10 /bin/bash 進去順便啓動
root@76ab065de67b:/#
可使用ll來進行查看該ubuntu的內部文件結構
參數解釋:
此時咱們已進入一個 ubuntu15.10 系統的容器 也就是進入了一個容器的內部咱們也管他叫容器上的操做系統
這時咱們能夠在容器內部使用uname 查看他的系統的名字, 也可使用uname -r 來查看當前操做系統的版本或者是 uname - -m,若是下所示:
咱們嘗試在容器中運行命令 cat /proc/version 和 ls 分別查看當前系統的版本信息和當前目錄下的文件列表
root@76ab065de67b:/# cat /proc/version
Linux version 4.4.0-21-generic (buildd@lgw01-21) (gcc version 5.3.1 20160413 (Ubuntu 5.3.1-14ubuntu2) ) #37-Ubuntu SMP Mon Apr 18 18:33:37 UTC 2016
root@76ab065de67b:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
退出容器:
最後使用docker rm id刪除容器便可
使用如下命令建立一個以進程方式運行的容器(說白了就是創建一個持久的容器爲我服務,前面的都是運行當前就釋放了,而且都是在主線程成操做,不能幹其餘事情)
設置一個後臺一個長期運行的服務,就須要啓動的容器,讓他一直在後臺運行,纔可以提供持久的服務
suchuanqi@UbuntuBase:~$ docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello docker; sleep 1; done" 使用這個命令後臺執行一個容器
0977407542d16c5699a2cc0455d977cb5d8ef011a1a762cdcf2323851f6b3ed3 ----這裏顯示的這串編碼翻譯過來就是hello docker
docker run表示執行
-d 表示在後臺執行
ubuntu:15.10執行的是哪一個容器
while true; do表示死循環並不斷打印echo hello docker;這句話,
sleep 1; done 1秒執行一次
在輸出中,咱們沒有看到指望的"hello docker",而是一串長字符
0977407542d16c5699a2cc0455d977cb5d8ef011a1a762cdcf2323851f6b3ed3
這個長字符串叫作容器ID,對每一個容器來講都是惟一的,咱們能夠經過容器ID來查看對應的容器發生了什麼。
首先,咱們須要確認容器有在後臺運行,能夠經過 docker ps
來查看正在運行的容器 以前的操做docker ps -a 表示顯示全部的容器,包括未運行的
suchuanqi@UbuntuBase:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0977407542d1 ubuntu:15.10 "/bin/sh -c 'while..." 2 seconds ago Up 1 second thirsty_kowalevski
CONTAINER ID:容器ID
NAMES:自動分配的容器名稱
在容器內使用 docker logs
命令,查看容器內的標準輸出
suchuanqi@UbuntuBase:~$ docker logs 0977407542d1 (0977407542d1
表示容器
id)
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
suchuanqi@UbuntuBase:~$ docker logs thirsty_kowalevski
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
中止容器: docker stop容器id以下圖所示:
跟蹤容器日誌操做:docker logs -f 0cb8efb396d6,跟蹤容器的每次的執行,每隔1秒會打印一第二天志操做,也就是跟蹤當前容器的狀態
docker exec -it容器id /bin/bash 這裏的意思是與一個正在執行的容器進行交互,進入到該正在運行容器的內部
這個時候咱們可使用ps -ef|grep echo查看當前這個容器正在執行什麼,以下所示:
咱們可使用kill -9 1來把當前所要執行的命令殺死,那麼他將不執行上面root 1的這個線程的操做即意味着該容器沒有持續執行某些命令
最後咱們使用docker stop容器id中止該容器便可
最後咱們使用docker stop容器id中止該容器便可,最後在進行刪除容器,及查看等操做便可,以下圖所示:
Docker 客戶端
docker 客戶端很是簡單 ,咱們能夠直接輸入 docker
命令來查看到 Docker 客戶端的全部命令選項。
能夠經過命令 docker command --help
更深刻的瞭解指定的 Docker 命令使用方法。也可使用咱們常常操做docker ps --help來看他下面的全部參數
例如咱們要查看 docker stats --help 這裏是幫助查看該命令下有哪些具體的參數
命令用於顯示一個或多個容器實時的資源使用狀況,包括CPU,內存使用量,網絡IO,磁盤IO等信息。
命令僅顯示正在運行的容器的實時資源使用狀況,不能顯示已經中止的容器的資源使用狀況docker statsdocker statsrunning
運行 WEB 容器
前面咱們運行的容器並無一些什麼特別的用處。
接下來讓咱們嘗試使用 docker 構建一個 web 應用程序。
咱們將在 docker 容器中運行一個 Python Flask 應用來運行一個web應用。
suchuanqi@UbuntuBase:~$ docker run -d -P training/webapp python app.py
d89a785788469da23529eebf70f1764611bb28818a8de7fa1ea85154327b807a
參數說明:
那麼這個時候咱們就能夠經過網頁去訪問該容器內的程序
查看 WEB 容器
使用 docker ps
來查看咱們正在運行的容器
suchuanqi@UbuntuBase:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d89a78578846 training/webapp "python app.py" 2 minutes ago Up 2 minutes 0.0.0.0:32771->5000/tcp laughing_cori
這裏多了端口信息
PORTS
0.0.0.0:32771->5000/tcp
Docker 開放了 5000
端口(默認 Python Flask 端口)映射到主機端口 32771
上。
這時咱們能夠經過瀏覽器訪問WEB應用
http://192.168.211.130:32768/ 經過它進行訪問網頁
在執行下面的自定義端口前咱們使用命令docker stop 4a04170c112b來中止上面運行的容器
咱們也能夠指定 -p
標識來綁定指定端口
suchuanqi@UbuntuBase:~$ docker run -d -p 5000:5000 training/webapp python app.py
9490b017fdf6b8c6415d5d01b925413c6ed2dd782566d251ad2bdad90263c3cb
suchuanqi@UbuntuBase:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9490b017fdf6 training/webapp "python app.py" 3 seconds ago Up 2 seconds
那麼咱們就能夠經過http://192.168.1.34:5000/這個自定義的端口經過瀏覽器進行訪問了
查看 WEB 應用日誌
docker logs [ID或者名字] 能夠查看容器內部的標準輸出:
suchuanqi@UbuntuBase:~$ docker logs -f 容器id(
或容器
name)
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
192.168.75.1 - - [03/Nov/2017 06:14:05] "GET / HTTP/1.1" 200 -
192.168.75.1 - - [03/Nov/2017 06:14:05] "GET /favicon.ico HTTP/1.1" 404 -
192.168.75.1 - - [03/Nov/2017 06:16:57] "GET / HTTP/1.1" 200 -
192.168.75.1 - - [03/Nov/2017 06:16:57] "GET /favicon.ico HTTP/1.1" 404 -
參數說明:
從上面,咱們能夠看到應用程序使用的是 5000 端口而且可以查看到應用程序的訪問日誌。
查看 WEB 應用容器的進程
咱們還可使用 docker top
來查看容器內部運行的進程
suchuanqi@UbuntuBase:~$ docker top容器id[名字]
UID PID PPID C STIME TTY TIME CMD
root 71917 71897 0 14:13
檢查 WEB 應用程序
使用 docker inspect
來查看Docker的底層信息。它會返回一個 JSON 文件記錄着 Docker 容器的配置和狀態信息:(要有一個運行狀態下的容器)
suchuanqi@UbuntuBase:~$docker inspect容器id(或容器name)
[
{
"Id": "9490b017fdf6b8c6415d5d01b925413c6ed2dd782566d251ad2bdad90263c3cb",
"Created": "2017-11-03T06:13:13.053498761Z",
"Path": "python",
"Args": [
"app.py"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 71917,
"ExitCode": 0,
"Error": "",
"StartedAt": "2017-11-03T06:13:13.374235386Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:6fae60ef344644649a39240b94d73b8ba9c67f898ede85cf8e947a887b3e6557",
"ResolvConfPath": "/var/lib/docker/containers/9490b017fdf6b8c6415d5d01b925413c6ed2dd782566d251ad2bdad90263c3cb/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/9490b017fdf6b8c6415d5d01b925413c6ed2dd782566d251ad2bdad90263c3cb/hostname",
"HostsPath": "/var/lib/docker/containers/9490b017fdf6b8c6415d5d01b925413c6ed2dd782566d251ad2bdad90263c3cb/hosts",
"LogPath": "/var/lib/docker/containers/9490b017fdf6b8c6415d5d01b925413c6ed2dd782566d251ad2bdad90263c3cb/9490b017fdf6b8c6415d5d01b925413c6ed2dd782566d251ad2bdad90263c3cb-json.log",
"Name": "/amazing_archimedes",
"RestartCount": 0,
"Driver": "overlay2",
"Platform": "linux",
"MountLabel": "",
"ProcessLabel": "",
"AppArmorProfile": "docker-default",
"ExecIDs": null,
"HostConfig": {
"Binds": null,
"ContainerIDFile": "",
"LogConfig": {
"Type": "json-file",
"Config": {}
},
"NetworkMode": "default",
"PortBindings": {
"5000/tcp": [
{
"HostIp": "",
"HostPort": "5000"
}
]
},
...
docker exec -it 容器id(
或容器
name)
/bin/bash 咱們可使用它進行容器的交互操做進入容器的內部進行執行,顯示的內容以下所示:
進入到內部能夠是ll顯示當前文件及文件夾
而後咱們能夠操做它的內部文件 好比咱們操做它的顯示文件 app.py
咱們使用vi app.py,進入到改文件的內部,以下所示:
這是一段用python寫的代碼,咱們僅進行查看便可
咱們在內部容器中使用cd 讓他會到根目錄
重啓 WEB 應用容器
docker stop容器id(或容器name)
docker start
來啓動docker start容器id(或容器name)
docker restart容器id(或容器name)
docker ps -a
docker ps -l
移除 WEB 應用容器
咱們可使用 docker rm
命令來刪除不須要的容器:
suchuanqi@UbuntuBase:~$ docker rm 9490b017fdf6 5198a90e2406 d89a78578846 435db4b99464 76aafa3bb20d 0977407542d1
9490b017fdf6
5198a90e2406
d89a78578846
435db4b99464
76aafa3bb20d
0977407542d1
注意:刪除容器時,容器必須是中止狀態,不然會報錯,由於它如今在後臺在運行
當運行容器時,使用的鏡像若是在本地中不存在,docker 就會自動從 docker 鏡像倉庫中下載,默認是從Docker Hub 公共鏡像源下載。
能夠進入該網站www.docker.com進行查看
鏡像列表
咱們可使用 docker images 來查看本地主機上的鏡像:
suchuanqi@UbuntuBase:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 15.10 9b9cb95443b5 15 months ago 137MB
training/webapp latest 6fae60ef3446 2 years ago 349MB
選項說明:
同一倉庫源能夠有多個 TAG,表明這個倉庫源的不一樣個版本,如 ubuntu 倉庫源裏,有15.十、14.04等多個不一樣的版本,咱們使用 REPOSITORY:TAG 來定義不一樣的鏡像。
因此,咱們若是要使用版本爲15.10的ubuntu系統鏡像來運行容器時,命令以下:
docker run -it ubuntu:15.10 /bin/bash
若是要使用版本爲14.04的ubuntu系統鏡像來運行容器時,命令以下:
docker run -it ubuntu:14.04 /bin/bash
若是你不指定一個鏡像的版本標籤,例如你只使用 ubuntu,docker 將默認使用 ubuntu:latest 鏡像。
獲取鏡像
當咱們在本地主機上使用一個不存在的鏡像時 Docker 就會自動下載這個鏡像。若是咱們想預先下載這個鏡像,咱們可使用 docker pull
命令來下載它。
suchuanqi@UbuntuBase:~$ docker pull tomcat 這裏就是從鏡像docker的鏡像倉庫來得到相應的鏡像的命令
14.04: Pulling from library/ubuntu
bae382666908: Pull complete
29ede3c02ff2: Pull complete
da4e69f33106: Pull complete
8d43e5f5d27f: Pull complete
b0de1abb17d6: Pull complete
Digest: sha256:6e3e3f3c5c36a91ba17ea002f63e5607ed6a8c8e5fbbddb31ad3e15638b51ebc
Status: Downloaded newer image for ubuntu:14.04
下載完成後,咱們能夠直接使用這個鏡像來運行容器。
下載tomcat的同時咱們要告訴學生其實容器與容器之間是存在依賴關係的,好比tomcat依賴與jdk, jdk依賴於Linux
我如今倉庫的鏡像有:
REPOSITORY:表示鏡像名稱, TAG:表示版本,latest表示最後一個版本號 IMAGE ID:表示當前鏡像的惟一標識
CREATED:表示最後更新的時間 SIZE:表示鏡像的大小
查找鏡像
咱們能夠從 Docker Hub 網站來搜索鏡像,Docker Hub 網址爲: https://hub.docker.com/
咱們也可使用 docker search
命令來搜索鏡像。好比咱們須要一個 httpd
的鏡像來做爲咱們的 web
服務。咱們能夠經過 docker search
命令搜索 httpd
來尋找適合咱們的鏡像。
suchuanqi@UbuntuBase:~$ docker search tomcat
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
ubuntu Ubuntu is a Debian-based Linux operating s... 6759 [OK]
dorowu/ubuntu-desktop-lxde-vnc Ubuntu with openssh-server and NoVNC 141 [OK]
rastasheep/ubuntu-sshd Dockerized SSH service, built on top of of... 114 [OK]
ansible/ubuntu14.04-ansible Ubuntu 14.04 LTS with ansible 88 [OK]
ubuntu-upstart Upstart is an event-based replacement for ... 80 [OK]
neurodebian NeuroDebian provides neuroscience research... 40 [OK]
ubuntu-debootstrap debootstrap --variant=minbase --components... 32 [OK]
nuagebec/ubuntu Simple always updated Ubuntu docker images... 22 [OK]
tutum/ubuntu Simple Ubuntu docker images with SSH access 19
1and1internet/ubuntu-16-nginx-php-phpmyadmin-mysql-5 ubuntu-16-nginx-php-phpmyadmin-mysql-5 17 [OK]
ppc64le/ubuntu Ubuntu is a Debian-based Linux operating s... 11
aarch64/ubuntu Ubuntu is a Debian-based Linux operating s... 9
i386/ubuntu Ubuntu is a Debian-based Linux operating s... 8
darksheer/ubuntu Base Ubuntu Image -- Updated hourly 3 [OK]
codenvy/ubuntu_jdk8 Ubuntu, JDK8, Maven 3, git, curl, nmap, mc... 3 [OK]
1and1internet/ubuntu-16-nginx-php-5.6-wordpress-4 ubuntu-16-nginx-php-5.6-wordpress-4 2 [OK]
1and1internet/ubuntu-16-apache-php-7.0 ubuntu-16-apache-php-7.0 1 [OK]
smartentry/ubuntu ubuntu with smartentry 0 [OK]
1and1internet/ubuntu-16-healthcheck ubuntu-16-healthcheck 0 [OK]
pivotaldata/ubuntu-gpdb-dev Ubuntu images for GPDB development 0
thatsamguy/ubuntu-build-image Docker webapp build images based on Ubuntu 0
ossobv/ubuntu Custom ubuntu image from scratch (based on... 0
1and1internet/ubuntu-16-sshd ubuntu-16-sshd 0 [OK]
pivotaldata/ubuntu A quick freshening-up of the base Ubuntu d... 0
defensative/socat-ubuntu 0 [OK]
說明:
建立鏡像
當咱們從 docker 鏡像倉庫中下載的鏡像不能知足咱們的需求時,咱們能夠經過如下兩種方式對鏡像進行更改:
更新鏡像(基於運行的容器來建立對象)
更新鏡像以前,咱們須要使用鏡像來建立一個容器:
suchuanqi@UbuntuBase:~$ docker run -it ubuntu:15.10 /bin/bash 這裏是進入容器內部進行操做
root@9a3dcafd7a83:/# apt-get update 使用這個命令來更新數據源
Ign http://archive.ubuntu.com wily InRelease 注意這裏面不是用的是阿里雲的數據源,咱們使用的ubuntu的官方數據源
Ign http://archive.ubuntu.com wily-updates InRelease
Ign http://archive.ubuntu.com wily-security InRelease
Ign http://archive.ubuntu.com wily Release.gpg
Ign http://archive.ubuntu.com wily-updates Release.gpg
Ign http://archive.ubuntu.com wily-security Release.gpg
Ign http://archive.ubuntu.com wily Release
Ign http://archive.ubuntu.com wily-updates Release
Ign http://archive.ubuntu.com wily-security Release
最後你會發現你使用ubuntu的官方數據源的時候你不能下載或更新最新版本,因此咱們要去修改數據源
可是你在內部容器中進入到 cd etc/apt/目錄找到sources.list這個文件時使用vi sources.list進行對這個命令進行編輯時發現不可以使用這個命令,那就悲催了
那麼咱們能夠這麼作使用echo命令向sources.list進行覆蓋寫入,由於他能夠覆蓋文件內部的內容,以下所示:
echo deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse > sources.list
echo deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse >> sources.list
echo deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse >> sources.list
echo deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse >> sources.list
使用apt-get update進行更新對ubuntu進行更新操做
而後使用命令ubuntu版本的查看,你會發現不能查看ubuntu的版本須要對vim進行安裝lsb_release -a進行對
而後咱們對vim進行安裝操做
使用命令apt-get install vim 進行安裝,這個是有咱們就能夠用vim sources.list命名對這個文件進行修改了
上面的操做是對ubuntu和vim等進行了更新,可是一旦我退出該容器,那麼全部的操做將會迴歸到之前版本的狀態,作了無用之功
那麼接下來的操做是我要修改這個容器讓他變爲一個鏡像才能夠,也就是把修改後的版本及其餘操做完全的保存下來,這就比如我在類裏面增長了一個屬性
那麼接下來的操做是新開一個對話
而後我要把剛纔更新的ubuntu和vim的那個內部容器的操做重新建立一個鏡像便可,咱們可使用命令,以下所示
docker commit -m="has update" -a ="suchuanqi" 2635af4bcd3f suchuanqi/ubuntu:v2便可建立一個新的容器並把以前所作的操做保留下來,以下所示:
上面黃色部分的容器的id爲修改以前的容器的id號
而後使用docker images顯示全部容器你就會看到剛纔我麼本身建立的容器
在運行的容器內使用 apt-get update 命令進行更新。
在完成操做以後,輸入 exit 命令來退出這個容器。
此時ID爲 9a3dcafd7a83 的容器,是按咱們的需求更改的容器。咱們能夠經過命令 docker commit 來提交容器副本。
suchuanqi@UbuntuBase:~$ docker commit -m="has update" -a="suchuanqi" 9a3dcafd7a83 suchuanqi/ubuntu:v2
sha256:2642b4944b285974e5f007f30bc33b651220ea9931982c3c53b61a8f8fd5011b
各個參數說明:
咱們可使用 docker images 命令來查看咱們的新鏡像 suchuanqi/ubuntu:v2:
suchuanqi@UbuntuBase:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
suchuanqi/ubuntu v2 2642b4944b28 2 minutes ago 137MB
ubuntu 14.04 dea1945146b9 7 weeks ago 188MB
ubuntu 15.10 9b9cb95443b5 15 months ago 137MB
training/webapp latest 6fae60ef3446 2 years ago 349MB
使用咱們的新鏡像 suchuanqi/ubuntu 來啓動一個容器:
suchuanqi@UbuntuBase:~$ docker run -it suchuanqi/ubuntu:v2 /bin/bash
root@060f7af5fbec:/#
Dockerfile(建立鏡像)
咱們要建立本身的鏡像必需要先建立統一的文件夾,咱們使用名 cd /usr/local 進入該文件夾中而後使用命令mkdir docker命令建立docker文件夾即意味着全部自定義的我文件都安裝到usr/local這個文件夾下。
那麼咱們如今開始建立本身的鏡像: 首先在docker這個文件裏使用mkdir myubuntu建立一個文件夾,而後在這裏面開始使用命令vi Dockerfile建立文件及編譯文件,注意你的Dockerfile必需要使用這個文件名在建立這個文件,
那麼這個時候開始進入文件進行編輯操做
FROM ubuntu:15.10
MAINTAINER suchuanqi99@sina.com
RUN /bin/bash -c 'echo "helloWorld"'
COPY text.txt /home (這裏須要外部有個text.txt文件)
WORKDIR /home
EXPOSE 80
EXPOSE 8080
CMD ["/bin/echo", "this is a echo test"]
Dockerfile是一個包含用於組合映像的命令的文本文檔。可使用在命令行中調用任何命令。 Docker經過讀取Dockerfile中的指令自動生成映像。
docker build
命令用於從Dockerfile構建映像。能夠在 docker build
命令中使用 -f
標誌指向文件系統中任何位置的Dockerfile。
docker build -f /path/to/a/Dockerfile
說明不區分大小寫,但必須遵循建議使用大寫字母的約定。
Docker 以從上到下的順序運行 Dockerfile 的指令。爲了指定基本映像,第一條指令必須是 FROM
。
一個聲明以#
字符開頭則被視爲註釋。能夠在Docker文件中使用RUN
,CMD
,FROM
,EXPOSE
,ENV
等指令。
在這裏列出了一些經常使用的說明。
該指令用於設置後續指令的基本映像。有效的 Dockerfile 必須使用FROM
做爲其第一條指令。
FROM ubuntu
指定鏡像的做者
MAINTAINER <name>
該指令用於執行當前映像的任何命令。 好比我想執行tomcat咱們必需要爲tomcat進行解壓那麼咱們就可使用 RUN -zxvf tomcat.tar.gz,表示咱們要使用tomcat要執行解壓命令
RUN /bin/bash -c 'echo "Hello World"'
這用於執行映像的應用程序。應該如下列形式老是使用CMD
CMD ["executable", "param1", "param2"]
這是使用CMD的首選方法。Dockerfile文件中只能有一個CMD。若是使用多個CMD,則只會執行最後一個CMD。
例:CMD [「/bin/echo」, 「this is a echo test 」]
該指令用於未來自源的新文件或目錄複製到目的地的容器的文件系統。
COPY abc/ /xyz
規則:
source
路徑必須在構建的上下文以內。沒法使用COPY ../something /something
,由於docker構建的第一步是將上下文目錄(和子目錄)發送到 docker 守護程序。source
是目錄,則會複製目錄的所有內容,包括文件系統元數據。WORKDIR用於爲Dockerfile中的RUN
,CMD
和COPY
指令設置工做目錄。若是工做目錄不存在,它默認將會建立。
咱們能夠在Dockerfile文件中屢次使用WORKDIR
。
備註:能夠簡單理解爲 cd
命令,可是若是目錄不存在它會自動建立。
咱們使用命令 docker build
, 從零開始來建立一個新的鏡像。爲此,咱們須要建立一個 Dockerfile 文件,其中包含一組指令來告訴 Docker 如何構建咱們的鏡像。
而後,咱們使用 Dockerfile 文件,經過 docker build
命令來構建一個鏡像。
root@localhost:/usr/local/docker/myubuntu#docker build -t suchuanqi/myubuntu .
Sending build context to Docker daemon 3.072kB
Step 1/8 : FROM ubuntu:15.10
---> 9b9cb95443b5
Step 2/8 : MAINTAINER suchuanqi99@sina.com
---> Running in fa936b072333
Removing intermediate container fa936b072333
---> 916fc56e3d1c
Step 3/8 : RUN /bin/bash -c 'echo "helloWorld"'
---> Running in 958324b988f8
helloWorld
Removing intermediate container 958324b988f8
---> a8b51a2b0131
Step 4/8 : COPY text.txt /home
---> e7061c6a3d2a
Step 5/8 : WORKDIR /home
---> Running in 563e719cc3e8
Removing intermediate container 563e719cc3e8
---> bc123d948c54
Step 6/8 : EXPOSE 80
---> Running in 5dc8da7f8943
Removing intermediate container 5dc8da7f8943
---> bca43c71df89
Step 7/8 : EXPOSE 8080
---> Running in 56360de0c019
Removing intermediate container 56360de0c019
---> 70d24a500db4
Step 8/8 : CMD ["/bin/echo", "this is a echo test"]
---> Running in 0f54ce040ffc
Removing intermediate container 0f54ce040ffc
---> ff89b95d0de2
Successfully built ff89b95d0de2
Successfully tagged suchuanqi/myubuntu:latest
root@localhost:/usr/local/docker/myubuntu# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
suchuanqi/myubuntu latest ff89b95d0de2 9 seconds ago 137MB
suchuanqi/ubuntu v2 2deac3a7b242 23 hours ago 211MB
tomcat latest 05af71dd9251 2 days ago 463MB
ubuntu 15.10 9b9cb95443b5 2 years ago 137MB
training/webapp latest 6fae60ef3446 3 years ago 349MB
參數說明:
使用 docker images
查看建立的鏡像已經在列表中存在,鏡像ID爲 6cdd9c6b840d
root@localhost:/usr/local/docker/myubuntu# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
suchuanqi/myubuntu latest ff89b95d0de2 9 seconds ago 137MB
suchuanqi/ubuntu v2 2deac3a7b242 23 hours ago 211MB
tomcat latest 05af71dd9251 2 days ago 463MB
ubuntu 15.10 9b9cb95443b5 2 years ago 137MB
training/webapp latest 6fae60ef3446 3 years ago 349MB
設置鏡像標籤(複製)
咱們可使用 docker tag
命令,爲鏡像添加一個新的標籤。
docker tag 6cdd9c6b840d suchuanqi/ubuntu:dev
docker tag
鏡像ID
,這裏是 6cdd9c6b840d ,用戶名稱、鏡像源名(repository name)和新的標籤名(tag)。
使用 docker images
命令能夠看到,ID爲 6cdd9c6b840d 的鏡像多一個標籤。
root@UbuntuBase:/usr/local/docker/ubuntu# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
suchuanqi/ubuntu dev 6cdd9c6b840d 15 minutes ago 122MB 這個兩個id一致也就是所dev依賴了latest這個鏡像而建立的
suchuanqi /ubuntu latest 6cdd9c6b840d 15 minutes ago 122MB
suchuanqi /ubuntu v2 2642b4944b28 About an hour ago 137MB
ubuntu latest 747cb2d60bbe 3 weeks ago 122MB
ubuntu 14.04 dea1945146b9 7 weeks ago 188MB
ubuntu 15.10 9b9cb95443b5 15 months ago 137MB
training/webapp latest 6fae60ef3446 2 years ago 349MB
7.Docker實例教程
Docker 安裝 Tomcat
root@UbuntuBase:/usr/local/docker/tomcat# docker search tomcat
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
tomcat Apache Tomcat is an open source implementa... 1550 [OK]
dordoka/tomcat Ubuntu 14.04, Oracle JDK 8 and Tomcat 8 ba... 43 [OK]
tomee Apache TomEE is an all-Apache Java EE cert... 42 [OK]
davidcaste/alpine-tomcat Apache Tomcat 7/8 using Oracle Java 7/8 wi... 21 [OK]
consol/tomcat-7.0 Tomcat 7.0.57, 8080, "admin/admin" 16 [OK]
cloudesire/tomcat Tomcat server, 6/7/8 15 [OK]
maluuba/tomcat7 9 [OK]
tutum/tomcat Base docker image to run a Tomcat applicat... 8
jeanblanchard/tomcat Minimal Docker image with Apache Tomcat 8
andreptb/tomcat Debian Jessie based image with Apache Tomc... 7 [OK]
bitnami/tomcat Bitnami Tomcat Docker Image 5 [OK]
aallam/tomcat-mysql Debian, Oracle JDK, Tomcat & MySQL 4 [OK]
antoineco/tomcat-mod_cluster Apache Tomcat with JBoss mod_cluster 1 [OK]
maluuba/tomcat7-java8 Tomcat7 with java8. 1
amd64/tomcat Apache Tomcat is an open source implementa... 1
primetoninc/tomcat Apache tomcat 8.5, 8.0, 7.0 1 [OK]
trollin/tomcat 0
fabric8/tomcat-8 Fabric8 Tomcat 8 Image 0 [OK]
awscory/tomcat tomcat 0
oobsri/tomcat8 Testing CI Jobs with different names. 0
hegand/tomcat docker-tomcat 0 [OK]
s390x/tomcat Apache Tomcat is an open source implementa... 0
ppc64le/tomcat Apache Tomcat is an open source implementa... 0
99taxis/tomcat7 Tomcat7 0 [OK]
qminderapp/tomcat7 Tomcat 7 0
這裏咱們拉取官方的鏡像
docker pull tomcat ---固然咱們以前已經拉去過了鏡像
等待下載完成後,咱們就能夠在本地鏡像列表裏查到 REPOSITORY 爲 tomcat 的鏡像。
docker run --name tomcat -p 8080:8080 -d tomcat
--name tomcat運行容器的名稱自定義
-p 8080:8080 第一個8080表示sudo機的端口號 第二個8080表示映射到容器的端口號,
-d tomcat -d表示後臺運行容器tomcat
而後使用docker ps 查看運行的容器
而後我麼作個小實驗,首先使用命令docker run -it tomcat /bin/bash(非運行的容器,用這個等於新開一個容器 並不能映射到端口號) 或者使用命令docker exec -it tomcat /bin/bash(已經運行的容器) 均可以進入到容器的內部進行操做
使用ll進行操做是你會發現沒有改命令顯示文件目錄,那麼咱們使用ls -l命令顯示tomcat下的全部文件及文件夾
而後使用名cd webapps/進入該文件夾後建立一個文件夾mkdir test,而後在裏面建立一個html文件使用命令echo "hello tomcat" > index.html建立一個html,那麼咱們能夠經過外部瀏覽器進行訪問如:http://192.168.211.130:8080/test/index.html
Docker 安裝 MySQL
root@UbuntuBase:/usr/local/docker/mysql# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relati... 5177 [OK]
mariadb MariaDB is a community-developed fork of M... 1602 [OK]
mysql/mysql-server Optimized MySQL Server Docker images. Crea... 361 [OK]
percona Percona Server is a fork of the MySQL rela... 298 [OK]
hypriot/rpi-mysql RPi-compatible Docker Image with Mysql 72
zabbix/zabbix-server-mysql Zabbix Server with MySQL database support 62 [OK]
centurylink/mysql Image containing mysql. Optimized to be li... 53 [OK]
sameersbn/mysql 48 [OK]
zabbix/zabbix-web-nginx-mysql Zabbix frontend based on Nginx web-server ... 36 [OK]
tutum/mysql Base docker image to run a MySQL database ... 27
1and1internet/ubuntu-16-nginx-php-phpmyadmin-mysql-5 ubuntu-16-nginx-php-phpmyadmin-mysql-5 17 [OK]
schickling/mysql-backup-s3 Backup MySQL to S3 (supports periodic back... 16 [OK]
centos/mysql-57-centos7 MySQL 5.7 SQL database server 15
linuxserver/mysql A Mysql container, brought to you by Linux... 12
centos/mysql-56-centos7 MySQL 5.6 SQL database server 6
openshift/mysql-55-centos7 DEPRECATED: A Centos7 based MySQL v5.5 ima... 6
frodenas/mysql A Docker Image for MySQL 3 [OK]
dsteinkopf/backup-all-mysql backup all DBs in a mysql server 3 [OK]
circleci/mysql MySQL is a widely used, open-source relati... 2
cloudposse/mysql Improved `mysql` service with support for ... 0 [OK]
astronomerio/mysql-sink MySQL sink 0 [OK]
ansibleplaybookbundle/rhscl-mysql-apb An APB which deploys RHSCL MySQL 0 [OK]
cloudfoundry/cf-mysql-ci Image used in CI of cf-mysql-release 0
astronomerio/mysql-source MySQL source 0 [OK]
jenkler/mysql Docker Mysql package 0
這裏咱們拉取官方的鏡像
docker pull mysql
等待下載完成後,咱們就能夠在本地鏡像列表裏查到 REPOSITORY 爲 mysql 的鏡像
docker run -p 3306:3306 --name mysql \
-v /usr/local/docker/mysql/conf:/etc/mysql \
-v /usr/local/docker/mysql/logs:/var/log/mysql \
-v /usr/local/docker/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.7
48f81c14530203c98735e85eccd065228d5b6468c68e88923bfa19c3f46ccfe5
root@localhost:/usr/local/docker# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
48f81c145302 mysql:5.7 "docker-entrypoint.s…" 13 seconds ago Up 11 seconds 0.0.0.0:3306->3306/tcp mysql
81c42ab338ef tomcat "catalina.sh run" 2 hours ago Up 2 hours 0.0.0.0:8080->8080/tcp tomcat
root@localhost:/usr/local/docker#
這裏是一條命令 \ 表示能夠換行,使用該命令後即
命令參數:
-p 3306:3306
:將容器的3306端口映射到主機的3306端口-v /usr/local/docker/mysql/conf:/etc/mysql
:將主機當前目錄下的 conf 掛載到容器的 /etc/mysql-v /usr/local/docker/mysql/logs:/var/log/mysql
:將主機當前目錄下的 logs 目錄掛載到容器的 /var/log/mysql-v /usr/local/docker/mysql/data:/var/lib/mysql
:將主機當前目錄下的 data 目錄掛載到容器的 /var/lib/mysql-e MYSQL\_ROOT\_PASSWORD=123456
:初始化root用戶的密碼查看容器啓動狀況
root@UbuntuBase:/usr/local/docker/mysql# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bc49c9de4cdf mysql:latest "docker-entrypoint..." 4 minutes ago Up 4 minutes 0.0.0.0:3306->3306/tcp mysql
使用客戶端工具sqlyod鏈接 MySQL
若是要從新設置密碼須要刪除到宿主機路徑下/usr/local/docker/mysql/
裏面的3個文件(conf, data logs)把他刪除重新設置密碼就能夠了
docker run -p 3306:3306 --name mysql \
-v /usr/local/docker/mysql/conf:/etc/mysql \
-v /usr/local/docker/mysql/logs:/var/log/mysql \
-v /usr/local/docker/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=abcdef \
-d mysql:5.7
Docker 部署應用
首先在 /usr/local/docker 的文件夾下建立一個文件tomcat,而後根據項目名建立一個news文件夾,而後把外部的項目以war包結尾的文件拉進就能夠了
而後建立文件vi Dockerfile,按照下面的語法編輯Dockerfile文件就能夠了
FROM tomcat
MAINTAINER suchuanqi
ADD news.war /usr/local/tomcat/webapps/news.war
docker build -t suchuanqi/tomcat .
docker run --name tomcat -p 8080:8080 suchuanqi/tomcat
Docker 數據卷
數據卷簡介
數據卷是一個能夠供一個或多個容器使用的特殊目錄。
能夠達到如下目的:
docker commit
打包進鏡像文件。
咱們能夠建立兩個tomcat容器進行測試,看看他們的頁面或數據是否共享(確定不會共享)在沒有建立數據卷的時候數據就會丟失
建立數據卷(要把相關的tomcat的全部容器停掉和刪除掉)
爲何要建立數據卷:是由於當咱們中止容器,或重啓容器,或關機後全部的東西將被銷燬,由於容器其實就是對象同樣的東西當釋放資源後全部的東西都會被回收
在cd usr/local/docker目錄下建立tomcat文件夾,在tomcat文件夾建立share文件夾,在share文件夾建立webapps文件夾, 此時個人想法是我啓動的tomcat容器與我剛剛建立在宿主機上的webapps進行共享,這樣咱們的宿主機就能訪問到同一個webapps了,就能請求相同的內容了
要建立數據卷首先拿到要進入到tomcat容器內部拿到項目部署的目錄/usr/local/tomcat/webapps/
而後咱們進入到咱們剛剛建立的文件/usr/local/docker/tomcat/share中進行建立數據卷的操做注意該share文件夾中也包含了一個文件webapps,而後咱們使用命令
具體的命令爲:docker run --name tomcat1 -d -p 8080:8080 -v /usr/local/docker/tomcat/share/webapps/:/usr/local/tomcat/webapps/ tomcat
那麼注意如今咱們訪問同步後的share文件夾下的webapps的時候你會發現空空如也,由於咱們在同步容器的的時候那個tomcat的webapps裏面就什麼也沒有,因此咱們經過網絡訪問時404,那麼如今咱們能夠對share下的webapps進行設置,好比咱們進入到share/webapps目錄下建立個文件夾ROOT,使用vi index.html建立一個html的頁面,那麼咱們就能夠經過8080端口訪問到當前的index.html文件裏面的內容了, 同時他也會在內部容器tomcat中的webapps文件夾下爲我自動的建立一個ROOT目錄並自動的建立一個文件index.html實現了同步的操做;
那麼基於以上操做咱們能夠再來建立一個數據卷:好比(可是要注意必定時在webapps文件夾下來建立)
docker run --name tomcat2 -d -p 8081:8080 -v $PWD:/usr/local/tomcat/webapps/ tomcat
$PWD表示: /usr/local/docker/tomcat/share/webapps/當前這個目錄
這樣就完成了數據卷的共享操做,只要建立了數據卷,那麼那麼咱們就能夠經過數據捲來建立多個tomcat容器了
那麼綜上所述,咱們建立數據卷後數據將會保留到宿主機中不會隨着容器的中止或銷燬而銷燬,若是咱們再去經過數據捲來建立其餘容器的時候也依然會共享數據
備份數據卷
這實際上是利用 tar
命令來執行的。
備份的原理:使用 tar -zcvf
對數據卷打包壓縮
建立一個 MySQL 容器:
docker run -p 3306:3306 --name mysql \
-v /usr/local/docker/mysql/conf:/etc/mysql \
-v /usr/local/docker/mysql/logs:/var/log/mysql \
-v /usr/local/docker/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.7
進入 /usr/local/docker/mysql
目錄(這裏是數據卷的目錄),使用
tar -zcvf 201810212224backup.tar.gz .
進行對mysql裏面的內容記性打包操做 注意這裏面"."表示打包到當前目錄
恢復數據卷
解壓縮備份數據壓縮包
tar -zxvf backup.tar.gz
從新啓動一個新的容器並將數據卷指向須要還原的數據卷目錄
docker run -p 3306:3306 --name mysql \
-v /usr/local/docker/mysql/conf:/etc/mysql \
-v /usr/local/docker/mysql/logs:/var/log/mysql \
-v /usr/local/docker/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.7