由于github网站速度太慢,可以采用码云上的代码路径: moby:https://gitee.com/mirrors/moby.git 开启Docker学习之路,需要脚踏实地,从源码开始;网上也有一些关于 Docker源码的学习的资料,但是分析的源码都是比较老的版本,所以这里就班门弄斧一下,将自己学习Docker的总结一下,也是方便自己复习; Goland代码配置: 在GOPATH的目录下:src/github.com /docker/: git clone https://gitee.com/mirrors/moby.git 然后在Goland中添加对应的目录:
本书是一本引导读者深入了解Docker实现原理的技术普及读物,主要目标是通过对Docker架构和源代码的详细讲解和解剖,帮助读者对Docker的底层实现有一个全面的理解。 作者通过大量的流程图和代码片段对Docker的架构、Docker的重要模块,特别是对Swarm、Machine和Compose这三个模块进行了详细介绍和深度剖析,无论是Docker的使用者还是开发者,通过阅读此书都可以对 Docker有更深刻的理解,能够更好的使用或者开发Docker。
文章来源: InfoQ推出了《Docker源码分析》系列文章。 本系列文章从源码的角度出发,详细介绍Docker的架构、Docker的运行以及Docker的卓越特性。本文是Docker源码分析系列的第一篇——Docker架构篇。 1.2 Docker版本信息 本文关于Docker架构的分析都是基于Docker的源码与Docker相应版本的运行结果,其中Docker为最新的1.2版本。 分析过程中主要按照以下三个步骤进行: Docker的总架构图展示 Docker架构图内部各模块功能与实现分析 以Docker命令的执行为例,进行Docker运行流程阐述 3 Docker总架构图 学习Docker 的源码并不是一个枯燥的过程,反而可以从中理解Docker架构的设计原理。
这是在docker v1.10.3版本的使用过程中,使用convoy 作为volume driver,在一次docker volume remove失败时,使我不得不对docker volume 的源码做一次分析 当时考虑是 docker 缓存没有及时清理的问题,于是得去分析下相关代码。 ##docker volume create源码分析: ? 如果此时,convoy和docker daemon缓存信息不同步,则create操作不能如愿了。 ##docker volume remove源码分析: ? 如果此时convoy 中volume数据和docker daemon 缓存中volume数据不一致,也不会得到纠正。 ##docker volume list源码分析: ? 之后docker再收到删除该volume的请求时,docker会调用convoy删除,而convoy中已经没有这个volume了,于是向docker返回失败的信息,因而docker也返回失败。
启动Docker [root@h103 ~]# service docker start Redirecting to /bin/systemctl start docker.service [root ● docker.service - Docker Application Container Engine Loaded: loaded (/usr/lib/systemd/system/docker.service Main PID: 3200 (docker) CGroup: /system.slice/docker.service └─3200 /usr/bin/docker daemon on /var/run/docker.sock" Jan 19 17:20:05 h103 docker[3200]: time="2016-01-19T17:20:05.917640473+08:00 msg="Default bridge (docker0) is as...ddress" Jan 19 17:20:10 h103 docker[3200]: time="2016-01-19T17
比如是否设置了"always"呀 ├── runconfig ├── vendor # go的vendor机制 └── volume # volume相关 负责存储配置的一般都叫 xx Store Docker 的设计是单机的,不是分布式的 Docker的设计是Client-Server模式的,平时我们用的docker这个命令被分散到 https://github.com/docker/cli 这个仓库去了 从命令行进入 入口在 cmd/dockerd/docker.go: func newDaemonCommand() *cobra.Command { opts := newDaemonOptions FullTimestamp: true, }) // LCOW: Linux Containers On Windows. ref: https://blog.docker.com 那我们要找一个新的入口点去跟踪 代码,所以我选择 docker run。从 docker/cli 库翻了翻,发现最后是调用 containers/create 这样一个接口。
Docker 添加国内镜像源 windows 版 Step1 打开 Docker for windows { "registry-mirrors": [ "https://7bezldxe.mirror.aliyuncs.com /", "https://docker.mirrors.ustc.edu.cn/", "https://hub-mirror.c.163.com", "https://registry.docker-cn.com "experimental": false, "features": { "buildkit": true } } Linux 版 Step1 创建配置文件 vi /etc/docker /daemon.json 然后将上述 json 输入 step2 重启 docker 服务 systemctl restart docker
inspect 3.docker ps 常用的选项有-a和-l,-a选项可以查看所有的容器,包括停止的容器;-l选项只查看最新创建的容器,包括不在运行的容器 docker ps [OPTIONS] 4.docker rename 重命名容器 docker rename CONTAINER NEW_NAME 示例: [root@localhost ~]# docker rename 48432e783e65 top 7.docker cp 用于容器与主机之间的数据拷贝 docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|- docker cp [OPTIONS 8.docker diff 检查容器里文件结构的更改 docker diff [OPTIONS] CONTAINER 示例: [root@localhost ~]# docker diff 5198ec963e43 history 3.docker logs 获取容器的日志 docker logs [OPTIONS] CONTAINER -f : 跟踪日志输出 --since :显示某个开始时间的所有日志 -t
下载 Swarm 镜像 Docker 将 Swarm 也做成了镜像,可以通过 Docker Swarm 的官方镜像来构建集群 Tip: 第一次尝试使用任何镜像时,Docker 引擎都会去本地的镜像库里找 ,如果有,就使用本地的,如果没有就去Docker Hub里找,如不指定版本,默认会使用 *:latest ,如果本地不是最新的,也会从 Docker Hub 下载 使用 docker pull swarm 的方式下载 Swarm 镜像 [root@h104 ~]# docker images REPOSITORY TAG 81127fe5e9b4: Pull complete Digest: sha256:5f2b4066b2f7e97a326a8bfcfa623be26ce45c26ffa18ea63f01de045d2238f3 但是官方不推荐这么用,因为有配置编译安装等一系列“脏活”要干(实在是感兴趣的话可以参考 Swarm binary ,主要面向贡献代码的开发人员),相较而言直接使用 Swarm的镜像有如下好处: 不必操心源码的编译
×××地址 docker distibution分发工具包 https://github.com/docker/distribution git clone源码 git clone https://github.com pull 192.168.9.223:5000/sshd:v3 v3: Pulling from sshd Digest: sha256:46d7064f74b2fd47be7014f02e81d9e96bdafb1a07bc31dccc5d912e8f26c400 Status: Downloaded newer image for 192.168.9.223:5000/sshd:v3 [root@dockers ~]# docker images REPOSITORY fdfec675a68c 5 days ago 218MB [root@dockers ~]# docker tag 192.168.9.223:5000/sshd:v3 " ] } 以上配置,方式一 与方式二都需要 # 方式一: 运行一个自动获取地址的容器 [root@dockers ~]# docker run -dit centos 81e9afed70b68a74d4c1e28919a3e0f3df8afdc5d06c74b74fc54ec9b879180f
推送镜像到Registry [root@h103 ~]# docker push localhost:5000/myfirstimage The push refers to a repository 0 [root@h103 ~]# ---- 销毁Registry registry和其它实例没有任何区别,使用stop然后rm就可以便捷地进行销毁 [root@h103 ~]# docker ps registry /etc/d" 22 hours ago Up 2 minutes 0.0.0.0:5000->5000/tcp regi [root@h103 ~]# docker stop 7716d7899161 7716d7899161 [root@h103 ~]# docker ps -a CONTAINER ID IMAGE rm 7716d7899161 7716d7899161 [root@h103 ~]# docker ps -a CONTAINER ID IMAGE COMMAND
附 yum 源地址:https://repo.mysql.com/yum 2、编译源码生成 rpm 2.1、在 ARM 环境安装依赖 yum install -y cmake time libaio-devel -5.7.40-1.el7.src.rpm rpm -ivh mysql-community-minimal-5.7.40-1.el7.src.rpm 2.3、修改源码配置 cd /root/rpmbuild -5.7.40.tar.gz && rm -rf mysql-5.7.40.tar.gz vim mysq1-5.7.40/sql/mysqld.cc,添加 #include sed -i "s#-O3# rpm rpmbuild -bb /root/rpmbuild/SPECS/mysql.spec 生成的 rpm 文件位于 /root/rpmbuild/RPMS/aarch64 目录下 3、构建镜像 _is_sourced; then _main "$@" fi 3、my.cnf # For advice on how to change settings please see #
有一项重要的参数 -v 目录挂载,就是让容器内部目录和宿主主机目录关联起来,这样就可以直接操作宿主主机目录而不用再操作具体容器了 比如在2中,我们要发布一个war包,是通过 sudo docker 肯定有, 没有 我就不会在这里写这些玩意儿了 sudo docker run -p 8822:8080 --name tomcat_xiao_volume -v /home/xiaochangwei/test 9f2c1a649a75 2 hours ago 108MB nginx latest 3f8a4339aadd 9 days ago 108MB ubuntu 16.04 00fd29ccc6f1 3 weeks 2636bd14}, StubPropertySource@1385884584 {name='servletContextInitParams', properties=java.lang.Object@33ec3b2
命令,并且不匹配其它子命令时,则这个根命令将得到执行,也即打印docker命令的用法。 cmd.AddCommand(newDaemonCommand()) 将DaemonCommand添加为根命令的子命令,这样docker daemon命令即可启动docker daemon。 newDaemonCommand函数定义在cmd/docker/daemon_unix.go里。 Client命令行示例 这里我拿一个非常简单的子命令示例,来说明Docker客户端是如何运行的。 上面我仅分析了docker system info的执行过程,其它命令也很类似。
print-foreign-architectures # 若支持,输出 i386 2> 手动开启支持 >> $ sudo dpkg --add-architecture i386 >> $ sudo apt-get update 3> bc zip curl lzop >> $ sudo apt-get install schedtool libxml2 libxml2-utils xsltproc squashfs-tools 3> hours ago 971 MB ubuntu 14.04 b969ab9f929b 5 weeks ago 188 MB 使用镜像编译Android系统源码 1> 准备系统源码 在宿主机上,创建源码目录,如 /home/android 目录,并放入Android系统源码。 2> 挂载源码目录到docker容器中 $ docker run -it -v /home/android:/home/android 49df00985bd1 /bin/bash 3> 开始编译源码
今天是Docker讨论系列的终章,我们先从docker的命令开始介绍,再说明Docker run命令关键参数... Engine:docker引擎 2. 与Engine相关的命令 Docker version 查看docker版本 Docker info 显示 Docker 系统信息,包括镜像和容器数. Docker events 从服务器获取实时事件 3. 3. -h –name -h指定容器中的主机名,--name指定容器的名字 ? ? 4. -p -p 可以将主机上的端口映射到容器中。 如果我们在一个总限额为2000MB的stress容器中启动3个占用500MB的进程,总共1500MB,那么情况如下: ? 在容器中是运行超过容器内存限额的进程的: ?
如果您有其他想要了解的,欢迎私信联系我~ 背景介绍 接上篇,笔者完成公司 MySQL 适配 ARM 64 架构工作后,马上又着手推进 RocketMQ 适配 ARM 64 架构,同样由于 Docker alias dfimage="docker run -v /var/run/docker.sock:/var/run/docker.sock --rm alpine/dfimage" dfimage - 解决方案是:修改源码中 broker、client、openmessaging、remoting、tools 等 distribution 下的相关源码并重新编译。 4.9.4.tar.gz 2.3、编译源码生成 jar 包 tar -xzvf rocketmq-all-4.9.4.tar.gz cd rocketmq-rocketmq-all-4.9.4 # 修改以下源码文件中的超时时间为 包位于 rocketmq-rocketmq-all-4.9.4/<distribution>/target 目录下,如 rocketmq-rocketmq-all-4.9.4/broker/target 3、
开发环境构建 Nebula Graph 依赖较多,且一些第三方库需本地编译安装,为了方便开发者本地编译项目源码, Nebula Graph 官方为大家提供了一个预安装所有依赖的 docker 镜像。 $ docker pull vesoft/nebula-dev 运行 Docker 并挂载 Nebula 源码目录到容器的 /home/nebula 目录 $ docker run --rm 容器之后,重新键入上述的命令,我们在 vesoft-inc/nebula-dev-docker 中提供了一个简单的 build.sh 脚本,可通过 . 使用 cmake 构建 Nebula 工程 docker> mkdir _build && cd _build docker> cmake .. && make -j2 docker> 修改后,点击 Apply & Restart 按钮, 重启 Docker。
1.工具介绍 docker-monitor-injector是携程开源的一个修正docker容器内监控数据的工具,通过劫持open,fopen等linux库函数,重算/proc/meminfo,/proc 下面将对其进行源码分析,并整理出各个数据的监控修正算法。 2.原理 图片描述 ? 3.函数调用关系 ? tot_ticks, rq_ticks); 6.参考项目 https://linuxcontainers.org/lxcfs/introduction/ https://github.com/CtripCloud/docker-monitor-injector
本文是基于docker 1.10.3版本的源码,对docker stats命令进行源码分析,看看docker stats命令输出的数据是从cgroups fs中怎么怎么计算出来的。 $ docker stats nginx-test |CONTAINER|CPU % |MEM USAGE / LIMIT|MEM %|NET I/O |BLOCK I/O | |---|---|--- client相关代码入口可参考:/docker/docker/api/client/stats.go#141 docker daemon相关代码入口可参考:/docker/docker/daemon/ daemon.go#1474 ##源码分析结果 ###Cpu数据: docker daemon会记录这次读取/sys/fs/cgroup/cpuacct/docker/[containerId]/cpuacct.usage /blkio/docker/[containerId]/blkio.io_service_bytes_recursive的值返回; 如果没有,就去读取/sys/fs/cgroup/blkio/docker