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 or rebuild services |
|
Get help on a command |
|
Kill containers |
|
View output from containers |
|
Print the public port for a port binding |
|
List containers |
|
Pulls service images |
|
Restart services |
|
Remove stopped containers |
|
Run a one-off command |
|
Set number of containers for a service |
|
Start services |
|
Stop services |
|
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_USER
和MYSQL_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