由于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版本。 2 Docker架构分析内容安排 本文的目的是:在理解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 ~]# yum install docker-engine Loaded plugins: fastestmirror, langpacks dockerrepo _64 0:1.9.1-1.el7.centos will be installed --> Processing Dependency: docker-engine-selinux >= 1.9.1- .x86_64.rpm | 69 kB 00:00:00 (2/ libsemanage-python-2.1.10-18.el7.x86_64 2/ -6.el7.noarch 2/
的设计是单机的,不是分布式的 Docker的设计是Client-Server模式的,平时我们用的docker这个命令被分散到 https://github.com/docker/cli 这个仓库去了 从命令行进入 protoAddr := cli.Config.Hosts[i] protoAddrParts := strings.SplitN(protoAddr, "://", 2) = 2 { return fmt.Errorf("bad format %s, expected PROTO://ADDR", protoAddr) } 那我们要找一个新的入口点去跟踪 代码,所以我选择 docker run。从 docker/cli 库翻了翻,发现最后是调用 containers/create 这样一个接口。 for _, v := range daemon.configStore.GraphOptions { opt := strings.SplitN(v, "=", 2)
启动运行 参照之前写的博客windows7 安装docker,点击Docker Quickstart Terminal图标启动,不能正常启动。 ? Docker Quickstart Terminal启动后会复制C:\Users\Administrator\.docker\machine\cache下的镜像boot2docker.iso到C:\Users 检测到默认的镜像不是最新版本的,需要到https://github.com/boot2docker/boot2docker/releases下载最新的,并复制到C:\Users\Administrator 比较烦恼的是boot2docker.iso下载需要访问Github,用Chrome下载很慢,得一个小时。 翻了一下墙,重新点击Docker Quickstart Terminal图标,会自动下载最新版本的boot2docker.iso,速度很快啊。。。 ? 下载成功了。。。。 ? docker启动成功。
启动运行 参照之前写的博客windows7 安装docker,点击Docker Quickstart Terminal图标启动,不能正常启动。 ? Docker Quickstart Terminal启动后会复制C:\Users\Administrator\.docker\machine\cache下的镜像boot2docker.iso到C:\Users 检测到默认的镜像不是最新版本的,需要到https://github.com/boot2docker/boot2docker/releases下载最新的,并复制到C:\Users\Administrator 比较烦恼的是boot2docker.iso下载需要访问Github,用Chrome下载很慢,得一个小时。 翻了一下墙,重新点击Docker Quickstart Terminal图标,会自动下载最新版本的boot2docker.iso,速度很快啊。。。 ? 下载成功了。。。。 ? docker启动成功。
使用镜像 1.1 在Docker Hub上查找镜像 我们查找一下之前博客里面,推送到Docker Hub里面的bage88/docker-demo,能看到有2个仓库,第一个就是我们上次上传的镜像。 1.2 拉取镜像到本地机器 在我们本地虚拟机上执行如下命令,获取该镜像: docker pull bage88/docker-demo 1.3 了解我们获取的镜像 下载完成之后,通过docker images root@ubuntu-512mb-sfo2-01-gfw:~# docker inspect 3172d41e1212 [ { "Id": "sha256:3172d41e12122d18216cd3179292e3840963e3d80e6ad70046c7270e85342f11 " ] } } ] 2. 执行命令 root@ubuntu-512mb-sfo2-01-gfw:~# docker run -t -i bage88/docker-demo /bin/bash root@94a1f3581ebb
作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势。 首先,Docker 容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多。 其次,Docker 对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器。 传统虚拟机方式运行 10 个不同的应用就要起 10 个虚拟机,而Docker 只需要启动 10 个隔离的应用即可。具体说来,Docker 在如下几个方面具有较大的优势。 • docker容器很轻!很快! 三、更轻松的迁移和扩展 Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。
2.docker logout 登出一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub 示例: docker logout logout 3.docker search v1: digest: sha256:f83b2ffd963ac911f9e638184c8d580cc1f3139d5c8c33c87c3fb90aebdebf76 size: 948 镜像管理相关命令 [root@localhost docker-for-web]# docker build -t ctf-sqli:1 . 2.docker images 通过docker images命令可以列出主机上的镜像 Untagged: ubuntu:16.04 Untagged: ubuntu@sha256:58d0da8bc2f434983c6ca4713b08be00ff5586eb5cdff47bcde4b2e88fd40f88 Deleted: sha256:5c6983f277f26021b5e38501fdf06fa29f7158a93641f3f10aedbdc9869121d0 Deleted: sha256:aa54c2bc12290df2851a94b8834cae75e4627219d2b423d4d3db8b0a497e79a2
从Docker Hub拉取镜像 [root@h103 ~]# docker pull ubuntu Using default tag: latest latest: Pulling from library /ubuntu 92ec6d044cb3: Verifying Checksum 2ef91804894a: Download complete f80999a1f330: Download complete 6cc0fc2a5ee3: Download complete Pulling repository docker.io/library/ubuntu 8693db7e8a00: Download Important: This registry version will not be supported in future versions of docker. 683f9cd9cf88 2 weeks ago 224.5 MB hello-world latest 0a6ba66e537a
两种方式: 1、 curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io 2、 vi /etc/docker/daemon.json { "registry-mirrors": ["https://registry.docker-cn.com"] } service docker restart
准备 要在每一台服务器上安装Docker 相关的安装过程可以参考 Docker 基础 关键是要使用如下配置启动服务 [root@h104 ~]# docker daemon -H tcp://0.0.0.0 状态 安装完成后,可以使用 hello-world 镜像来检测是否运行成功 [root@h104 ~]# docker run hello-world Hello from Docker. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. 3. The Docker daemon streamed that output to the Docker client, which sent it to your terminal.
CentOS7 下安装 Docker # 卸载旧版本 yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine # 安装 yum utils yum install -y yum-utils # 添加镜像 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 建立缓存 yum makecache fast # 安装 docker yum install docker-ce docker-ce-cli containerd.io
run -it centos bash #进入容器 [root@4f1f1ca319f2 /]# [root@4f1f1ca319f2 /]# [root@4f1f1ca319f2 / /nginx latest e445ab08b2be 6 days ago 126 MB docker.io/alpine latest b7b28af77ffe 2 weeks ago 5.58 MB docker.io/centos latest /nginx latest e445ab08b2be 6 days ago 126 MB docker.io/alpine latest b7b28af77ffe 2 weeks ago 5.58 MB docker.io/centos latest
附 yum 源地址:https://repo.mysql.com/yum 2、编译源码生成 rpm 2.1、在 ARM 环境安装依赖 yum install -y cmake time libaio-devel zlib-devel \ cyrus-sasl-devel openldap-devel perl-Env gcc gcc-c++ make rpm-build autoconf perl-JSON 2.2、下载源码 -5.7.40-1.el7.src.rpm rpm -ivh mysql-community-minimal-5.7.40-1.el7.src.rpm 2.3、修改源码配置 cd /root/rpmbuild compat ENTRYPOINT ["docker-entrypoint.sh"] EXPOSE 3306 33060 CMD ["mysqld"] 2、docker-entrypoint.sh < "$f"; echo ;; *.sql.bz2) mysql_note "$0: running $f"; bunzip2 -c "$f" | docker_process_sql
命令,并且不匹配其它子命令时,则这个根命令将得到执行,也即打印docker命令的用法。 cmd.AddCommand(newDaemonCommand()) 将DaemonCommand添加为根命令的子命令,这样docker daemon命令即可启动docker daemon。 newDaemonCommand函数定义在cmd/docker/daemon_unix.go里。 Client命令行示例 这里我拿一个非常简单的子命令示例,来说明Docker客户端是如何运行的。 上面我仅分析了docker system info的执行过程,其它命令也很类似。
2> 在docker的伪终端中使用 # 符号,我们使用 $ 替代。 $ sudo apt-get install schedtool libxml2 libxml2-utils xsltproc squashfs-tools 3> 安装其他需要的库 >> $ sudo 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> 开始编译源码
alias dfimage="docker run -v /var/run/docker.sock:/var/run/docker.sock --rm alpine/dfimage" dfimage - 解决方案是:修改源码中 broker、client、openmessaging、remoting、tools 等 distribution 下的相关源码并重新编译。 2、原 Dockerfile 中替换了原有的 runserver-customize.sh、runbroker-customize.sh 文件,可以从 RocketMQ 4.9.4 的 AMD 64 镜像中获取 附 rocketmq 项目地址:https://github.com/apache/rocketmq 2、编译源码生成 rpm 2.1、在 ARM 环境安装依赖 yum install -y maven 4.9.4.tar.gz 2.3、编译源码生成 jar 包 tar -xzvf rocketmq-all-4.9.4.tar.gz cd rocketmq-rocketmq-all-4.9.4 # 修改以下源码文件中的超时时间为