窝牛号

(docker创建容器的几种办法)如何交互式地创建一个Docker容器

今天我们来解惑有关(docker创建容器的几种办法)如何交互式地创建一个Docker容器,以下3个关于docker创建容器的观点希望能帮助到您找到想要的答案。

问题1:如何交互式地创建一个Docker容器

本文贡献者:【橘凉】 ,解答(docker创建容器)的问题,如果问题解决,可以关注本站!

优质回答Docker容器运行后,如何进入容器进行操作呢?起初我是用SSH。如果只启动一个容器,用SSH还能应付,只需要将容器的22端口映射到本机的一个端口即可。当我启动了五个容器后,每个容器默认是没有配置SSH Server的,安装配置SSHD,映射容器SSH端口,实在是麻烦。 我发现很多Docker镜像都是没有安装SSHD服务的,难道有其他方法进入Docker容器?

有很多种方法,包括使用 docker attach 命令或 nsenter 工具等。

使用 attach 命令有时候并不方便。当多个窗口同时 attach 到同一个容器的时候,所有窗口都会同步显示。

nsenter 可以访问另一个进程的名字空间。

为了连接到容器,你还需要找到容器的第一个进程的 PID,可以通过下面的命令获取。

PID=$(docker inspect –format “{{ .State.Pid }}” ) //将换成你的容器id

通过这个 PID,就可以连接到这个容器:

$ nsenter –target $PID –mount –uts –ipc –net –pid

更简单的,建议大家下载 .bashrc_docker,并将内容放到 .bashrc 中。

$ wget -P ~

$ echo “[ -f ~/.bashrc_docker ] && . ~/.bashrc_docker” >> ~/.bashrc; source ~/.bashrc

这个文件中定义了很多方便使用 Docker 的命令,例如 docker-pid 可以获取某个容器的 PID;而 docker-enter 可以进入容器或直接在容器内执行命令。

$ echo $(docker-pid )

$ docker-enter

附.bashrc_docker文件内容:

# Some useful commands to use docker.

# Author: yeasy@github

# Created:2014-09-25

alias docker-pid=”sudo docker inspect –format ‘{{.State.Pid}}’”

alias docker-ip=”sudo docker inspect –format ‘{{ .NetworkSettings.IPAddress }}’”

#the implementation refs from

function docker-enter() {

if [ -e $(dirname "$0")/nsenter ]; then

# with boot2docker, nsenter is not in the PATH but it is in the same folder

NSENTER=$(dirname “$0″)/nsenter

else

NSENTER=nsenter

fi

[ -z "$NSENTER" ] && echo “WARN Cannot find nsenter” && return

if [ -z "$1" ]; then

echo “Usage: `basename “$0″` CONTAINER [COMMAND [ARG]…]”

echo “”

echo “Enters the Docker CONTAINER and executes the specified COMMAND.”

echo “If COMMAND is not specified, runs an interactive shell in CONTAINER.”

else

PID=$(sudo docker inspect –format “{{.State.Pid}}” “$1″)

if [ -z "$PID" ]; then

echo “WARN Cannot find the given container”

return

fi

shift

OPTS=”–target $PID –mount –uts –ipc –net –pid”

if [ -z "$1" ]; then

# No command given.

# Use su to clear all host environment variables except for TERM,

# initialize the environment variables HOME, SHELL, USER, LOGNAME, PATH,

# and start a login shell.

#sudo $NSENTER “$OPTS” su – root

sudo $NSENTER –target $PID –mount –uts –ipc –net –pid su – root

else

# Use env to clear all host environment variables.

sudo $NSENTER –target $PID –mount –uts –ipc –net –pid env -i $@

fi

fi

}

以上就是窝牛号小编解答贡献者:(橘凉)解答的关于“如何交互式地创建一个Docker容器”的问题了,不知是否已经解决你的问题?如果没有,下一篇内容可能是你想要的答案,下面继续解析下文用户【体温㎝╮】贡献的“docker的容器常规操作”的一些相关疑点做出分析与解答,如果能找到你的答案,可以关注本站。

问题2:docker的容器常规操作

热心用户提供:【体温㎝╮】 ,解答(docker创建容器)的问题,如果问题解决,可以关注本站!

优质回答解释:创建一个容器,但容器处于停止状态

解释:启动容器

解释:

-t : 让Docker分配一个伪终端并绑定到容器的标准输入上

-i: 让容器的标准输入保持打开

-d: 让Docker容器在后台以守护态运行

解释:

-details:打印详细信息

-f,-follow:保持持续输出

-since string:输出从某个时间开始的日志

-tail string:输出最近的若干日志

-t,-timestamps:输出时间戳信息

-until string:输出某个时间之前的日志

解释:暂停容器,暂停后,容器处于paused状态

解释:将paused状态的容器恢复至运行状态

解释: 终止一个运行状态的容器,但是这个终止不是立即执行的。该命令会先向容器发送一个SIGTERM信号,等待一段超时时间(默认为10s)后,再发送SIGKILL信号终止容器,而终止容器的关键就在于SIGKILL信号。

解释: 终止一个运行状态的容器,但是这个终止是立即执行的。该命令直接发送SIGKILL信号强行终止容器。

解释: 重启容器

解释:进入容器。使用这个命令有时候并不方便,当多个窗口同时attach到同一个容器的时候,所有窗口都会同步显示;当某个窗口因命令阻塞时,其他窗口也无法执行操作;默认使用CTRL+q或者CTRL+p退出容器

解释:

-d,--detach:在容器中后台执行命令

--detach-keys="":指定将容器切回后台的案件

-e,--env=[]:指定环境变量列表

-i,--interactive=true|false:打开标准输入接收用户输入命令,默认值为false

--privileged=true|false:是否给执行命令以高权限,默认值为false

-t,--try=true|false:分配伪终端,默认值为false

-u,--user="":执行命令的用户名或ID

解释:

删除处于退出或者终止状态的容器

-f,--force=false:是否强行终止并删除一个处于运行状态的容器

-l,--link=false:删除容器的链接,但保留容器

-v,--volumns=false:删除容器挂载的数据卷

解释:导出容器。导出一个已经创建的容器到文件,不管此时这个容器是否处于运行状态。在这里如果把export换成save,再把af18换成镜像名称:tag,就是导出镜像的命令了。但是这两个命令的区别在于:docker export命令丢弃了原容器的历史信息及元数据,而docker save命令会保留原文件的历史信息。

解释:将导出的文件变成镜像。当然,这个也可以用docker load命令来执行。

解释:查看容器具体信息,比如:容器ID,创建时间,路径,状态,镜像,配置等

解释: 查看容器内进程信息

解释:查看容器的内存、CPU、存储、网络等使用情况

-a,-all:输出所有容器统计信息

-format string: 格式化输出信息

-no-stream:不持续输出,默认会自动更新持续实时结果

-no-trunc:不截断输出信息

解释:第一行命令为将test容器的temp文件夹复制到主机的data文件夹下

第二行的命令为将主机的data文件夹复制到test容器的tmp文件夹下

解释:查看容器内的数据修改

解释:查看test容器的端口映射情况

解释:修改容器的一些运行时配置。主要是一些资源限制配额。

上文就是窝牛号小编解答贡献者:(体温㎝╮)贡献的关于“docker的容器常规操作”的问题了,不知是否已经解决你的问题?如果没有,下一篇内容可能是你想要的答案,接下来继续介绍下文用户【心瘾成病】分析的“【docker】docker的容器创建与管理过程”的一些相关疑点做出分析与解答,如果能找到你的答案,可以关注本站。

问题3:【docker】docker的容器创建与管理过程

贡献用户名:【心瘾成病】 ,现在由窝牛号小编为你解答与【docker创建容器】的相关内容!

优质回答# yum -y install  docker  docker-ce-cli   containerd.io

# rpm -qa | grep container

# rpm -qa | grep docker

# rpm -ql docker-ce-cli | grep bin

# rpm -ql docker-ce | grep bin

# rpm -ql containerd.io | grep bin 

# systemctl status docker

# systemctl status containerd

/var/run/docker.sock

/run/containerd/containerd.sock

/usr/bin/docker 和 /usr/bin/dockerd 就是命令行客户端和daemon

dcocker的架构是 C/S 模式

docker-containerd

docker-containerd-ctr

docker-containerd-shim

 docker-init

 docker-proxy

 docker-runc 

其实最简单的方式,就是加个命令行参数 --help 看看他们的简介。

可以看出来,docker-init, docker-containerd-shim 和 docker-proxy 没有在帮助里告诉我们是干什么的,其他的都有:

docker-containerd: 高性能容器运行时

docker-containerd-ctr: docker-containerd 的命令行客户端

docker-runc: 运行容器的命令行工具

如果去搜索一番,就会发现:docker-containerd 就是  containerd ,而 docker-runc 就是  runc 。

containerd是真正管控容器的daemon,执行容器的时候用的是runc。

为什么 要分的七零八散呢?

我估计其中主要的原因是防止docker垄断,因此把容器标准独立出来,就有了  runtime-spec ,然后有了 runc ,然后有了 containerd (此处发展历史没有考究,并不关心)。

可以看出来,docker本身其实已经被剥离干净了,只剩下docker自身的一些特色功能了,真正容器的管控都在containerd里实现。 

所以接下来介绍的顺序是 runc, containerd, shim, docker-init, docker-proxy。

runc是标准化的产物,为了防止一家商业公司主导容器化标准,因此又了open containers组织,因此,创建容器,其实最终通过runc就可以了。

dockerd 有个子进程,是 containerd,然后 containerd 有子进程。

从  官方仓库  的描述可以看出来,其实 containerd 就包含了我们常用的 docker 的命令:

增删查改容器

增删查改镜像

也就是说,如果我们要对容器进行操控,直接使用 containerd 其实就够了。

说明: 如果没有单独起一个containerd,而是使用了 docker-containerd,通过 ps aux | grep docker 发现它使用了 /var/run/docker/containerd/containerd.toml 这个配置文件,而监听路径就写在里面。

shim的翻译是垫片,就是修自行车的时候,用来夹在螺丝和螺母之间的小铁片。

关于shim本身,网上介绍的文章很少,但是作者在 Google Groups 里有解释到shim的作用:

1. 允许runc在创建&运行容器之后退出

2. 用shim作为容器的父进程,而不是直接用containerd作为容器的父进程,是为了防止这种情况:当containerd挂掉的时候,shim还在,因此可以保证容器打开的文件描述符不会被关掉

3. 依靠shim来收集&报告容器的退出状态,这样就不需要containerd来wait子进程

因此,使用shim的主要作用,就是 将containerd和真实的容器(里的进程)解耦 ,这是第二点和第三点所描述的。

而第一点,为什么要允许runc退出呢? 

因为,Go编译出来的二进制文件,默认是静态链接,因此,如果一个机器上起N个容器,那么就会占用M*N的内存,其中M是一个runc所消耗的内存。 但是出于上面描述的原因又不想直接让containerd来做容器的父进程,因此,就需要一个比runc占内存更小的东西来作父进程,也就是shim。但实际上, shim仍然比较占内存( 参考这里 )。

我们都知道UNIX系统中,1号进程是init进程,也是所有孤儿进程的父进程。

而使用docker时,如果不加 --init 参数,容器中的1号进程 就是所给的ENTRYPOINT。

而加上 --init 之后,1号进程就会是  tini 。

在entrypoint.sh中使用Tini的优势是什么?

用来做容器和宿主机之间的端口映射,其底层是使用iptables来完成的。

The docker-proxy

docker本身而言包括了,docker client和dockerd(docker daemon),dockerd本身实属是对容器相关操作的api的最上层封装,

直接面向操作用户。

dockerd

dockerd本身实属是对容器相关操作的api的最上层封装,直接面向操作用户。

containerd

dockerd实际真实调用的还是 containerd的api接口(rpc方式实现 ),containerd是dockerd和runc之间的一个中间交流组件。

containerd-shim

containerd-shim是一个运行的容器的真实垫片载体,每启动一个容器都会起一个新的docker-shim进程。

他直接通过指定的三个参数:容器id,boundle目录(containerd的对应某个容器生成的目录,一般位于:/var/run/docker/libcontainerd/containerID),运行二进制(默认为runc)来调用runc的api创建一个容器(比如创建容器:最后拼装的命令如下:runc create  )

runc

runc是一个命令行工具端,根据oci(开放容器组织)的标准来创建和运行容器。

1. docker 与 dockerd 通过/var/run/docker.sock 通讯

2. dockerd通过 grpc 与containerd模块通信,dockerd由libcontainerd负责和containerd进行交换,dockerd与containerd通信socket文件为 /run/containerd/containerd.sock

3. containerd在dockerd启动时 被启动 ,然后containerd启动grpc请求监听,containerd处理grpc请求,根据请求做相应动作

4. 若是start或是exec容器,containerd拉起一个 container-shim ,并进行相应的操作

5. container-shim拉起后,start/exec/create拉起runC进程,通过exit、control文件和 containerd 通信,通过父子进程关系和SIGCHLD监控容器中进程状态

6. 在整个容器生命周期中,containerd通过epoll监控容器文件,监控容器事件

Docker组件介绍(一):runc和containerd

Docker组件介绍(二):shim, docker-init和docker-proxy

关于docker启动一个容器后进程

今天有关内容《(docker创建容器的几种办法)如何交互式地创建一个Docker容器》先分享到这里了,如果想要了解更多,请关注baike.ccv168.com,您的关注是给小编最大的鼓励。

本站所发布的文字与图片素材为非商业目的改编或整理,版权归原作者所有,如侵权或涉及违法,请联系我们删除

窝牛号 wwww.93ysy.com   沪ICP备2021036305号-1