Docker實戰-從入門到跑路

玄翼貓發表於2020-10-07

領導:“你會Docker嗎?”我尋思,Docker是什麼?含糊回道:“嗯……應該不會。”領導:“去學學。”我面露難色。領導:“我朋友公司那個月薪4K的開發,什麼分散式,大資料,阿里雲,百度雲,信口……拈來!你要對得起你8K的工資!”我無言以對,無法反駁,無法反抗。
本人使用的環境是Ubuntu 16.04,64位系統。
首先了解下Docker。百度百科:Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後釋出到任何流行的Linux機器上,也可以實現虛擬化,容器是完全使用沙箱機制,相互之間不會有任何介面。
個人理解,類似映象和虛擬機器。什麼是虛擬機器?自行百度。裝個vmvare或者virtualbox試試就知道了。
傳統的部署應用:購買伺服器,根據不同的作業系統安裝應用執行環境,如JDK,Tomcat,mysql等等。上傳檔案,一堆配置,費神費力。
使用Docker部署應用:購買伺服器,安裝Docker環境,編寫Dockerfile,建立Docker映象,啟動Docker容器。加個Jenkins做一鍵部署更方便
在初學Docker時,最讓人害怕的可能是Dockerfile編寫,我剛接觸的時候也被嚇到了,後來發現其實沒想象的那麼難。不要恐懼未知。
Docker相當於一個虛擬機器,Dockerfile則相當於告訴虛擬機器按照步驟執行哪些指令。很多情況下,我們並不需要寫Dockerfile,Docker倉庫裡已有專業人士做好了Docker映象,我們只需要拿來用就行了。

Docker安裝
Docker安裝我們選擇簡單的方式,下載Docker官方的指令碼,執行。複雜的方式請自行百度。

curl -fsSL get.docker.com -o get-docker.sh
sh get-docker.sh

指令碼執行完後,一般來說docker安裝成功了。執行以下指令測試docker是否可用

docker -v

有些時候可能會提示:Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?(我在阿里雲大陸伺服器經常遇到)
執行以下指令:

systemctl daemon-reload
systemctl restart docker.service

docker-compose安裝
裝docker-compose是為了方便管理docker容器,每次啟動docker容器輸入一大串引數相信你也覺得麻煩。
請去 https://github.com/docker/compose/releases 獲取最新版本的下載指令碼。我這裡以我經常用的1.24.1為例
執行以下命令:

curl -L https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

執行可能會報錯,手動下載相應的docker-compose檔案,上傳到伺服器的 /usr/local/bin/docker-compose 目錄
執行 docker-compose -v 測試是否安裝成功

先介紹下Dockerfile,docker容器,docker-compose之間的關係
Dockerfile用於構建映象,映象用於建立容器(虛擬機器),docker-compose用於配置容器啟動命令。
先有映象再有容器,一個映象可以建立多個容器,容器的名字不能一樣,各個容器互不干擾。就像裝系統的小哥拿個盜版win10光碟,可以給無數臺電腦裝系統一樣。盜版光碟是映象,電腦是容器。再打個粗俗的比方:給你一頭母豬,你能創造一個族群。
完整的建立到啟動容器流程,需要先編寫Dockerfile,建立映象,再在docker run 命令後面加一大串引數靈活配置容器。容器啟動可能會附帶多個命令引數,比如mysql可以自定義資料檔案目錄,通訊埠等。
為了簡化過程(偷懶),減少記憶量,可以編寫docker-compose配置檔案,實現快速部署應用。

下面以mysql 5.7為例演示docker從入門到跑路
領導:“昨天給了你一天時間學習,進展怎麼樣了。”我內心慌的一匹,道:“略懂一二。”領導:“怎樣用Docker部署mysql 5.7。”我開啟word文件,以領導看不清的速度迅速划動:“如此如此,這般這般……”領導:“說人話!”

首先,搜尋並下載指定版本的mysql映象
docker search mysql

也可以進入https://hub.docker.com/ ,搜尋mysql,進入mysql官方映象頁面。
Supported tags and respective Dockerfile links 下面的是mysql的各版本號,根據專案選擇需要的版本pull到本地倉庫。

下載映象:docker pull 映象名:版本號

docker pull mysql:5.7

版本號可以不寫,如:docker pull mysql,不加版本號下載的是最後一個版本(latest)

檢視本地倉庫映象列表

docker image ls

Repository 是映象名,Tag是映象的版本號,IMAGE_ID是映象ID
刪除本地倉庫映象:docker image rm 映象ID(IMAGE_ID)
一般來說,映象ID取前四位即可,比如我要刪除mysql:latest,執行:docker image rm e1d7

如果無法刪除,可能是關聯了容器,需要先刪除容器,才能刪除映象

 

啟動mysql容器:

docker run -d --name mysql -v /usr/local/docker/mysqldata:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 mysql:5.7

--name:容器名
-d:後臺啟動
-v:將容器中mysql的資料目錄對映到宿主機。-v 宿主機目錄:容器內目錄。如果想對映多個目錄,多加幾個-v。此方式同樣適用-e,-p等引數
-e:傳入引數,這裡是設定mysql的訪問密碼
-p:將容器的3306埠對映到宿主機的3306埠。docker容器相當於虛擬機器,預設情況下它有自己獨立的虛擬網路卡和IP,它的3306埠是它自己的,不是宿主機的,所以要做埠對映
mysql:5.7是映象名。如果映象不存在,docker會自動pull該映象。
dockerhub的官方映象下面一般有使用說明(英文的),可以參照使用說明啟動容器。相對於傳統的安裝mysql來說,這種方式簡單的多。

曾經遇到過,mysql安裝好後,無法遠端連線操作mysql(現在沒遇到過這問題)。這和在liunx裝mysql無法遠端連線是一個道理,需要開啟mysql的遠端連線許可權。
可以在啟動容器的時候使用 -v 替換容器的相關配置檔案,或者,進入docker容器

docker exec -it mysql bash

登入mysql

mysql -u root -p

輸入密碼,登入mysql,執行以下mysql語句
grant all on *.* to root@'%' identified by '遠端連線的密碼' with grant option;

FLUSH PRIVILEGES;
執行以上操作後,你可以用“遠端連線的密碼”連線mysql。這時候mysql有兩個密碼,一個是本地連線的密碼(-e MYSQL_ROOT_PASSWORD設定的密碼),一個是遠端連線的密碼

這樣生成的mysql容器,宿主機部署的專案是無法通過localhost或者127.0.0.1訪問的。就像你在win10中用vm裝了個win7,win10上執行的專案無法通過localhost連線win7中的資料庫。
為了能讓專案使用localhost訪問mysql,我們可以讓mysql容器和宿主機用同一個網路
你可以在啟動命令加上 --net=host,即:

docker run -d --name mysql -v /usr/local/docker/mysqldata:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 --net=host mysql:5.7

這樣你的應用就能像訪問本機mysql一樣訪問mysql容器了。
--net=host即讓容器與宿主機共用網路,Docker網路有bridge(預設),host(與主機共用IP和埠),none(關閉容器網路),overlay(叢集)。請自行百度瞭解。

 

檢視執行的容器
docker ps
檢視所有容器(包含已停止的)
docker ps -a

CONTAINER ID:容器ID
IMAGE_ID:映象名
STATUS:容器狀態
NAMES:容器名,由--name引數指定

停止容器:docker stop 容器ID,比如要停止mysql,執行:docker stop a7df
啟動容器:docker start 容器ID
檢視容器日誌:docker logs -f -t --tail 行數 容器ID/容器名。檢視docker_file的日誌:docker logs -f -t --tail 100 c38a (建議用容器名)
檢視容器詳細資訊:docker inspect 容器名
進入容器終端:docker exec -it 容器ID /bin/bash

使用docker-compose啟動mysql容器
按照上面的方法建立好容器,還會有一些問題,比如資料庫時間不對等,這些都可以通過加引數解決。為了不在下次使用的時候再去找這些引數,我們可以編寫docker-compose檔案。
隨便找一個地方,建立 docker-compose.yml檔案。
vi docker-compose.yml
輸入以下文字:

version: "2" #表示本docker-compose檔案使用的是 version 2 file,3和2的寫法有差別
services:
  mysql1: #容器名
    image: mysql:5.7 #映象名
   # network_mode: "host" #網路模式
    restart: always #容器異常崩潰後自動重啟
    volumes: #對映目錄
      - "/usr/local/docker/mysqldata1:/var/lib/mysql"
    environment: #引數
      - TZ=Asia/Shanghai   #使用北京時間
      - MYSQL_ROOT_PASSWORD=12345678   #設定密碼
    ports : #埠,因為3306已被另一個mysql使用,這個容器用8080
      - "8080:3306"

儲存並退出,執行

docker-compose build

再執行

docker-compose up -d

mysql容器啟動成功。特別要注意yml檔案的格式,分號後面必須有一個空格。子節點和父節點偏移一個 Tab或者2個空格。
如果要停止容器,除了使用docker stop,還可以使用 docker-compose stop mysql1

編寫一個Dockerfile
以openjdk:8-jdk-slim為基礎映象,建立一個同時執行兩個springboot專案的映象。同時執行兩個專案用到了supervisor,看日誌很麻煩,建議一個容器只執行一個專案。
建議檢視Docker的詳細文件瞭解指令含義。

#指定操作的映象
FROM openjdk:8-jdk-slim

#維護者資訊
MAINTAINER liuming "842417019@qq.com"

#安裝supervisor
RUN apt-get update \
        && apt-get install -y supervisor \
        && mkdir -p /var/log/supervisor

#複製檔案到容器
COPY xym-gateway.jar /usr/app/
COPY xym-static.jar /usr/app/
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
        
#暴露埠
#gateway
EXPOSE 8001
#static
EXPOSE 8002

#執行supervisord
CMD ["/usr/bin/supervisord"]

指定基礎映象,安裝相關軟體,再將專案複製到指定目錄,執行專案。這和我們部署專案的步驟何其相似。RUN執行的,其實就是一系列liunx shell指令,多個指令以特定的格式隔開
學習更多Docker知識,可去網上查閱 Docker技術入門與實戰 這本書

我:“領導,我有點事,想和你說下。”領導:“你說。”我:“最近房租漲了,物價也漲了,我樓下那家沙縣的蛋炒飯漲到10塊……”領導打斷了我:“你堂堂七尺男兒,要為五斗米折腰?你現在還年輕,正是學習的好時候!你問問,哪家公司能給你8K月薪,還能讓你學這麼多知識!”我:“道理我都懂,加點吧。”領導:“我們公司現在正在創業階段,現在日子雖然苦了點,等以後飛黃騰達了,你就是公司元老!”我:“公司創業都十年了……”領導:“這叫沉澱!你們現在的年輕人,真的是,浮躁!”我:“加500行不行。”領導:“最多250。”
我拿著開除證明離開了公司,在寫字樓下的停車場,看著領導的大奔,我陷入了沉思……

相關文章