名詞概念:鏡像、容器、倉庫node
Docker 是一個開源的應用容器引擎,基於 Go 語言 並聽從 Apache2.0 協議開源。Docker 可讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,而後發佈到任何流行的 Linux 機器上,也能夠實現虛擬化。容器是徹底使用沙箱機制,相互之間不會有任何接口(相似 iPhone 的 app),更重要的是容器性能開銷極低。
mysql
鏡像(Image):Docker 鏡像(Image),就至關因而一個 root 文件系統。好比官方鏡像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系統的 root 文件系統。
容器(Container):鏡像(Image)和容器(Container)的關係,就像是面向對象程序設計中的類和實例同樣,鏡像是靜態的定義,容器是鏡像運行時的實體。容器能夠被建立、啓動、中止、刪除、暫停等。
倉庫(Repository):倉庫可看着一個代碼控制中心,用來保存鏡像。
關於docker的一些優勢和使用場景能夠去docker官網查看,這裏不一一列出,上述簡單介紹一下幾個關鍵名詞,下面開始學習怎麼使用docker。web
舉一個栗子:假如如今有一個web項目,咱們須要部署到服務器上面去,而且啓動能夠訪問。咱們的思路確定是把這個項目的war包拷貝到服務器的tomcat的webapps下面,而後將這個tomcat啓動。這是沒學docker以前的思路,那麼如今怎麼用docker容器來把這個項目跑起來呢?算法
咱們知道學了docker之後,咱們的思惟發生了變化,各個應用均可以嘗試用容器部署,例如tomcat、mysql、Redis等均可以用容器啓動,因此咱們本身的項目也是這樣。容器能夠理解爲是鏡像的一個實例化對象,因此首先須要有鏡像文件,才能啓動容器,那麼這個鏡像文件就是經過Dockfile來定製的,Dockerfile 是一個用來構建鏡像的文本文件,文本內容包含了一條條構建鏡像所需的指令和說明, 簡單來講就是用來定製鏡像的一個規則文件。sql
首先用idea建了一個web項目,且打成war包後上傳到服務器的某個文件夾下面,這裏是放在了docker-registry-demo文件夾下面, 同時在同級目錄建了一個Dockerfile文件,下圖所示:docker
Dockerfile內容以下:json
from tomcat:latest
copy ./docker-registry-demo.war /usr/local/tomcat/webapps/複製代碼
本次dockerfile的內容特別簡單,就兩句話,第一句是依賴基礎鏡像tomcat,由於咱們的項目是要在tomcat中運行的,第二句是將當前路徑的war拷貝到tomcat容器的webapps下面。以後咱們使用構建鏡像的,命令直接構建就好了。ubuntu
使用命令:docker build -t docker-registry-demo .複製代碼
注意這裏的.指的是上下文路徑,上下文路徑是指 docker 在構建鏡像,有時候想要使用到本機的文件(好比複製),docker build 命令得知這個路徑後,會將路徑下的全部內容打包。咱們看到構建步驟一就是在發送這個上下文環境到鏡像文件中,第三步的copy也是在上下文環境中找到這個war。vim
咱們的項目已經構建成一個鏡像文件了,經過docker images命令能夠查看全部的鏡像文件,接下來就是運行這個文件,即容器啓動。瀏覽器
使用命令:docker run -p 8083:8080 -d docker-registry-demo複製代碼
一句簡單命令就把項目啓動了,咱們在瀏覽器輸入訪問地址:
如今咱們已經成功將本身的項目經過docker容器部署起來了,可是咱們有時候會遇到須要在服務器查看日誌狀況,這裏有兩種方式:一種是進入到這個容器裏面,或者是將日誌數據映射到服務器某個位置。
方式一:
使用docker ps命令查看當前活躍的容器,再經過命令docker exec -it 容器ID /bin/bash
進入容器之後,就是咱們熟悉的目錄了,在這能夠查看日誌
方式二:
在容器啓動的時候指定數據的映射,即數據卷設置
docker run -p 8080:8080 --name tomcat -v $PWD/logs:/usr/local/tomcat/logs 4e7840b49fad複製代碼
-v
參數爲容器添加數據卷。-v
參數參數能夠屢次使用,以添加多個數據卷。咱們已經學會怎麼構建一個簡單的鏡像文件,以及怎麼啓動容器。可是你會發現,當咱們每次啓動容器的時候都須要寫一長串命令,像這種:docker run -p 8080:8080 --name tomcat -v $PWD/logs:/usr/local/tomcat/logs 4e7840b49fad , 雖然能夠複製,可是仍是以爲很麻煩,因此docker爲咱們提供了docker-compose的使用,就是用來簡化啓動配置的。
docker-compose是一個yml文件,在這個文件裏面咱們能夠將一些啓動配置寫在裏面,例如數據卷的設置,容器名稱,端口映射等。首先咱們要進行compose的下載安裝,這裏不介紹。安裝完成之後,使用命令docker-compose --version查看是否安裝成功
安裝好docker-compose之後,接下來就是編寫文件,一樣在docker-registry-demo文件夾下面建立docker-compose-yaml文件,內容是:
version: "2.2"
services:
docker-registry-demo:
volumes:
- ./logs:/usr/local/tomcat/logs
image: docker-registry-demo-image
build: .
ports:
- 8002:8080
複製代碼
這是一個yml文件,因此格式也是yml格式, volumes就是數據卷設置,ports是端口映射,build是幫咱們構建鏡像,image是鏡像名稱。
使用命令:docker-compose up -d複製代碼
上述命令是以compose方式啓動容器,不須要帶不少參數,變得方便不少。
中止容器可使用docker stop 容器id, 也可使用命令:docker-compose down.
說明:用docker-compose down中止容器是能夠同時刪除中止後的容器,不用再手動刪除了,並且能夠同時中止全部在docker-compose文件裏面定義的容器。
在結束上面一些關於docker基礎知識鋪墊後,進入今天的學習正題,怎麼搭建docker私倉。
咱們都知道maven私服,就是在服務器上有一塊jar包共享區域,你們能夠在共享倉庫裏面進行pull或者push。docker的私服差很少也是這個概念,只不過這塊共享區域放的不是jar, 而是鏡像文件,這樣就能實現不一樣服務器均可以從這塊共享區域上傳或者拉取鏡像,十分方便。咱們知道的docker倉庫有DockerHub, 還有aliyun提供的鏡像服務,今天就來學習怎麼搭建本身的私倉,這也是經常使用的狀況。
docker私服是用docker-registry技術實現的,因此先要下載docker-registry鏡像並啓動registry容器。
使用命令:$ docker run ‐d ‐p 5000:5000 ‐‐restart=always ‐‐name registry
‐v /usr/docker/registry:/var/lib/registry registry:2 複製代碼
小提示: Docker Registry目前有v1和v2兩個版本,v2版本並非v1版本的簡單升級,而是在不少 功能上都有了改進和優化。v1版本使用的是Python開發的,而v2版本是用go語言開發的; v1版本本地鏡像倉庫容器中數據默認掛載點是/tmp/registry,而v2版本的本地鏡像倉庫容 器中數據默認掛載點是/var/lib/registry 。
啓動好registry容器,咱們就將上面構建的docker-registry-demo鏡像推送到倉庫,首先須要給鏡像重命名。因爲推送到本地私有鏡像倉庫的鏡像名必須符合「倉庫IP:端口 號/repository」的形式,因此可使用下面命令命名:
docker tag docker-registry-demo localhost:5000/docker-registry-demo2複製代碼
接下來經過push命令推送鏡像到倉庫
docker push localhost:5000/docker-registry-demo2複製代碼
推送結束,咱們能夠到倉庫地址/usr/docker/registry/docker/registry/v2/repositories查看全部的鏡像文件。
上面的步驟很簡單,固然也是不安全的,因此須要配置私有倉庫認證,這樣在進行鏡像文件推送或者拉取時,必需要登錄,這樣安全性獲得了保障。怎麼配置私有倉庫認證?
一、查看Docker Registry私有倉庫搭建所在服務器地址:ifconfig 例如:服務器地址爲:192.168.158.129
二、生成自簽名證書
要確保Docker Registry本地鏡像倉庫的安全性,還須要一個安全認證證書,來保證其餘 Docker機器不能隨意訪問該機器上的Docker Registry本地鏡像倉庫,因此須要在搭建 Docker Registry本地鏡像倉庫的Docker主機上先生成自簽名證書(若是已購買證書就無需生成),具體操做指令以下。
$ mkdir registry
$ cd registry
$ mkdir certs
$ cd certs
$ openssl req ‐x509 ‐days 3650 ‐subj '/CN=192.168.158.129:5000/'
‐nodes ‐newkey rsa:2048 ‐keyout domain.key ‐out domain.crt 複製代碼
三、生成用戶名和密碼
在Docker Registry本地鏡像倉庫所在的Docker主機上生成自簽名證書後,爲了確保 Docker機器與該Docker Registry本地鏡像倉庫的交互,還須要生成一個鏈接認證的用戶名和密碼,使其餘Docker用戶只有經過用戶名和密碼登陸後才容許鏈接到Docker Registry本地鏡像倉庫
$ cd ..
$ mkdir auth
$ docker run ‐‐entrypoint htpasswd registry:2 ‐Bbn admin 123456 > auth/htpasswd 複製代碼
四、啓動Docker Registry本地鏡像倉庫服務(將以前建立的容器刪除)
docker run -p 5000:5000 --restart=always --name registry
-v /usr/docker/registry:/var/lib/registry
-v /registry/auth:/auth
-e "REGISTRY_AUTH=htpasswd"
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm"
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd
-v /registry/certs:/certs
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt
-e REGISTRY_HTTP_TLS_KEY=/certs/domain.key -d 708bc6af7e5e複製代碼
五、配置Docker Registry訪問接口
完成Docker Registry本地鏡像倉庫服務啓動後,還須要在搭建了Docker Registry本地鏡像倉庫所在的Docker主機上配置供其餘Docker機器訪問的接口,具體指令以下:
$ mkdir ‐p /etc/docker/certs.d/192.168.158.129:5000
$ cp certs/domain.crt /etc/docker/certs.d/192.168.158.129:5000 複製代碼
六、Docker Registry私有倉庫使用登記 在Docker機器終端使用
vi /etc/docker/daemon.json命令編輯daemon.json文 件,在該文件中添加以下內容 {"insecure‐registries":["192.168.158.129:5000"]}
七、重啓並加載docker配置文件
$ /etc/init.d/docker restart 複製代碼
自此,咱們的倉庫認證已經作完,下面咱們再試一下push鏡像。首先是重命名。
docker tag docker-registry-demo 192.168.158.129:5000/docker-registry-demo3複製代碼
docker push 192.168.158.129:5000/docker-registry-demo3
複製代碼
發現此時權限受限制,咱們能夠先登錄
docker login 192.168.158.129:5000複製代碼
登錄成功後,在push鏡像到倉庫成功
push 成功後,咱們能夠在另一臺服務器pull該鏡像,固然前提也是須要先登錄,再使用pull命令。體現了一次構建,處處運行的優點。
docker-maven-plugin插件讓咱們在idea中能夠直接構建docker鏡像文件,而後推送到遠程私倉,使用起來很是方便,具體使用以下:
首先修改docker.service文件 開啓2375端口,供其餘客戶端上傳
vim /usr/lib/systemd/system/docker.service
複製代碼
修改ExecStart這一行爲如下內容
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock \複製代碼
從新啓動docker
// 1,加載docker守護線程
systemctl daemon-reload
// 2,重啓docker
systemctl restart docker複製代碼
在idea項目的pom.xml中加入如下內容
<plugins>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.1.0</version>
<executions>
<execution>
<id>build-image</id>
<phase>install</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<serverId>my-docker-registry</serverId>
<imageName>192.168.158.129:5000/docker-registry-demo</imageName>
<dockerHost>http://192.168.158.129:2375</dockerHost>
<baseImage>tomcat</baseImage>
<pushImage>true</pushImage>
<resources>
<resource>
<targetPath>/usr/local/tomcat/webapps/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.war</include>
</resource>
</resources>
</configuration>
</plugin>
</plugins>複製代碼
這裏須要注意的一點是,由於咱們已經配了倉庫安全認證,因此須要登陸,這裏的登陸是經過settings.xml中配置:
<server>
<id>my-docker-registry</id>
<username>admin</username>
<password>123456</password>
</server>
複製代碼
而後在pom.xml中指定
<serverId>my-docker-registry</serverId>複製代碼
使用命令:mvn clean install 進行打鏡像包同時push到遠程私倉,注意只有配置了<pushImage>true</pushImage>
纔會在install階段上傳,不然只能在deploy階段上傳