Docker可以让你在一个类似于虚拟机的环境里运行特定的程序,它不仅能够真实的模拟生产环境,有比较好的隔离效果,其速度也会比虚拟机快很多。但是安装Docker这个软件本身还是比较麻烦的。https://docker-curriculum.com/提供了一个比较好的教程,但是我在按照教程安装的时候,发现软件卡在了配置界面。

在安装的最后一步,有两个选项:使用推荐的默认配置还是自定义配置。默认配置需要我输入密码来进行一些更高权限的操作,但是输入完密码之后,显示HTTP 500: Internal Server Error。查了半天,也问了大模型,但是都没能解决问题,我自己推测是跟苹果电脑的一些安全特性有关——我前几天刚升级到最新版本的Tahoe,可能还不被支持。这怎么办?我就试了一下自定义配置,把那些需要提权的操作全都取消勾选,然后就成功的安装了。

这样做很显然是有后患的,因为有一些功能会因为权限问题而无法使用。但是好歹把软件装上了。

基本操作

安装了docker桌面版之后,我发现docker这个程序本身并没有进我的环境变量里。所以我运行了下面的命令(仅适用于MacOS):

export PATH="$PATH:/Applications/Docker.app/Contents/Resources/bin"
source ~/.zshrc

然后就可以正常在命令行使用docker了。

docker run hello-world

这行代码可以直接从docker官网上下载hello-world环境的镜像,然后在本地的容器中运行。

如果只下载,不运行,可以使用pull命令:

docker pull busybox

然后查看自己所有下载好的镜像:

docker images

运行某个镜像并且执行命令:第二行需要特别说明的是-it参数指的是interactive,这样可以在镜像的命令行里连续输入命令。

docker run busybox echo "hello from busybox"
docker run -it busybox sh

还有一个值得注意的点。每运行完一个镜像,其结果都会保存到本地,不会被删除。可以查看自己产生的文件,第二行是删除某一个运行后的镜像副本,第三行是删除所有运行完毕的镜像。

docker ps -a
docker rm 175e643f257e
docker container prune

同时,在docker run后面加--rm就可以在运行结束之后自动删除对应的记录。

运行基本Web应用。

-d参数:detach,关掉控制台,网站也会继续运行。

-P参数:分配随机端口。

docker run -d -P --name static-site prakhar1989/static-site

接下来我们获取网站的端口,这样就可以在本地访问了:

docker port static-site

同时,如果不想随机分配端口,就可以直接规定要使用的端口。

docker run -p 8888:80 prakhar1989/static-site

其中,80是容器里的端口,而8888是映射到localhost的端口。

下面的命令可以关闭我们的容器:

docker stop static-site

打包成Docker Image

想要把一个已有的项目打包成一个Docker镜像,只需要一个Dockerfile(没错,文件名就是这个,没有扩展名)。然后在文件里写进去这些东西:

FROM python:3.8
# set a directory for the app
WORKDIR /usr/src/app
# copy all the files to the container
COPY . .
# install dependencies
RUN pip install --no-cache-dir -r requirements.txt
# tell the port number the container should expose
EXPOSE 5000
# run the command
CMD ["python", "./app.py"]

然后运行命令docker build -t jasoncoderjia/catnip .为什么可以直接规定上传到自己的用户名下?因为本地的docker已经登录了。接下来就是奇怪的事情:我这边总是报错,好像和网络连接问题有关。同样,大模型一点忙都没有帮上,我最后大概猜出可能问题出在第一步,抓取python3.8环境的时候下载出错了。

于是我就单独运行了docker pull python:3.8,然后等下载完成后(不出意外,成功了),再运行上面的命令,结果就也成功了。虽然很奇怪,但是问题也解决了,我就懒得深究了。

接下来,

docker run -p 8888:5000 jasoncoderjia/catnip

就可以在localhost的8888端口运行我们的Flask程序。这个程序就是docker curriculum网站上提供的。