我一直对于docker处于一个仅仅了解表面概念的状态,对于说它像个“沙盒”,避免出现“在我电脑上能运行怎么到你那就不行了”的情况,知道它很好用,但是也没实际用过,今天就让自己动动手,自己试着在pycharm里编写简单的dockerfile构建镜像(image)和容器(container)吧,慢慢了解。

一、安装Docker desktop

https://blog.csdn.net/cooldream2009/article/details/146127437?ops_request_misc=&request_id=&biz_id=102&utm_term=dockerdesktop&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-146127437.142^v102^pc_search_result_base6&spm=1018.2226.3001.4187

可以借鉴别的博主安装教程,并不难,然后我是用自己的谷歌账号登录的。

二、基础使用

登录后界面像是这样:

1这里表示Docker Desktop 已经跑起来了,2是可以直接练习一些命令的终端。

1.  docker --version

2.  # 第一步:拉取 nginx 镜像(会从网上下载,稍等一会)
    docker pull nginx

    # 第二步:运行它(--name和后面的my_docker是用来给容器起名字的,也可以不写,会自动分配名字)
    docker run -d -p 8081:80 --name my_docker nginx

    # 第三步:看容器是否在跑
    docker ps

3.  docker rename 旧名字 新名字  #修改容器名字

跑完之后,打开浏览器访问 http://localhost:8081,如果看到 Nginx 的欢迎页面,你的第一个容器就成功了!

还有一些别的命令:

docker ps可以查看当前正在运行的容器

在界面侧边栏的containersimages里可以看到自己的所有容器镜像情况。

注意:

1)

在images里每点击一次后面那个运行键,就会在containers里创建一个容器,点一次创建一个,同一个镜像可以启动任意多个容器,通过这种方式不小心创建的容器有个特点-----port(s)这一列为空,你想删就删掉,不想删的就留着。

也可以用别的方法避免这种情况:

1.启动容器时指定容器名字,类似于:

docker run --name my-docker nginx

2.  docker start my-docker    # 启动已有容器
     docker stop my-docker    # 停止

docker run 是新建并启动,docker start 是启动已有的

2)

因为创建容器时要指定端口号,我就遇到了问题,如果你不慎将某几个容器的端口号都设置成80,那只能启动其中一个,而且容器一旦创建完成端口是不能更改的,只能删除重建,所以注意一下。

OK,然后可以在pycharm里自己写dockerfile并将其容器化,其实不止可以在pycharm里写,只是我习惯在pycharm里写而已。

新建一个项目dockerapp,总共就俩文件就行,app.py和Dockerfile文件

app.py:

from flask import Flask

app=Flask(__name__)

@app.route('/')
def hello():
    return 'Hello, Docker!'

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)
  • port=5000:Flask 在容器内部的 5000 端口监听请求,所以 docker run 时要写 -p 8080:5000
  • host='0.0.0.0':这个非常重要,意思是接受来自任何地方的请求。如果写 127.0.0.1 只接受容器自己内部的请求,外面根本访问不到,这是新手容器跑起来但浏览器访问不了的最常见原因之一
  • 当有人访问 /根路径,就是 localhost:8080)时,执行 hello() 函数,返回 Hello, Docker! 这段文字给浏览器

Dockerfile:

#指定基础镜像。就像说"我要在一台已经装好 Python 3.12 的电脑上开始操作"。slim 是精简版,体积更小,够用就行
FROM python:3.12-slim

#在容器内部创建 /app 目录并进入,后续所有操作都在这里进行,相当于 mkdir /app && cd /app
WORKDIR /app

#把你本机当前目录(.)的所有文件复制到容器内的当前目录(也是 .,即 /app)
COPY . .

#告诉容器**启动时**执行什么命令,这里就是 `python app.py`,也就是启动 Flask 服务器。`CMD` 和 `RUN` 的区别是:`RUN` 是做菜的过程,`CMD` 是菜做好后怎么上桌。
CMD ["python", "app.py"]

然后就可以去终端执行构建:

1. docker build -t dockerapp .

2. docker run -d -p 8080:5000 --name python_docker

在这里我出现了问题:

原因是网络问题,Docker 无法连接到 docker.io 去下载 python 镜像,是因为国内访问 Docker Hub 被限制了,解决方法就是打开 Docker Desktop → 右上角齿轮(Settings)→ Docker Engine,添加字段:(注意要和已有的 JSON 内容合并,不要破坏原有结构

{
  "registry-mirrors": [
    "https://docker.m.daocloud.io",
    "https://dockerproxy.com",
    "https://mirror.baidubce.com"
  ]
}

点 "Apply & Restart",等 Docker 重启再去pycharm运行刚才那个命令。打开浏览器访问 localhost:8080,能看到Hello,Docker!就成功了。

这时候回到Docker desktop里能看到创建的这个容器和镜像。

三、后续

假如后期python文件有所变动,比如你又写了一些文件、删除了一些文件等等,都要重新docker build一次,比较麻烦,可以通过挂载的方式简化,不过我还没实践过,命令如下:

docker run -d -p 8080:5000 -v D:\PycharmProjects\dockerapp:/app --name python_docker dockerapp

这个 -v 本机路径:容器路径 就是挂载,本机的文件夹和容器的 /app 实时同步,改完代码不用 rebuild,重启容器就生效。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐