Docker與微服務

哈哈哈hh發表於2022-06-07

映象下載、域名解析、時間同步請點選  阿里雲開源映象站

一、映象

映象是一種輕量級、可執行的獨立軟體包,它包含執行某個軟體所需的所有內容,我們把應用程式和配置依賴打包形成一個可交付的執行環境(包括程式碼、執行時需要的庫、環境變數和配置檔案等),這個打包好的執行環境就是image映象檔案

1.映象分層

以tomcat映象為例,我們發現在pull的過程中映象好像一層一層的在下載

file

(1). Docker映象載入原理:

docker映象實際上由一層一層的檔案系統組成,這種層級的檔案系統就是聯合檔案系統(UnionFS)

(2). UnionFS(聯合檔案系統)

UnionFS(聯合檔案系統):Union檔案系統是一種分層、輕量級並且高效能的檔案系統,它支援對檔案系統的修改作為一次提交來一層層的疊加, 同時可以將不同目錄掛載到同一個虛擬檔案系統下。Union檔案系統時Docker映象的基礎。映象可以透過分層來進行繼承,基於基礎映象(沒有父映象)可以製作除具體的應用映象。

(3). 具體細節

  • bootfs(boot file sysytem)

主要包含bootloader和kernel,bootloader主要是引導載入kernel,Linux剛啟動時會載入bootfs檔案系統,在Docker映象的最底層時引導檔案系統bootfs。這一層與我們典型的Linux/Unix系統是一樣的,包含boot載入器和核心。當boot載入完成之後整個核心就都在記憶體中了,此時記憶體的使用權已由bootfs轉交給核心,此時系統也會解除安裝bootfs

  • rootfs(root file system)

在bootfs之上,包含的就是典型Linux系統中的/dev, /proc, /bin,/etc等標準目錄和檔案,rootfs就是各種不同作業系統發行版,比如Ubuntu,Centos等

(4). 映象分層的好處

共享資源,方便複製遷移、複用

比如說多個映象都是從相同的一份base映象構建而來(更詳細的講 假如base映象共有十層,而A映象是base映象的前三層,B映象是base映象的後三層),那麼我們只需要在磁碟上儲存一份base映象,在記憶體中載入一份base映象,就可以為所有由base映象構建而來的映象的例項容器服務了。

通俗來講,大學圖書館分為好幾層,如工學、文學、醫學每個大的分割槽又可以細分多個不同的子領域,而我們全校的學生雖然專業眾多,但是都可以在圖書館找到屬於自己專業的書籍。這樣我們就不需要因為學科領域不同也建造多個圖書館了

(5). 容器層、映象層

當容器啟動時,一個新的可寫層被載入到映象的頂部,這一層通常被稱為 " 容器層" , "容器層 " 之下的都叫 " 映象層 " 。Docker映象層都是隻讀的,容器層是可寫的。

這個好理解,圖書館中的書可以借閱,但是圖書館地基和整體建築肯定不能隨便動

在docker上執行Ubuntu容器例項,使用vim編輯檔案,發現報錯了,找不到vim

file

原因

這是由於映象是簡易版的Linux,僅包括Linux核心等一些重要的。

但是我們進行配置檔案的修改,需要用到vim編輯器,這時候就需要映象加強了

apt update 更新包管理工具(ubuntu)

file

apt install vim 下載vim

使用vim編輯器,新建檔案a.txt 並寫入hello docker,儲存退出。讀取a.txt檔案

file

ctrl+q+p 退出容器 docker ps 檢視正在執行的容器

file

第一個就是我們剛才使用的帶vim編輯器的ubuntu容器

docker commit -m=“提交的描述資訊” -a=“作者” 容器ID 要建立的目標映象名:[標籤名]

file

commit 帶vim編輯器的ubuntu容器到本地,檢視本地映象發現帶vim的大小多了近100MB,這就是為什麼映象檔案小的原因所在,只是按需下載

Docker中的映象分層,支援透過擴充套件現有映象,建立新的映象。

2.本地映象釋出到阿里雲

在阿里雲控制檯 -> 容器映象服務 -> 個人例項(建立一個用於測試)

file

file

file

(1). 建立名稱空間

file

(2) 建立映象倉庫

file

file

(3) 阿里雲會自動生成操作指南

file

(3)講映象推送到Registry

(4)登入

docker login --username=使用者名稱 registry.cn-shanghai.aliyuncs.com

file

(5)設定映象版本號

docker tag [ImageId] registry.cn-shanghai.aliyuncs.com/xueyueqing/ubuntu:[映象版本號]

file

(6)推送

docker push registry.cn-shanghai.aliyuncs.com/xueyueqing/ubuntu:[映象版本號]

file

(7)測試

刪除本地Ubuntu1.3的映象

file

(8)從阿里雲Registry中拉取映象

docker pull registry.cn-shanghai.aliyuncs.com/xueyueqing/ubuntu:[映象版本號]

file

測試成功!

file

二、容器資料卷

1.作用

試想一下:我們的docker容器很容易被自己誤刪或者被別人惡意刪除,那我們容器中的重要資料不就丟失了嗎?

docker採用容器資料卷的方式解決此類問題。

卷就是目錄或檔案,存在於一個或多個容器中,由docker掛載到容器,不屬於聯合檔案系統,可以繞過聯合檔案系統提供一些用於持久化和共享資料的特性。

容器資料卷設計的目的就是資料的持久化,它完全獨立於容器的生存週期,因此Docker不會再容器刪除時刪除其掛載的資料卷

注意事項

Docker掛載主機目錄訪問如果出現cannot open directory:Permission denied解決辦法:在掛載目錄後多加一個–privileged=true引數即可

作用: 擴大容器的許可權解決掛載目錄沒有許可權的問題,使得容器中root擁有所有許可權,否則root只是外部一個普通的使用者

2.特點

  • 資料卷可在容器之間共享或重用資料
  • 卷中的更改可以直接實時生效
  • 資料卷中的更改不會包含再映象的更新中
  • 資料卷的生命週期一直持續倒沒有容器使用它為止

3.測試

docker run -it --privileged=true -v/宿主機絕對路徑目錄:/容器內目錄 映象名

file

(1). 在容器docker_data目錄中建立檔案

file

(2). 在本地host_data目錄下發現 dockerin.txt檔案已共享

file

(3). 在本地host_data目錄下新建檔案並寫入資料 hello docker

file

(4). 在容器docker_data目錄中發現hostin.txt檔案 並讀取到共享過來的資料

file

(5). docker inspect 容器ID 檢視容器內部細節

file

假設容器停止,在主機新建檔案能否共享嗎?

(6). 停止容器

file

(7). 在主機建立檔案c.txt

file

(8). 重啟容器

file

(9). 進入容器docker_data目錄下發現c.txt檔案已共享

file

4.容器卷的讀寫規則

容器資料卷的讀寫規則預設 rw 可讀可寫,就如同上述的例子

file

ro:容器例項內部被限制,只能讀取不能寫

docker run -it --privileged=true -v/宿主機絕對路徑目錄:/容器內目錄:ro 映象名

(1). 建立只讀的Ubuntu容器例項

file

(2). 在本地主機上建立a.txt檔案 並寫入資料 xueyueqing

file

(3). 這容器中只能讀檔案,其他操作被限制

file

5.容器卷的繼承

docker run -it --privileged=true --volumes-from 父類 --name u2 ubuntu

file

(注意:向將之前的u2容器刪除,docker rm 容器ID)

(1). u2繼承u1的docker_data目錄及目錄下的檔案

file

(2). 在u2中建立檔案,u1中也會共享資料

file

file

當u1停止了,u2會共享本地主機資料嗎? 會

file

(3). u2容器共享了主機的資料

file

容器卷的繼承本質是繼承了容器之間的規則與容器本身沒有關係,因此u1容器停止不影響u2容器與本地主機資料共享

如果啟動u1容器,那麼u1中會有之前本地主機建立的檔案嗎? 會

file

三、docker上安裝常用軟體

總體步驟:

  • 搜尋映象

  • 拉取映象

  • 檢視映象

  • 啟動映象

  • 停止映象

  • 移除容器

補充:

netstat -tunlp | grep 埠號 檢視埠使用情況

ps - ef | grep 埠號 檢視埠使用情況

kill - 9 程式號 殺程式

1.Tomcat

(1).搜尋映象 docker search tomcat

file

(2).拉取映象,一般都是使用第一個 docker pull tomcat

file

(3).檢視tomcat映象是否下載成功 docker images tomcat

file

(4).使用tomcat映象建立容器例項 docker run -d -p 8080:8080 --name t1 tomcat

-p 小寫,主機埠:docker容器埠 -d 後臺執行

-P 大寫,隨機分配埠

(5). 啟動成功

file

file

(6). 訪問不到tomcat首頁

file

首先檢查防火牆埠8080是否開啟,使用雲伺服器還需要檢查雲伺服器安全組中的8080埠規則是否新增

檢查tomcat中webapps目錄下是否有tomcat首頁

(7). 進入tomcat容器,發現tomcat中webapps目錄下為空

file

(8). 刪掉webapps,將webapps.dist 改為webapps

file

成功了!!!

file

(原因是因為新版tomcat 預設訪問路徑webapps目錄是空的,預設配置在webapps.dist目錄中 ,需要修改下)

(9). 停止、刪除容器一氣呵成

file

2.MySQL

(1). 簡易版

  • 搜尋映象 docker search mysql

file

  • 拉取映象,使用5.7版本的 docker pull mysql:5.7

file

  • 檢視mysql映象是否下載成功 docker images mysql

file

  • 使用tomcat映象建立容器例項 docker run -d -p 8080:8080 --name t1 tomcat

先檢查Linux本地主機是否啟動了MySQL,防止埠衝突

file

  • 啟動容器 docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

file

  • 進入容器,登入root使用者

file

  • 簡單測試下MySQL

file

file

  • 使用SQLyog測試 連線成功

file

** 問題一:測試中文資料,發現亂碼**

file

問題二:mysql容器如果被誤刪了,那麼我的資料該怎麼辦

file

解決方案:請看實戰版

(2). 實戰版

  • 建立一個mysql目錄儲存資料

file

  • 使用容器卷儲存資料 docker run -d -p 3306:3306 --privileged=true -v /mysql/log:/var/log/mysql -v /mysql/data:/var/lib/mysql -v /mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql:5.7

file

  • 在本地主機/mysql/conf目錄下新建my.cnf 檔案利用容器卷共享,將檔案共享到mysql容器解決亂碼
[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8

file

  • 進入容器,登入mysql

file

  • 檢視mysql編碼 show variables like ‘character%’

file

  • 測試

file

  • 成功解決中文亂碼問題

file

  • mysql容器被刪了???

file

這個時候就不怕資料丟失了,因為我們之前使用容器卷儲存資料了

  • 再次建立mysql容器 資料卷宿主機絕對路徑就是之前設定的

file

  • 資料庫中資料從本地主機共享過來了,再也不怕刪庫跑路了???

file

3.Redis

  • 搜尋映象 docker search redis

file

  • 拉取映象, docker pull redis

file

  • 檢視tomcat映象是否下載成功 docker images redis

file

  • 進入容器,連線客戶端

file

這樣肯定是不行的,因為redis需要儲存資料,還要修改配置檔案

  • 在本地主機新建目錄 /app/redis

file

  • 將一個redis.conf 檔案模板複製進 /app/redis 目錄下

file

  • 修改redis.conf配置檔案

file

  • .將daemonize yes改為 no ,因為該設定何docker run中-d引數衝突,會導致容器一直啟動失敗

file

  • 再次建立redis容器(記得先把之前6379埠停了)

docker run -p 6379:6379 --name myredis --privileged=true -v /app/redis/redis.conf:/etc/redis/redis.conf -v /app/redis/data:/data -d redis redis-server /etc/redis/redis.conf

file

  • 測試連線成功

file

本文轉自:https://blog.csdn.net/qq_52595134/article/details/124460846


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70003733/viewspace-2899132/,如需轉載,請註明出處,否則將追究法律責任。

相關文章