Docker數據卷和容器編排

前言

Docker 數據卷和容器編排,記錄下來!💻🦄html

數據卷

數據卷能夠繞過拷貝系統,在多個容器之間、容器和宿主機之間共享目錄或文件,數據卷繞過了拷貝系統,能夠達到本地磁盤I/O性能。mysql

  • 運行容器時,指定一個數據卷
$ docker run -itd --name nginx -v /usr/share/nginx/html/ -p 80:80 e445ab08b2be
複製代碼

此時,咱們建立了一個數據卷而且掛載到容器的/usr/share/nginx/html/目錄下。nginx

使用 docker inspect 命令找到數據卷映射目錄:git

Docker默認將宿主機的/var/lib/docker/volumes/1baaa58867f6e5b6bed703b0eae6ae859d39fa293ad5d85f58bf73d6101914c6/_data目錄做爲source目錄,接下來,進入到該目錄中:github

此時發現該目錄下的文件內容與容器中/usr/share/nginx/html/目錄下的文件內容一致,這是由於掛載一個空的數據捲到容器中的一個非空目錄中,這個目錄下的文件會被複制到數據卷中。

注意:因爲Mac中的Docker有點特殊,上文提到的/var/lib/xxxx目錄,若是是在Linux環境下,則直接進入便可, 若是是在mac中,須要首先執行以下命令,在新進入的命令行中進入到/var/lib/xxx目錄下: screen ~/Library/Containers/com.docker.docker/Data/vms/0/ttyweb

接下來修改數據卷中的index.html文件內容,以下:sql

$ echo "hello volumes">index.html
複製代碼

修改完成後,再回到瀏覽器中,輸入127.0.0.1,查看nginx中index.html頁面中的數據,發現已經發生改變。docker

注意:Linux環境下輸入 curl 127.0.0.1數據庫

說明宿主機中的文件共享到容器中去了。

宿主機目錄作數據卷

上文中對於數據卷的用法還不是最佳方案,通常來講,咱們可能須要明確指定將宿主機中的一個目錄掛載到容器中,這種指定方式以下:ubuntu

$ docker run -itd --name nginx2 -v /root/www/:/usr/share/nginx/html/ -p 8889:80 98ebf73aba75
複製代碼

這樣即是將宿主機中的 /root/www/ 目錄掛載到容器的 /usr/share/nginx/html/ 目錄下,接下來只須要在 /root/www/ 目錄下添加、修改html文件,都能在nginx訪問中立馬看到效果。這種用法對於開發測試很是方便,不用從新部署,重啓容器等。

注意:宿主機目錄是一個絕對路徑。

數據卷其餘操做

  • Dockerfile文件裏面設置數據卷
VOLUME /usr/share/nginx/html/
複製代碼

這樣就配置了一個匿名數據卷,運行過程當中,將數據寫入到/usr/share/nginx/html/目錄中,就能夠實現容器存儲層的無狀態變化。

  • 查看全部數據卷
$ docker volume ls
複製代碼

  • 查看數據卷詳情
$ docker volume inspect
複製代碼

  • 刪除數據卷
$ docker volume rm
複製代碼

注意:在使用中的數據卷,須要先將相關的容器中止並移除,才能刪除。

數據卷容器

數據卷容器是一個專門用來管理數據卷的容器,該容器主要是供其餘容器的引用和使用。

  • 建立數據卷容器
$ docker run -itd -v /usr/share/nginx/html/ --name mydata ubuntu
複製代碼
  • 引用容器
$ docker run -itd --volumes-from mydata 80:80 --name nginx1 nginx
$ docker run -itd --volumes-from mydata 81:80 --name nginx2 nginx
複製代碼

此時,nginx1和nginx2都掛載了同一個數據捲到/usr/share/nginx/html/目錄下,三個容器中,任意一個修改了該目錄下的文件,其餘兩個都能看到變化。

容器鏈接

通常來講,容器啓動後,咱們都是經過端口映射來使用容器提供的服務,端口映射只是使用容器服務的一種方式,除了這種方式外,還可使用容器鏈接的方式來使用容器服務。

例如,有兩個容器,一個容器運行一個SpringBoot項目,另外一個容器運行着mysql數據庫,能夠經過容器鏈接使 SpringBoot直接訪問到Mysql數據庫,而沒必要經過端口映射來訪問mysql服務。

爲了案例簡單,我這裏舉另一個例子:

有兩個容器,一個nginx容器,另外一個ubuntu,我啓動nginx容器,可是並不分配端口映射,而後再啓動 ubuntu,經過容器鏈接,在ubuntu中訪問nginx。

具體操做步驟以下:

  1. 首先啓動一個nginx容器,可是不分配端口,命令以下:
$ docker run -d --name nginx1 nginx
複製代碼

容器啓動成功後,在宿主機中是沒法訪問的。

  1. 啓動ubuntu

接下來,啓動一個ubuntu,而且和nginx創建鏈接,以下:

$ docker run -dit --name ubuntu --link nginx1:mylink ubuntu bash
複製代碼

這裏使用--link創建鏈接,nginx1是要創建鏈接的容器,後面的mylink則是鏈接的別名。

運行成功後,進入到ubuntu容器命令行:

$ docker exec -it ubuntu bash
複製代碼

在ubuntu控制檯直接輸入env,查看環境變量信息:

能夠看到docker爲nginx建立了一系列環境變量。每一個前綴變量是MYLINK,這就是剛剛給鏈接取得別名。開發者可使用這些環境變量來配置應用程序鏈接到nginx。該鏈接是安全、私有的。

注意:默認狀況下,ubuntu容器中沒有安裝curl命令,須要手動安裝下,安裝命令以下: apt-get updateapt-get install curl

容器編排

使用docker-compose能夠實現容器編排。

Compose是一個用於定義和運行多容器Docker應用程序的工具。

  • 在Linux系統上安裝Compose
  1. 下載Docker Compose二進制文件
sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
複製代碼
  1. 對二進制文件應用可執行權限:
sudo chmod +x /usr/local/bin/docker-compose
複製代碼
  1. 測試docker-compose是否安裝:
$ docker-compose --version
複製代碼

  • 編寫Dockerfile,內容以下:
FROM tomcat
ADD https://github.com/JpressProjects/jpress/raw/alpha/wars/jpress-web-newest.war /usr/local/tomcat/webapps/
RUN cd /usr/local/tomcat/webapps/ \
    && mv jpress-web-newest.war jpress.war
複製代碼

解釋:

  1. 容器基於Tomcat建立。
  2. 下載jpress項目的war包到tomcat的webapps目錄下。
  3. 給jpress項目重命名。
  • 編寫docker-compose.yml,內容以下:
version: '3.1'
services:
 web:
  build: .
  container_name: jpress
  ports:
    - '8080:8080'
  volumes:
    - /usr/local/tomcat/
  depends_on:
    - db
 db:
  image: mysql
  container_name: mysql
  command: --default-authentication-plugin=mysql_native_password
  restart: always
  ports:
    - '3306:3306'
  environment:
    MYSQL_ROOT_PASSWORD: root
    MYSQL_DATABASE: jpress
複製代碼
  1. 首先聲明瞭web容器,而後聲明db容器。
  2. build .表示web容器項目構建上下文爲.,即,將在當前目錄下查找Dockerfile構建web容器。
  3. container_name表示容器的名字。
  4. ports是指容器的端口映射。
  5. volumes表示配置容器的數據卷。
  6. depends_on表示該容器依賴於db容器,在啓動時,db容器將先啓動,web容器後啓動,這只是啓動時機 的前後問題,並非說web容器會等db容器徹底啓動了纔會啓動。
  7. 對於db容器,則使用image來構建,沒有使用Dockerfile。
  8. restart描述了容器的重啓策略。
  9. environment則是啓動容器時的環境變量,這裏配置了數據庫root用戶的密碼以及在啓動時建立一個名爲 jpress的庫,environment的配置可使用字典和數組兩種形式。

注意:docker-compose.yml文件裏面不能有多餘的空格!不然會運行不成功。

運行:

$ docker-compose up -d
複製代碼

瀏覽器輸入http://localhost:8080/jpress,就能夠看到jpress的配置頁面。

  • 經常使用命令
# 中止容器運行
$ docker-compose stop

# 啓動容器
$ docker-compose start

# 重啓容器
$ docker-compose restart
複製代碼

注意:需在docker-compose.yml和Dockerfile所在目錄下執行以上命令。

最後

沒有什麼是永恆的!🌴

今日寄語:
「男人的征途是星辰大海!⛄️️」

歡迎關注我的微信公衆號:桃李報春 我的博客:leeyunt.top

桃李報春
相關文章
相關標籤/搜索