天天看點

docker 添加端口映射_Docker資料卷和容器編排

docker 添加端口映射_Docker資料卷和容器編排

前言

Docker 資料卷和容器編排,記錄下來!
docker 添加端口映射_Docker資料卷和容器編排

資料卷

資料卷可以繞過拷貝系統,在多個容器之間、容器和主控端之間共享目錄或檔案,資料卷繞過了拷貝系統,可以達到本地磁盤I/O性能。

  • 運作容器時,指定一個資料卷
$ docker run -itd --name nginx -v /usr/share/nginx/html/ -p 80:80 e445ab08b2be
           
此時,我們建立了一個資料卷并且挂載到容器的/usr/share/nginx/html/目錄下。

使用

docker inspect

指令找到資料卷映射目錄:

docker 添加端口映射_Docker資料卷和容器編排
Docker預設将主控端的/var/lib/docker/volumes/1baaa58867f6e5b6bed703b0eae6ae859d39fa293ad5d85f58bf73d6101914c6/_data目錄作為source目錄,接下來,進入到該目錄中:
docker 添加端口映射_Docker資料卷和容器編排

此時發現該目錄下的檔案内容與容器中/usr/share/nginx/html/目錄下的檔案内容一緻,這是因為挂載一個空的資料卷到容器中的一個非空目錄中,這個目錄下的檔案會被複制到資料卷中。

注意:由于Mac中的Docker有點特殊,上文提到的/var/lib/xxxx目錄,如果是在Linux環境下,則直接進入即可, 如果是在mac中,需要首先執行如下指令,在新進入的指令行中進入到/var/lib/xxx目錄下: screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty

接下來修改資料卷中的index.html檔案内容,如下:

$ echo "hello volumes">index.html
           

修改完成後,再回到浏覽器中,輸入127.0.0.1,檢視nginx中index.html頁面中的資料,發現已經發生改變。

docker 添加端口映射_Docker資料卷和容器編排
注意:Linux環境下輸入

curl 127.0.0.1

docker 添加端口映射_Docker資料卷和容器編排

說明主控端中的檔案共享到容器中去了。

主控端目錄做資料卷

上文中對于資料卷的用法還不是最佳方案,一般來說,我們可能需要明确指定将主控端中的一個目錄挂載到容器中,這種指定方式如下:

$ 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 添加端口映射_Docker資料卷和容器編排
  • 檢視資料卷詳情
$ docker volume inspect
           
docker 添加端口映射_Docker資料卷和容器編排
  • 删除資料卷
$ 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則是連接配接的别名。

docker 添加端口映射_Docker資料卷和容器編排

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

$ docker exec -it ubuntu bash
           

在ubuntu控制台直接輸入env,檢視環境變量資訊:

docker 添加端口映射_Docker資料卷和容器編排

可以看到docker為nginx建立了一系列環境變量。每個字首變量是MYLINK,這就是剛剛給連接配接取得别名。開發者可以使用這些環境變量來配置應用程式連接配接到nginx。該連接配接是安全、私有的。

docker 添加端口映射_Docker資料卷和容器編排
注意:預設情況下,ubuntu容器中沒有安裝curl指令,需要手動安裝下,安裝指令如下:

apt-get update

apt-get install curl

容器編排

使用docker-compose可以實作容器編排。

Compose是一個用于定義和運作多容器Docker應用程式的工具。
  • 在Linux系統上安裝Compose
  • 下載下傳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
           
docker 添加端口映射_Docker資料卷和容器編排
  • 編寫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
           
docker 添加端口映射_Docker資料卷和容器編排

浏覽器輸入http://localhost:8080/jpress,就可以看到jpress的配置頁面。

  • 常用指令
# 停止容器運作
$ docker-compose stop

# 啟動容器
$ docker-compose start

# 重新開機容器
$ docker-compose restart
           
注意:需在docker-compose.yml和Dockerfile所在目錄下執行以上指令。

最後

沒有什麼是永恒的!
docker 添加端口映射_Docker資料卷和容器編排

今日寄語:

“男人的征途是星辰大海!⛄️️”
歡迎關注個人微信公衆号: 桃李報春 個人部落格: http://leeyunt.top
docker 添加端口映射_Docker資料卷和容器編排

繼續閱讀