今天我们来解惑有关(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,您的关注是给小编最大的鼓励。
本站所发布的文字与图片素材为非商业目的改编或整理,版权归原作者所有,如侵权或涉及违法,请联系我们删除
热门信息
阅读 ()
1 注册微信号怎么注册第二个阅读 ()
2 怎么把照片变成卡通头像阅读 ()
3 手机越充越少电怎么解决