一、什么是docker
docker是一种容器,容器就是一个虚拟化的独立的环境,容器区别于虚拟机,它不是一个独立的操作系统,而是对进程进行隔离。对于容器里面的进程来说,它接触到的各类资源都是虚拟的,这样就实现了其与底层系统的隔离。
容器是进程的级别。
docker里的概念:
1.dockerfile --->docker会根据该文件进行镜像的创建
2.docker build -f ros_x86.docker . --->根据dockerfile创建这个镜像
3.docker run ---> 运行docker容器 相当于去网吧你得先开机吧
4.docker exec --> 进入docker容器 相当于进入了docker的容器,你开机了你得进到系统里,要不你玩啥呢
如何查询进程:
ps aux | grep docker
ps aux是一个常用的Linux命令行命令,用于列出当前系统中正在运行的进程的详细信息。这个命令可以帮助用户查看当前系统中运行的进程以及它们所占用的资源和状态信息。
具体来说,ps aux命令中的各个选项的含义如下:
- a:表示显示所有用户的进程,而不仅仅是当前用户的进程。
- u:表示显示详细的进程信息,包括用户、CPU使用率、内存使用率等。
- x:表示显示没有控制终端的进程,通常用于显示后台进程。
通过对输出进行筛选和排序,用户可以进一步了解进程的性能和行为,以及对系统资源的使用情况进行监控和分析。
此外,ps aux命令的输出包含了丰富的进程信息,这对于定位特定进程或监视系统中特定的应用程序非常有用。同时,结合其他命令和工具,用户还可以对进程进行更复杂的操作和管理。
需要注意的是,在某些操作系统中,ps aux的写法可能已经过时,更推荐使用ps aux(无需加横杠)的形式。同时,用户在使用该命令时,需要确保具有足够的权限和权限设置,以避免对系统造成不必要的影响。
总之,ps aux命令是Linux系统中非常实用的进程查看工具,可以帮助用户更好地了解和管理系统中的进程。
grep docker是用来捕捉docker字段
可以通过
docker ps
查看所有的容器
docker与虚拟机的区别:
虚拟机是通过虚拟出网卡、cpu、内存,在虚拟出的硬件基础上建立操作系统,其拥有自己的系统内核。
容器利用namespace将文件系统、进程、网络进行隔离,然后应用cgroup对CPU资源、权限进行限制,使容器间互不影响,使用容器无法影响宿主的主机。容器的本质是进程
cgroup的作用:
cgroup,全称control groups,是Linux内核的一个功能,主要用于限制、控制与分离一个进程组的资源使用,如CPU、内存、磁盘输入输出等。它是通过为不同的进程组分配特定的资源限制,如CPU使用时间、内存使用量等,来避免某个进程或进程组占用过多资源导致系统崩溃或变慢。同时,cgroup还可以为不同的进程组设置不同的优先级,确保重要的进程或进程组能够获得更多的资源。此外,cgroup还具有资源统计的功能,可以实时监视和记录每个进程组使用的资源量,以便进行性能分析和故障排查。最后,cgroup还可以对进程组中的进程进行控制,如暂停、恢复、终止等操作。
cgroup的主要特点包括层次结构,即以层次结构的方式组织,形成一个树状结构,方便管理和控制。这使得cgroup在Linux系统中扮演着非常重要的角色,尤其是在需要管理和控制进程组资源使用的情况下。
总的来说,cgroup是一个强大的工具,可以帮助系统管理员更好地管理和控制Linux系统中的进程和资源,提高系统的稳定性和可靠性。
docker的常用命令:
docker images
查看所有本地主机上的镜像
docker search
用于在docker hub上搜索镜像
docker pull
下载镜像
docker rmi
删除镜像
docker tag
给镜像命名
二、dockerfile构建
一般流程
一、首先通过创建好的dockerfile去构建镜像
docker build -f xxxxx.dockerfile .
当构建流程进行完毕后,通过docker images查看构建好的镜像文件
二、启动docker容器
通过docker run指令(注意,docker run就包含了创建一个容器了)
三、进入docker容器
通过docker exec指令
四、可以通过exit的方式退出容器(或者ctrl+D)
然后通过docker ps查看容器
五、可以通过docker rm删除容器
指令和各种概念之间的关系:
其中:
下面对上述dockerfile进行详细的解释:
一、dockerfile
dockerfile是一个文本文件,用来配置镜像。docker根据该文件生成二进制的image文件。
dockerfile常用指令
FROM 这个镜像的妈妈是谁?(指定基础镜像)
ENV 环境配置
RUN 你想让它干啥(在命令前面加上RUN即可)
COPY 复制文件 WORKDIR 设置当前工作目录
VOLUME 设置卷,挂载主机目录
CMD 指定容器启动后的要干的事情
一个dockerfile解析
#以ubuntu20.04为根基进行后续环境的叠加
FROM ubuntu:20.04
#设置默认的交互方式(noninteractive即后续不需要认为点击yes或者回车进行确认,自动进行确认)
ENV DEBIAN_FRONTEND=noninteractive
#RUN命令即执行这一步的指令、下述两步用于清楚残留依赖
RUN apt-get clean && \
apt-get autoclean
#安装ros(开源代码noetic)需要的步骤和标准流程
¥首先分别安装curl lsb gnu gdb
RUN apt update && \
apt install -y \
curl \
lsb-release \
gnupg gnupg1 gnupg2 \
gdb
#安装密钥
RUN apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
#把ros的一些包打到source.list中
RUN sh -c '. /etc/lsb-release && echo "deb http://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu/ `lsb_release -cs` main" > /etc/apt/sources.list.d/ros-latest.list'
#这个项目用到protobuf 所以需要安装一些依赖
RUN apt update && \
apt install -y ros-noetic-desktop-full \
python3-rosdep python3-rosinstall python3-rosinstall-generator python3-wstool build-essential
#环境工具(安装下述内容才能正确的安装protobuf)
RUN echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc
RUN apt update && \
apt install -y \
vim \
htop \
apt-utils \
curl \
cmake \
net-tools
#宿主机目录拷贝到镜像目录
COPY install/protobuf /tmp/install/protobuf
RUN /tmp/install/protobuf/install_protobuf.sh
#ros的路径刷新到终端bachrc中
RUN echo "source /work/devel/setup.bash" >> ~/.bashrc
WORKDIR /work
DEBIAN_FRONTEND
告知操作系统应该从哪儿获得用户输入。如果设置为"noninteractive",你就可以直接运行命令,而无需向用户请求输入(所有操作都是非交互式的)。这在运行apt-get命令的时候格外有用,因为它会不停的提示用户进行到了哪步并且需要不断确认。非交互模式会选择默认的选项并以最快的速度完成构建。请确保只在Dockerfile中调用的RUN命令中设置了该选项,而不是使用ENV命令进行全局的设置。因为ENV命令在整个容器运行过程中都会生效,所以当你通过BASH和容器进行交互时,如果进行了全局设置那就会出问题。
关于Protobuf
官网给出的要求:
需要安装好上述内容,才可以安装protobuf,注意这里需要的版本,apt install提供的版本是否符合要求。
Abseil是C++代码的开源集合(符合C++14),旨在增强C++标准库。和stl一样的功能,通过使用这种库能增快开发效率。(protobuf就是使用这种库)