docker 使用手冊

docker 介紹

什麼是docker

  • Docker 是一個Go語言開發實現的開源應用容器引擎
  • 分爲 CE(Community Edition: 社區版) 和 EE(Enterprise Edition: 企業版)
  • Docker 和傳統虛擬化方式的不一樣之處。傳統虛擬機技術是虛擬出一套硬件後,在其上運行一個完整操做系統,在該系統上再運行所需應用進程;而容器內的應用進程直接運行於宿主的內核,容器內沒有本身的內核,並且也沒有進行硬件虛擬。所以容器要比傳統虛擬機更爲輕便

爲何須要使用docker

更高效的利用系統資源

  • 因爲容器不須要進行硬件虛擬以及運行完整操做系統等額外開銷,Docker 對系統資源的利用率更高。不管是應用執行速度、內存損耗或者文件存儲速度,都要比傳統虛擬機技術更高效。所以,相比虛擬機技術,一個相同配置的主機,每每能夠運行更多數量的應用

更快速的啓動時間

  • 傳統的虛擬機技術啓動應用服務每每須要數分鐘,而 Docker 容器應用,因爲直接運行於宿主內核,無需啓動完整的操做系統,所以能夠作到秒級、甚至毫秒級的啓動時間。大大的節約了開發、測試、部署的時間。

一致的運行環境

  • 開發過程當中一個常見的問題是環境一致性問題。因爲開發環境、測試環境、生產環境不一致,致使有些 bug 並未在開發過程當中被發現。而 Docker 的鏡像提供了除內核外完整的運行時環境,確保了應用運行環境一致性,從而不會再出現 「這段代碼在我機器上沒問題啊」 這類問題。

持續交付和部署

  • 對開發和運維(DevOps)人員來講,最但願的就是一次建立或配置,能夠在任意地方正常運行。
  • 使用 Docker 能夠經過定製應用鏡像來實現持續集成、持續交付、部署。開發人員能夠經過 Dockerfile 來進行鏡像構建,並結合 持續集成(Continuous Integration) 系統進行集成測試,而運維人員則能夠直接在生產環境中快速部署該鏡像,甚至結合 持續部署(Continuous Delivery/Deployment) 系統進行自動部署

更輕鬆的遷移

  • 因爲 Docker 確保了執行環境的一致性,使得應用的遷移更加容易。Docker 能夠在不少平臺上運行,不管是物理機、虛擬機、公有云、私有云,甚至是筆記本,其運行結果是一致的。所以用戶能夠很輕易的將在一個平臺上運行的應用,遷移到另外一個平臺上,而不用擔憂運行環境的變化致使應用沒法正常運行的狀況。

更輕鬆的維護和擴展

  • Docker 使用的分層存儲以及鏡像的技術,使得應用重複部分的複用更爲容易,也使得應用的維護更新更加簡單,基於基礎鏡像進一步擴展鏡像也變得很是簡單。此外,Docker 團隊同各個開源項目團隊一塊兒維護了一大批高質量的 官方鏡像,既能夠直接在生產環境使用,又能夠做爲基礎進一步定製,大大的下降了應用服務的鏡像製做成本。

對比傳統虛擬機總結

特性 容器 虛擬機
啓動 秒級 分鐘級
硬盤使用 通常爲 MB 通常爲 GB
性能 接近原生 弱於
系統支持量 單機支持上千個容器 通常幾十個

docker的架構

Docker 使用客戶端-服務器 (C/S) 架構模式,使用遠程 API 來管理和建立 Docker 容器。html

Docker 容器經過 Docker 鏡像來建立。mysql

容器與鏡像的關係相似於面向對象編程中的對象與類。linux

Docker 面向對象
容器 對象
鏡像

image

  • 架構中的名詞說明
名詞 說明
鏡像(Images) Docker 鏡像是用於建立 Docker 容器的模板。
容器(Container) 容器是獨立運行的一個或一組應用。
客戶端(Client) Docker 客戶端經過命令行或者其餘工具使用 Docker API (docs.docker.com/reference/a…) 與 Docker 的守護進程通訊。
主機(Host) 一個物理或者虛擬的機器用於執行 Docker 守護進程和容器。
倉庫(Registry) Docker 倉庫用來保存鏡像,能夠理解爲代碼控制中的代碼倉庫。Docker Hub(hub.docker.com) 提供了龐大的鏡像集合供使用。
Docker Machine Docker Machine是一個簡化Docker安裝的命令行工具,經過一個簡單的命令行便可在相應的平臺上安裝Docker,好比VirtualBox、 Digital Ocean、Microsoft Azure。

docker的安裝

使用腳本的方式安裝

執行安裝腳本

$ curl -fsSL https://get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh
複製代碼

啓動 docker 進程

sudo systemctl enable docker
sudo systemctl start docker 
複製代碼

爲docker配置鏡像加速器

  • /etc/docker/daemon.json 中寫入以下內容(若是文件不存在請新建該文件)
{
  "registry-mirrors": [
    "https://registry.docker-cn.com"
  ]
}
複製代碼
  • 從新啓動服務
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
複製代碼
  • 檢查加速器是否生效 配置加速器以後,若是拉取鏡像仍然十分緩慢,請手動檢查加速器配置是否生效,在命令行執行 docker info,若是從結果中看到了以下內容,說明配置成功。
Registry Mirrors:
 https://registry.docker-cn.com/
複製代碼

docker的卸載

  • 先查詢安裝過的包
yum list installed | grep docker
複製代碼
  • 移除docker相關的包
yum -y remove 上面列出來的包
複製代碼

鏡像的使用

獲取鏡像

以前提到過,Docker Hub 上有大量的高質量的鏡像能夠用,這裏咱們就說一下怎麼獲取這些鏡像。nginx

從 Docker 鏡像倉庫獲取鏡像的命令是 docker pull。其命令格式爲:git

docker pull [選項] [Docker Registry 地址[:端口號]/]倉庫名[:標籤]github

具體的選項能夠經過 docker pull --help 命令看到,這裏咱們說一下鏡像名稱的格式。web

  • Docker 鏡像倉庫地址:地址的格式通常是 <域名/IP>[:端口號]。默認地址是 Docker Hub。
  • 倉庫名:如以前所說,這裏的倉庫名是兩段式名稱,即 <用戶名>/<軟件名>。對於 Docker Hub,若是不給出用戶名,則默認爲 library,也就是官方鏡像。
docker pull ubuntu:16.04
16.04: Pulling from library/ubuntu
bf5d46315322: Pull complete
9f13e0ac480c: Pull complete
e8988b5b3097: Pull complete
40af181810e7: Pull complete
e6f7c7e5c03e: Pull complete
Digest: sha256:147913621d9cdea08853f6ba9116c2e27a3ceffecf3b492983ae97c3d643fbbe
Status: Downloaded newer image for ubuntu:16.04
複製代碼

上面的命令中沒有給出 Docker 鏡像倉庫地址,所以將會從 Docker Hub 獲取鏡像。而鏡像名稱是 ubuntu:16.04,所以將會獲取官方鏡像 library/ubuntu 倉庫中標籤爲 16.04 的鏡像。sql

從下載過程當中能夠看到咱們以前說起的分層存儲的概念,鏡像是由多層存儲所構成。下載也是一層層的去下載,並不是單一文件。下載過程當中給出了每一層的 ID 的前 12 位。而且下載結束後,給出該鏡像完整的 sha256 的摘要,以確保下載一致性。docker

在使用上面命令的時候,你可能會發現,你所看到的層 ID 以及 sha256 的摘要和這裏的不同。這是由於官方鏡像是一直在維護的,有任何新的 bug,或者版本更新,都會進行修復再以原來的標籤發佈,這樣能夠確保任何使用這個標籤的用戶能夠得到更安全、更穩定的鏡像。shell

列出鏡像

鏡像列表

要想列出已經下載下來的鏡像,有兩個命令。

docker images
複製代碼

或者

docker image ls
複製代碼

結果以下

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              16.04               2a697363a870        38 hours ago        119MB
tomcat              latest              27600aa3d7f1        8 days ago          463MB
ubuntu              <none>              a3551444fc85        2 weeks ago         119MB

複製代碼

列表包含了 倉庫名、標籤、鏡像 ID、建立時間 以及 所佔用的空間。

鏡像體積

若是仔細觀察,會注意到,這裏標識的所佔用空間和在 Docker Hub 上看到的鏡像大小不一樣。好比,ubuntu:16.04 鏡像大小,在這裏是 127 MB,可是在 Docker Hub 顯示的倒是 50 MB。這是由於 Docker Hub 中顯示的體積是壓縮後的體積。在鏡像下載和上傳過程當中鏡像是保持着壓縮狀態的,所以 Docker Hub 所顯示的大小是網絡傳輸中更關心的流量大小。而 docker image ls 顯示的是鏡像下載到本地後,展開的大小,準確說,是展開後的各層所佔空間的總和,由於鏡像到本地後,查看空間的時候,更關心的是本地磁盤空間佔用的大小。

另一個須要注意的問題是,docker image ls 列表中的鏡像體積總和並不是是全部鏡像實際硬盤消耗。因爲 Docker 鏡像是多層存儲結構,而且能夠繼承、複用,所以不一樣鏡像可能會由於使用相同的基礎鏡像,從而擁有共同的層。因爲 Docker 使用 Union FS,相同的層只須要保存一份便可,所以實際鏡像硬盤佔用空間極可能要比這個列表鏡像大小的總和要小的多。

你能夠經過如下命令來便捷的查看鏡像、容器、數據卷所佔用的空間。

docker system df
TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
Images              3                   1                   700.2MB             237.5MB (33%)
Containers          2                   0                   65.95kB             65.95kB (100%)
Local Volumes       0                   0                   0B                  0B
Build Cache         0                   0                   0B                  0B

複製代碼

虛懸鏡像

上面的鏡像列表中,還能夠看到一個特殊的鏡像,這個鏡像標籤爲 none

ubuntu              <none>              a3551444fc85        2 weeks ago         119MB
複製代碼

這個鏡像本來是有鏡像名和標籤的, 鏡像發佈新版本後,從新docker pull的時候, 這個鏡像名被轉移到了新下載的鏡像身上, 而舊的鏡像上的這個名稱則被取消,從而成爲了 。除了 docker pull 可能致使這種狀況,docker build 也一樣能夠致使這種現象。因爲新舊鏡像同名,舊鏡像名稱被取消,從而出現倉庫名、標籤均爲 的鏡像。這類無標籤鏡像也被稱爲 虛懸鏡像(dangling image) ,能夠用下面的命令專門顯示這類鏡像:

docker images -f dangling=true
複製代碼

中間層鏡像

爲了加速鏡像構建、重複利用資源,Docker 會利用 中間層鏡像。因此在使用一段時間後,可能會看到一些依賴的中間層鏡像。默認的 docker image ls 列表中只會顯示頂層鏡像,若是但願顯示包括中間層鏡像在內的全部鏡像的話,須要加 -a 參數。

docker images -a
複製代碼

列出部分鏡像

不加任何參數的狀況下,docker images 會列出全部頂級鏡像,可是有時候咱們只但願列出部分鏡像。docker image ls 有好幾個參數能夠幫助作到這個事情。

  • 根據倉庫名列出鏡像
docker images ubuntu
ubuntu              16.04               2a697363a870        38 hours ago        119MB
ubuntu              <none>              a3551444fc85        2 weeks ago         119MB

複製代碼
  • 列出特定的某個鏡像,也就是說指定倉庫名和標籤
docker images ubuntu:16.04
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              16.04               2a697363a870        38 hours ago        119MB

複製代碼

刪除鏡像

若是要刪除本地的一個鏡像,可使用 docker image rm 命令,其格式爲:

  • 刪除一個鏡像
docker image rm [選項] <鏡像1> [<鏡像2> ...]
複製代碼

或者

docker rmi [選項] <鏡像1> [<鏡像2> ...]
複製代碼
  • 刪除所有鏡像
docker image prune
複製代碼

其中,<鏡像> 能夠是 鏡像短 ID、鏡像長 ID、鏡像名 或者 鏡像摘要。<> 表明必須參數,[] 表明可選參數

定製鏡像

dockerfile定製鏡像

Dockerfile 是一個文本文件,其內包含了一條條的指令(Instruction),每一條指令構建一層,所以每一條指令的內容,就是描述該層應當如何構建。

這裏以定製 tomcat 鏡像爲例,咱們使用 Dockerfile 來定製本身的tomcat

  • 運行一個tomcat容器出來
docker run -p 8080:8080 tomcat 
複製代碼
  • 新開xshell窗口,以交互的方式進入剛剛啓動的容器
docker exec -it f208e826caf2 bash
複製代碼
  • 更改/webapps/Root 目錄中的 index.jsp,再後面追加一段內容
cd webapps/ROOT
echo "hello docker tomcat" >> index.jsp
複製代碼

以上咱們對原來的tomcat容器作了修改,但沒有更改鏡像,致使每次啓動一個容器,都要進入容器進行修改。若是直接修改鏡像,那麼只會跑起來的容器都不在須要一一修改。

如今建立一個Dockerfile 文件來構建咱們本身的鏡像

cd /usr/local

mkdir -p docker/mytomcat

cd docker/mytomcat


複製代碼
  • 編寫Dockerfile 腳本構建鏡像
vi Dockerfile

複製代碼
  • 寫入腳本
FROM tomcat

WORKDIR /usr/local/tomcat/webapps/ROOT/
RUN rm -rf *
RUN echo "hello docker tomcat" > /usr/local/tomcat/webapps/ROOT/index.html


複製代碼

FROM tomcat: 選定基礎鏡像爲tomcat WORKDIR /usr/local/tomcat/webapps/ROOT/:指定工做目錄,進入到這個目錄 RUN rm -rf * : 刪除當前目錄全部文件 RUN echo "hello docker tomcat" > /usr/local/tomcat/webapps/ROOT/index.html: 寫入一個index.html文件到當前目錄

  • 構建鏡像 進入到Dockerfile 所在目錄
docker build -t mytomcat .
複製代碼

mytomcat爲你要構建的鏡像的標籤名 . 表示當前目錄。

好了,如今已經構建好咱們本身的tomcat鏡像了。運行起來

  • 運行定製鏡像
docker run -p 8080:8080 mytomcat
複製代碼

Dockerfile 命令詳解

FROM

  • 功能爲指定基礎鏡像,而且必須是第一條指令。,那麼寫法爲:FROM scratch。同時意味着接下來所寫的指令將做爲鏡像的第一層開始

RUN

功能爲運行指定的命令

RUN命令有兩種格式

  1. RUN
  2. RUN ["executable", "param1", "param2"] 第一種後邊直接跟shell命令

在linux操做系統上默認 /bin/sh -c

在windows操做系統上默認 cmd /S /C

第二種是相似於函數調用。

可將executable理解成爲可執行文件,後面就是兩個參數。

兩種寫法比對:

RUN /bin/bash -c 'source HOME/.bashrc; echoHOME RUN ["/bin/bash", "-c", "echo hello"] 注意:多行命令不要寫多個RUN,緣由是Dockerfile中每個指令都會創建一層.

多少個RUN就構建了多少層鏡像,會形成鏡像的臃腫、多層,不只僅增長了構件部署的時間,還容易出錯。

RUN書寫時的換行符是\

COPY

看這個名字就知道,又是一個複製命令

語法以下:

  1. COPY ...
  2. COPY ["",... ""] 與ADD的區別

COPY的只能是本地文件,其餘用法一致

ADD

一個複製命令,把文件複製到景象中。

若是把虛擬機與容器想象成兩臺linux服務器的話,那麼這個命令就相似於scp,只是scp須要加用戶名和密碼的權限驗證,而ADD不用。

語法以下:

  1. ADD ...
  2. ADD ["",... ""]

路徑的填寫能夠是容器內的絕對路徑,也能夠是相對於工做目錄的相對路徑

能夠是一個本地文件或者是一個本地壓縮文件,還能夠是一個url

若是把寫成一個url,那麼ADD就相似於wget命令

若是把的文件是個tar.gz包, 發送以後就會自動解壓縮。

容器的使用

啓動容器

簡單啓動

docker run -p 8081:8080 tomcat 
複製代碼
  • run:啓動一個容器,啓動一個容器即啓動了一個進程

  • -p: 指定端口, 第一個參數爲宿主機的端口,第二個參數爲docker容器的端口。意思是把宿主機8081端口映射到容器中的8080端口上, 咱們直接訪問宿主機的8081端口就能直接訪問到8080

  • tomcat:鏡像名

守護態啓動

也就是後臺運行,不佔用主線程,不會被日誌卡住在主線程。

docker run -d -p 8080:8080 tomcat
複製代碼
  • -d:以守護態啓動容器

這種方式啓動後, 只會返回一個完整的容器Id, 要查看啓動時輸出的日誌使用如下命令查看:

docker container logs 容器Id
複製代碼

進入已經啓動的容器

docker exec -it 容器Id bash
複製代碼
  • exec:進入
  • -it: 交互模式
  • bash:命令行

進入容器後, 有些linux 命令會不能使用,好比llvi,由於tomcat這個鏡像是基於最簡單的linux構建的。

列出容器

docker container ls -a
複製代碼

或者

docker ps -a
複製代碼

終止容器

docker container stop
複製代碼

刪除容器

docker container rm 容器Id
複製代碼

或者

docker container prune 
複製代碼

刪除全部處於終止狀態的容器

docker container prune
複製代碼

容器數據持久化

一個容器銷燬後, 容器裏面的數據也就丟失了。 如何把容器中的數據和宿主機之間作讀取,作到容器中的數據持久化呢, 這就是容器數據的持久化,須要使用到docker的數據卷

數據卷是一個可供一個或多個容器使用的特殊目錄,它繞過 UFS,能夠提供不少有用的特性:

  • 數據卷 能夠在容器之間共享和重用
  • 對 數據卷 的修改會立馬生效
  • 對 數據卷 的更新,不會影響鏡像
  • 數據卷 默認會一直存在,即便容器被刪除

下面運行一個tomcat容器, 把ROOT 目錄指定爲宿主機上的目錄

  • 在宿主機的root目錄下新建一個目錄ROOT

mkdir ROOT

  • 在ROOT目錄中建立一個index.html文件
cd /ROOT 

vi index.html


複製代碼

內容爲 hello I am domain , this is index.html in volume

  • 啓動一個掛載數據卷的容器
docker run -d -p 8081:8080 -v /root/ROOT:/usr/local/tomcat/webapps/ROOT tomcat 

複製代碼

-v: 第一個參數表示宿主機的目錄,第二個參數表示容器中的目錄,意思是把容器中的ROOT 目錄替換爲宿主機中ROOT目錄

瀏覽器中訪問 8081 端口就能看到 剛剛宿主機中index.html中的內容了。

能夠查看容器中數據卷的信息:

docker inspect 容器Id
複製代碼

數據卷 信息在 "Mounts" Key 下面

容器部署mysql數據庫

  • 拉取mysql鏡像

不指定標籤,默認從官網拉取最新的mysql鏡像

docker pull mysql
複製代碼
  • 啓動容器

帶數據卷啓動容器

docker run -p 3306:3306 --name mysql \
-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/logs:/var/log/mysql: 掛載日誌文件,左邊宿主機目錄, 右邊容器目錄。
-v /usr/local/docker/mysql/data:/var/lib/mysql:掛載 數據文件。
-e MYSQL_ROOT_PASSWORD=123456:經過環境變量設置root用戶的密碼

docker-compose

Compose 項目是 Docker 官方的開源項目,負責實現對 Docker 容器集羣的快速編排。

Compose 中有兩個重要的概念:

服務 (service):一個應用的容器,實際上能夠包括若干運行相同鏡像的容器實例。
項目 (project):由一組關聯的應用容器組成的一個完整業務單元,在 docker-compose.yml 文件中定義。

Compose 的默認管理對象是項目,經過子命令對項目中的一組容器進行便捷地生命週期管理。

docker-compose 的安裝卸載

這裏使用二進制包的方式來安裝和卸載

安裝

從github上面下載安裝並給docker-compose命令執行權限

curl -L https://github.com/docker/compose/releases/download/1.17.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
複製代碼

卸載

刪除二進制文件便可。

rm /usr/local/bin/docker-compose
複製代碼

docker-compose 使用

docker-compose 部署項目

這裏經過docker-compose來啓動一個項目,啓動項目須要啓動兩個容器, 一個tomcat,一個mysql。 這就是前面說的服務組成項目

docker-compose是經過docker-compose.yml 文件來構建的 .

  • 在部署目錄 建立編寫一個docker-compose.yml文件
cd /usr/local/docker

mkdir myshop

cd myshop

vi docker-compose.yml


version: '3'
services: 
  tomcat:
    restart: always
    image: 'tomcat'
    container_name: tomcat
    ports:
      - 8080:8080
    volumes:
      - /usr/local/docker/myshop/ROOT:/usr/local/tomcat/webapps/ROOT

  mysql:
    restart: always
    image: mysql
    container_name: mysql
    ports:
      - 3306:3306
    environment:
      TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: 123456
    command:
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --explicit_defaults_for_timestamp=true
      --lower_case_table_names=1
      --max_allowed_packet=128M
    volumes:
      - mysql-data:/var/lib/mysql

volumes:
  mysql-data:

複製代碼

這裏配置了兩個服務, 兩個服務都使用了數據卷, tomcat中的使用數據卷是常見的格式: 宿主機目錄:容器目錄,mysql中使用的是 統一管理數據卷的方式, 使用docker分配的宿主機目錄,而不是本身指定。下面是配置中的意思:

- mysql-data:/var/lib/mysql: 左邊宿主機目錄名,右邊是容器目錄,而後在下面volumes節點下聲明這個宿主機目錄

volumes:
  mysql-data:
複製代碼
  • docker-compose 啓動項目 在當前docker-compose.yml文件所在目錄,執行啓動命令
docker-compose up -d
複製代碼

-d 表示以守護態運行,不佔用操做系統主線程,不在主線程輸出日誌。

  • docker-compose 中止項目 在當前docker-compose.yml文件所在目錄,執行啓動命令
docker-compose down
複製代碼
  • docker-compose 查看日誌

那麼以守護態運行後,怎麼查看日誌?經過如下命令:

docker-compose logs
複製代碼

docker-compose 部署mysql

version: '3.1'
services:
  db:
    image: mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: 123456
    command:
      --default-authentication-plugin=mysql_native_password
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --explicit_defaults_for_timestamp=true
      --lower_case_table_names=1
    ports:
      - 3306:3306
    volumes:
      - ./data:/var/lib/mysql

  adminer:
    image: adminer
    restart: always
    ports:
      - 8080:8080
複製代碼

docker-compose 安裝 GitLab

經過docker-compos 來部署一個 git 託管平臺,很是的方便。

/usr/local/docker/gitlab 目錄下建立一個docker-compose.yml配置文件,內容以下:

version: '3'
services:
    web:
      image: 'twang2218/gitlab-ce-zh'
      restart: always
      hostname: '192.168.65.130'
      environment:
        TZ: 'Asia/Shanghai'
        GITLAB_OMNIBUS_CONFIG: |
          external_url 'http://192.168.65.130:8080'
          gitlab_rails['gitlab_shell_ssh_port'] = 2222
          unicorn['port'] = 8888
          nginx['listen_port'] = 8080
      ports:
        - '8080:8080'
        - '8443:443'
        - '2222:22'
      volumes:
        - /usr/local/docker/gitlab/config:/etc/gitlab
        - /usr/local/docker/gitlab/data:/var/opt/gitlab
        - /usr/local/docker/gitlab/logs:/var/log/gitlab
複製代碼

下面是每一個節點屬性的意思:

  • restart:每次啓動都重啓容器
  • hostname:主機名,就是當前宿主機的ip
  • environment:環境變量,用來設置一些初始化的數據
  • TZ:時區
  • GITLAB_OMNIBUS_CONFIG:gitlab的一些配置
  • external_url:外部訪問地址
  • gitlab_rails:git ssh 端口
  • unicorn:內部端口
  • nginx:nginx 監聽端口,須要和上面的外部訪問端口一致
  • ports:宿主機和容器之間的映射端口, 左邊宿主機端口,右邊容器端口
  • volumes:數據卷目錄, 左邊宿主機目錄,右邊容器目錄

去到官網搜索鏡像gitlab-ce-zh,拉取鏡像:

docker pull twang2218/gitlab-ce-zh
複製代碼

在docker-compose.yml文件所在目錄, 執行啓動命令:

docker-compose up 
複製代碼

容器很大, 啓動時間較長, 須要等待一段時間。啓動成功後,提示修改密碼,這裏修改的是root的密碼。 修改完後就可使用 root 帳號和剛剛修改的密碼登陸啦。

docker-compose 搭建私服

Nexus 是一個強大的倉庫管理器,部署後,能夠把本身的sdk上傳這裏。 配置後便可拉取使用

  • /usr/local/docker/nexus3目錄下,建立docker-compose.yml配置文件,內容以下:
version: '3.1'
services:
  nexus:
    restart: always
    image: sonatype/nexus3
    container_name: nexus
    ports:
      - 8081:8081
    volumes:
      - /usr/local/docker/nexus3/data:/nexus-data
複製代碼
  • 啓動 在當前目錄 啓動 nexus3 容器:
docker-compose up
複製代碼

啓動報錯, 沒有IO權限,經過更改當前目錄的data目錄權限解決:

chmod 777 data
複製代碼

把以前的容器關閉,再從新啓動:

docker-compose down
docker-compose up
複製代碼

在項目中使用私服

  • 在 Maven settings.xml 中添加 Nexus 認證信息(servers 節點下):
<server>
  <id>nexus-releases</id>
  <username>admin</username>
  <password>admin123</password>
</server>

<server>
  <id>nexus-snapshots</id>
  <username>admin</username>
  <password>admin123</password>
</server>
複製代碼
  • 配置自動化部署

在 pom.xml 中添加以下代碼:

<distributionManagement>  
  <repository>  
    <id>nexus-releases</id>  
    <name>Nexus Release Repository</name>  
    <url>http://192.168.65.130:8081/repository/maven-releases/</url>  
  </repository>  
  <snapshotRepository>  
    <id>nexus-snapshots</id>  
    <name>Nexus Snapshot Repository</name>  
    <url>http://192.168.65.130:8081/repository/maven-snapshots/</url>  
  </snapshotRepository>  
</distributionManagement> 

複製代碼

這裏的id需和上面節點中定義的id一致,url爲nexus中browse拷貝對應版本的url

  • 部署到倉庫
mvn deploy
複製代碼
  • 上傳第三方 JAR 包 Nexus 3.0 不支持頁面上傳,可以使用 maven 命令:
# 如第三方JAR包:aliyun-sdk-oss-2.2.3.jar
mvn deploy:deploy-file 
  -DgroupId=com.aliyun.oss 
  -DartifactId=aliyun-sdk-oss 
  -Dversion=2.2.3 
  -Dpackaging=jar 
  -Dfile=D:\aliyun-sdk-oss-2.2.3.jar 
  -Durl=http://127.0.0.1:8081/repository/maven-3rd/ 
  -DrepositoryId=nexus-releases
複製代碼

注意事項:

  • 建議在上傳第三方 JAR 包時,建立單獨的第三方 JAR 包管理倉庫,便於管理有維護(maven-3rd)。
  • -DrepositoryId=nexus-releases 對應的是 settings.xml 中 Servers 配置的 ID 名稱。(受權)
  • 項目拉取依賴的順序爲: 本地->私服->官服

倉庫的使用

綜合實戰

相關文章
相關標籤/搜索