Docker 入門(二):從實例來看 Dockerfile 和 Compose

上一文中提到,每次對容器作了改動,若是不把它 commit 成新的鏡像,在刪除容器後,數據也會丟失,有沒有什麼更好的辦法來保存數據呢?使用數據卷就能夠解決這個問題。mysql

另外,相對於用 commit 容器建立鏡像,使用 Dockerfile 在創鏡像的同時還能夠包含不少命令進去,能夠簡化後續操做。git

對於須要用到多個容器的應用,Docker 也提供了更強大的工具 Compose 來管理容器。github

本文就將淺談 Docker 的 數據管理、Dockerfile、Compose 這三個方面,同時用實例來演示,助你快速掌握 Docker 基本技能。web

環境說明:上一篇文章我用的是 Ubuntu,這篇文章換 win 來玩玩。用的 shell 是 CMD(美化版)

win 下,配置鏡像加速也很是方便,只須要在以下位置填寫阿里雲的專屬加速地址就能夠了。sql

從 MySQL 實例來看數據管理

若是咱們運行了一個 MySQL 容器,數據庫等信息就是存放在容器內的,中止容器到還沒事,一旦咱們在刪除容器以前忘了導出數據,那麼全部的數據就會丟失。這是很是 不安全 的。docker

何況就算咱們不會忘了在刪除容器以前導出數據,若是要用到多個須要存儲數據的容器,咱們也要一個一個把數據導出來嗎?這是很是 不方便 的。shell

而 Docker 就提供了一個獨立於容器以外的存儲技術 數據卷(Volume),數據卷的本質是一個文件目錄,它能夠是本機的目錄也能夠是一個容器中的目錄(若是把數據卷放在了一個單獨的容器中,這個容器也被稱爲 數據卷容器)。數據庫

使用 數據卷 就能夠將多個容器內的數據單獨 持久化 在一個本機目錄或者一個單獨的容器中了。segmentfault

例以下面這個例子:tomcat

$ docker run -d -p 3307:3306 --name sql -v E:/jpress/mysql:/var/lib/mysql -e MYSQL_DATABASE=jpress -e MYSQL_ROOT_PASSWORD=root mysql
-d 後臺運行, -p 映射本機端口 3307 到容器內的 3306 , --name是指定容器的別名, -v local-dir:container-dir 將本地的目錄做爲數據卷掛載到容器內的目錄進行數據持久化, -e 是 mysql 的參數,後面跟上 MySQL 的環境變量, /var/lib/mysql是 MySQL 存儲數據的目錄。

-e MYSQL_DATABASE= 能夠指定運行容器時建立一個數據庫,-e MYSQL_ROOT_PASSWORD= 指定 MySQL 的密碼,MySQL 用戶名默認是 root。

上面的那條命令雖長,但主要的操做是數據持久化的那一步,下面咱們來驗證一下,數據究竟有沒有被持久化:

$ docker pull mysql
$ docker run -d -p 3307:3306 --name sql -v E:/jpress/mysql:/var/lib/mysql -e MYSQL_DATABASE=jpress -e MYSQL_ROOT_PASSWORD=root mysql
$ docker stop sql
$ docker rm sql
$ docker run -d -p 3307:3306 --name sql -v E:/jpress/mysql:/var/lib/mysql mysql
$ docker exec -it sql bash
$ SHOW DATABASES;

有圖有真相:

圖中的文字已經足夠說明作數據持久化的好處了。

Dockerfile

Dockerfile 是一個 配置文件,裏面能夠放多條處理命令,一次配置好了能夠簡化後續的部分操做。須要注意的是,一個 Dockerfile 只能包含一個基礎鏡像,就像函數同樣,一個配置文件只幹一件事。

一個 Dockerfile 裏面通常有兩類信息:

  • 基礎鏡像和維護者的信息
  • 多條操做鏡像和容器的命令

下面經過建立本身的 Tomcat 鏡像來演示 Dockerfile 的用法(Tocmcat 已包含 JDK):

vi Dockerfile

在 Dockerfile 中寫入如下信息,#後面的是註釋:

#基礎鏡像和維護者的信息

#使用一個 Tomcat 鏡像做爲基礎鏡像
From tomcat
#註明建立者的信息,也能夠不寫
MAINTAINER stormxing <stormxing@foxmail.com>

#多條操做鏡像和容器的命令(這裏舉例一條)

#複製 war 包到鏡像內的 webapps 目錄裏
COPY jpress.war /usr/local/tomcat/webapps

這裏用到的 war 包是一個開源的 Java 博客,官網是:

https://github.com/JpressProj...

war 包我已經打好了,下載地址是:

http://stormxing.oss-cn-beiji...

接下來用 Dockerfile 構建咱們的鏡像:

docker build -t myweb .

-t myweb是爲新的鏡像起一個名字, .表示 Dockerfile 的路徑,因爲是它在當前路徑因此是 .

而後,運行鏡像後訪問localhost:8080/jpress,就能夠看到網頁了。

$ docker run -d -p 8080:8080 myweb

點下一步以後按提示輸入信息,還記得嗎,上面咱們已經搞定數據庫了(沒想到吧),這裏直接填寫信息既能夠了,這個數據庫主機並非 localhost ,而是容器外的 ip,也就是咱們的本機 ip,用 ipconfig就能查到。

最後點下一步,按提示設置後臺登錄的用戶名和密碼,輸入localhost:8080/jpress/admin就能夠進入到後臺管理頁面。

至此,咱們還 順便 知道了如何用 Docker 搭建 JavaWeb 環境了。

多容器應用工具(Compose)

一個 Dockerfile 能包含一個基礎鏡像,而比較複雜的項目是要用多個容器部署的,一個一個建立仍是有點麻煩的,而 Compose 就是一個管理多容器應用的工具。

Compose 安裝

Docker-compose 只有在 Linux 上是須要單獨下載的,Windows 和 Mac 自帶。而且它是放在 GitHub 上面維護的,因此國內從 GitHub 上下載它速度很是慢,能夠訪問下面的地址從 daocloud 下載鏡像。

https://get.daocloud.io/#inst...

執行如下兩條命令便可完成安裝。

$ curl -L https://get.daocloud.io/docker/compose/releases/download/1.20.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
$ chmod +x /usr/local/bin/docker-compose

安裝完成後,能夠用如下命令查看下版本信息。

$ docker-compose --version

從 jpress 來看 docker-compose

docker-compose 相似於 Dockerfile,也是一個配置文件,但不一樣的是,一個 Dockerfile 只能跑一個鏡像,而 docker-compose 就能一次跑多個,並且還能配合 Dockerfile 來使用。

這裏咱們演示用 docker-compose 來跑 jpress。

  • 編寫配置文件(這個文件名同 Dockerfile 同樣是約定好的)
vi docker-compose.yml

填寫如下內容:

version: "3"

services:
  mysql:
    image: mysql
    ports:
      - "3307:3306"
    volumes:
      - "E:/jpress/sql:/var/lib/mysql"
    container_name: sql
    environment:
      MYSQL_DATABASE: jpress
      MYSQL_ROOT_PASSWORD: root

  tomcat:
    build: .
    ports:
      - "8080:8080"
    container_name: web
注意縮進,tomcat 和 mysql 都是包含在 services 下面的。 build: .指調用以前寫的 Dockerfile 來運行 Tomcat,MySQL 的數據卷注意要從新建立,不然會使用以前的數據,其餘的在以前都見到過,看字段的名字就知道意思了。

我這個文件是新建在 Dockerfile 的同一個目錄裏的:

  • 執行一下命令就能運行了,結果跟上面的構建方式是同樣的
$ docker-compose up -d
  • 如此看來用 docker-compose 果真簡化了不少操做,只須要一次配置好,而後直接運行就能夠了。
  • 另外,若是要刪除剛運行的兩個容器,能夠:
$ docker-compose stop
$ docker-compose rm

總結

本文從數據持久化開始提及,淺談了 Dockerfile 和 docker-compose 並附送如何用這兩種方式分別搭建 JavaWeb 環境,並在對比中展現了它們各自的特色。

最後結合 上篇文章 畫張導圖送給你,可不是用來收藏的喲:

本文用到的全部文件已整理到 GitHub:

https://github.com/stormxing/...

相關文章
相關標籤/搜索