第一次構(gòu)建、運(yùn)行、發(fā)布、獲取docker鏡像的步驟詳解
1、前言
過去,如果您要開始編寫Python應(yīng)用程序,第一步就是把Python的運(yùn)行環(huán)境安裝到您的機(jī)器上,而且安裝的環(huán)境還要和線上的一致,比較麻煩。
使用Docker,您可以從docker的官方registry或者其他倉庫,獲取一個(gè)可移植的Python運(yùn)行環(huán)境鏡像,無需安裝。然后,你可以基于這個(gè)鏡像開發(fā)你的應(yīng)用程序,這樣可以確保您的應(yīng)用程序,依賴項(xiàng)和運(yùn)行時(shí)都一起運(yùn)行。
2、構(gòu)建一個(gè)python鏡像
2.1、為了構(gòu)建您自己的鏡像,首先需要?jiǎng)?chuàng)建一個(gè)名稱為Dockerfile的文件,用于定義創(chuàng)建鏡像并運(yùn)行container所需的步驟。 Dockerfile中的每條指令都會(huì)在鏡像中創(chuàng)建一個(gè)層級(jí)。當(dāng)您更改Dockerfile并重新build鏡像時(shí),只重建那些更改的層級(jí)。與其他虛擬化技術(shù)相比,這是使鏡像輕量,小巧,快速的一個(gè)原因。
創(chuàng)建一個(gè)空目錄,創(chuàng)建一個(gè)名為Dockerfile的文件,將以下內(nèi)容復(fù)制并粘貼到該文件中并保存。
# Use an official Python runtime as a parent image FROM python:2.7-slim # Set the working directory to /app WORKDIR /app # Copy the current directory contents into the container at /app ADD . /app # Install any needed packages specified in requirements.txt RUN pip install --trusted-host pypi.python.org -r requirements.txt # Make port 80 available to the world outside this container EXPOSE 80 # Define environment variable ENV NAME World # Run app.py when the container launches CMD ["python", "app.py"]
2.2 在與Dockerfile文件同一個(gè)目錄下,創(chuàng)建requirements.txt和app.py文件。因?yàn)镈ockerfile文件的ADD命令,上面的兩個(gè)文件會(huì)被加到最終的鏡像中;因?yàn)镋XPOSE命令,訪問容器的80端口,才可以訪問到app.py的內(nèi)容,注意:這里的80端口指的是容器暴露的端口,并不是實(shí)際機(jī)器的端口。
requirements.txt
Flask
Redis
app.py
from flask import Flask from redis import Redis, RedisError import os import socket # Connect to Redis redis = Redis(host="redis", db=0, socket_connect_timeout=2, socket_timeout=2) app = Flask(__name__) @app.route("/") def hello(): try: visits = redis.incr("counter") except RedisError: visits = "<i>cannot connect to Redis, counter disabled</i>" html = "<h3>Hello {name}!</h3>" \ "<b>Hostname:</b> {hostname}<br/>" \ "<b>Visits:</b> {visits}" return html.format(name=os.getenv("NAME", "world"), hostname=socket.gethostname(), visits=visits) if __name__ == "__main__": app.run(host='0.0.0.0', port=80)
2.3 把我們的應(yīng)用打包為鏡像,要在DockerFile目錄下執(zhí)行。這會(huì)創(chuàng)建一個(gè)Docker鏡像,我們將使用-t標(biāo)記它,以使鏡像有一個(gè)友好的名稱。
docker build -t friendlyhello
3 、運(yùn)行鏡像
運(yùn)行應(yīng)用程序,使用-p將機(jī)器的端口4000映射到容器暴露的端口80:
docker run -p 4000:80 friendlyhello
您也可以在shell中使用curl命令來查看相同的內(nèi)容。
$ curl http://localhost:4000 <h3>Hello World!</h3><b>Hostname:</b> 8fc990912a14<br/><b>Visits:</b> <i>cannot connect to Redis, counter disabled</i>
按crtl+c結(jié)束應(yīng)用
現(xiàn)在讓我們?cè)诤笈_(tái)運(yùn)行應(yīng)用程序:
docker run -d -p 4000:80 friendlyhello
查看所有的container信息
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED
1fa4ab2cf395 friendlyhello "python app.py" 28 seconds ago
現(xiàn)在使用docker container stop來結(jié)束進(jìn)程,使用CONTAINER ID,如下所示:
docker container stop 1fa4ab2cf395
4、發(fā)布鏡像
4.1、我使用的是阿里云的docker registry,感覺應(yīng)該會(huì)比較快。首先你要有一個(gè)阿里云的賬號(hào)。然后登陸進(jìn)去新建一個(gè)倉庫,設(shè)置命名空間等信息。
4.2 登陸阿里云的docker registry,后續(xù)操作都需要登陸才可以執(zhí)行。
sudo docker login --username=admin registry.cn-hangzhou.aliyuncs.com
4.3 為鏡像打標(biāo),tag為可選的,如果沒有,默認(rèn)為latest
格式:
docker tag image_name registry_url/namespace/repository_name:[tag]
例如
docker tag friendlyhello registry.cn-hangzhou.aliyuncs.com/shuzhou/demo1:latest
查看本地的鏡像列表
docker image ls
4.4 發(fā)布鏡像
docker push registry.cn-hangzhou.aliyuncs.com/shuzhou/demo1:latest
4.5 現(xiàn)在你可以在任何一臺(tái)機(jī)器上執(zhí)行下面的命令,運(yùn)行鏡像
docker run -p 4000:80 registry.cn-hangzhou.aliyuncs.com/shuzhou/demo1:latest
4.6 拉取鏡像
docker pull registry.cn-hangzhou.aliyuncs.com/shuzhou/demo1:latest
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接
相關(guān)文章
Docker安裝Nginx并部署及MySQL容器構(gòu)建全過程
眾所周知Docker是一種容器化技術(shù),可以用來快速部署和管理應(yīng)用程序,這篇文章主要給大家介紹了關(guān)于Docker安裝Nginx并部署及MySQL容器構(gòu)建的相關(guān)資料,需要的朋友可以參考下2024-02-02Linux下使用Docker部署MinIO存儲(chǔ)服務(wù)實(shí)現(xiàn)遠(yuǎn)程上傳的方法
MinIO是一個(gè)開源的對(duì)象存儲(chǔ)服務(wù)器,可以在各種環(huán)境中運(yùn)行,例如本地、Docker容器、Kubernetes集群等,本文主要是Linux下通過Docker部署MinIO存儲(chǔ)服務(wù)實(shí)現(xiàn)遠(yuǎn)程上傳的文章,感興趣的朋友一起看看吧2023-11-11詳解如何修改 Docker 默認(rèn)網(wǎng)橋地址
這篇文章主要介紹了詳解如何修改 Docker 默認(rèn)網(wǎng)橋地址,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-05-05docker run啟動(dòng)的容器掛掉了數(shù)據(jù)怎么辦
這篇文章主要介紹了docker run啟動(dòng)的容器掛掉了,數(shù)據(jù)怎么辦,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09基于alpine用dockerfile創(chuàng)建的爬蟲Scrapy鏡像的實(shí)現(xiàn)
這篇文章主要介紹了基于alpine用dockerfile創(chuàng)建的爬蟲Scrapy鏡像的實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-12-12在IntelliJ IDEA中使用Docker的開發(fā)指南
這篇文章主要給大家介紹了在IntelliJ IDEA中使用Docker開發(fā)指南,文中通過圖文介紹的非常詳細(xì),對(duì)我們的使用Docker有一定的幫助,需要的朋友可以參考下2023-09-09Docker利用busybox創(chuàng)建基礎(chǔ)鏡像(base image)
今天小編就為大家分享一篇關(guān)于Docker利用busybox創(chuàng)建基礎(chǔ)鏡像(base image),小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-12-12淺析docker-compose部署mysql無法訪問的問題
Compose 是 Docker 容器進(jìn)行編排的工具,定義和運(yùn)行多容器的應(yīng)用,可以一條命令啟動(dòng)多個(gè)容器,使用Docker Compose不再需要使用shell腳本來啟動(dòng)容器。接下來通過本文給大家分享docker-compose部署mysql無法訪問的問題,需要的朋友參考下吧2018-10-10