dockerbusybox的简单介绍

本篇文章给大家谈谈dockerbusybox,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

使用busybox镜像创建容器启动容器并查看容器状态的命令是什么?

1. 创建并缺昌启动容器 docker create命宽扮闭令来创建容器 $ docker create -it --name=busybox busybox 1 容器启动有两种方式: 使用docker start命令基于

2. 终止容器 容器停止用docker stop 命令。格式为: docker stop [-t]|–time[=10]. 该命令首先会向运行中的容器发送SIGTERM信号,如果

3. 进慎裂入容器 处于运行状态的容器可以通过docker

Docker容器生产实践1——永远设置容器内存限制

在默认情况下,docker容器并不会对容器内部进程使用的内存大小进行任何限制。对于PaaS系统而言,或者对于直接使用docker的用户而言,这非常危险。如果哪个业务容器,出现了内存泄漏;那么它可能会危害到整个主机系统,导缺销塌致业务app容器所在的主机出现oom。本文将介绍着眼于docker对内存资源的使用,解释背后的原理。同时也给出k8s上如何配置内存限制的方法。

通过下面参数可以为容器设置一个内存使用量硬大小,当超出这个大小时刻,linux系统会根据配置设置决定是否进入oom-killer状态。

docker run --name zxy-docker -m 1g -it busybox bash

单位为:b,k,m和g

如果设置了-m参数伏圆,通常情况下如果容器使用内存量超过了设置的硬水线,那么linux的oom-killer触发,它将根据oom-score对容器内部进程进行oom kill。但是不影响宿主机上其他进程。

这个参数设置一定需要在容器run或者create过程中使用了-m参数才可以设置。设置了-m参数,如果容器使用内存超限了,那么oom-kill将触发。如果设置了--oom-kill-disable, 那么容器不会oom,但斗橡是此时容器内部申请内存的进程将hang,直到他们可以申请到内存(容器内其他进程释放了内存) 。

绝对不要在没有使用-m的时候设置--oom-kill-disable 因为这会影响到宿主机的oom-killer

docker 设置容器的-m是通过设置memory cgoup的memory.limit_in_bytes实现的。在没有设置-m的时候这个值为-1,表示容器使用的内存不受限制。

例如:

`bashdocker run --name zxy-memorylimit -it -m 1g docker-build:12.06 bash

bashdocker inspect zxy-memorylimit|grep -i pid

“Pid”:24360

bashcat /proc/24360/cgroup|grep memory

9:memory:/docker/xxxxx

bashcd /sys/fs/cgroups/memory/docker/xxxx

bash cat memory.limit_in_bytes

1073741824`

--oom-kill-disable参数实际设置的就是这是了同级目录之下的memory.oom_control,设置此参数就相当于做了如下动作

bash echo 1 memory.oom_control

对linux memory cgroup感兴趣的朋友可以参考:

一文

在上一节中,我们介绍了-m硬限制容器使用的内存资源。一旦设置了这个-m参数,那么容器内进程使用量超过这个数值,就会被杀或者hang住。docker还提供了一种soft limit就是--memory-reservation,单位和-m一致。当设置了这个参数以后, 如果宿主机系统内存不足,有新的内存请求时刻,那么linux会尝试从设置了此参数的容器里回收内存,回收的办法就是swap了。那么如果此容器还在继续使用内存,那么此容器会遇到很大的性能下降 。

通常实践是设置--memory-reservevation 的值小于-m的值。

和-m参数一致,此参数docker也是借助于memory cgroup的memory.soft_limit_in_bytes 实现。

2、一个进程是否使用了swap空间以及使用了多少swap空间,可以用/proc/$pid/smap中所有内存区域的swap值进行累加可以计算出

docker做的工作实际上是由runc完成的,docker 创建的hostconfig.json文件(也就是oci接口文件)中,有如下字段描述-m,--memory-reservation等内存资源限制参数:

memory MemoryReservation MemorySwap MemorySwappiness

下文节选自

limits:

cpu: 100m

memory: 100Mi

`

其中limits节限制memory设置的就是docker 容器的-m,而且k8s仅仅使用了-m参数其他参数都没有使用。

[img]

docker 的container模式

Docker网络container模式是指,创建新容器的时候,通过 --net container 参数,指定其和已经存在的某个容器共享一个 Network Namespace。如下图所示,右方黄色新创建的container,其网卡共享左边容器。因此就不会拥有自己独立的 IP,而是共享左边容器的 IP 172.17.0.2,端口范围等网络资源,两个容器的进程通过 lo 网卡设备通信。

但这两个容器在其他的资源上,如文件系统、族饥进程列表等还是隔离的。

使用busybox镜像新建bb容器,bb容器网络模型默认采用的bridge模式

使用Nginx镜像新建nginx容器,并用 --net container:bb 参数,指定该容器的网络模型为container模式,和bb容器共用相同的网络命名空间。

进入bb容器

使用命令查看网络端口情况

可以看到,nginx容器的80端口已经映射到了bb容器的80端口

在bb容器内部访问bb容器本机的80商品,我们可以看到实际上可以访问到nginx容器的

查看bb容器的ip地址,并退出bb容器

使用上面得到IP地址,从云环境主机的环境,去访问

也会得到

总结

Docker container网络模式兆薯返,这种模式可以节约一定的网络资源,并能降低容器间的通信的难度。container网络手知模式使多个容器共享网络环境,在这种模式下容器可以通过访问localhost来访问 namespace下的其他容器,网络性能高

docker 怎么配置国内镜像

查看下当前系统脊瞎及docker安装情况

wzb@wzb-pc:~$ sudo docker info

使用配置文件 /etc/docker/daemon.json(没有时新建该文件)

如果没有 /樱信空etc/docker文件夹 请执行

wzb@wzb-pc:~$ sudo mkdir -p /etc/docker

写入镜像加速地址(镜像加速地址可在 阿里云容器Hub服务控制台 的加速器中 查看)

sudo tee /etc/docker/daemon.json -'EOF'{ "registry-mirrors": ["坦唤你自己的镜像加速地址"]}EOF

3

重启daemon及docker

wzb@wzb-pc:~$ sudo systemctl daemon-reload

wzb@wzb-pc:~$ sudo systemctl restart docker

4

测试之后就可正常拉去上传镜像了。

例如拉去个简单的busybox镜像

busybox是一个最小的Linux系统,它提供了该系统的主要功能,不包含一些与GNU相关的功能和选项。

wzb@wzb-pc:/etc/docker$ sudo docker pull busybox

如何在Docker中使用Open vSwitch-Docker

你好,使用方法如下:

首先我们让ovsdb-server监听一个TCP端口:

ovs-appctl -t ovsdb-server ovsdb-server/add-remote ptcp:6640

接下来,启动ovn-northd后台进程。这个进程负责将来自Docker的网络信息(存储在OVN_Northbound 数据库中)转换成逻辑流存储于OVN_Southbound数据库。

/usr/share/openvswitch/scripts/ovn-ctl start_northd

2、一次性配置

在每一个你打算创建容器的主机上,你需要运行以下的命令(如果你的OVS数据库被清空,你需要再次运行这个命令。除此之外,重复运行这个命令都是没有任何影响的)。

其他的主机可以通过$LOCAL_IP地址来访问到这个主机,它就相当于本地通道的端点。

$ENCAP_TYPE是指用户想使用的通道的类型。它猛局颂可以是”geneve“或者”stt“。(注意,你的内核需要支持以上两个类型,用户可以通过运行以下命令来检测内核是否支持以上类型:"llsmod | grep $ENCAP_TYPE")。

ovs-vsctl set Open_vSwitch . external_ids:ovn-remote="tcp:$CENTRAL_IP:6640" external_ids:ovn-encap-ip=$LOCAL_IP external_ids:ovn-encap-type="$ENCAP_TYPE"

最后,启动ovn-controller(你需要在每一次启动时运行以下命令):

/usr/share/openvswitch/scripts/ovn-ctl start_controller

3、启动Open vSwitch网络驱动

在默认情况下,Docker使用Linux网桥,但它支持外扩展。为了替换Linux网桥,我们需要先启动Open vSwitch驱动。

Open vSwitch驱动使用了Python Flask模块来监听Docker的网络API请求。因此,用户需要先安装Python 的Flask模块。

easy_install -U pip pip install Flask

在每一个你想要创建容器的主机上启动Open vSwitch驱动:

ovn-docker-overlay-driver --detach

Docker内部包含了一些模块,这些模块拥有类似于OVN的逻辑交换机和逻辑端口的概念。请读者仔细阅读Docker的文档来查找相关的命令。这里我们给出了一些案例:

1)创建用户自己的逻辑交换机

下面的命令创建了一个名为”foo“的逻辑交换机,它的网段为”192.168.1.0/24”:

NID=`docker network create -d openvswitch --subnet=192.168.1.0/24 foo`

2)显示已有逻辑交换机

docker network ls

你也可以通过以下命令从OVN的northbound数据库中查找到这个逻辑交换机:

ovn-nbctl --db=tcp:$CENTRAL_IP:6640 lswitch-list

3)Docker创建逻辑端口,并且将这个端口附加到逻辑网络上

比如说,将一个逻辑端口添加到容器busybox的“foo”网络上:

docker run -itd --net=foo --name=busybox busybox

4)显示所有的逻辑端口

Docker现在并没有一个CLI命令来罗列所有的逻辑端口,但是你可以从OVN的数据库中找到它们:

ovn-nbctl --db=tcp:$CENTRAL_IP:6640 lport-list $NID

5)用户也可腊野以创建一个逻辑端口,并将它添加到一个运行中的容器上:

docker network create -d openvswitch --subnet=192.168.2.0/24 bar docker network connect bar busybox

用户可以删除逻辑端口,或者将它们从运行容器上分离出来:

docker network disconnect bar busybox

6)用户枝郑也可以删除逻辑交换机:

docker network rm bar

超值一篇分享,Docker:从入门到实战过程全记录

作者 | 天元浪子

来源 | CSDN博客

想要真正理解Docker,就不得不从虚拟化技术的发展历程说起。普遍认为虚拟化技术经历了物理机时代、虚拟机时代,目前已经进入到了容器化时代。可以说,Docker是虚拟化技术不断发展的必然结果。

那么,什么是容器呢?容器和虚拟机有什么不同?Docker和容器又是什么关系呢?搞明白这几个问题,Docker的概念就清晰了。

1.1 虚拟机和容器

借助于VMWare等软件,可以在一台计算机上创建多个虚拟机,每个虚拟机都拥有独立的操作系统,可以各自独立的运行程序。这种分身术虽然隔离度高(操作系统级),使用方便(类似物理机),但占用存储资源多(GB级简袭)、启动速度慢(分钟级)的缺点也是显而易见的。

相较于虚拟机,容器(Container)是一种轻量型的虚拟化技术,它虚拟的是最简运行环境(类似于沙盒)而非操作系统,启动速度快(秒级)、占用存储资源少(KB级或MB级),容器间隔离度为进程级。在一台计算机上可以运行上千个容器,这是容器技术对虚拟机的碾压式优势。

1.2 容器、镜像和Docker

Docker是一个开源的应宽凯用容器引擎,可以创建容器以及基于容器运行的程序。Docker可以让开发者打包他们的应用和依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。

听起来很简单,但是在Docker和容器之间,还隐藏着一个镜像的概念,令初学者颇感困惑。本质上,Docker镜像是一个特殊的文件系统,它提供容器运行时所需的程序、库、资源、配置等文件。Docker镜像类似于一个py文件,它需要Docker的运行时(类似于Python解释器)运行。镜像被运行时,即创建了一个镜像的实例,一个实例就是一个容器。

1.3 Docker 和 k8s

作为容器引擎,Docker为容器化的应用程序提供了开放的标准,使得开发者可以用管理应用程序的方式来管理基础架构,实现快速交付、测试和部署代码。随着容器的大量使用,又产生了如何协调、调度和管理容器的问题,Docker的容器编排应运而生。

k8s是Google开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理,是一个开源的,用于管理云平台中多个主机上的容器化的应用,k8s的目标是让部署容器化的应用简单并且高效,k8s提供了应用部署、规划、更新、维护的一种机制。

Docker和k8sr都是以containerd(容器化标准)作为运行时,因此使用Docker创建的镜像完全可以在k8s中无障碍的使用。

2.1 在ubuntu中安装

在linux系统中安装Docker非常简单,官方为我们提供了一键安装脚本。这个方法也适用于Debian或CentOS等发行版。

安装过程如果出现超时,不要灰心,多试几次,总会成功的。安装完成后,Docker只能被root用户使用,可以使用下面的命令取消权限限制:

然后,重启docker服务:

最后,关闭当前的命令行,重新打开新的命令行就可以了。

顺便提一下,如果在CentOS下安装,可能会出现一堆类似于下面的错误:

这是由于docker和Podman冲突造成的,需要先卸载Podman:

2.2 在Win10中安装

Docker的运行,依赖linux的环境,官方提供了Docker Desktop for Windows,但是它需要安装Hyper-V,Hyper-V是微软开发的虚拟机,类似拦巧兄于 VMWare 或 VirtualBox,仅适用于 Windows 10。这个虚拟机一旦启用,QEMU、VirtualBox 或 VMWare Workstation 15 及以下版本将无法使用!如果你必须在电脑上使用其他虚拟机(例如开发 Android 应用必须使用的模拟器),请不要使用 Hyper-V!

我的电脑是win10家庭版,不能直接安装hyper-v,需要将下面的命令保存到cmd文件中:

然后在cmd文件上点击右键,选择使用管理员运行。执行完毕后会重启,在重启的过程中进行安装。

2.3 Hello world

docker服务启动的情况下,运行下面的命令:

此命令的含义是:

第一次运行时,因为本地没有ubuntu:20.04镜像,docker会自动从镜像服务器下载。下载过程可能需要多试几次,只要成功一次,以后执行就不再需要下载了。

docker官方还提供了一个hello-world镜像,可以直接运行:

此命令省略了镜像版本和运行参数,docker使用latest作为版本,即最新版本。

从hello world的例子中,也可以体验到,docker实例的运行是非常快的。

docker官方的镜像库比较慢,在进行镜像操作之前,需要将镜像源设置为国内的站点。

新建文件/etc/docker/daemon.json,输入如下内容:

然后重启docker的服务:

3.1 列出本地所有镜像

执行命令 docker images 可以查看

当前我本地只有刚才安装的两个镜像。

3.2 从镜像库中查找镜像

执行命令 docker search 镜像名称可以从docker镜像库中查找镜像。

最好选择官方(OFFICIAL)的镜像,这样的镜像最稳定一些。

3.3 下载新的镜像

执行命令docker pull 镜像名称:版本号即可下载新的镜像。

镜像下载后,就可以使用镜像来创建容器了。

4.1 启动容器

执行命令docker run即可启动容器,也就是创建某个镜像的实例。docker run命令非常复杂,可以先执行一个docker run --help来查看帮助:

比如我们要执行python的shell,需要添加-it参数,即:docker run -it python:3.8

4.2 将宿主机的文件挂载到容器

docker容器与宿主机是隔离的,要想让容器内的程序能访问宿主机上的文件,需要通过-v参数将宿主机的文件挂载到容器中。

比如我们在宿主机上有一个hello.py,可以打印hello,想要在python容器中执行,就需要进行挂载。-v后还需要接两个参数,分别是宿主机的目录和容器内的目录,两者使用:分隔,路径必须都是绝对路径。

我的hello.py保存在主目录的/docker_test目录中,将这个目录挂载到容器的/docker_test目录,然后在容器内执行python /docker_test/hello.py:

4.3 容器的端口映射

我们修改一下hello.py,创建一个socket服务端,并监听5000端口,当有客户端连接时,打印客户端的地址,先客户端发送hello,然后关闭连接:

在容器内执行:

接下来,尝试用telnet命令连接,结果却是失败的。原因是,127.0.0.1是宿主机的ip地址,5000是容器的端口,这与我们的习惯稍微有些不同。事实上,docker的容器是非常轻量的,它并没有自己的网络,要想访问容器的端口,需要进行端口映射,将容器的某端口映射到宿主机的端口,客户端连接时,只要与宿主机的端口进行连接就可以了。

需要注意的是,上面的代码创建的服务器,无论如何也不可能被客户端连接,因为代码中绑定了127.0.0.1的ip,在容器中运行时,需要绑定所有ip,即0.0.0.0。

然后,再使用-p参数,-p还需要三个参数,即宿主机的ip地址、宿主机的端口、容器的端口,三者之间使用:分隔。一般的,可以将宿主机的ip地址省略,只写宿主机的端口:容器的端口即可。

这样,就将容器的5000端口映射到了宿主机的5001端口,使用:

即可与容器中的服务器进行连接。

4.4 容器管理

上面的服务运行之后,可以使用docker ps命令,查看运行中的容器:

显示的内容有下面几列:

要想结束容器,可以使用docker kill 容器ID命令。

一般而言,当我们的程序开发完成后,会连同程序文件与运行环境一起制作成一个新的镜像。

要制作镜像,需要编写Dockerfile。DockeFile由多个命令组成,常用的命令有:

注意,Docker镜像中有一个层的概念,每执行一个RUN命令,就会创建一个层,层过多会导致镜像文件体积增大。尽量在RUN命令中使用连接多条shell命令,减少RUN命令的个数,可以有效减小镜像文件的体积。

5.1 自制显示文本文件内容镜像

编写cat.py,接收一个文件名,由python读取文件并显示文件的内容:

这个例子比较简单,缩写Dockerfile如下:

这个Dockerfile的含义是:

需要说明的是,ENTRYPOINT有两种写法:

这里采用第二种写法,是因为我们要在外部给容器传递参数。执行命令编译Docker镜像:

这个命令中,-t的含义是目标,即生成的镜像名为hello,版本号为1.0,别忘了最后那个.,这叫到上下文路径,是指 docker 在构建镜像,有时候想要使用到本机的文件(比如复制),docker build 命令得知这个路径后,会将路径下的所有内容打包。

这样,我们的第一个镜像就制作完成了,使用下面的命令执行它:

即可看到~/docker_test/cat/files/test.txt的内容。

5.2 自制web服务器镜像

我们使用tornado开发一个网站,而python的官方镜像是没有tornado库的,这就需要在制作镜像时进行安装。

测试的ws.py如下:

编写Dockerfile文件如下:

在此我们验证一下CMD与ENTRYPOINT的区别。在Dockerfile所在有目录下执行如下命令:

执行完成后,再使用docker images使用就可以看到生成的镜像了,然后使用下面的命令运行:

在浏览器中输入宿主机的ip和8000端口,就可以看到页面了。

在这个例子中,我使用的运行命令是CMD,如果在docker run中指定的其他的命令,此命令就不会被执行,如:

此时,容器中被执行的是python命令,而不是我们的服务。在更多情况下,我们希望在docker run命令中为我们的服务传参,而不是覆盖执行命令,那么,我们应该使用ENTRYPOINT而不是CMD:

上面这种写法,是不支持传递参数的,ENTRYPOINT和CMD还支持另一种写法:

使用这种写法,docker run命令中的参数才可以传递给hello.py:

这个命令中,--port=9000被作为参数传递到hello.py中,因此容器内的端口就成了9000。

在生产环境中运行时,不会使用-it选项,而是使用-d选项,让容器在后台运行:

这种方式下,即使当前的控制台被关闭,该容器也不会停止。

5.3 自制apscheduler服务镜像

接下来,制作一个使用apscheduler编写的服务镜像,代码如下:

Dockerfile也是信手拈来:

生成镜像:

应该可以运行了,文件复制需要两个目录,在运行时,可以使用两次-v来挂载不同的目录:

前面用到的官方python镜像大小足足882MB,在这个基础上,再安装用到的第三方库,添加项目需要的图片等资源,大小很容易就超过1个G,这么大的镜像,网络传给客户非常的不方便,因此,减小镜像的体积是非常必要的工作。

docker hub上有个一python:3.8-alpine镜像,大小只有44.5MB。之所以小,是因为alpine是一个采用了busybox架构的操作系统,一般用于嵌入式应用。我尝试使用这个镜像,发现安装一般的库还好,但如果想安装numpy等就会困难重重,甚至网上都找不到解决方案。

还是很回到基本的路线上来,主流的操作系统镜像,ubuntu的大小为72.9MB,centos的大小为209MB——这也算是我更喜欢使用ubuntu的一个重要原因吧!使用ubuntu作为基础镜像,安装python后的大小为139MB,再安装pip后的大小一下子上升到了407MB,要是再安装点其他东西,很容易就赶上或超过python官方镜像的大小了。

看来,寻常路线是很难压缩镜像文件体积了。幸好,还有一条曲线救国的路可走,这就是多阶段构建法。

多阶段构建的思想其实很简单,先构建一个大而全的镜像,然后只把镜像中有用的部分拿出来,放在一个新的镜像里。在我们的场景下,pip只在构建镜像的过程中需要,而对运行我们的程序却一点用处也没有。我们只需要安装pip,再用pip安装第三方库,然后将第三方库从这个镜像中复制到一个只有python,没有pip的镜像中,这样,pip占用的268MB空间就可以被节省出来了。

1、在ubuntu镜像的基础上安装python:

然后运行:

这样,就生成了python:3.8-ubuntu镜像。

2、在python:3.8-ubuntu的基础上安装pip:

然后运行:

这样,就生成了python:3.8-ubuntu-pip镜像。

3、多阶段构建目标镜像:

这个dockerfile需要解释一下了,因为它有两个FROM命令。

第一个是以python:3.8-ubuntu-pip镜像为基础,安装numpy,当然,在实际应用中,把所有用到的第三方库出写在这里。

第二个FROM是以FROM python:3.8-ubuntu镜像为基础,将第三方库统统复制过来,COPY命令后的–from=0的意思是从第0阶段进行复制。实际应用中再从上下文中复制程序代码,添加需要的ENTRYPOINT等。

最后,再运行:

这然,用于我们项目的镜像就做好了。比使用官方python镜像构建的版本,小了大约750MB。

到此,我们的镜像已经制作好了,可是,镜像文件在哪,如何在生产环境下运行呢?

刚才使用docker images命令时,已经看到了生成的镜像:

我们可以使用docker save命令将镜像保存到指定的文件中,保存的文件是一个.tar格式的压缩文件:

将hello.tar复制到生产环境的机器上,然后执行导入命令:

就可以使用了。

关于dockerbusybox和的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

标签列表