自我的学习日志,第一次接触是使用docker进行封装程序。
内容都是“从别的文章里学习来的”,毕竟是学习日志
Docker 是一个开源的应用容器引擎,由go语言编写,简单点说就是用一个压缩包装把要运行的程序装起来,然后只要有Docker就可以在任何机器上运行了,可以不用配环境(这点是非常棒的)。
由以下几部分组成:
- DockerClient客户端
- Docker Daemon守护进程 (没写字的就是不会)
- Docker Image镜像 (镜像可以理解为是一个程序,比如微信)
- DockerContainer容器 (容器我暂时的理解是一个沙盒,就是可以多开镜像,容器与镜像的关系类似于面向对象编程中的对象与类。)
虚拟机和容器的区别
(参考的网址:https://github.com/CyC2018/CS-Notes/blob/master/notes/Docker.md)
优缺点
虚拟机(模拟硬件,然后在硬件上安装操作系统)
- 资源占用多(虚拟机会独占一部分内存和硬盘空间)
- 冗余步骤多(虚拟机是完整的操作系统)
- 启动慢(启动操作系统的时间和启动虚拟机一样)
容器
- 启动快(启动容器相当于启动本机的一个进程,而不是启动一个操作系统)
- 资源占用少(容器只占用需要的资源,不占用那些没有用到的资源)
- 体积小(容器只要包含用到的组件即可)
容易迁移,容易维护,容易拓展。
docker与容器关系
Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。
Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。
docker用途
提供一次性的环境
提供弹性的云服务(适合动态扩容和缩容)
组建微服务架构(一个服务器可以跑多个服务)
持续集成(持续集成指的是频繁地将代码集成到主干上,这样能够更快地发现错误。)我的理解就是新的东西要及时加到主干代码上去防止之后太多了加不上还不知道是哪里的问题。还有什么持续交付,持续部署。
容器和镜像
镜像是一种静态的结构,可以看成面向对象里面的类,而容器是镜像的一个实例。(就像一个python环境可以让好多代码一起用)
镜像是一种分层结构,每一层都是只读的。
构建容器的时候,通过在镜像的基础上添加一个可写层(writable layer),用来保存着容器运行过程中的修改。
docker命令
构建docker镜像
这个时候得写一个Dockerfile文件才行,我随便举例一个。因为做过一些图像相关的工程,这里写一个封装封装yolov5的例子。我是新手,勿喷。
Dockerfile(不带cuda版本)
# 首先选取一个基础镜像
FROM python:3.6.8
# 安装linux的一些包
RUN apt update && apt install -y zip htop screen libgl1-mesa-glx
# 安装python依赖,里面加的-i是进行换源
COPY requirements.txt .
RUN python -m pip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple
RUN pip install --no-cache -r requirements.txt coremltools onnx gsutil notebook -i https://pypi.tuna.tsinghua.edu.cn/simple
RUN pip install --no-cache -U torch==1.9.0 torchvision numpy -i https://pypi.tuna.tsinghua.edu.cn/simple
# 创建工作目录
RUN mkdir -p /usr/src/app
# 设置工作目录设置,就是进去之后会直接进入到这个目录
WORKDIR /usr/src/app
# 把当前目录的文件拷贝进镜像里面,方便使用
COPY . /usr/src/app
# 设置环境变量
ENV HOME=/usr/src/app
# 容器启动之后,运行的命令,这个停止的话容器会自动停止
CMD ["python","/usr/src/app/main.py"]
带cuda的基础镜像可以参考下面这个图(OBB里面的Dockerfile)
之后在本目录下,使用docker构建镜像
docker build -t name:v1 . # 冒号后面可以自己设置版本号,最后的.是使用本目录下的Dockerfile文件构建。
然后使用docker images
查看镜像
使用镜像生成容器如下:
docker run -p 8000:3000 --name name_sever -itd name:v1 /bin/bash
# run指的是生成容器
# -p指的是端口号的映射,这里是将容器里面的3000映射到外面的8000上。
# --name name_sever 指的是给容器起个名字叫name_server
# name:v1指的是镜像的名字和端口号
# /bin/bash 指的是容器运行之后执行的命令是什么,这个命令是启动容器里面带的shell。要是python的话,你打开就是python的命令行。
进入容器
docker attach name_server # 进去之后就是和linux一样了(大概)
附录上AcWing里y总的图(https://www.acwing.com.cn/):
修改镜像默认运行命令(或者说是默认dockerfile文件):
可以从容器里使用命令重新构建:
docker commit --change="WORKDIR /root" -c 'CMD ["python","main.py"]' dfb8a4200a1b name:v2
其中–change后面跟着的是修改dockerfile的内容。需要是dockerfile的格式,-c后面可以修改默认的启动命令。然后加容器id,新生成的镜像的名字和版本。
之后就可以运行这个镜像了。
docker run -p 8883:8883 --name server2 -itd name:v2
再深的东西仍在学习中