1. 程式人生 > >ubuntu中docker使用2

ubuntu中docker使用2

部署單體專案:

1.先把專案打包成war包並上傳到伺服器

2.建立Dockerfile檔案

cd /usr/local/docker
mkdir tomcat
cd /usr/local/docker/tomcat
mkdir wang
cd /usr/local/docker/tomcat/wang
cd 到專案war包所在位置
mv 專案war名字 /usr/local/docker/tomcat/wang/test.war
cd /usr/local/docker/tomcat/wang
vi Dockerfile

3.編輯Dockerfile檔案

FROM tomcat   # 此專案基於tomcat
MAINTAINET wang   # 編輯者
ADD test.war /usr/local/tomcat/webapps/test.war  # 在當前目錄找test.war 新增到/usr/local/tomcat/webapps/下,並命名為test.war

4.構建映象

docker build -t wang/tomcat .

5.啟動容器

docker run --name tomcat -p 8080:8080 wang/tomcat

6.開啟瀏覽器訪問測試

ip:8080/test

資料卷簡介:

資料卷是一個可以供一個或多個容器使用的特殊目錄。 
可以達到以下目的: 
1. 繞過“拷貝寫”系統,以達到本地磁碟IO的效能,(比如執行一個容器,在容器中對資料卷修改內容,會直接改變宿主機上的資料卷中的內容,所以是本地磁碟IO的效能,而不是先在容器中寫一份,最後還要將容器中的修改的內容拷貝出來進行同步。) 
2. 繞過“拷貝寫”系統,有些檔案不需要在docker commit打包進映象檔案。 
3. 在多個容器間共享目錄 
4. 在宿主和容器間共享目錄 
5. 在宿主和容器間共享一個檔案。

建立資料卷:

方法一:dockerfile中指定VOLUME後的目錄,如 VOLUME /var/lib/test

方法二:docker run命令中加-v選項。如 :

docker run -d -P -v /webapp training/webapp python app.py

注意:這裡定義的 /webapp 資料卷,但是不知道宿主機上與之對應的在哪裡。我們需要仔細的觀察docker inspect docker ps -q的結果,是非常長的一段東西。在這裡我只摘出我們需要的部分

例子:

建立目錄  mkdir -p /usr/local/docker/tomcat/share/webapps/ROOT
cd /usr/local/docker/tomcat/share/webapps/ROOT
vi index.html     hello share tomcat
cd /usr/local/docker/tomcat/share/webapps/
進入到該目錄執行tomcat
docker run --name tomcat -d -p 8080:8080 -v $PWD:/usr/local/tomcat/webapps/ tomcat
$PWD 意思是基於當前目錄
$PWD:/usr/local/tomcat/webapps/  把容器的目錄對映到/usr/local/docker/tomcat/share/webapps/下
訪問 ip:8080  即可看到效果  "hello share tomcat"
在啟動一個tomcat
docker run --name tomcat2 -d -p 8081:8080 -v $PWD:/usr/local/tomcat/webapps/ tomcat
再次訪問 ip:8081 可看到兩次訪問結果一樣
這樣就可以直接操作宿主機器的檔案而不需要操作容器檔案了,且達到了檔案共享的目的
並且不管是刪除容器還是停止容器,/usr/local/docker/tomcat/share/webapps/ROOT/index.html
檔案都不會被刪除,保證了資料的持久化

備份資料卷:

啟動mysql測試

docker run -p 3306:3306 --name mysql \
 -v /usr/local/docker/mysql/conf:/etc/mysql/conf.d \
 -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
因為啟動的時候是用的 
-v /usr/local/docker/mysql/conf:/etc/mysql/conf.d \
 -v /usr/local/docker/mysql/logs:/var/log/mysql \
 -v /usr/local/docker/mysql/data:/var/lib/mysql \ 即資料卷的形式,所以宿主機和容器共享了資料所以/usr/local/docker/mysql 這個目錄就是mysql資料庫的資料,備份資料卷只需要把這個目錄下的東西給打包就可
如:
tar -zxvf backup_2018106.tar.gz .
即可做到備份的作用

還原資料卷:

重新克隆一臺伺服器,並把之前備份的資料放到一臺安全的機器上,進入到新的伺服器
建立mysql資料夾   mkdir -p /usr/local/docker/mysql
下拉mysql映象  docker pull mysql
並把之前的資料壓縮包移動到 /usr/local/docker/mysql目錄下
如:
mv /home/backup_2018106.tar.gz /usr/local/docker/mysql/backup_2018106.tar.gz
然後解壓縮 tar -zxvf backup_2018106.tar.gz
刪除備份 rm -rf backup_2018106.tar.gz

重新啟動mysql
docker run -p 3306:3306 --name mysql \
 -v /usr/local/docker/mysql/conf:/etc/mysql/conf.d \
 -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
 啟動完畢,可以用遠端工具連線測試

下載安裝docker-compose

簡介:

允許使用者通過一個單獨docker-comose.yml模版檔案來定義一組相關聯的應用容器為一個專案compose重要概念:服務:一個應用容器,實際可包括若干執行相同映象的容器例項。專案:由一組關聯的應用容器組成的一個完整業務單元,在docker-compose.yml檔案中定義一個專案可以由多個服務(容器)關聯而成,compose面向專案進行管理執行compose專案:docker-compose up
意思就是可以通過 docker-compose來啟動docker映象並減少每次啟動所需要輸入的大量引數

可以直接下載:

sudo curl -L "https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

也可以進入https://github.com/docker/compose/releases/ 下載 選擇是Latest release的不要用Pre-release

選擇自己的作業系統進行選擇,我這裡用的是 docker-compose-Linux-x86_64 版本是1.22.0

把檔案上傳到伺服器,如果用xftp上傳沒有許可權可以建立一個目錄並分配許可權

chmod 777 檔名 即可上傳成功

上傳完畢後 mv docker-compose-Linux-86_64 docker-compose

並把此檔案放到環境變數下,通過 cat /etc/environment 檢視

[email protected]:/home/downloads# cat /etc/environment 
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"

[email protected]:/home/downloads# mv docker-compose /usr/bin

檢視是否移動成功

[email protected]:/home/downloads# ls /usr/bin |grep docker-compose
docker-compose

此時的docker-compose沒有可執行的許可權所以我們需要修改他的使用者組包括許可權

[email protected]:/usr/bin# chown -R root:root docker-compose 
[email protected]:/usr/bin# chmod +x docker-compose 

檢視所屬使用者組合許可權

[email protected]:/usr/bin# ll |grep docker-compose
-rwxrwxr-x  1 root   root    11750136 Oct  6 11:28 docker-compose*

輸入檢視版本測試是否成功

[email protected]:/usr/bin# docker-compose version
docker-compose version 1.22.0, build f46880fe
docker-py version: 3.4.1
CPython version: 3.6.6
OpenSSL version: OpenSSL 1.1.0f  25 May 2017

測試第一個docker-compose檔案

cd /usr/local/docker/tomcat
rm -rf /usr/local/docker/tomcat/
vi docker-compose.yml

建立一個docker-compose.yml配置檔案(每一級用兩個空格,不能直接用tab鍵)

version: '3'   # 對應版本
services:      # 設定服務
  tomcat:      # 服務名字可以任意起 
    restart: always   # 總是開機自啟
    image: tomcat     # 使用的映象
    container_name: tomcat  # 容器名稱
    ports:     # 埠
      - 8080:8080

啟動 docker-compose up 這種啟動是佔用主執行緒的啟動。停止使用ctrl+c停止

並使用 docker-compose down刪除使用過的映象記錄

開啟瀏覽器訪問測試 ip:8080

docker compose常用命令:

前臺執行 : docker-compose up

後臺執行 : docker-compose up -d

啟動 : docker-compose start

停止 : docker-compose stop

停止並移除容器列表 : docker-compose down

tomcat的使用:

建立一個docker-compose.yml配置檔案

version: '3'   # 對應版本
services:      # 設定服務
  tomcat:      # 服務名字可以任意起 
    restart: always   # 總是開機自啟
    image: tomcat     # 使用的映象
    container_name: tomcat  # 容器名稱
    ports:     # 埠
      - 8080:8080
    volumes:    # 資料卷
      - /usr/local/docker/tomcat/webapps/:/usr/local/tomcat/webapps/
    environment:            # 環境變數
      TZ: Asia/Shanghai
      
mkdir -p /usr/local/docker/tomcat/webapps/ROOT
vi /usr/local/docker/tomcat/webapps/ROOT/index.html   hello docker compose

啟動測試 docker-compose up -d 開啟瀏覽器訪問: ip:8080檢視效果

測試mysql:

version: '3'   
services:      
  mysql:       
    restart: always  
    image: mysql    
    container_name: mysql 
    ports:     
      - 3306:3306
    environment:
      TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: 123123
    command:   # 命令配置編碼
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --explicit_defaults_for_timestamp=true
      --lower_case_table_names=1   # 忽略資料庫表大小寫
      --max_allowed_packet=128M
      --sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO"
    volumes:    
      - mysql-date:/var/lib/mysql
volumes:
  mysql-date: