您好,登錄后才能下訂單哦!
如何實現上傳和拉取Docker鏡像?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
1.創建命名空間hhu,創建菜鳥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圖,每次刷新會隨機獲取不同的貓圖。
三、鏡像推送
在文首已有,整個制作Docker鏡像的文件地址:https://github.com/Jacksonary/Docker/tree/master/flask-app
四、簡單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_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
關于如何實現上傳和拉取Docker鏡像問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。