Docker入门
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网站上提供的。