我的团队一直在运行 VirtualBox 的 Ubuntu 16.04 服务器上开发我们的项目。随着新开发人员加入我们的项目,每次帮助他们在 VirtualBox 上创建新的 Ubuntu 服务器并安装所有依赖项以启动项目对我们来说是一个很大的麻烦。
我们决定用 Docker 来解决这个麻烦。因此,我尝试使用下面的方法在 Docker 上的 Ubuntu 上运行我们的项目Dockerfile
,docker-compose.yml
但我找不到很多资源,例如how to run Ubuntu on Docker
。使用下面的方法在 Docker 上运行 Ubuntu 是否正确?
ifconfig
让我感到困惑的一件事是为什么我在运行 Docker 的 Ubuntu 服务器上运行时无法获取 IP 地址?
Dockerfile
FROM ubuntu:16.04
RUN sudo apt-get update
RUN sudo apt-get install -y build-essential autoconf libtool
RUN sudo apt-get install -y python-setuptools python-dev python3-dev
RUN sudo apt-get install -y python-pip python3-pip
RUN sudo apt-get install -y python-virtualenv unixodbc-dev libffi-dev git
...
docker-compose.yml
version: '3'
services:
ubuntu:
build:
context: .
dockerfile: ./Dockerfile
ports:
- "8000:8000"
container_name: dev_ubuntu
...
答案1
第一个错误是认为 Docker 镜像/容器类似于虚拟机。它们有相似之处,但并不完全相同,坦率地说,并不是很相似。
实际上,Docker 并不是用来运行操作系统的。它用于在封闭(隔离)环境中运行单个进程。容器使用与主机相同的内核。
当您创建 Docker 镜像时,FROM ubuntu
您将使用一些预先创建的层来启动镜像,这些层会引入您可以在 Ubuntu 服务器上找到的标准文件系统和包的某些部分。
然后添加您自己的附加层,添加运行程序/进程所需的二进制文件和文件。
图像会(通常但不是强制性的)有一个CMD
命令或ENTRYPOINT
运行某些东西的命令。
每一行Dockerfile
都是一个命令,指示 Docker 如何创建镜像。每行/命令都会产生一个新层。要安装软件包,您可能需要执行以下操作:
FROM ubuntu:16.04
RUN apt-get -qq update && \
apt-get -y install build-essential autoconf libtool && \
apt-get install -y python-setuptools python-dev python3-dev && \
apt-get install -y python-pip python3-pip && \
apt-get install -y python-virtualenv unixodbc-dev libffi-dev git && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
这会让你的图像变得更小。
然后您将需要实际运行一些操作......
CMD python
然后你就可以构建你的图像了:
docker build -t myimage .
并使用它...
docker run --rm -it myimage
ifconfig
不起作用,因为二进制文件不在镜像中。这实际上没有必要,因为您无法从容器内部管理网络。
因此,您似乎正在制作一个容器来构建一些代码。运行容器时,您需要将包含代码的目录挂载到容器内。我不知道您在工作站或服务器上运行的是什么操作系统,因此我将参考此帖子获取更多信息:https://stackoverflow.com/questions/41485217/mount-current-directory-as-a-volume-in-docker-on-windows-10/41489151#41489151
假设您正在使用命令进行构建make
,您可以执行以下操作:
docker run --rm -it -v $(pwd):/usr/src/project myimage make
这将需要一行来Dockerfile
创建工作目录/usr/src/project
:
WORKDIR /usr/src/project
如果您运行docker
上述命令行,将会发生什么情况?它将从名为myimage
(前面显示的 build 命令)的映像创建一个容器,将当前所在的目录挂载为/usr/src/project
新容器内。make
在容器内运行该命令,然后退出。该--rm
参数告诉 Docker 在运行完成后不要保留容器。-it
参数的意思是interactive
和tty
。
如果你只是想要访问某个 shell,以便可以以make
临时方式手动运行或其他命令,你也可以这样做:
docker run --rm -it -v $(pwd):/usr/src/project myimage /bin/bash
这将从图像创建容器myimage
并运行bash
。由于bash
不退出并且您有参数-it
,因此您将在容器的提示符下执行任何您想做的事情。
请记住,您在容器内修改的任何文件都不会被保留,下次启动时将恢复为默认状态。当然,目录中的任何文件都/usr/src/project
将在您的本地硬盘上进行修改,因为这是从该硬盘安装的。