1.Docker 源码分析
2.dockerexeccontainer后面的源码/bin/bash怎么理解?
3.docker中的exec和attach命令的区别?
4.exec...çdockerä¸çEXEC
5.Docker源码安装附内网镜像安装演示
6.docker进入容器的命令
Docker 源码分析
本文旨在解析Docker的核心架构设计思路,内容基于阅读《Docker源码分析》系文章后,源码整理的源码核心架构设计与关键部分摘抄。Docker是源码Docker公司开源的基于轻量级虚拟化技术的容器引擎项目,使用Go语言开发,源码遵循Apache 2.0协议。源码专题专栏源码Docker提供快速自动化部署应用的源码能力,利用内核虚拟化技术(namespaces及cgroups)实现资源隔离与安全保障。源码相比虚拟机,源码Docker容器运行时无需额外的源码系统开销,提升资源利用率与性能。源码Docker迅速获得业界认可,源码包括Google、源码Microsoft、源码VMware在内的源码领导者支持。Google推出Kubernetes提供Docker容器调度服务,驾校通app源码Microsoft宣布Azure支持Kubernetes,VMware与Docker合作。Docker在分布式应用领域获得万美元的C轮融资。
Docker的架构主要由Docker Client、Docker Daemon、Docker Registry、Graph、Driver、libcontainer以及Docker container组成。
Docker Client:用户通过命令行工具与Docker Daemon建立通信,发起容器管理请求。
Docker Daemon:后台运行的系统进程,接收并处理Docker Client请求,通过路由与分发调度执行相应任务。
Docker Registry:存储容器镜像的启动上扬源码仓库,支持公有与私有注册。
Graph:存储已下载镜像,并记录镜像间关系的数据库。
Driver:驱动模块,实现定制容器执行环境,包括graphdriver、networkdriver和execdriver。
libcontainer:库,使用Go语言设计,直接访问内核API,提供容器管理功能。
Docker container:Docker架构的最终服务交付形式。
架构内各模块功能如下:
Docker Client:用户与Docker Daemon通信的客户端。
Docker Daemon:后台服务,接收并处理请求,数据精灵官方源码执行job。
Graph:存储容器镜像,记录镜像间关系。
Driver:实现定制容器环境,包括管理、网络与执行驱动。
libcontainer:库,提供内核访问,实现容器管理。
Docker container:执行容器,提供隔离环境。
核心功能包括从Docker Registry下载镜像、创建容器、运行命令与网络配置。
总结,下载阅读spark源码通过Docker源码学习,深入了解其设计、功能与价值,有助于在分布式系统实现中找到与已有平台的契合点。同时,熟悉Docker架构与设计思想,为云计算PaaS领域带来实践与创新启发。
dockerexeccontainer后面的/bin/bash怎么理解?
理解docker exec 后面的/bin/bash 需要从两方面入手。首先,docker exec 命令的用途在于容器中执行命令,而命令的执行取决于后续参数。
/bin/bash 是 Linux 中的一种常用脚本,用于解释执行 Linux 命令。不同镜像可能支持不同的 shell 脚本,因此可根据需要使用。
结合来看,docker exec 后面的/bin/bash 指令意味着在支持此脚本的容器中执行相应命令。
举例说明:执行 docker exec -it ubuntu /bin/bash 命令。这将使我们进入 ubuntu 容器的 /bin/bash 脚本执行模式。此时,我们仿佛直接登录到了容器内部,可通过 shell 与容器进行交互,执行各种 Linux 命令。
docker中的exec和attach命令的区别?
在Docker环境中,exec和attach命令的主要区别在于它们如何与容器交互。当使用docker attach时,用户只能与一个shell实例互动。若要启动容器中的新终端窗口,需要使用docker exec。这意味着attach提供了直接访问容器终端的便捷方式,而exec则用于在运行的容器上启动新的进程。
如果Docker容器在启动时使用/bin/bash,attach命令就能直接访问容器内部的bash环境。然而,如果容器使用了不同的启动命令,attach将无法直接进入容器内部。此时,需要通过exec命令在容器内部创建bash实例。
attach的主要功能是附着到已运行的容器,而不会在容器中创建新的进程执行额外的命令。它仅提供了一个直接与容器内部环境进行交互的通道。相比之下,exec命令不仅允许在容器上创建新进程,而且执行用户指定的命令,这使得它成为在容器中执行特定任务的强大工具。
exec...çdockerä¸çEXEC
æ们å¨åºç¨å®¹å¨çè¿ç¨ä¸ï¼æ 论æ¯å¨éè¿Dockerfileå¨è°è¯æ建éåçè¿ç¨ï¼è¿æ¯å®¹å¨è¿è¡ä¸æ®µæ¶é´æ³æ¥çå é¨ç»æï¼æ们è¿æ¯å¸æè½åæä½æ¬å°æºå¨ä¸æ ·ï¼å®æ¶çæ¥ç容å¨å é¨æ件ï¼ä»£ç æè æ¥å¿ãææ¯ä¿®æ¹æ件ï¼æ·è´æ件ç®å½ççã- 访é®å®¹å¨å é¨ï¼ç®åæ两ç§æ¹æ³
1. Dockerèªå¸¦çexecå½ä»¤ãã2. Nsenterå·¥å ·ãã- æ¥è¯´è¯´Docker exec å½ä»¤æ¹å¼è®¿é®
- å¦å¾æ示ï¼ç®åçlså½ä»¤ãLinuxç³»ç»èªå¸¦çå½ä»¤é½å¯ä»¥éè¿è¿ç§æ¹å¼è¿è¡ãæ件æ¾éä½ç½®äºï¼mvä¸ä¸ï¼æ¥çlogï¼å°±cat log.logä¸ä¸ï¼ççã
Execå ç¹æ
- ç®åçæä½ä¸è½æ»¡è¶³æ们对ä»ç好å¥...ãã- æ们è¿è¡ä¸ä¸ docker exec -ti f ps -ef
- åç°åªæ3个è¿ç¨ï¼è¿ç¨1æ¯CMDå½ä»¤å¯å¨çèæ¬;è¿ç¨2æ¯èæ¬å¯å¨çç¨åº;è¿ç¨3æ¯æ们è¿è¡ps -efçè¿ç¨ããã- åºäºå¥½å¥ï¼æådocker exec 9fe0 kill
- 容å¨ä»æ¤å°±åæ¢äº...ãã- åå æ¯ææè¿ç¨åï¼Dockerfileæå®çCMD[/run.sh]èæ¬è¿è¡ç»æï¼CMDå ¥å£å·²ç»éåºï¼å¯¼è´å®¹å¨éåºã
é®é¢è¿æ²¡ç»æ
- Kubernetesæ¯ä¸ä¸ªåºäºdockerç容å¨é群管çç³»ç»ï¼å®çä¸å¤§ç¹ç¹æ¯æ¥æReplication Controllersï¼ä»çä½ç¨ä¸»è¦æ¯ä¿ææèµ·å¨çPodæ°éä¸åï¼podéé¢è£ çæ¯containerï¼ãæçæ³å¦æ类似çkillæ容å¨å é¨çè¿ç¨ï¼é£ä¹kubernetesåºè¯¥ä¼è®©è¿ä¸ªcontaineréæ°å¯å¨ãäºæ¯å°±æ¥å¨æè¯è¯ããã- æ¶éäºä»ä»¬åºç¨äºkubernetesï¼å¹¶ä¸æä¾äºå®¢æ·ç«¯tceå¯ä»¥ä½¿ç¨execåè½ãè¿è¡ tce exec bbb-fv-zkdqz ps -ef
- tce exec bbb-fv-zkdqz kill
没æéå¯ï¼ï¼
- å次è¿è¡ tce exec bbb-fv-zkdqz ps -ef
- ååºç°äºããã- ç±æ¤å¯è§KubernentesçReplication Controllersè¿æ¯å¾å¼ºå¤§çãä¿è¯äºé群ä¸ææå®æ°éçpodå¯æ¬å¨è¿è¡ã
Docker源码安装附内网镜像安装演示
系统版本要求源码包下载
官网下载地址(download.docker.com/lin...)
我这里已docker-...tgz该版本做演示
1.下载源码包文件到本地
2.通过远程连接工具(xShell、SecureCRT等将源码包文件上载到服务器自定义目录)
3.解压文件
4.配置docker为service服务
5.添加可执行权限
注:如遇到启动不成功可通过状态查询、/var/log/messages/运行日志或直接使用dockerd命令查看错误信息,如还解决不了建议服务器重启一下在运行docker启动命令
6.配置镜像加速
7.检查安装版本内网下载镜像
注:使用docker pull拉取镜像的时候需要网络,但是项目部署一般都是在内网。内网访问不了外网,所以需要在外网环境下把需要的镜像拉取下来打包,然后拷贝到内网,载入到内网的docker
1.在外网机器上拉取mysql镜像,可以看到外网的docker已经拉取了镜像。
2.将镜像打包成tar压缩包
3.将打包好的mysql镜像包通过远程工具下载到本地
4.拷贝到内网linux服务器并载入docker
docker基础命令使用(扩展)下载镜像:(hub.docker.com/search/官网镜像地址)
docker pull [IMAGE_NAME]:[TAG] #命令格式
docker pull mysql:8.0 #下载mysql8.0镜像(不指定默认下载最新版本)
查看当前镜像版本
docker -v #查看当前安装版本
docker version #查看版本信息
docker info #查看系统信息
docker images #查看当前镜像
docker search 镜像名 #搜索镜像
镜像、容器删除
docker rm 容器ID
docker rm 容器名字
docker rmi 镜像ID
docker rmi 镜像名
docker rmi -f 镜像ID #强制删除
创建网络及数据卷
docker volume create +数据卷名称
docker volume list #查看当前数据卷信息
docker network create -d bridge +网络名称
docker network ls #查看当前网络
docker inspect containername +id #查看容器的hash值
启动、关闭容器
docker stop $(docker ps -a | awk '{ print $1}' | tail -n +2) #关闭所有容器
docker start $(docker ps -a | awk '{ print $1}' | tail -n +2) #开启所有容器
杂
docker inspect 容器ID (使用该命令重点关注容器ip) #查看容器/镜像元数据
docker exec #在运行的容器中执行命令
docker exec -it 容器ID /bin/bash #以交互模式开启伪终端
docker进入容器的命令
产品型号:ThinkpadE
系统版本:centos8
docker进入容器的命令
1、先启动一个centos容器
[root@xuegod~]#dockerpullcentos#拉取centosdocker镜像
[root@xuegod~]#dockerrun-d-it--name=xuegod-webcentos#运行一个docker实例
2、使用dockerexec进入容器
语法:dockerexec-it
查看容器ID
[root@xuegod~]#dockerps
方法1:通过容器ID
[root@xuegod~]#dockerexec-it1edef/bin/bash
root@1edef:/usr/local/apache2#exit
方法2:通过容器名称
[root@xuegod~]#dockerexec-itxuegod-web/bin/bash
root@1edef:/usr/local/apache2#exit
Docker Exec 命令详解与实践指南
Docker Exec命令详解与实践指南 Docker的Exec命令是一个强大的工具,它允许用户在运行中的容器内部执行命令,简化了管理和调试过程。本文将深入探讨这一命令的使用,并提供实用示例,帮助初学者更好地理解和运用。 Exec命令的基础是,在不进入容器的情况下,直接在容器内部执行操作,如运行shell脚本、安装软件、查看日志,甚至设置环境变量。比如:使用`docker exec -it my_container bash`启动交互式bash终端。
`docker exec -it my_container ls /app`查看目录内容。
`docker exec -d my_container python script.py`在后台运行Python脚本。
`docker exec -e MY_VAR=value my_container echo $MY_VAR`设置并输出环境变量。
使用Exec命令的一大优势在于,可以在容器中以root权限操作,避免权限问题。它提高了容器管理的效率,是Docker实用工具箱中的重要一员。 通过本文的学习,你应能掌握如何灵活运用Docker Exec,使其成为日常容器操作中的得力助手。在实际工作中,根据需求定制操作,将使你的工作更加高效。docker exec å docker attachçåºå«
Docker execä¸Docker attach
ä¸è®ºæ¯å¼åè æ¯è¿ç»´äººåï¼é½ç»å¸¸æéè¦è¿å ¥å®¹å¨çè¯æ±ã
ç®åçï¼ä¸»è¦çæ¹æ³ä¸å¤ä¹ä»¥ä¸å ç§ï¼
1. 使ç¨sshç»éè¿å®¹å¨
2. 使ç¨nsenterãnsinitç第ä¸æ¹å·¥å ·
3. 使ç¨dockeræ¬èº«æä¾çå·¥å ·
æ¹æ³1éè¦å¨å®¹å¨ä¸å¯å¨sshdï¼åå¨å¼éåæ»å»é¢å¢å¤§çé®é¢ãåæ¶ä¹è¿åäºDockeræå¡å¯¼
çä¸ä¸ªå®¹å¨ä¸ä¸ªè¿ç¨çååã
æ¹æ³2éè¦é¢å¤å¦ä¹ 使ç¨ç¬¬ä¸æ¹å·¥å ·ã
æ以大å¤æ°æ åµæ好è¿æ¯ä½¿ç¨Dockeråçæ¹æ³ï¼Dockerç®å主è¦æä¾äºDocker execå
Docker attach两个å½ä»¤ã
以ä¸å¨fedoraï¼docker1.7ä¸éªè¯ã
Docker attach
Docker attachå¯ä»¥attachå°ä¸ä¸ªå·²ç»è¿è¡ç容å¨çstdinï¼ç¶åè¿è¡å½ä»¤æ§è¡çå¨ä½ã
ä½æ¯éè¦æ³¨æçæ¯ï¼å¦æä»è¿ä¸ªstdinä¸exitï¼ä¼å¯¼è´å®¹å¨çåæ¢ã
[root@localhost temp]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e7eab0ed busybox:buildroot-. "/bin/sh" About a minute ago Up About a minute bb2
[root@localhost temp]# docker attach bb2
/ # ls
bin dev etc home lib lib linuxrc media mnt opt proc root run sbin sys tmp usr var
/ # pwd
/
/ #
Docker exec
å ³äº-iã-tåæ°
å¯ä»¥çåºåªç¨-iæ¶ï¼ç±äºæ²¡æåé 伪ç»ç«¯ï¼çèµ·æ¥åpipeæ§è¡ä¸æ ·ãä½æ¯æ§è¡ç»æãå½ä»¤
è¿åå¼é½å¯ä»¥æ£ç¡®è·åã
[root@localhost temp]# docker exec -i bb2 /bin/sh
date
Tue Jul :: UTC
echo $?
0
dir
/bin/sh: dir: not found
echo $?
使ç¨-itæ¶ï¼ååæ们平常æä½consoleçé¢ç±»ä¼¼ãèä¸ä¹ä¸ä¼åattachæ¹å¼å 为éåºï¼å¯¼è´
æ´ä¸ªå®¹å¨éåºã
è¿ç§æ¹å¼å¯ä»¥æ¿ä»£sshæè nsenterãnsinitæ¹å¼ï¼å¨å®¹å¨å è¿è¡æä½ã
[root@localhost temp]# docker exec -it bb2 /bin/sh
/ # pwd
/
/ # echo $?
0
/ # dir
/bin/sh: dir: not found
/ # echo $?
å¦æåªä½¿ç¨-tåæ°ï¼åå¯ä»¥çå°ä¸ä¸ªconsoleçªå£ï¼ä½æ¯æ§è¡å½ä»¤ä¼åç°ç±äºæ²¡æè·å¾stdin
çè¾åºï¼æ æ³çå°å½ä»¤æ§è¡æ åµã
[root@localhost temp]# docker exec -t bb2 /bin/sh
/ # pwd
hanging....
[root@localhost temp]# docker exec -t bb2 pwd
/
[root@localhost temp]# echo $?
0
[root@localhost temp]# docker exec -t bb2 dir
// :: docker-exec: failed to exec: exec: "dir": executable file not found in $PATH
[root@localhost temp]# echo $?
0
docker execæ§è¡åï¼ä¼å½ä»¤æ§è¡è¿åå¼ãï¼å¤æ³¨Docker1.3ä¼¼ä¹æBugï¼ä¸è½æ£ç¡®è¿åå½ä»¤æ§è¡ç»æï¼
[root@localhost temp]# docker exec -it bb cat /a.sh
echo "running a.sh"
exit
[root@localhost temp]# docker exec -t bb /a.sh
running a.sh
[root@localhost temp]# echo $?
[root@localhost temp]# docker exec -it bb /a.sh
running a.sh
[root@localhost temp]# echo $?
[root@localhost temp]# docker exec -i bb /a.sh
running a.sh
[root@localhost temp]# echo $?
å ³äº-dåæ°
å¨åå°æ§è¡ä¸ä¸ªè¿ç¨ãå¯ä»¥çåºï¼å¦æä¸ä¸ªå½ä»¤éè¦é¿æ¶é´è¿ç¨ï¼ä½¿ç¨-dåæ°ä¼å¾å¿«è¿åã
ç¨åºå¨åå°è¿è¡ã
[root@localhost temp]# docker exec -d bb2 /a.sh
[root@localhost temp]# echo $?
0
å¦æä¸ä½¿ç¨-dåæ°ï¼ç±äºå½ä»¤éè¦é¿æ¶é´æ§è¡ï¼docker execä¼å¡ä½ï¼ä¸ç´çå½ä»¤æ§è¡å®æ
æè¿åã
[root@localhost temp]# docker exec bb2 /a.sh
^C[root@localhost temp]#
[root@localhost temp]#
[root@localhost temp]# docker exec -it bb2 /a.sh
^C[root@localhost temp]#
[root@localhost temp]# docker exec -i bb2 /a.sh
^C[root@localhost temp]# docker exec -t bb2 /a.sh
^C[root@localhost temp]#