1. 程式人生 > >Docker映象的製作、上傳、拉取和部署(利用阿里雲)

Docker映象的製作、上傳、拉取和部署(利用阿里雲)

由於學習過程中發現push映象的時候一直超時,所以直接把阿里雲的Docker倉庫申請一個(管理中心–>建立映象倉庫–>我的是華東2繫結github賬戶即可),搞定!以後push就用這個倉庫,pull的時候使用加速器,注意切換根據使用場景進行切換,dockerhub丟棄……記錄了一下操作流程:
1.建立名稱空間hhu(以當前學校為單位,只能小寫,每個賬號只能建立5個),建立菜鳥Docker映象倉庫docker1(繫結github中某個倉庫,個人可以隨意,這個倉庫映象就像是一個app,可以不斷的更新它的版本),那麼所有測試映象可以推送到這裡,以後作專門的其他映象可以再申請其他的映象倉庫(比如作Tomcat時,單獨申請一個映象倉庫tomcat,作redis時再申請一個redis的倉庫,依次類推)。完成;

2.映象製作,這一步下面單獨拎出來詳細記錄;

3.映象推送:製作完事後,需要將映象push到映象測試倉庫中docker1中。基本資訊如下–
1.公網地址:registry.cn-shanghai.aliyuncs.com/hhu/docker1
2. 內網地址(ECS可選):registry-internal.cn-shanghai.aliyuncs.com/hhu/docker1
3.程式碼倉庫(即繫結的github上的倉庫):https://github.com/Jacksonary/Docker
,我的第一個Docker映象名字為:jacksonary/myfirstapp,根據網路情況選擇公網推送,主要過程如下:

# 1.從加速器切換到倉庫地址登入
docker login --username=jacksonary@163.com registry.cn-shanghai.aliyuncs.com

# 2.根據映象名字或者ID為它建立一個標籤,預設為latest
docker tag jacksonary/myfirstapp registry.cn-shanghai.aliyuncs.com/hhu/docker1[:映象版本號]

# 3.推送映象
docker push registry.cn-shanghai.aliyuncs.com/hhu/docker1[:映象版本號]

隨後可以在阿里雲倉庫中檢視推送的映象,如下:
這裡寫圖片描述

在獲取上述的映象檔案時,需要將指定映象版本號,所以在推送映象時還是建議追加必須的映象版本號以作區分,如果我需要拉取上述的映象可以通過如下操作:

# 因為版本預設預設是latest的,所以獲取時可以預設,或者追加:latest(建議)
docker pull registry.cn-shanghai.aliyuncs.com/hhu/docker1

一、Docker映象的製作

一般是一個專案放一個資料夾,比如官網上有一個專案叫flask-app,那麼所有的檔案都在專案目錄下,我們需要在專案根目錄下新增一個叫做”Dockerfile”的文字檔案,並且將它的txt字尾去除,然後利用普通的文字編輯器進行Docker環境的編寫即可,比如下面這個Dockerfile:

# 1.指定基本映象為Linux(alipine Docker映象是隻有5M的輕量級Linux系統)
FROM alpine:3.5

# 在alipine下安裝python和pip,這個app是用Python寫的,所以需要安裝Python環境,通常是複製檔案和安裝依賴
RUN apk add --update py2-pip

# 安裝app所需的Python所必須的
COPY requirements.txt /usr/src/app/
RUN pip install --no-cache-dir -r /usr/src/app/requirements.txt

# 複製應用必須的檔案到映象中
COPY app.py /usr/src/app/
COPY templates/index.html /usr/src/app/templates/

# 設定需要暴露的埠號
EXPOSE 5000

# 設定應用通過cmd啟動Python應用程式
CMD ["python", "/usr/src/app/app.py"]

然後建立Docker映象,PowerShell進入專案根目錄(即Dockerfile所在目錄),執行

docker build -t jacksonary/myfirstapp .

這裡需要注意的是當我們使用“Dockerfile”為Docker的配置檔名時,直接這麼寫,但是如果使用其他的配置檔名必須額外指定,比如指”jdk-9-alpine.Dockerfile”為Docker的配置檔案,應該用-f指定配置檔案這麼寫:

docker build -t jacksonary/myfirstapp -f jdk-9-alpine.Dockerfile .

其中-t表示為當前建立的映象打一個標籤為“jacksonary/myfirstapp”,/前半部分必須是你Docker的使用者名稱ID(如果你使用的是Dockerhub倉庫,因為Dockerhub預設是你的使用者名稱,如果使用阿里雲的話,我可以隨意取),/後半部分是該應用的名字,合起來作為這個映象的tag,後面的URL路徑不能丟了,點號表示的是當前路徑,執行完成後會自動釋出到當前HV的虛擬機器中,利用docker images可以檢視多了一個“jacksonary/myfirstapp”的映象,完成。
【總結】關於Dockerfile檔案配置需:
1. Dockerfile檔案必須以FROM開頭,後面跟基礎容器和版本,指明當前映象的父容器,父容器通常是以“使用者名稱/映象名:版本號”的形式存在(Dockerhub中是這一樣的)

2.RUN指令用於建立當前的Docker映象,每次呼叫該指令的時候,Docker都會建立新的映象層,這樣便於回滾到之前的映象版本,它的語法是在RUN後面接shell指令(比如RUN mkdir /user/local/foo),它會自動執行/bin/sh的shell,當然也可以指定比如:RUN /bin/bash -c 'mkdir /user/local/foo'

3.COPY指令可以將本地的檔案複製到容器中

4.CMD指令定義的命令將會在映象啟動時執行,和RUN指令不同的是它不會建立新的映象層,只是簡單的執行指令,在每個映象的Dockerfile檔案中可以只有一個CMD指令,也可以有多個待執行的指令(這種情況最好是將CMD以指令碼的方式執行),CDM執行指令的時候需要我們指定在哪裡執行這些指令,而RUN則無需指定,比如下面的CMD指令

CMD ["python", "./app.py"]
CMD ["/bin/bash", "echo", "Hello World"]

5.EXPOSE指令用於指定映象程式將會在哪個埠提供服務,這些資訊可以通過docker inspect <container-id>指令檢索出來,但是EXPOSE指令實際上並沒有向主機暴露埠,而是在需要在docker run 釋出時以-p標誌的方式暴露,上述的是小寫的p需要指定主機到到虛擬到主機埠之間的對映,而大寫的P是將映象中的埠暴露到主機的隨機埠,具體暴露到哪個埠可以通過docker ps檢視,比如:
這裡寫圖片描述
上圖可以看到就是將映象的8080埠暴露給主機的32768埠,此時可以通過localhost:32768進行檢視。

6.PUSH指令可以將映象釋出到Docker Cloud這類平臺

7.ENV指令用於配置環境變數,如:

# 配置Java的環境變數,這是Linux中標準的JAVA環境變數
ENV JAVA_HOME=/opt/jdk-9
ENV PATH=$PATH:$JAVA_HOME/bin

二、部署執行該映象

在建立完映象後,可以來跑一跑,這裡先提供我自己根據教程作的映象:docker pull registry.cn-shanghai.aliyuncs.com/hhu/docker1,可以拉取下來在Docker中跑:

docker pull registry.cn-shanghai.aliyuncs.com/hhu/docker1

docker run -p 8888:5000 --name myfirstapp registry.cn-shanghai.aliyuncs.com/hhu/docker1

其中 -p (這個指令很重要)表示將虛擬機器上的暴露的5000埠對映到本機8888埠,並且將該映象命名為myfirstapp,此時通過訪問http://localhost:8888即可檢視關於貓的git圖,每次重新整理會隨機獲取不同的貓圖。

三、映象推送

四、簡單JAVA應用的部署

就是簡單的java工程,這裡利用maven打包,來吧,先到我們的工作目錄下,執行

mvn archetype:generate -DgroupId=edu.hhu.java -DartifactId=helloworld -DinteractiveMode=false

建立簡單的mavenJava工程,我知道大部分人都可以這樣執行成功,但是也有小部分人執行這個命令無法建立工程(我就是其中的一個��),提示

there is no POM in this directory

一臉懵逼的給他一個空的pom,它又提示pom中沒有資料,好吧,換種方式來搞,我們先這樣告訴他我們要建立工程了:

mvn archetype:generate

然後它會提示我們要不要內建的骨架,選擇7:maven-archetype-quickstart即可,然後根據提示輸入groupID和artifactId等資訊,最後會問你是否打包,直接打包(然後jar包就會出現在target目錄下),好了這一步完事了,看一下這個工程能不能用:

java -cp target/helloworld-1.0-SNAPSHOT.jar edu.hhu.java.App

其中-cp指明瞭執行這個class檔案所需要的所有類的包路徑-即系統類載入器的路徑,預設骨架會給出“Hello World”來問候你,好了,java工程建立完成。

第二步寫Docker的配置檔案Dockerfile:

FROM openjdk:latest

COPY target/helloworld-1.0-SNAPSHOT.jar /usr/src/helloworld-1.0-SNAPSHOT.jar

CMD java -cp /usr/src/helloworld-1.0-SNAPSHOT.jar edu.hhu.java.App

第三部建立映象並執行

docker build -t jacksonary/helloworld .
docker run jacksonary/helloworld

四、Docker中複雜多容器的應用(Docker-compose)

在實際開發中,往往需要多種業務,不再是Ubuntu中列印一句話,比如在WEB中和資料庫的互動,這樣的應用就是典型的由多個容器組成,不需要用shell去啟動這些容器,所有的容器將會以一種“服務組”的方式定義在一個配置檔案中,和Dockerfile類似的,寫在專案根目錄中,然後可以利用

docker-compose up -d

docker-compose指令碼可以用來啟動、停止、重啟應用和所有的應用中的服務,docker-compose的完整的命令如下:

指令 內容

build

Build or rebuild services

help

Get help on a command

kill

Kill containers

logs

View output from containers

port

Print the public port for a port binding

ps

List containers

pull

Pulls service images

restart

Restart services

rm

Remove stopped containers

run

Run a one-off command

scale

Set number of containers for a service

start

Start services

stop

Stop services

up

Create and start containers

這些定義在一起的Docker元件服務入口是docker-compse配置檔案,他通常以yml檔案的形式存在,比如下面的docker-compse.yml(注意在每個屬性配置時冒號後面必須加空格符,除了埠對映):

version: '3.3'
services:
  db:
    container_name: db
    image: mysql:8
    environment:
      MYSQL_DATABASE: employees
      MYSQL_USER: mysql
      MYSQL_PASSWORD: mysql
      MYSQL_ROOT_PASSWORD: supersecret
    ports:
      - 3307:3306
  web:
    image: arungupta/docker-javaee:dockerconeu17
    ports:
      - 8081:8080
      - 9991:9990
    depends_on:
      - db

在上面的組合檔案中:
1. 定義了兩個服務:db和web
2. image屬性為每個服務字指定了映象檔案
3. mysql:8映象將會啟動MySql服務
4. environment屬性定義了MySQL服務環境變數進行初始化:MYSQL_DATABASE 在映象啟動時常見一個指定名字的資料庫,MYSQL_USERMYSQL_PASSWORD組合建立一個新的使用者並設定密碼,這個使用者將會被授予MYSQL_DATABASE建立的那個資料庫的超級許可權,MYSQL_ROOT_PASSWORD是強制性的設定MySQL超級使用者密碼
5. ports實現埠的轉發,前面的是主機,後面的是虛擬機器
6. depends_on屬性表明了兩個服務之間的依賴,這個案例中,WildFly(一種應用伺服器)依賴於MySQL,所以MySQL將在WildFly之前啟動

在有了上述的組合配置檔案後,PW進入該檔案的所在目錄下,即可利用docker-compose up -d以隔離模式啟動這兩個服務,docker ps可以檢視埠之間的對映情況,也可以發現是啟動了兩個容器,docker-compose logs可以檢視服務的日誌,此時我們就可以通過http://localhost:8081/resources/employees訪問所有人員資訊,停止這一組服務:

docker-compose down