内涵:日常工作中docker的常用知识

发布于:2024-07-08 ⋅ 阅读:(34) ⋅ 点赞:(0)


  正如 优雅:从系统环境到依赖包的管理,最近工作中,对开发、部署环境中的管理全面迁移至docker镜像。本文是对docker相关高频指令和操作的记录:

1. docker高频指令(与参数)

  1. 构建镜像相关指令
docker build -t ${image} -f ${Dockerfile} ${CONTEXT_DIR}

  其中,${image}表示构建的镜像名称,例如:nvcr.io/nvidia/pytorch:22.09-py3

  {Dockerfile} 故名思意,就是构建所需要依赖的dockerfile。
  {CONTEXT_DIR}指上下文路径,例如Dockerfile中可能会存在这样的指令:
COPY ./app/requirements.txt /app/requirements.txt
  这里的./app/requirements.txt就是相对于${CONTEXT_DIR}来讲的。

  1. 启动镜像相关指令

最简模式:

docker run -ti --entrypoint=/bin/bash -v /home/xiaoming/code:/code nvcr.io/nvidia/pytorch:22.09-py3

  --entrypoint=/bin/bash表示容器启动的时候,会直接进入一个bash终端。另外一种常见的作法是在Dockerfile中制定容器的入口。例如:
ENTRYPOINT [ "sh", "./start-reload.sh" ]
这样,就可以做到在启动镜像的过程中,启动镜像中的服务或者执行一些操作。
  -v表示将主机路径挂载至容器路径。

  • 如果镜像中需要使用到gpu资源
    --gpus all或者--gpus 2
  • 给容器起一个名字方便管理
    --name my-container-name
  • 容器和宿主机共享内存
    --ipc=host否则可能会出现容器默认分配的内存不足。
  • -p 30006:30006用于将宿主机的端口映射到容器的端口,这样可以在容器的外部访问容器内部的服务。例如
docker run -p 8080:80 nginx

这条命令会启动一个基于 Nginx 镜像的容器,并将主机的 8080 端口映射到容器的 80 端口。这样,你可以通过访问主机的 http://localhost:8080 来访问容器内运行的 Nginx 服务。如果不加-p进行映射,因为容器内部的端口是隔离的,就无法在容器外部访问内部的服务。

2. 单docker使用场景

  在一个终端下,启动起来服务:
Uvicorn running on http://0.0.0.0:30009 (Press CTRL+C to quit)
  在另外一个终端下可以通过curl命令来快速的对服务进行测试:
curl -X POST http://0.0.0.0:30009/{service-interface} -H "Content-type:application/json" --data-binary @test.json

3.双(多)docker使用场景

  在一个容器中,启动起来一个服务A, 那么如何在另外一个容器中调用服务A呢?

  • 使用默认桥接网络:
    在docker run第一个容器的时候,利用–name为其起一个名字,例如container-A,在第二个容器调用该服务A的时候不再是http://0.0.0.0:30009而是http://container-A:30009
  • 使用自定义的桥接网络
docker network create my-network

然后启动第一个容器和第二个容器的时候都添加上参数--network my-network。那么此时两个容器就会存在于同一个自定义的桥接网络中,就可以进行通信。注意此时,方位服务A仍旧要通过```http://container-A:30009``这种方式进行。


网站公告

今日签到

点亮在社区的每一天
去签到