这是我参与8月更文挑战的第11天,活动详情查看:8月更文挑战
Dockerfile
Docker 允许通过文本格式的配置文件来构建镜像,默认名称为 Dockerfile。因此在项目根目录新建文件 Dockerfile,写入:
# 从仓库拉取 带有 python 3.7 的 Linux 环境
FROM python:3.7.0
# 设置 python 环境变量
ENV PYTHONUNBUFFERED 1
# 创建 workspace 文件夹并将其设置为工作目录
RUN mkdir /workspace
WORKDIR /workspace
# 将当前文件夹中的文件和文件夹复制到容器的 workspace 目录
COPY . /workspace
# 安装库
RUN pip install -i https://mirrors.aliyun.com/pypi/simple/ -r requirments.txt
# 容器暴露的端口
EXPOSE 8080
#ENV DB_PASS="root"
# 运行Django项目命令
CMD ["python", "manage.py", "runserver", "0.0.0.0:8080"]
通过dockerfile构建镜像
docker build -t my_blog:v1 . (注意最后有一个点,表示本次执行的上下文路径)
启动容器
docker run -itd --name my_blog -p 8888:8080 357eab81f7c6
验证启动结果
docker-compose
在线上环境中,通常不会将项目的所有组件放到同一个容器中;更好的做法是把每个独立的功能装进单独的容器,这样方便复用。比如将 Django 代码放到容器A,将 Mysql 数据库放到容器B,以此类推。
因此同一个服务器上有可能会运行着多个容器,如果每次都靠一条条指令去启动,未免也太繁琐了。 docker-compose就是解决这个问题的,它用来编排多个容器,将启动容器的命令统一写到 docker-compose.yml 文件中,以后每次启动这一组容器时,只需要 docker-compose up就可以了。因此教程也会用 docker-compose 来管理容器。
首先确认 docker-compose 是否安装成功:
确认无误后,在项目根目录创建 docker-compose.yml 并写入:
version: "3"
services:
app:
restart: always
build: .
command: python manage.py runserver 127.0.0.1:8888 # bash start.sh
volumes:
- .:/workspace
ports:
- "8888:8888"
让我们来分解一下其中的各项含义。
version 代表 docker-compose.yml 的版本,目前最新版为 3,不需要改动它。 接着定义了一个名叫 app的容器。后面的内容都是 app
容器的相关配置:
restart:除正常工作外,容器会在任何时候重启,比如遭遇 bug、进程崩溃、docker 重启等情况。
build :指定一个包含 Dockerfile 的路径,并通过此 Dockerfile 来构建容器镜像。注意那个 "." ,代表当前目录。
command :容器运行时需要执行的命令。这里就是我们很熟悉的运行开发服务器了。
volumes :卷,这是个很重要的概念。前面说过容器是和宿主机完全隔离的,但是有些时候又需要将其连通;比如我们开发的 Django 项目代码常常会更新,并且更新时还依赖如 Git 之类的程序,在容器里操作就显得不太方便。所以就有卷,它定义了宿主机和容器之间的映射:"." 表示宿主机的当前目录,":" 为分隔符,"/code" 表示容器中的目录。即宿主机当前目录和容器的 /code 目录是连通的,宿主机当前目录的 Django 代码更新时,容器中的 /code 目录中的代码也相应的更新了。这有点儿像是在容器上打了一个洞,某种程度上也是实用性和隔离性的一种妥协。
严格意义上讲,这里用到的 .:/code并不是卷,而是叫挂载,它两是有区别的,只不过 docker-compose 允许将挂载写到卷的配置中。
ports :定义了宿主机和容器的端口映射。容器的隔离不止环境,甚至连端口都隔离起来了。但 web 应用不通过端口跟外界通信当然不行,因此这里定义将宿主机的 8888 端口映射到容器的 8888 端口,即访问宿主机的 8888 端口就是访问到了容器的 8888 端口,但要确保端口没有被其他程序占用。
停止服务器后实际上容器还存在,只是停止运行了而已。输入:
docker-compose down
就可以删除容器。
如果想在后台运行容器,则输入:
docker-compose up -d
另外,如果你需要重新构建镜像,则输入命令:
docker-compose build
启动和停止已有的容器:
docker-compose start
docker-compose stop