亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

一文教會(huì)你用Docker打包Python運(yùn)行環(huán)境

 更新時(shí)間:2022年05月14日 08:26:34   作者:orion-orion  
Docker提供了容器級(jí)別的資源隔離,由于Python的外部依賴管理中存在的問題,我們通常會(huì)使用virtualenv來對(duì)不同的項(xiàng)目創(chuàng)建其唯一的依賴環(huán)境,下面這篇文章主要給大家介紹了如何通過一篇文章教會(huì)你用Docker打包Python運(yùn)行環(huán)境的相關(guān)資料,需要的朋友可以參考下

前言

雖然Docker作為部署環(huán)境打包鏡像的工具,和我的科研并沒有直接的關(guān)系。但我覺得在項(xiàng)目中運(yùn)用Docker來打包環(huán)境依賴也可以大大提高工作效率,于是準(zhǔn)備專門學(xué)習(xí)一下Docker。

1. Docker基礎(chǔ)

1.1 Docker架構(gòu)

Docker使用客戶端服務(wù)器架構(gòu)。Docker客戶端與Docker守護(hù)進(jìn)程會(huì)話,后者復(fù)雜構(gòu)建、運(yùn)行和分發(fā)Docker容器的繁重工作。Docker客戶端和守護(hù)程序可以在同一系統(tǒng)運(yùn)行,也可以將Docker客戶端連接到遠(yuǎn)程Docker守護(hù)進(jìn)程。Docker客戶端和守護(hù)程序通過REST API(采用一種簡(jiǎn)潔的URL風(fēng)格規(guī)范)通信,其底層基于UNIX套接字或網(wǎng)絡(luò)接口。其架構(gòu)示意圖如下:

其中,Docker 守護(hù)程序 (dockerd) 監(jiān)聽Docker API 請(qǐng)求并管理Docker對(duì)象,例如鏡像、容器、網(wǎng)絡(luò)和磁盤分卷。守護(hù)進(jìn)程還可以與其他守護(hù)進(jìn)程通信以管理Docker服務(wù)。而Docker 客戶端 ( docker) 是用戶與 Docker 交互的主要方式。當(dāng)我們使用諸如docker run之類的命令時(shí),客戶端會(huì)將這些命令發(fā)送到dockerd執(zhí)行它們。docker命令使用 Docker API。Docker 客戶端可以與多個(gè)守護(hù)進(jìn)程通信。

Docker注冊(cè)表存儲(chǔ)Docker鏡像(你可以類比為Maven的repo)。Docker Hub 是一個(gè)任何人都可以使用的公共注冊(cè)表,并且 Docker 默認(rèn)配置為在Docker Hub上查找鏡像。我們也可以運(yùn)行自己的私有注冊(cè)表。我們可以調(diào)用docker pull從注冊(cè)表中拉取鏡像。當(dāng)我們docker run命令時(shí),系統(tǒng)會(huì)從先從本地尋找鏡像,如果本地找不到,則會(huì)從Docker Hub拉取。當(dāng)我們使用docker push命令時(shí),鏡像會(huì)被推送到我們配置的注冊(cè)表中。可以看出,Docker鏡像版本控制和Git類似。

1.2 Docker對(duì)象

當(dāng)我們?cè)谑褂肈ocker時(shí),我們就正在創(chuàng)建和使用鏡像、容器、網(wǎng)絡(luò)、磁盤分卷、插件和其他對(duì)象了。下面簡(jiǎn)要介紹一下其中的鏡像和容器對(duì)象。

  • 鏡像 鏡像可視為一個(gè)只讀模板,其中包含創(chuàng)建 Docker 容器的指令。通常,一個(gè)鏡像基于另一個(gè)鏡像,并帶有一些額外的自定義。例如可以基于現(xiàn)有的ubuntu鏡像,來構(gòu)建安裝有其它應(yīng)用程序的鏡像。要構(gòu)建我們自己的鏡像,需要使用簡(jiǎn)單的語法創(chuàng)建一個(gè)Dockerfile ,用于定義創(chuàng)建和運(yùn)行鏡像所需的步驟。

  • 容器容器是鏡像的可運(yùn)行實(shí)例(類似于進(jìn)程和程序的關(guān)系)。我們可以使用 Docker API 或 CLI 創(chuàng)建、啟動(dòng)、停止、移動(dòng)或刪除容器。我們可以將容器連接到一個(gè)或多個(gè)網(wǎng)絡(luò)。

2. 啟動(dòng)Docker進(jìn)程并運(yùn)行鏡像

2.1 啟動(dòng)Docker守護(hù)進(jìn)程

Linux

Linux上的docker同時(shí)包括客戶端和守護(hù)進(jìn)程兩部分,故安裝好docker后,只需要用以下命令即可運(yùn)行docker守護(hù)進(jìn)程:

$ sudo service docker start # Ubuntu/Debian

如果您是RedHat/Centos,則需要運(yùn)行:

$ sudo systemctl start docker

MacOS

然而,在Mac上docker二進(jìn)制僅僅是client部分(因?yàn)閐ocker守護(hù)進(jìn)程使用了一些Linux內(nèi)核的特點(diǎn)),我們不能使用它來運(yùn)行docker守護(hù)進(jìn)程。所以,我們還需要安裝docker-machine來創(chuàng)建一個(gè)虛擬機(jī)并將守護(hù)進(jìn)程運(yùn)行在上面。如果你的Mac上已經(jīng)有brew,可以直接運(yùn)行以下命令安裝:

brew install docker-machine

然后啟動(dòng)docker-machine:

(base) orion-orion@MacBook-Pro ~ % brew services start docker-machine
==> Successfully started `docker-machine` (label: homebrew.mxcl.docker-machine)

2.2 運(yùn)行鏡像

之后我們就可以嘗試運(yùn)行Docker鏡像了。比如我們下面用docker run命令運(yùn)行docker/getting-started鏡像:

(base) orion-orion@MacBook-Pro ~ % docker run -d -p 80:80 docker/getting-started 
Unable to find image 'docker/getting-started:latest' locally
latest: Pulling from docker/getting-started
9981e73032c8: Pull complete 
e5f90f35b4bc: Pull complete 
ab1af07f990a: Pull complete 
bd5777bb8f79: Pull complete 
a47abff02990: Pull complete 
d4b8ebd00804: Pull complete 
6bec3724f233: Pull complete 
b95ca5a62dfb: Pull complete 
Digest: sha256:b558be874169471bd4e65bd6eac8c303b271a7ee8553ba47481b73b2bf597aae
Status: Downloaded newer image for docker/getting-started:latest
cc167092ff76941a25fe51da25fbbfe6a0a70cc07171fa5f56707f3bf7383e6a

可以看到由于沒有在本地找到docker/getting-started:latest鏡像,Docker從遠(yuǎn)處Docker Hub注冊(cè)表上pull下來。

我們用docker ps查看目前在運(yùn)行的鏡像實(shí)例(即容器):

(base) orion-orion@MacBook-Pro ~ % docker ps       
CONTAINER ID   IMAGE                    COMMAND                  CREATED          STATUS          PORTS                NAMES
cc167092ff76   docker/getting-started   "/docker-entrypoint.…"   29 minutes ago   Up 29 minutes   0.0.0.0:80->80/tcp   epic_lehmann

可以用docker stop終止鏡像運(yùn)行:

(base) orion-orion@MacBook-Pro ~ % docker stop cc167092ff76
cc167092ff76
(base) orion-orion@MacBook-Pro ~ % docker ps   
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

docker images查看有哪些本地鏡像:

(base) orion-orion@MacBook-Pro ~ % docker images                                 
REPOSITORY               TAG       IMAGE ID       CREATED       SIZE
docker/getting-started   latest    157095baba98   4 weeks ago   27.4MB

3. 用Docker打包Python環(huán)境

接下來我們看如何用Docker打包一個(gè)Python環(huán)境。
首先,我們編寫一個(gè)Python小Demo:

import numpy as np
import matplotlib.pyplot as plt
x = np.arange(-10, 10, 0.01)
y = x**2
plt.plot(x, y)
plt.savefig("/out/quad.png") 
# 此處的/out為容器內(nèi)的絕對(duì)路徑,無需手動(dòng)創(chuàng)建,
# 后面我們會(huì)設(shè)置掛載參數(shù)自動(dòng)生成該目錄

然后我們編輯好requirements.txt

numpy==1.21.3
matplotlib==3.4.3  

再編輯好Dockerfile:

# syntax=docker/dockerfile:1

FROM python:3.9-slim-buster

WORKDIR /draw_quad

COPY requirements.txt requirements.txt
RUN pip3 install -r requirements.txt 

COPY . .

CMD [ "python3", "draw_quad.py"]

我們來細(xì)細(xì)看Dockerfile每一部分。

首先,# syntax是指解析器指令。這里使用docker/dockerfile:1,即始終指向版本1語法的最新版本。

之后,我們需要告訴Docker我們?cè)趹?yīng)用中使用什么基礎(chǔ)鏡像。由于Docker鏡像可以從其它鏡像繼承,因此我們并不構(gòu)建自己的基礎(chǔ)鏡像,而是使用官方的Python鏡像,即FROM python:3.9-slim-buster。

然后我們建立一個(gè)工作目錄/draw_quad,即后續(xù)命令的默認(rèn)執(zhí)行路徑。這樣我們后面就不必輸入完整的文件路徑,而是可以使用基于工作目錄的相對(duì)路徑。如COPY requirements.txt requirements.txt其實(shí)是將requirements(第一個(gè)參數(shù))復(fù)制到到工作目錄中(第二個(gè)參數(shù))。

接著,我們將requirements.txt 放入鏡像后,就可以使用RUN命令來執(zhí)行pip3 install了,這和我們?cè)诒镜匕惭b的經(jīng)驗(yàn)完全相同,不過這次是將模塊安裝到鏡像中。

此時(shí),我們有了一個(gè)基于Python 3.9的鏡像,并且已經(jīng)按照了我們的依賴項(xiàng)。下一步我們繼續(xù)用COPY命令將源代碼添加到鏡像中,即DockerFile中的COPY . .。

之后,我們還需要Docker當(dāng)我們的鏡像在容器中運(yùn)行時(shí)我們想要執(zhí)行什么命令,即CMD [ "python3", "draw_quad.py"]。

最終的項(xiàng)目目錄如下:

draw
|____ draw_quad.py
|____ requirements.txt
|____ Dockerfile

然后我們就可以構(gòu)建docker鏡像了(用--tag參數(shù)指定鏡像名稱):

(base) orion-orion@MacBook-Pro draw % docker build --tag draw .                 
[+] Building 9.1s (14/14) FINISHED                                                                                             
 => [internal] load build definition from Dockerfile                                                                      0.0s
 => => transferring dockerfile: 37B                                                                                       0.0s
 => [internal] load .dockerignore                                                                                         0.0s
 => => transferring context: 2B                                                                                           0.0s
 => resolve image config for docker.io/docker/dockerfile:1                                                                4.9s
 => CACHED docker-image://docker.io/docker/dockerfile:1@sha256:443aab4ca21183e069e7d8b2dc68006594f40bddf1b15bbd83f5137bd  0.0s
 => [internal] load build definition from Dockerfile                                                                      0.0s
 => [internal] load .dockerignore                                                                                         0.0s
 => [internal] load metadata for docker.io/library/python:3.9-slim-buster                                                 3.9s
 => [1/5] FROM docker.io/library/python:3.9-slim-buster@sha256:830e161433edfe047a23ebc99c12ee0eb1dc0a50e6b5f1c98e869ac27  0.0s
 => [internal] load build context                                                                                         0.0s
 => => transferring context: 594B                                                                                         0.0s
 => CACHED [2/5] WORKDIR /draw_quad                                                                                       0.0s
 => CACHED [3/5] COPY requirements.txt requirements.txt                                                                   0.0s
 => CACHED [4/5] RUN pip3 install -r requirements.txt                                                                     0.0s
 => [5/5] COPY . .                                                                                                        0.0s
 => exporting to image                                                                                                    0.0s
 => => exporting layers                                                                                                   0.0s
 => => writing image sha256:18f3a254f4ce46faa17142ece6bfd442e9157e79510ca60a789ab4d4b1a12498                              0.0s
 => => naming to docker.io/library/draw                                        0.0s

我們輸入docker images命令可以看到名稱為draw的鏡像已經(jīng)構(gòu)建成功。

(base) orion-orion@MacBook-Pro Draw % docker images
REPOSITORY               TAG       IMAGE ID       CREATED          SIZE
draw                     latest    f1fc30becc34   46 seconds ago   251MB

然后就可以運(yùn)行鏡像了(包含文件系統(tǒng)掛載操作):

(base) orion-orion@MacBook-Pro draw % docker run -d -v ${PWD}/out:/out draw
0e04d81d254fcd963924ee2492b82a6c895789525f09943b43ce0b46ac0d63a9

注意,${PWD}/out為宿主機(jī)的目錄,意思為當(dāng)前目錄下的out文件夾,如果不存在則會(huì)自動(dòng)為我們創(chuàng)建。/out為該容器中的絕對(duì)路徑,在容器啟動(dòng)會(huì)自動(dòng)創(chuàng)建/out目錄。

我們可以看到,quad.png成功在宿主機(jī)當(dāng)前目錄下的out文件中生成:

(base) orion-orion@MacBook-Pro draw % ls out           
quad.png

參考

總結(jié)

到此這篇關(guān)于用Docker打包Python運(yùn)行環(huán)境的文章就介紹到這了,更多相關(guān)Docker打包Python環(huán)境內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解如何將docker快速升級(jí)到最新版本

    詳解如何將docker快速升級(jí)到最新版本

    最近在對(duì)區(qū)塊鏈瀏覽器調(diào)優(yōu),該區(qū)塊鏈瀏覽器就是使用docker部署的微服務(wù),在一臺(tái)新的服務(wù)器上啟動(dòng)時(shí)報(bào)錯(cuò),發(fā)現(xiàn)是docker版本過低,所以本文給大家介紹了將docker快速升級(jí)到最新版本的方法,需要的朋友可以參考下
    2024-02-02
  • docker?swarm快速部署redis分布式集群的詳細(xì)過程

    docker?swarm快速部署redis分布式集群的詳細(xì)過程

    這篇文章主要介紹了docker?swarm快速部署redis分布式集群,只需要通過docker-compose.yml文件和一個(gè)啟動(dòng)命令就完成redis分布式部署的方式,讓其分別部署在不同機(jī)器上,并實(shí)現(xiàn)集群搭建,需要的朋友可以參考下
    2022-10-10
  • Docker搭建并啟動(dòng)Logstash的實(shí)現(xiàn)方式

    Docker搭建并啟動(dòng)Logstash的實(shí)現(xiàn)方式

    這篇文章主要介紹了Docker搭建并啟動(dòng)Logstash的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • 如何使用docker配置wordpress

    如何使用docker配置wordpress

    本文詳細(xì)介紹了如何使用Docker安裝并配置WordPress,包括配置Yum源下載Docker,檢查安裝成功,并設(shè)置開機(jī)啟動(dòng),還涉及了如何配置MySQL密碼,以及設(shè)置php.ini來增加WordPress的文件上傳大小限制,最后,通過訪問指定IP完成WordPress的配置
    2024-10-10
  • 利用Docker搭建Laravel開發(fā)環(huán)境的完整步驟

    利用Docker搭建Laravel開發(fā)環(huán)境的完整步驟

    這篇文章主要給大家介紹了關(guān)于如何利用Docker搭建Laravel開發(fā)環(huán)境的完整步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Laravel具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Docker 查看鏡像信息的方法

    Docker 查看鏡像信息的方法

    這篇文章主要介紹了Docker 查看鏡像信息的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Docker實(shí)現(xiàn)雙容器部署的方法步驟

    Docker實(shí)現(xiàn)雙容器部署的方法步驟

    本文介紹了Docker和DockerCompose實(shí)現(xiàn)雙容器部署,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-12-12
  • 詳解Docker Compose 中可用的環(huán)境變量問題

    詳解Docker Compose 中可用的環(huán)境變量問題

    Compose 的多個(gè)部分在某種情況下處理環(huán)境變量。這篇文章主要介紹了Docker Compose 中可用的環(huán)境變量問題,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12
  • Docker實(shí)踐之搭建wordpress的方法

    Docker實(shí)踐之搭建wordpress的方法

    這篇文章主要介紹了Docker實(shí)踐之搭建wordpress的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-12-12
  • docker如何給已存在的容器添加或修改端口映射

    docker如何給已存在的容器添加或修改端口映射

    這篇文章主要介紹了docker如何給已存在的容器添加或修改端口映射問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02

最新評(píng)論