Linux(Ubuntu):搭建Docker

 

1. Docker 簡介

 

 

Docker 是一個開源的應用容器引擎,基於 Go 語言 並聽從 Apache2.0 協議開源。php

Docker 可讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,而後發佈到任何流行的 Linux 機器上,也能夠實現虛擬化。html

容器是徹底使用沙箱機制,相互之間不會有任何接口 (相似 iPhone 的 app),更重要的是容器性能開銷極低。前端

Docker 的應用場景

  • Web 應用的自動化打包和發佈
  • 自動化測試和持續集成、發佈
  • 在服務型環境中部署和調整數據庫或其餘的後臺應用
  • 從頭編譯或者擴展示有的 OpenShift 或 Cloud Foundry 平臺來搭建本身的 PaaS (Platform-as-a-Service) 環境
  • 簡化程序:Docker 讓開發者能夠打包他們的應用以及依賴包到一個可移植的容器中,而後發佈到任何流行的 Linux 機器上,即可以實現虛擬化。Docker改變了虛擬化的方式,使開發者能夠直接將本身的成果放入Docker中進行管理。方便快捷已是 Docker的最大優點,過去須要用數天乃至數週的 任務,在Docker容器的處理下,只須要數秒就能完成。
  • 避免選擇恐懼症:若是你有選擇恐懼症,仍是資深患者。Docker 幫你打包你的糾結!好比 Docker 鏡像;Docker 鏡像中包含了運行環境和配置,因此 Docker 能夠簡化部署多種應用實例工做。好比 Web 應用、後臺應用、數據庫應用、大數據應用好比 Hadoop 集羣、消息隊列等等均可以打包成一個鏡像部署。
  • 節省開支:一方面,雲計算時代到來,使開發者沒必要爲了追求效果而配置高額的硬件,Docker 改變了高性能必然高價格的思惟定勢。Docker 與雲的結合,讓雲空間獲得更充分的利用。不只解決了硬件管理的問題,也改變了虛擬化的方式。

Docker 的優勢

Docker 引擎

Docker 引擎是一個包含如下主要組件的客戶端服務器應用程序。java

  • 一種服務器,它是一種稱爲守護進程而且長時間運行的程序。
  • REST API用於指定程序能夠用來與守護進程通訊的接口,並指示它作什麼。RPC  restFull
  • 一個有命令行界面 (CLI) 工具的客戶端。

Docker 引擎組件的流程以下圖所示:python

 

 

2. Docker 功能特色

雖然Docker提供了不少功能,但這裏只列出了一些主要功能,以下所示:mysql

輕鬆快捷的配置

這是Docker的一個主要功能,可幫助咱們輕鬆快速地配置系統。能夠在更少的時間和精力的狀況下部署代碼。 因爲Docker能夠在各類各樣的環境中使用,基礎架構再也不要求與應用程序的環境相關聯。linux

提升工做效率

經過放寬技術配置和應用的快速部署。 毫無疑問,它節約了時間提升了生產率。 Docker不只有助於在孤立環境中執行應用程序,並且還減小了資源。nginx

應用隔離

Docker提供用於在隔離環境中運行應用程序的容器。 每一個容器獨立於另外一個容器,並容許執行任何類型的應用程序。git

雲調度

它是Docker容器的集羣和調度工具。 Swarm(是Docker的集羣調度工具,使用Swarm控制和管理Docker的集羣)使用Docker API做爲其前端,這有助於咱們使用各類工具來控制它。 它還能夠將Docker主機集羣控制爲一個虛擬主機。 這是一個用於啓用可插拔後端的自組織引擎組。web

路由網

它將可用節點上已發佈端口的傳入請求路由到活動容器。 即便節點上沒有任務正在運行,此功能也能夠實現鏈接。

服務

服務是容許指定集羣內的容器狀態的任務列表。 每一個任務表示一個應該運行的容器的一個實例,而且Swarm在節點之間調度它們。

安全管理

它容許將保密數據保存到雲羣 (swarm) 中,而後選擇給予服務訪問某些保密數據。它包括一些重要的命令給引擎,如保密數據檢查,保密數據建立等。

 

 

 

 

3. Docker 系統架構

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。

 

 

 

 

 

 

4. Docker 安裝(安裝以前clone出一臺新的虛擬機)

能夠在任何操做系統上安裝 Docker,不管是 Mac,Windows,Linux 仍是任何雲服務器。Docker 引擎在 Linux 發行版上運行。 在這裏,咱們將以 Linux Ubuntu Server 16.04 做爲演示安裝 Docker 引擎的過程。

前提條件

Docker 須要兩個重要的安裝要求:

  • 它僅適用於 64 位 Linux 安裝
  • 它須要 Linux 內核版本 3.10 或更高版本。

要查看當前的內核版本,請打開終端並鍵入uname -r命令以查看內核版本:

suchuanqi@UbuntuBase:~$uname -r
4.4.0-21-generic

查看操做系統是32位仍是64位:

suchuanqi@UbuntuBase:~$uname --m
x86_64

在安裝Docker以前先更改數據源,用阿里源便可

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

使用腳本安裝 Docker

使用在線安裝腳本

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'.

啓動 Docker 後臺服務,若是成就重啓系統

service docker start啓動docker                 從新啓動docker----service docker restart

查看 Docker 當前版本

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

 

 

 

5. Docker 基本使用(到這裏咱們Docker要再克隆一臺出來,以便咱們更好的操做)

第一個 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:Docker 的二進制執行文件
  • run:與前面的 docker 組合來運行一個容器
  • ubuntu:15.10:指定要運行的鏡像,Docker首先從本地主機上查找鏡像是否存在,若是不存在,Docker 就會從鏡像倉庫 Docker Hub 下載公共鏡像
  • /bin/echo "Hello Docker":在啓動的容器裏執行的命令

以上命令完整的意思能夠解釋爲: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的內部文件結構

參數解釋:                                  

  • -t:在新容器內指定一個僞終端或終端
  • -i:容許你對容器內的標準輸入進行交互

此時咱們已進入一個 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

退出容器:

  • 運行 exit
  • 使用 CTRL + D
  • 可使用docker  ps(查看正在運行的容器) 或docker  ps  -a(查看全部容器包括正在運行的和運行過的容器)  進行對容器的查看 

最後使用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中止該容器便可,最後在進行刪除容器,及查看等操做便可,以下圖所示:

 

 

 

 

6. Docker 容器管理

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

參數說明:

  • -d:讓容器在後臺運行
  • -P:將容器內部使用的網絡端口映射到咱們使用的主機上
  • training/webapp:   這裏的意思是鏡像爲training/webapp
  • 執行的命令爲: python app.py

那麼這個時候咱們就能夠經過網頁去訪問該容器內的程序

 

 

查看 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 -

參數說明:

  • -f:讓 dokcer logs 像使用 tail -f 同樣來輸出容器內部的標準輸出

從上面,咱們能夠看到應用程序使用的是 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 應用容器

中止WEB應用容器

docker stop容器id(或容器name)

已經中止的容器,咱們可使用命令 docker start 來啓動

docker start容器id(或容器name)

重啓WEB應用容器

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

注意:刪除容器時,容器必須是中止狀態,不然會報錯,由於它如今在後臺在運行

 

 

 

 

6. Docker 鏡像管理:

當運行容器時,使用的鏡像若是在本地中不存在,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

選項說明:

  • REPOSITORY:表示鏡像的倉庫源
  • TAG:鏡像的標籤
  • IMAGE ID:鏡像ID
  • CREATED:鏡像建立時間
  • SIZE:鏡像大小

同一倉庫源能夠有多個 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]

說明:

  • NAME:鏡像倉庫源的名稱
  • DESCRIPTION:鏡像的描述
  • OFFICIAL:是否docker官方發佈

 

 

 

 

建立鏡像

當咱們從 docker 鏡像倉庫中下載的鏡像不能知足咱們的需求時,咱們能夠經過如下兩種方式對鏡像進行更改:

  • 從已經建立的容器中更新鏡像,而且提交這個鏡像
  • 使用 Dockerfile 指令來建立一個新的鏡像

 

更新鏡像(基於運行的容器來建立對象)

更新鏡像以前,咱們須要使用鏡像來建立一個容器:

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

各個參數說明:

  • -m:提交的描述信息
  • -a:指定鏡像做者
  • 9a3dcafd7a83:容器ID
  • suchuanqi/ubuntu:v2:指定要建立的目標鏡像名

咱們可使用 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

Dockerfile文件說明

說明不區分大小寫,但必須遵循建議使用大寫字母的約定。

Docker 以從上到下的順序運行 Dockerfile 的指令。爲了指定基本映像,第一條指令必須是 FROM

一個聲明以字符開頭則被視爲註釋。能夠在Docker文件中使用RUNCMDFROMEXPOSEENV等指令。

在這裏列出了一些經常使用的說明。

FROM

該指令用於設置後續指令的基本映像。有效的 Dockerfile 必須使用FROM做爲其第一條指令。

FROM ubuntu

MAINTAINER

指定鏡像的做者

MAINTAINER <name>

RUN

該指令用於執行當前映像的任何命令。 好比我想執行tomcat咱們必需要爲tomcat進行解壓那麼咱們就可使用 RUN -zxvf tomcat.tar.gz,表示咱們要使用tomcat要執行解壓命令

RUN /bin/bash -c 'echo "Hello World"'

CMD

這用於執行映像的應用程序。應該如下列形式老是使用CMD

CMD ["executable", "param1", "param2"]

這是使用CMD的首選方法。Dockerfile文件中只能有一個CMD。若是使用多個CMD,則只會執行最後一個CMD。

例:CMD [「/bin/echo」, 「this is a echo test 」]

COPY---將sudo機中的文件複製到容器中

該指令用於未來自源的新文件或目錄複製到目的地的容器的文件系統。

COPY abc/ /xyz

規則:

  • source路徑必須在構建的上下文以內。沒法使用COPY ../something /something,由於docker構建的第一步是將上下文目錄(和子目錄)發送到 docker 守護程序。
  • 若是source是目錄,則會複製目錄的所有內容,包括文件系統元數據。

WORKDIR---用來指定工做目錄

WORKDIR用於爲Dockerfile中的RUNCMDCOPY指令設置工做目錄。若是工做目錄不存在,它默認將會建立。

咱們能夠在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
 

參數說明:

  • -t:指定要建立的目標鏡像名
  • .:Dockerfile 文件所在目錄,能夠指定 Dockerfile 的絕對路徑

使用 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

查找 Docker Hub 上的 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
 
 
  • -p 8080:8080:將容器的8080端口映射到主機的8080端口
  • -v $PWD/test:/usr/local/tomcat/webapps/test:將主機中當前目錄下的test掛載到容器的/test

 

 

 

Docker 安裝 MySQL

查找 Docker Hub 上的 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用戶的密碼
  • -d mysql:5.6  表示後臺運行mysql
  • 在我這裏最新版的mysql不能啓動起來在這裏我用命令docker pull mysql:5.7拉取了mysql的5.7的版本進行操做

查看容器啓動狀況

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 部署應用

  • 上傳應用到服務器
  • 建立 Dockerfile

首先在 /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 數據卷

數據卷簡介

數據卷是一個能夠供一個或多個容器使用的特殊目錄。

能夠達到如下目的:

  1. 繞過「拷貝寫」系統,以達到本地磁盤 IO 的性能,(好比運行一個容器,在容器中對數據卷修改內容,會直接改變宿主機上的數據卷中的內容,因此是本地磁盤IO的性能,而不是先在容器中寫一份,最後還要將容器中的修改的內容拷貝出來進行同步。)
  2. 繞過「拷貝寫」系統,有些文件不須要在 docker commit 打包進鏡像文件。
  3. 在多個容器間共享目錄。
  4. 在宿主和容器間共享目錄。
  5. 在宿主和容器間共享一個文件。

 

咱們能夠建立兩個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
相關文章
相關標籤/搜索