python部署docker
1. 如何運用docker配合python開發環境實例
由於開發一個Python程序時需要依賴大量的三方庫包,且python2和3本身就有互不兼容的地方,我們往往需要一個隔離的環境,來避免版本影響造成的bug。
傳統的做法大多數人可能會選擇virtualenv來隔離,但是它有很多明顯的缺點:
無法提供完全的隔離
如果不想在正式環境中使用,它就會造成差異
- # 參考命令
- sudo wget -qO- httpr.com/ | sh
- ├──fanxiangce
- _docker
- ├── Dockerfile
- ├── Readme.md
- └─fanxiangce
- └──app
- ├── manage.py
- └── requirements
- ├── common.txt
- ##########################################################
- # Dockerfile to run a flask-based web application# Based on an centos:7 image
- ##########################################################
- # Set the base image to use to centos
- FROM centos:7
- # Set the file maintainer
- MAINTAINER jasonwang,wjs7740@163.com
- # Set env varibles used in this Dockerfile (add a unique prefix, such as DOCKYARD)
- # Local directory with project source
- ENV DOCKYARD_SRC=fanxiangce
- # Directory in Container for all project files
- ENV DOCKYARD_SRCHOME=/opt
- # Directory in container for project source files
- ENV DOCKYARD_SRCPROJ=/opt/fanxiangce
- # Update the defualt application repository source list
- RUN yum -y install epel-release
- RUN yum -y install python-pip
- RUN yum clean all
- # Copy application source code to SRCDIR
- COPY $DOCKYARD_SRC $DOCKYARD_SRCPROJ
- # Create application subdirectories
- WORKDIR $DOCKYARD_SRCPROJ
- RUN mkdir log
- VOLUME ['$DOCKYARD_SRCPROJ/log/']
- # Install Python dependencies
- RUN pip install --upgrade pip
- RUN pip install -r $DOCKYARD_SRCPROJ/requirements/common.txt
- # Port to expose
- EXPOSE 8000
- # Copy entrypoint script into the image
- WORKDIR $DOCKYARD_SRCPROJ
- # 在Dockerfile同級目錄下
- sudo docker build -t jason/webdemo .
- # 查看當前容器
- sudo docker ps -a
- # 啟動容器
- docker start webdemo
- # 進入容器
- docker attach webdemo
而隨著容器技術的日漸成熟和普及,Docker無疑成為解決這個問題的最優解
本文將主要介紹docker和flask的配合開發
步驟:
1.安裝Docker(這里不詳細介紹)
2.應用目錄結構
3.編寫Dockerfile(詳細命令解釋可以參考hocker.com/engine/reference/builder/#environment-replacement)
4. build鏡像
成功後顯示Successfully,同時返回鏡像ID,如圖:
8.後續
如果容器關閉後需要再次進入,可以用如下命令
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
2. 寫python的至今沒搞懂的微服務是啥,請大佬們不吝賜教!
將模塊功能拆分成多個項目,獨立運行,分流數據壓力,宕機危險,但是每個項目之間又可以通信,比如用戶項目可以查詢訂單項目中的數據。大概就是這么意思,然後用docker把環境支起來大項目會用多個伺服器多個docker進行部署
3. 怎樣在Python中操作Docker容器
Docker容器運行後,如何進入容器進行操作呢?起初我是用SSH。如果只啟動一個容器,用SSH還能應付,只需要將容器的22埠映射到本機的一個埠即可。當我啟動了五個容器後,每個容器默認是沒有配置SSH Server的,安裝配置SSHD,映射容器SSH埠,實在是麻煩。 我發現很多Docker鏡像都是沒有安裝SSHD服務的,難道有其他方法進入Docker容器? 有很多種方法,包括使用 docker attach 命令或 nsenter 工具等。 使用 attach 命令有時候並不方便。當多個窗口同時 attach 到同一個容器的時候,所有窗口都會同步顯示。 nsenter 可以訪問另一個進程的名字空間。 為了連接到容器,你還需要找到容器的第一個進程的 PID,可以通過下面的命令獲取。 PID=$(docker inspect –format 「{{ .State.Pid }}」 <container>) //將<container>換成你的容器id 通過這個 PID,就可以連接到這個容器: $ nsenter –target $PID –mount –uts –ipc –net –pid 更簡單的,建議大家下載 .bashrc_docker,並將內容放到 .bashrc 中。
4. 如何在Python中使用ZeroMQ和Docker構建微服務架構
當想讓一個容器做兩件事情,或者使一個Docker鏡像包含來自兩個不同鏡像的依賴庫時,就需要知道每個鏡像的Dockerfile。本文介紹了如何通過docker history命令來對Docker鏡像進行反向工程,得到它們的Dockerfile,並組織到一個Dockerfile里然後build,從而實現想做的事情。
常言道,「不要重復發明輪子!」
在使用Docker時,構建自己的鏡像之前,最好在Docker Hub尋找一些可以直接使用的鏡像做練習。把軟體架構分布到一系列容器中,每一個容器只做一件事情,這樣的效果非常好。構建分布式應用的最好的基石是使用來自Docker Hub的官方鏡像,因為可以信任它們的質量。
在某些情況下,可能想讓一個容器做兩件不同的事情。而在另外一些情況下,可能想讓一個Docker鏡像包含來自兩個不同鏡像的依賴庫。如果有每個鏡像的Dockerfile,這是非常簡單的。將它們組織到一個Dockerfile里然後build就行。
然而,大多數時間都在使用Docker Hub上准備好的鏡像,不會有它們的源Dockerfile。我花時間找一個可以合並(或flatten)兩個不同Docker鏡像的工具,當然沒有它們的Dockerfile。也就是說在找一個能做下面這件事的東西:
image 1 --
\
---> merged_image_12
/
image 2 --
此前在GitHub上有兩個相關的討論(1、2),盡管它們都被關閉了。
這可能嗎?
那麼,是否存在工具能夠像這樣做嗎:docker merge image2 image2 merged_image?
沒有!
你甚至不可以用下面的方式來構建Dockerfile:
FROM image1
FROM image2
簡而言之,在一個Dockerfile里不能有多個基礎鏡像。
但是我需要這個功能!
唯一的解決辦法是取得這些鏡像的Dockerfile,然後把它們組織到一個文件中,再進行構建。那麼,我能在Docker Hub上獲得一個鏡像的Dockerfile嗎? 幸運的是可以。它不能離線獲取(譯註:原文是online,但顯然online時對於來自GitHub的自動構建鏡像是可以直接獲取的),但是你可以使用docker history命令,通過反向工程獲取。
怎麼來使用?
在你的機器上使用docker pull從Docker Hub下載鏡像。
docker pull image1
docker pull image2
然後使用docker history來取得構建這兩個容器時運行的命令。
docker history --no-trunc=true image > image1-dockerfile
docker history --no-trunc=true image2 > image2-dockerfile
接下來打開這兩個文件,你可以看到每個鏡像的命令堆棧。這是因為Docker鏡像通過層(閱讀更多)的方式來構建。即你在Dockerfile中鍵入的每一個命令所構建的新鏡像,都是在之前的命令產生的鏡像之上。所以你可以對鏡像進行逆向工程。
限制
不能對鏡像進行反向工程的唯一場景,是鏡像的維護者在他的Dockerfile中使用了ADD或COPY命令。你會看到這樣一行:
ADD file:1ac56373f7983caf22
或 ADD dir:cf6fe659e9d21535844
這是因為不知道維護者在他自己的機器上,包括鏡像里使用了什麼本地文件。
5. 如何在python腳本里調docker命令
在搭建開發環境時,我們都希望搭建過程能夠簡單,並且一勞永逸,其他的同事可以復用已經搭建好的開發環境以節省開發時間。而在搭建開發環境時,我們經常會被復雜的配置以及重復的下載安裝所困擾。在Docker技術未出現之前,我們可以使用Pupet、Chef、Ansible等配置管理工具把復雜的配置管理起來,這樣的管理配置技術仍然是目前比較流行的方式之一。配置管理工具使用的都是自己的DSL語法定義,考慮到環境的復雜性,配置一套通用的開發環境需要針對各個系統定製,對於大部分開發環境這種維護成本仍然是很高的。Docker技術出現之後,系統的依賴問題得到了徹底的解決,我們可以通過鏡像的方式簡化環境的安裝。結合Docker的開發部署工具Fig,我們可以使用fig.yml文件來定義所有的環境,一次定義,多處使用,簡單而且高效。
6. 如何製作 Python 的 Docker 鏡像
作基礎鏡像
選擇 Ubuntu 官方的 14.04 版本為我們依賴的系統鏡像。
FROM ubuntu:trusty
因所有官方鏡像均位於境外伺服器,為了確保所有示例能正常運行,可以使用與官方鏡像保持同步的 DaoCloud 境內鏡像:
dockerfile
FROM cloud.io/ubuntu:trusty
設置鏡像的維護者,相當於鏡像的作者或發行方。
MAINTAINER Captain Dao <support@cloud.io>
用 RUN 命令調用 apt-get 包管理器安裝 Python 環境所依賴的程序包。
安裝依賴包相對比較固定,因此該動作應該盡量提前,這樣做有助於提高鏡像層的復用率。
安裝完依賴後打掃衛生可以顯著的減少鏡像大小。
RUN apt-get update && \
apt-get install -y python \
python-dev \
python-pip && \
rm -rf /var/lib/apt/lists/*
7. 如何構建基於docker的開發環境
一、基本思路
1. 創建一個用於開發Django App的目錄
mkdir django-example && cd django-example
2. 構建基本開發環境
touch Dockerfile
touch pip.conf requirements.txt
pip.conf文件填入以下內容,以便一會用pip安裝Python 模塊時使用阿里雲鏡像加速:
[global]
index-url = http://mirrors.aliyun.com/pypi/simple/
[install]
trusted-host=mirrors.aliyun.com
requirements.txt文件中填入要安裝的Python 模塊:
django
編寫構建開發環境的Dockerfile文件,填入以下內容:
# MAINTAINER Gevin <flyhigher139@gmail.com>
# DOCKER-VERSION 1.12.0
#
# Dockerizing Python: Dockerfile for building python applications
FROM python:2.7.12
MAINTAINER Gevin <flyhigher139@gmail.com>
WORKDIR /usr/src/app
# 使用阿里雲的pip鏡像
COPY pip.conf /root/.pip/pip.conf
COPY requirements.txt /usr/src/app/requirements.txt
RUN pip install -r /usr/src/app/requirements.txt
EXPOSE 8000
CMD ["bash"]
然後執行下面命令構建鏡像:
docker build -t gevin/django-example:0.1 .
構建成功後,執行docker images命令,可以查看到當前構建好的image
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
gevin/django-example 0.1 1855fc3c8062 12 hours ago 698.9 MB
3. 使用構建的image拉起開發環境
執行下面命令,可以以前台形式拉起django-example鏡像的一個container:
docker run -it --rm -v $(pwd):/usr/src/app gevin/django-example:0.1
上面命令使用了data volume,把當前目錄掛載到container中的工作目錄下,這樣當前目錄下的所有文件都會映射到container的工作目錄下,在工作目錄下的所有改動,也都會保存到宿主機的當前目錄下。
4. 創建django項目
上一步的命令創建了一個安裝了django的互動式的container,直接在該container中執行創建django項目的命令即可:
root@7c91f460599f:/usr/src/app# django-admin startproject dj_example
上述命令,在container中基於django的命令創建了一個django項目,由於上一步操作時把宿主機的當前目錄掛載到container的工作目錄下,因此,剛剛在container中創建的django項目,在宿主機上也能看到。
container:
root@7c91f460599f:/usr/src/app# lsDockerfile dj_example pip.conf requirements.txt
宿主機:
django-example ls
Dockerfile dj_example pip.conf requirements.txt
5. 啟動django項目
docker run -it --rm -p 8000:8000 -v $(pwd):/usr/src/app gevin/django-example:0.1 python dj_example/manage.py runserver 0.0.0.0:8000
二、Docker-compose與Django環境的結合
每次使用上面章節中介紹的冗長命令來使用django環境非常麻煩,docker-compose可以簡化操作。
首先在當前目錄下創建docker-compose.yml文件:
➜ django-example touch docker-compose.yml
然後在該文件中寫入如下內容:
version: '2'
services:
django-example:
image: gevin/django-example:0.1
volumes:
- ./dj_example:/usr/src/app
ports:
- 8000:8000
command: python manage.py runserver 0.0.0.0:8000
執行下面命令即可拉起django服務:
➜ django-example docker-compose up# Starting djangoexample_django-example_1# Attaching to djangoexample_django-example_1
在瀏覽器中訪問http://localhost:8000,即可看到默認的django頁面
註:
上面的docker-compose文件,把./dj_example目錄掛載到/usr/src/app,免去執行django命令時,需要對應到下級目錄的麻煩,但這樣隱藏了原來container中的requirements.txt文件,需要注意。
基於docker-compose 執行django 命令
使用docker-compose 的 run命令,可以在容器內執行相應操作,如:
對django服務的資料庫做migrate操作:
docker-compose run django-example python manage.py migrate
創建超級用戶:
docker-compose run django-example python manage.py createsuperuser# Username (leave blank to use 'root'): gevin# Email address:# Password:# Password (again):# Superuser created successfully.
創建成功後,訪問http://localhost:8000/admin,即可使用剛創建的用戶(即gevin),登錄資料庫管理頁面
由於使用了數據卷,保存在sqlite資料庫中的數據會一直有效。
三、簡化方案
上面方案已經成功構建了django 環境,並應用於開發。上面的方案主要是為了闡述實現思路,在實際操作起來至少有兩個麻煩:(1)需要進入容器裡面創建django項目;(2)由於django項目是建立在當前目錄的子目錄下,使用docker-compose 時為了命令簡單通用,更換了數據卷。
在實踐中,利用docker-compose的run命令,沒必要進入容器創建django項目;只要把django項目建立在當前目錄下,也沒必要更換數據卷了。
因此,可以把上面的方案再理一下,按下面步驟構建開發環境,並應用到開發中去。
Outline:
創建Dockerfile文件
構建鏡像
創建docker-compose文件
創建項目
拉起項目
- # MAINTAINER Gevin <flyhigher139@gmail.com>
- # DOCKER-VERSION 1.12.0
- #
- # Dockerizing Python: Dockerfile for building python applications
- FROM python:2.7.12
- MAINTAINER Gevin <flyhigher139@gmail.com>
- WORKDIR /usr/src/app
- # 使用阿里雲的pip鏡像
- COPY pip.conf /root/.pip/pip.conf
- COPY requirements.txt /usr/src/app/requirements.txt
- RUN pip install -r /usr/src/app/requirements.txt
- EXPOSE 8000
- CMD ["bash"]
- docker build -t gevin/django-example:0.1 .
- version: '2'
- services:
- django-example:
- image: gevin/django-example:0.1
- volumes:
- - .:/usr/src/app
- ports:
- - 8000:8000
- command: python manage.py runserver 0.0.0.0:8000
- docker-compose run django-example django-admin startproject dj_project .
- docker-compose run django-example python manage.py migrate
- docker-compose run django-example python manage.py createsuperuser
- docker-compose up
- 作者:Gevin
- 鏈接:http://www.jianshu.com/p/29c422ae7c58
- 來源:簡書
- 著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請註明出處。
1. 創建Dockerfile文件
對Python開發環境而言,最好再創建pip.conf和requirements.txt文件,以便方便安裝項目必須的Python依賴,其他語言的開發環境就具體情況而定。
以Python為例,Dockerfile 內容如下:
2. 構建鏡像
3. 創建docker-compose文件
docker-compose文件內容如下:
4. 創建項目
果然需要migrate資料庫,創建超級用戶等,可以在這里一並創建,也可以在後面的開發中再創建:
5. 拉起項目
四、其他
Gevin認為,雖然基於docker可以構建開發環境,但還是vagrant用起來更舒服,docker更加適合做CI,測試和部署。
實際工作中如何使用docker,就仁者見仁,智者見智了。
8. 如何在docker上運行python工程
Docker容器運行後,如何進入容器進行操作呢?起初我是用SSH。如果只啟動一個容器,用SSH還能應付,只需要將容器的22埠映射到本機的一個埠即可。當我啟動了五個容器後,每個容器默認是沒有配置SSH Server的,安裝配置SSHD,映射容器SSH埠,...
9. 如何配置docker 部署到python
安裝Docker 藉助apt-get命令,安裝Docker是件輕而易舉的事。 $ sudo apt-get install docker.io 為了允許非根用戶也可以運行Docker,將你自己添加到docker群組。下面這個命令會允許當前用戶運行Docker,無需根用戶許可權。