0%

Docker入门

Docker现在应用的越来越广泛,不会使用Docker的研发人员估计很难适应未来的变化了。今天我们就简要的了解一下Docker及其使用。

Docker架构

如上图所示,Docker遵循客户端-服务器模型,包括 Docker ClientDocker 守护程序Docker ImageDocker ContainerDocker Registry 等主要组件。

让我们看看每个模块的作用吧:

  • Docker Client:我们 Docker 之旅的起点!🚀

    Docker Client 为用户提供了一种与 Docker 交互的方式。当我们发送 Docker 命令时,Docker Client会将这些指令发送到 Docker 守护程序,后者执行请求的任务。

  • Docker Daemon:任务主管在现场!👷‍♂️

    Docker 守护程序在主机上运行,并处理来自 Docker Client 的所有请求,例如构建、运行和分发 Docker 容器。

  • Docker Image:包括了操作系统和应用程序(可以把它想像成一张光盘/U盘)。🏢

    Docker 镜像 是构成容器的基础,它是只读的。它们包括应用程序有效运行所需的所有依赖项。

  • Docker Container:运行 Docker 镜像的实例。🏃‍♂️
    Docker 容器包含运行应用程序所需的一切,包括代码、运行时、库、环境变量和配置文件。

  • Docker Registry:就像 Docker 镜像库一样!📚
    Docker 仓库是 Docker 镜像所在的位置。

  • Docker Hub 是一个任何人都可以使用的公共仓库,但您也可以选择创建自己的专用仓库。

Docker 命令

Docker 有四个最基本的命令,其作用如下:

  • Docker pull

    1. 检查镜像是否已下载到本地。
    2. 如果没有,它将从 Docker Hub 下载镜像。
    3. Docker Hub 是存储 Docker 镜像的公共仓库。
  • Docker build

    1. 根据 Dockerfile文件,为您的应用程序创建本地镜像。
    2. Dockerfile 是一个文本文件,其中包含用于构建镜像的说明。
    3. 可用于为您的应用程序构建自定义镜像。
  • Docker push

    1. 将镜像/扩展/插件上传到 Docker Hub。
    2. 可用于与他人共享您的镜像。
  • Docker run

    1. 获取镜像并从中运行容器。
    2. 容器将运行镜像的可执行文件并公开镜像的端口。
    3. 可用于启动 Web 服务器、数据库或任何其他类型的应用程序。

具体的例子

启动带GPU的 tensorflow

1
2
  docker run --name my_tensorflow_container --gpus all -it --rm -p 8888:8888 tensorflow/tensorflow:latest- 
gpu-jupyter
  • name 指明启动后容器的名子
  • gpus all,表示使用所有可用的GPU
  • it,表示交互模式,即进入容器
  • rm,表示容器停止后自动删除容器
  • p 8888:8888,表示将容器的8888端口映射到主机的8888端口

启动带GPU的 pytorch

1
docker run --name my_pytorch_container --gpus all -it --rm -p 8888:8888 pytorch/pytorch:xxx /bin/bash

这条命令是我在WSL2上启动的,其中xxx是pytorch的版本号,比如:2.2.2-cuda-12.1-cudnn8-devel。

需要注意的是,这条命令应该在WSL2终端上执行,而不要在Windows的cmd上执行,否则container由于找不到/bin/bash,会直接退出。

另外,在WSL2上使用Docker时,有可能出现多个docker context,如果要切换context,你必须在Windows的cmd上执行,而不能在WSL2的终端上执行,否则会出错。切换docker context 的命令如下:

1
sudo docker context use context_name

根据当前container保存成一个新的镜像

1
sudo docker commit -a "lichao" -m "my mediasoup demo v4" 6b7f834336bb lc0060305/mediasoup-demo:v4

其中,

  • a,是作者的名子,这个可以随便写;
  • m,是对这个镜像的说明;
  • 6b7f834336bb,是container ID;
  • lc0060305/mediasoup-demo:v4,是生成的镜像名子和TAG, 特别关键的是前面的lc0060305,这个应该是你在hub.docker.com中的用户名,只有加了这个你的image才能被上传到hub.docker.com中

将产生的镜像提交到hub.docker.com中去

  • 首先在 hub.docker.com中注册一个帐号
  • 在你的控制台下调用 sudo docker login,用注册的帐号进行登陆
  • 调用 sudo docker images 查看你有哪些镜像
  • 调用 docker login 登陆 hub.docker.com
  • 调用 sudo docker push lc0060305/mediasoup-demo:v4 将你的镜像传上去。

常见的 Docker 命令

  • 查看所有的镜像

    1
    docker image ls 
  • 创建并启动一个镜像

    1
    docker container run imagename 
  • 创建并启动一个镜像,然后以交互的方式进入容器中

    1
    2
    3
    docker container run -it imagename 
    #
    docker container run -it -p servport:dockerport imangename
  • 查看所有运行的容器

    1
    docker container ls 
  • 查看所有容器

    1
    docker container ps -a 
  • 启动容器

    1
    docker container start 容器名 
  • 启动容器,以交互模式

    1
    docker container start -i 容器名 
  • 以交互模式启动容器

    1
    docker exec -it 容器id /bin/bash 
  • 停止容器运行

    1
    docker stop 容器名 
  • 提交容器到HOST仓库

    1
    docker commit -a=“用户名” -m=“描述” 容器名或ID image名称:版本
  • 根据Dockerfile创建image

    1
    docker build ...
  • 将image提交到仓库里

    1
    docker push 
  • 删除image

    1
    docker rmi id 
  • 查看有哪些 docker context

    1
    docker context ls
  • 切换docker context

    1
    docker context use context_name
  • 打印出所以已经退出的container

    1
    sudo docker ps -a | grep "Exited" | awk '{print $1}' 
  • 停止这些container

    1
    sudo docker ps -a | grep "Exited" | awk '{print $1}' | xargs sudo docker stop
  • 删除这些container

    1
    sudo docker ps -a | grep "Exited" | awk '{print $1}' | xargs sudo docker rm
  • 删除镜像

    1
    sudo docker images | grep none | awk '{print $3}' | xargs sudo docker rmi 
  • 删除所有已停止的容器

    1
    docker rm $(docker ps -a -q) 
  • 删除所有镜像

    1
    docker rmi $(docker images -q)
  • 设置环境变量

    1
    docker -e 用于
  • 指定使用哪个用户,如果未指定,默认为root用

    1
    docker -u 
  • 后台运行容器,并返回容器ID

    1
    docker -d, --detach=false # 
  • 以交互模式运行容器,通常与 -t 同时使用

    1
    docker -i, --interactive=false # 
  • 为容器重新分配一个伪输入终端,通常与 -i 同时使用

    1
    docker -t, --tty=false # 
  • 指定容器的工作目录

    1
    docker -w, --workdir="" # 
  • 给容器挂载存储卷,挂载到容器的某个目录

    1
    docker -v, --volume=[] # 
  • 指定容器暴露的端口

    1
    docker -P, --publish-all=false # 
  • 指定容器暴露的端口

    1
    docker -p, --publish=[] # 
  • 指定容器名字

    1
    docker --name="" # 
  • 指定容器停止后自动删除容器(不支持以docker run -d启动的容器)

    1
    docker --rm=false # 
  • 添加主机设备给容器,相当于设备直通

    1
    docker--device=[] # 

    小结

    总的来说,Docker 的使用还是蛮简单的,你把每个Docker容器当成一个独立的操作系统看就好了,而Docker Image就是你安装操作系统的光盘,而Docker的操作则与Git很类似,有pull, commit, push等方法。

    通过这种类比法,你就可以很快的掌握Docker的基本使用了。

欢迎关注我的其它发布渠道