我认为现在回答您的问题为时已晚,但是,这可能对其他伸出援手的人有益。
你提到的教程对于初学者来说有点棘手,所以我稍微改变了结构。我假设您有一个 docker 注册表帐户(如 Dockerhub),用于将图像发布到。如果您想访问远程主机上的图像,这是必需的(您可以复制实际的图像文件,但不推荐)。
创建项目
假设您要使用 Django 创建一个网站并将其 dockerize,首先,您这样做:
django-admin startproject samplesite
它会创建一个目录samplesite,其中包括以下内容(我添加了 requirements.txt):
db.sqlite3 manage.py requirements.txt samplesite
添加 Dockerfile 和 docker-compose.yml
如您所见,Dockerfile 与 Dockerfile 相比没有任何变化。
FROM python:3
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt
COPY . /code/
但是对于docker-compose.yml:
version: '3'
services:
db:
image: postgres
web:
build: .
image: yourUserNameOnDockerHub/mywebsite:0.1 # this line is added
command: python manage.py runserver 0.0.0.0:8000
#volumes:
# - .:/code
ports:
- "8000:8000"
depends_on:
- db
docker-compose.yml 也与教程中提到的几乎相同,只是注释了卷并添加了一行image: mywebsite:0.1。该行允许我们跟踪构建的映像并在需要时部署它。卷挂载与您编写的代码无关,被放在那里是为了取出被 Django 更改的动态内容(sqlite、上传的文件等)。
构建并运行
如果您第一次运行docker-compose up 一切正常,但是,由于添加了新行,当您在第一次之后更改代码时,更改不会反映在运行的容器中。这是因为在每个docker-compose up 上,compose 都会查找mywebsite:0.1(已经存在)并且不会构建新图像并基于旧图像创建容器。由于我们需要该图像名称和标签来发布/部署我们的图像,我们需要改为使用:
docker-compose up --build
它将重新构建反映更改的图像。每次进行一些更改,运行它并创建一个可以看到的新图像(请注意,虽然名称和标签保持不变,但图像 id 的更改表明这是一个新图像):
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
yourUserNameOnDockerHub/mywebsite 0.1 033c9d2bfac0 7 seconds ago 974MB
发布和部署
如果您在 Dockerhub(或任何其他注册表)上设置了一个帐户,您可以发布该映像以供以后使用或部署在远程服务器上:
docker push yourUserNameOnDockerHub/mywebsite:01
如果你想在远程主机上部署它并想再次使用 docker-compose,只需将 docker-compose.yml 更改为:
version: '3'
services:
db:
image: postgres
web:
image: yourUserNameOnDockerHub/mywebsite:0.1
command: python manage.py runserver 0.0.0.0:8000
#volumes:
# - .:/code
ports:
- "8000:8000"
depends_on:
- db
请注意,build: . 行已被删除(因为我们将只运行它)。在本地开发时,每当您运行docker-compose up --build 时,都会创建并标记一个新图像,并且基于该图像的容器将在撰写堆栈中运行。如果您认为自己对更改感到满意,请按照发布步骤使其在服务器上生效。