1. 程式人生 > >docker之旅,從入門到放棄

docker之旅,從入門到放棄

前言(廢話):花了3天時間, 才認識了docker這個神器, 並且成功地將專案部署到容器裡面, 但不知道為什麼docker.hub不能註冊, 所以無法上傳映象, 所以現在先記錄docker從安裝到部署專案的過程;

0#:開始前附上參考文件

1 :什麼是docker

首先要清楚什麼是docker?
Docker是一個開源的引擎,可以輕鬆的為任何應用建立一個輕量級的、可移植的、自給自足的容器。開發者在筆記本上編譯測試通過的容器可以批量地在生產環境中部署,包括VMs(虛擬機器)、bare metal、OpenStack 叢集和其他的基礎應用平臺。

說人話!他就是一個容器!!!

是一個怎樣的容器呢?首先介紹兩個概念,容器(container)和映象(image),他們兩者是密不可分的,我們啟動docker的時候,是直接跑一個映象,隨之會啟動一個容器,把這個映象裝起來;
總的來說,
- 映象 = 專案+伺服器+資料庫+…等等亂七八糟的東西;


- 容器 = 映象的載體;
(但映象從容器中生成)

既然映象中已經有了我們的專案和所需要的環境,那麼只要我們拿到這個映象,就算是一臺全新的電腦,我們都可以用一條命令把專案跑起來!(當然,需要安裝docker)

2:安裝docker

宿主系統:CentOS 7;
安裝docker的方式有多種,可以再yum上直接拉取安裝,也可以自己下載好再安裝;(本人懶得上網下載,這裡採用拉取yum的方式安裝,詳情可見上面的參考部落格):
直接敲linux命令

1)安裝依賴包:yum install -y yum-utils device-mapper-persistent-data lvm2

2)安裝穩定的倉庫:

3)安裝Docker(社群版):yum install docker (預設安裝最新版本)

4)啟動Docker:systemctl start docker

5)測試:docker run hello-world

第一次執行hello-world時,你的docker是沒有這個映象的,不過會自動從倉庫拉取,稍等片刻,
docker安裝完成

當出現以上的 Hello from Docker! 時,我們就可以一起愉快地玩docker了!

3:建立容器,並把所需要的環境壓縮包拉到容器中

  • 1)首先要拉取容器的系統(這裡使用ubuntu):
    docker run –name myproject ubuntu (實際上是執行一個ubuntu的映象,若本地還沒有,則會自動拉取)
    出現以下資訊即下載完成;
    映象下載完成

兩個常用命令:
1.檢視本地映象:docker images
檢視本地映象
2.檢視所有容器:docker ps -a (docker ps 是檢視正在執行的容器)
檢視所有容器

  • 2)把所需要的環境(如jdk,tomcat等)拉取到docker容器中
    在容器中安裝環境,可以線上下載安裝,也可以從宿主機中拉取,這裡介紹從父容器拉取環境的兩個方法:

    • 方法一:啟動一個容器,同時指定將宿主機中的某個資料夾掛載到docker容器中;
      執行run命令啟動容器:
    docker run -i -t -v /myjava/:/mnt/software/ ubuntu /bin/bash

    (會將宿主機的myjava目錄下的檔案都掛載到docker容器的/mnt/software/目錄下,所以要事先在myjava目錄下把所需要的檔案準備好。)
    命令解釋:
    run命令解釋

    引數:

    -i: 以互動模式執行容器,通常與 -t 同時使用;
    -t: 為容器重新分配一個偽輸入終端,通常與 -i 同時使用(容器啟動後會進入其命令列);
    -v: 指定宿主機的哪個目錄掛載到容器中,格式:-v <宿主機目錄>:<容器目錄> 

    啟動成功後會進入容器內部:
    這裡寫圖片描述
    進入剛才指定的檔案掛載的目錄,發現已經把jdk等東西拉過來了
    這裡寫圖片描述

    • 方法二:使用docker cp 命令拷貝檔案
      若已經在容器裡面,則先退出容器,
      下面先介紹幾個命令:

      退出容器:
          1.退出並停止容器:Ctrl+D;(而後執行docker ps不能看到該容器)
          2.退出但不停止容器:Ctrl+P+Q;(而後執行docker ps能看到該容器)
      進入容器:
          docker attach <容器名稱或ID>;
          (只能進入已經啟動了的容器,若容器已經停止,則先執行docker start <容器名稱或ID> 來啟動容器)

      退出容器後執行命令:
      docker cp myjava/ 190d:mnt/software/
      (docker cp <宿主機目錄或檔案> <容器名稱或id>:<容器目錄>)

3:在容器中安裝環境

這裡安裝jdk和tomcat,所以我這個容器還是得依賴外部的資料庫,如果你想要一個完全獨立的容器(資料也與外界隔絕)的話,還需要安裝資料庫;

(1)安裝 jdk

1)解壓縮

tar zxvf jdk-8u161-linux-x64.tar.gz -C /usr/myjava

2)配置環境變數

vi /etc/profile

(i 進入編輯)
在文末新增以下配置:
export JAVA_HOME=/usr/myjava/jdk1.8.0_161
export JRE_HOME=/usr/myjava/jdk1.8.0_161/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$JAVA_HOME:$PATH
(Esc 輸入:wq回車退出)

3)驗證jdk

java -version

出現安裝好的jdk資訊即成功:
這裡寫圖片描述

(2)安裝Tomcat

1)解壓縮

tar zxvf  -C /usr/myjava

2)配置環境
進入tomcat解壓的目錄的bin目錄下下執行:

vi setclasspath.sh
(./startup.sh最終還是呼叫setclasspath.sh的配置,所以直接在這裡配)

在文末新增以下配置:
export JAVA_HOME=/usr/myjava/jdk1.8.0_161
export JRE_HOME=/usr/myjava/jdk1.8.0_161/jre

3)驗證 tomcat
在tomcat的bin目錄下執行

./startup.sh 啟動tomcat

出現以下資訊則安裝成功
tomcat安裝成功

(3)把專案拉到 tomcat/webapps中

這裡寫圖片描述

(4)配置容器的環境變數

1)編輯.bashrc檔案

vi ~/.bashrc 

文末新增以下配置
export JAVA_HOME=/usr/myjava/jdk1.8.0_161/bin
export JRE_HOME=/usr/myjava/jdk1.8.0_161/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$JAVA_HOME:$PATH

2)使配置生效

source ~/.bashrc

(5)編寫執行指令碼

1)編寫執行指令碼run.sh

vi /root/run.sh

寫入以下配置(按自己專案需求新增執行的程式和服務)
#!/bin/bash
source ~/.bashrc
sh /usr/myjava/apache-tomcat-8.5.24/bin/catalina.sh run 

注意:這裡必須先載入環境變數,然後使用 Tomcat 的執行指令碼啟動 Tomcat 服務。

2)新增執行許可權

chmod u+x /root/run.sh

4:執行指令碼把專案跑起來

執行以下命令執行指令碼

/root/run.sh

若專案可以成功跑起來則進行下一步(5:建立專案映象)

(我這裡執行就報了錯,因為缺少memcached,所以先安裝memcached服務)
執行以下命令下載memcached:

安裝memcached:
apt-get install -y memcached

啟動memcached服務:
/usr/bin/memcached -d -m 2048 -p 11211 -u root 
(-d 後臺執行, -m 分配空間 -p 埠號, -u root 不加報錯)

之後再啟動 /root/run.sh
專案終於跑起來了撒花~~
這裡寫圖片描述

所以再次編輯run.sh,新增memcached的執行指令碼

這裡寫圖片描述

5:建立專案映象

1)先退出容器:Ctrl + D

2)執行 docker ps -a 檢視容器,記住容器id(前4位即可)
這裡寫圖片描述

3)執行docker commit 命令提交映象

docker commit 2736  myproject:1.0.0
(docker commit <容器名稱或id> <自定映象名稱>:<自定版本號TAG> )

4)檢視映象 docker images
這裡寫圖片描述

(刪除所有映象:docker rm $(docker ps -aq))

6:啟動映象訪問專案(即啟動容器)

執行以下命令:

docker run -d -p 9090:8080 --name testproject myproject:1.0.0 /root/run.sh

引數解釋:

-d:表示以“守護模式”執行/root/run.sh指令碼,此時 Tomcat 控制檯不會出現在輸出終端上。
    此時需要檢視日誌使用命令:docker logs <容器名稱或ID>
-p:表示宿主機與容器的埠對映,此時將容器內部的 8080 埠對映為宿主機的 9090 埠,這樣就向外界暴露了 9090 埠,可通過 Docker 網橋來訪問容器內部的 8080 埠了。  
--name:表示容器名稱,用一個有意義的名稱命名即可。

啟動成功後,在瀏覽器輸入地址訪問即可:
這裡寫圖片描述

最後:到此為止已經建立了一個完整的專案映象,如果要上傳映象,供其他機器下載,還需要在docker hub申請一個賬號來上傳。

不知道為什麼官網申請不了賬號,就不能演示上傳映象了。。。

–問題記錄–

問題 1:如果使用docker命令報以下錯誤時,說明docker服務沒有啟動
這裡寫圖片描述

解決方法:執行命令啟動docker服務:

service start docker

問題 2:我在最後啟動專案映象的時候報錯:
(直接執行/root/run.sh報錯)
這裡寫圖片描述

(先執行/bin/bash,再執行/root/run.sh成功啟動)
但是我先進入容器,再執行run.sh是成功的…奇了怪了
這裡寫圖片描述
暫時不知道原因….如果有知道的朋友請麻煩告訴我一下~~感謝!