主頁(yè) > 知識(shí)庫(kù) > Docker鏡像的制作,上傳,拉取和部署操作(利用阿里云)

Docker鏡像的制作,上傳,拉取和部署操作(利用阿里云)

熱門(mén)標(biāo)簽:網(wǎng)站建設(shè) 使用U盤(pán)裝系統(tǒng) 硅谷的囚徒呼叫中心 美圖手機(jī) 檢查注冊(cè)表項(xiàng) 阿里云 百度競(jìng)價(jià)點(diǎn)擊價(jià)格的計(jì)算公式 智能手機(jī)

由于學(xué)習(xí)過(guò)程中發(fā)現(xiàn)push鏡像的時(shí)候一直超時(shí),所以直接把阿里云的Docker倉(cāng)庫(kù)申請(qǐng)一個(gè)(管理中心–>創(chuàng)建鏡像倉(cāng)庫(kù)–>我的是華東2綁定github賬戶(hù)即可),搞定!以后push就用這個(gè)倉(cāng)庫(kù),pull的時(shí)候使用加速器,注意切換根據(jù)使用場(chǎng)景進(jìn)行切換,dockerhub丟棄……記錄了一下操作流程:

1.創(chuàng)建命名空間hhu(以當(dāng)前學(xué)校為單位,只能小寫(xiě),每個(gè)賬號(hào)只能創(chuàng)建5個(gè)),創(chuàng)建菜鳥(niǎo)Docker鏡像倉(cāng)庫(kù)docker1(綁定github中某個(gè)倉(cāng)庫(kù),個(gè)人可以隨意,這個(gè)倉(cāng)庫(kù)鏡像就像是一個(gè)app,可以不斷的更新它的版本),那么所有測(cè)試鏡像可以推送到這里,以后作專(zhuān)門(mén)的其他鏡像可以再申請(qǐng)其他的鏡像倉(cāng)庫(kù)(比如作Tomcat時(shí),單獨(dú)申請(qǐng)一個(gè)鏡像倉(cāng)庫(kù)tomcat,作redis時(shí)再申請(qǐng)一個(gè)redis的倉(cāng)庫(kù),依次類(lèi)推)。完成;

2.鏡像制作,這一步下面單獨(dú)拎出來(lái)詳細(xì)記錄;

3.鏡像推送:制作完事后,需要將鏡像push到鏡像測(cè)試倉(cāng)庫(kù)中docker1中?;拘畔⑷缦篓C

1.公網(wǎng)地址:registry.cn-shanghai.aliyuncs.com/hhu/docker1

2. 內(nèi)網(wǎng)地址(ECS可選):registry-internal.cn-shanghai.aliyuncs.com/hhu/docker1

3.代碼倉(cāng)庫(kù)(即綁定的github上的倉(cāng)庫(kù)):https://github.com/Jacksonary/Docker

我的第一個(gè)Docker鏡像名字為:jacksonary/myfirstapp,根據(jù)網(wǎng)絡(luò)情況選擇公網(wǎng)推送,主要過(guò)程如下:

# 1.從加速器切換到倉(cāng)庫(kù)地址登錄 docker login --username=jacksonary@163.com registry.cn-shanghai.aliyuncs.com

# 2.根據(jù)鏡像名字或者ID為它創(chuàng)建一個(gè)標(biāo)簽,缺省為latest docker tag jacksonary/myfirstapp registry.cn-shanghai.aliyuncs.com/hhu/docker1[:鏡像版本號(hào)]

# 3.推送鏡像 docker push registry.cn-shanghai.aliyuncs.com/hhu/docker1[:鏡像版本號(hào)]

隨后可以在阿里云倉(cāng)庫(kù)中查看推送的鏡像,如下:

在獲取上述的鏡像文件時(shí),需要將指定鏡像版本號(hào),所以在推送鏡像時(shí)還是建議追加必須的鏡像版本號(hào)以作區(qū)分,如果我需要拉取上述的鏡像可以通過(guò)如下操作:

# 因?yàn)榘姹救笔∧J(rèn)是latest的,所以獲取時(shí)可以缺省,或者追加:latest(建議) docker pull registry.cn-shanghai.aliyuncs.com/hhu/docker1

一、Docker鏡像的制作

一般是一個(gè)項(xiàng)目放一個(gè)文件夾,比如官網(wǎng)上有一個(gè)項(xiàng)目叫flask-app,那么所有的文件都在項(xiàng)目目錄下,我們需要在項(xiàng)目根目錄下添加一個(gè)叫做”Dockerfile”的文本文件,并且將它的txt后綴去除,然后利用普通的文本編輯器進(jìn)行Docker環(huán)境的編寫(xiě)即可,比如下面這個(gè)Dockerfile:

# 1.指定基本鏡像為L(zhǎng)inux(alipine Docker鏡像是只有5M的輕量級(jí)Linux系統(tǒng))
FROM alpine:3.5

# 在alipine下安裝python和pip,這個(gè)app是用Python寫(xiě)的,所以需要安裝Python環(huán)境,通常是復(fù)制文件和安裝依賴(lài)
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

# 復(fù)制應(yīng)用必須的文件到鏡像中
COPY app.py /usr/src/app/
COPY templates/index.html /usr/src/app/templates/

# 設(shè)置需要暴露的端口號(hào)
EXPOSE 5000

# 設(shè)置應(yīng)用通過(guò)cmd啟動(dòng)Python應(yīng)用程序
CMD ["python", "/usr/src/app/app.py"]

然后創(chuàng)建Docker鏡像,PowerShell進(jìn)入項(xiàng)目根目錄(即Dockerfile所在目錄),執(zhí)行

docker build -t jacksonary/myfirstapp .

這里需要注意的是當(dāng)我們使用“Dockerfile”為Docker的配置文件名時(shí),直接這么寫(xiě),但是如果使用其他的配置文件名必須額外指定,比如指”jdk-9-alpine.Dockerfile”為Docker的配置文件,應(yīng)該用-f指定配置文件這么寫(xiě):

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

其中-t表示為當(dāng)前創(chuàng)建的鏡像打一個(gè)標(biāo)簽為“jacksonary/myfirstapp”,/前半部分必須是你Docker的用戶(hù)名ID(如果你使用的是Dockerhub倉(cāng)庫(kù),因?yàn)镈ockerhub默認(rèn)是你的用戶(hù)名,如果使用阿里云的話(huà),我可以隨意?。?后半部分是該應(yīng)用的名字,合起來(lái)作為這個(gè)鏡像的tag,后面的URL路徑不能丟了,點(diǎn)號(hào)表示的是當(dāng)前路徑,執(zhí)行完成后會(huì)自動(dòng)發(fā)布到當(dāng)前HV的虛擬機(jī)中,利用docker images可以查看多了一個(gè)“jacksonary/myfirstapp”的鏡像,完成。

【總結(jié)】關(guān)于Dockerfile文件配置需:

1. Dockerfile文件必須以FROM開(kāi)頭,后面跟基礎(chǔ)容器和版本,指明當(dāng)前鏡像的父容器,父容器通常是以“用戶(hù)名/鏡像名:版本號(hào)”的形式存在(Dockerhub中是這一樣的)

2.RUN指令用于創(chuàng)建當(dāng)前的Docker鏡像,每次調(diào)用該指令的時(shí)候,Docker都會(huì)創(chuàng)建新的鏡像層,這樣便于回滾到之前的鏡像版本,它的語(yǔ)法是在RUN后面接shell指令(比如RUN mkdir /user/local/foo),它會(huì)自動(dòng)執(zhí)行/bin/sh的shell,當(dāng)然也可以指定比如:RUN /bin/bash -c 'mkdir /user/local/foo'

3.COPY指令可以將本地的文件復(fù)制到容器中

4.CMD指令定義的命令將會(huì)在鏡像啟動(dòng)時(shí)執(zhí)行,和RUN指令不同的是它不會(huì)創(chuàng)建新的鏡像層,只是簡(jiǎn)單的執(zhí)行指令,在每個(gè)鏡像的Dockerfile文件中可以只有一個(gè)CMD指令,也可以有多個(gè)待執(zhí)行的指令(這種情況最好是將CMD以腳本的方式運(yùn)行),CDM執(zhí)行指令的時(shí)候需要我們指定在哪里運(yùn)行這些指令,而RUN則無(wú)需指定,比如下面的CMD指令

CMD ["python", "./app.py"]

CMD ["/bin/bash", "echo", "Hello World"]

5.EXPOSE指令用于指定鏡像程序?qū)?huì)在哪個(gè)端口提供服務(wù),這些信息可以通過(guò)docker inspect <container-id>指令檢索出來(lái),但是EXPOSE指令實(shí)際上并沒(méi)有向主機(jī)暴露端口,而是在需要在docker run 發(fā)布時(shí)以-p標(biāo)志的方式暴露,上述的是小寫(xiě)的p需要指定主機(jī)到到虛擬到主機(jī)端口之間的映射,而大寫(xiě)的P是將鏡像中的端口暴露到主機(jī)的隨機(jī)端口,具體暴露到哪個(gè)端口可以通過(guò)docker ps查看,比如:

上圖可以看到就是將鏡像的8080端口暴露給主機(jī)的32768端口,此時(shí)可以通過(guò)localhost:32768進(jìn)行查看。

6.PUSH指令可以將鏡像發(fā)布到Docker Cloud這類(lèi)平臺(tái)

7.ENV指令用于配置環(huán)境變量,如:

# 配置Java的環(huán)境變量,這是Linux中標(biāo)準(zhǔn)的JAVA環(huán)境變量
ENV JAVA_HOME=/opt/jdk-9
ENV PATH=$PATH:$JAVA_HOME/bin

二、部署運(yùn)行該鏡像

在創(chuàng)建完鏡像后,可以來(lái)跑一跑,這里先提供我自己根據(jù)教程作的鏡像:docker pull registry.cn-shanghai.aliyuncs.com/hhu/docker1,可以拉取下來(lái)在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 (這個(gè)指令很重要)表示將虛擬機(jī)上的暴露的5000端口映射到本機(jī)8888端口,并且將該鏡像命名為myfirstapp,此時(shí)通過(guò)訪(fǎng)問(wèn)http://localhost:8888即可查看關(guān)于貓的git圖,每次刷新會(huì)隨機(jī)獲取不同的貓圖。

三、鏡像推送

在文首已有,整個(gè)制作Docker鏡像的文件地址:https://github.com/Jacksonary/Docker/tree/master/flask-app

四、簡(jiǎn)單JAVA應(yīng)用的部署

就是簡(jiǎn)單的java工程,這里利用maven打包,來(lái)吧,先到我們的工作目錄下,執(zhí)行

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

創(chuàng)建簡(jiǎn)單的mavenJava工程,我知道大部分人都可以這樣執(zhí)行成功,但是也有小部分人執(zhí)行這個(gè)命令無(wú)法創(chuàng)建工程(我就是其中的一個(gè)��),提示

there is no POM in this directory

一臉懵逼的給他一個(gè)空的pom,它又提示pom中沒(méi)有數(shù)據(jù),好吧,換種方式來(lái)搞,我們先這樣告訴他我們要?jiǎng)?chuàng)建工程了:

mvn archetype:generate

然后它會(huì)提示我們要不要內(nèi)置的骨架,選擇7:maven-archetype-quickstart即可,然后根據(jù)提示輸入groupID和artifactId等信息,最后會(huì)問(wèn)你是否打包,直接打包(然后jar包就會(huì)出現(xiàn)在target目錄下),好了這一步完事了,看一下這個(gè)工程能不能用:

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

其中-cp指明了執(zhí)行這個(gè)class文件所需要的所有類(lèi)的包路徑-即系統(tǒng)類(lèi)加載器的路徑,默認(rèn)骨架會(huì)給出“Hello World”來(lái)問(wèn)候你,好了,java工程創(chuàng)建完成。

第二步寫(xiě)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

第三部創(chuàng)建鏡像并執(zhí)行

docker build -t jacksonary/helloworld .

docker run jacksonary/helloworld

四、Docker中復(fù)雜多容器的應(yīng)用(Docker-compose)

在實(shí)際開(kāi)發(fā)中,往往需要多種業(yè)務(wù),不再是Ubuntu中打印一句話(huà),比如在WEB中和數(shù)據(jù)庫(kù)的交互,這樣的應(yīng)用就是典型的由多個(gè)容器組成,不需要用shell去啟動(dòng)這些容器,所有的容器將會(huì)以一種“服務(wù)組”的方式定義在一個(gè)配置文件中,和Dockerfile類(lèi)似的,寫(xiě)在項(xiàng)目根目錄中,然后可以利用

docker-compose up -d

docker-compose腳本可以用來(lái)啟動(dòng)、停止、重啟應(yīng)用和所有的應(yīng)用中的服務(wù),docker-compose的完整的命令如下:

指令 內(nèi)容

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組件服務(wù)入口是docker-compse配置文件,他通常以yml文件的形式存在,比如下面的docker-compse.yml(注意在每個(gè)屬性配置時(shí)冒號(hào)后面必須加空格符,除了端口映射):

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. 定義了兩個(gè)服務(wù):db和web

2. image屬性為每個(gè)服務(wù)字指定了鏡像文件

3. mysql:8鏡像將會(huì)啟動(dòng)MySql服務(wù)

4. environment屬性定義了MySQL服務(wù)環(huán)境變量進(jìn)行初始化:MYSQL_DATABASE 在鏡像啟動(dòng)時(shí)常見(jiàn)一個(gè)指定名字的數(shù)據(jù)庫(kù),MYSQL_USER和MYSQL_PASSWORD組合創(chuàng)建一個(gè)新的用戶(hù)并設(shè)定密碼,這個(gè)用戶(hù)將會(huì)被授予MYSQL_DATABASE創(chuàng)建的那個(gè)數(shù)據(jù)庫(kù)的超級(jí)權(quán)限,MYSQL_ROOT_PASSWORD是強(qiáng)制性的設(shè)定MySQL超級(jí)用戶(hù)密碼

5. ports實(shí)現(xiàn)端口的轉(zhuǎn)發(fā),前面的是主機(jī),后面的是虛擬機(jī)

6. depends_on屬性表明了兩個(gè)服務(wù)之間的依賴(lài),這個(gè)案例中,WildFly(一種應(yīng)用服務(wù)器)依賴(lài)于MySQL,所以MySQL將在WildFly之前啟動(dòng)

在有了上述的組合配置文件后,PW進(jìn)入該文件的所在目錄下,即可利用docker-compose up -d以隔離模式啟動(dòng)這兩個(gè)服務(wù),docker ps可以查看端口之間的映射情況,也可以發(fā)現(xiàn)是啟動(dòng)了兩個(gè)容器,docker-compose logs可以查看服務(wù)的日志,此時(shí)我們就可以通過(guò)http://localhost:8081/resources/employees訪(fǎng)問(wèn)所有人員信息,停止這一組服務(wù):

docker-compose down

以上這篇Docker鏡像的制作,上傳,拉取和部署操作(利用阿里云)就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

標(biāo)簽:湘潭 懷化 湖北 黃山 通遼 山南 賀州 煙臺(tái)

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Docker鏡像的制作,上傳,拉取和部署操作(利用阿里云)》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話(huà)咨詢(xún)

    • 400-1100-266