Docker现在应用的越来越广泛,不会使用Docker的研发人员估计很难适应未来的变化了。今天我们就简要的了解一下Docker及其使用。
Docker架构
如上图所示,Docker遵循客户端-服务器模型,包括 Docker Client 、Docker 守护程序 、Docker Image、Docker Container 和 Docker 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
- 检查镜像是否已下载到本地。
- 如果没有,它将从 Docker Hub 下载镜像。
- Docker Hub 是存储 Docker 镜像的公共仓库。
Docker build
- 根据 Dockerfile文件,为您的应用程序创建本地镜像。
- Dockerfile 是一个文本文件,其中包含用于构建镜像的说明。
- 可用于为您的应用程序构建自定义镜像。
Docker push
- 将镜像/扩展/插件上传到 Docker Hub。
- 可用于与他人共享您的镜像。
Docker run
- 获取镜像并从中运行容器。
- 容器将运行镜像的可执行文件并公开镜像的端口。
- 可用于启动 Web 服务器、数据库或任何其他类型的应用程序。
具体的例子
启动带GPU的 tensorflow
1 | docker run --name my_tensorflow_container --gpus all -it --rm -p 8888:8888 tensorflow/tensorflow:latest- |
- 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
3docker 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的基本使用了。