赞
踩
virtualenv 创建的虚拟环境只是隔离了 Python 运行虚拟环境,允许不同的项目可以通过不同版本的程序包来运行,解决包依赖的问题。而 docker 的每个容器都是独立的,可以看做一个个小的 Linux 系统,每个容器之间由 docker 分配有独立的ip地址,并且容器之间相互隔离的更加彻底。
容器是镜像创建运行的实例,镜像是一个文件,容器是镜像的一个进程。可以将两者的关系看作是 python 的类和实例化对象
docker pull
docker run
docker exec -it
宿主机指的就是安装 docker 的系统(比如我们的电脑),有自己独立的 IP 和系统。容器有 docker 分配的ip地址。两者通过 docker ccp
来进行通信
我使用的是 docker 的桌面版,可以看做是可视化软件。以下是网址。按照自己的电脑来进行下载。
Download Docker Desktop | Docker
我以 Mac 电脑、docker desktop v4.11.0为例,下载完成以后可以看到以下画面
我们默认下载东西的网址比较慢,可以通过换国内的网址源来达到加速的效果。
{
"debug": true,
"experimental": false,
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com"
]
}
docker info
,最底部可以看到以下信息,就表示切换成功 Registry Mirrors:
https://docker.mirrors.ustc.edu.cn/
https://hub-mirror.c.163.com/
在需要部署的 django 目录下,新建一个Dockerfile
文件。这个文件的作用相当于把多个需要执行的命令放在一个文件中,当创建镜像的时候 docker 会在当前目录自动寻找Dockerfile
文件,再挨个执行里面的命令
# 从 docker 中拉取Python镜像的版本 FROM python:3.7 #镜像作者 MAINTAINER Songzi #设置虚拟环境变量 ENV PYTHONUNBUFFERED 1 # 将 pip 源设置为国内的源 COPY pip.conf /root/.pip/pip.conf # 在容器的指定目录下面创建项目的文件夹 RUN mkdir -p /Code/BookPro #设置容器的工作目录(也就是当前的 django 的位置) WORKDIR /Code/BookPro #使用 pip 安装依赖 RUN pip install -r requirements.txt
RUN mkdir -p /Code/BookPro
和WORKDIR /Code/BookPro
都是在容器,也就是 docker 中创建的。前者是创建一个文件夹来放我们的项目,后者是指定项目的主目录。[global]
#国内源网址
index-url = https://mirrors.aliyun.com/pypi/simple/
[install]
#信任该域名,防止出现报错
trusted-host=mirrors.aliyun.com
目前我们的项目结构是这样的:
编写好Dockerfile
以后,我们就可以开始创建镜像了。
# 进入django 目录
cd BookPro
sudo docker build -t book_img:v1 .
sudo
:提权,防止因为权限不够而报错docker build
:创建镜像-t book_img:v1
:设置镜像的名称为 book_img,版本为 v1.
表示在当前目录下寻找Dockerfile
文件当我们输入以后,docker 会在当前目录下面自动寻找Dockerfile
,并且依此的执行里面的命令。
(如果有遇到报错failed to solve with frontend dockerfile.v0: failed to create LLB definition: unexpected status code [manifests 3.7]: 403 Forbidden
,则表示没有Python 的镜像,我们可以通过 docker pull先拉取 Python3.7 以后再进行镜像的创建。)
docker images
查看当前有哪些镜像。
sudo docker run -it -d --name book_pro -p 8000:8000 -v /Users/songzi/Code/BookPro:/Code/BookPro book_img:v1
docker start book_pro
来启动容器)/Users/songzi/Code/BookPro
目录下的所有内容映射到容器的/Code/BookPro
中。实现了文件共享docker ps
或者 docker ps -a
命令行来查看,两者的区别在于-a会将停止的容器也会显示出来CONTAINER ID:容器 id
IMAGE:镜像来源
COMMAND:备注
CREATED:创建时间
STATUS:容器状态
PORTS:映射端口关系
NAMES:容器名称
通过 docker desktop 查看:
到目前为止基本步骤都已经完成,我们只需要进入容器,然后就可以像操作正常终端一样启动容器即可。
docker exec -it book_pro /bin/bash
我们可以看到进入容器以后显示的目录为/Code/BookPro
,也就是我们创建镜像时设置的目录。我们再通过ls
查看目录,发现我们的 django 项目都在里面了。
然后我们就可以通过python manage.py runserver 0.0.0.0:8000
来启动这个 django 项目了
此时我们在浏览器中输入 127.0.0.1:8000,就可以查看到当前项目啦!
(同时,因为我们采用的是文件路径映射的方式,所以当我们在本地修改 django 目录时,docker 中的容器也会自动同步哦。解决了 docker 容器和本地代码不同步的问题,实现了文件共享。)
是不是还不明白其中的原理,让我来一一解释:
一、怎么在宿主机和容器中实现文件共享?
RUN mkdir -p /Code/BookPro
创建一个/Code/BookPro
文件夹-v /Users/songzi/Code/BookPro:/Code/BookPro
的命令会从我们本地宿主机中拉取文件过来二、为什么输入 127.0.0.1:8000 可以访问到容器的项目:
-p 8000:8000
。当我们访问宿主机本地的 IP127.0.0.1:8000
时,我们会监测到 8000
端口。将其转到我们 docker 容器的 8000
中。所以访问的实际是我们 docker 中的链接 0.0.0.0
就是为了最大的兼容宿主机的 IP 地址。# 查看所有镜像
docker images
# 删除镜像 -f 强制删除
docker rmi [-f] image[,image...]
# 查看启动容器 docker ps # 查看所有容器 docker ps -a # 启动容器 docker start 容器名称 # 停止容器 docker stop 容器名称 # 删除容器 docker rm 容器名称 # 查看容器 IP sudo docker inspect book_pro | grep "IPAddress"
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。