手工编译安装docker
㈠ Docker编译文件安装
docker安装包地址: https://download.docker.com/linux/static/stable/x86_64/
大家可以根据自己的需求选择适应的版本,我选择的版本的【20.10.10】
docker.service文件内容如下:
镜像导出命令:
我们可以查看镜像的名称和版本:
所以这里的具体的导出命令是:
将tar文件上传到内网docker服务器,使用如下命令导入镜像文件:
㈡ 请教,如何在ubuntu环境下编译Docker的安装文件
Docker 的基本用法
在本节中,我将向您介绍 Docker 命令的常用选项。例如如何下载一个 docker image,打造一个容器,以及如何访问容器。
要创建一个新的容器,你应该选择一个基本 image 的操作系统,例如启动 Ubuntu 或者 CentOS 或其他系统。您可以搜索一个基本 image 使用 Docker 搜索命令:
docker search ubuntu
该命令将显示所有 ubuntu images,你可以自己尝试一下搜索 centos Images。
现在我们现在 base image到我们的服务中,使用命令:
docker pull ubuntu
现在,您可以通过使用命令来查看所有已下载的images:
docker images
Ubuntu 镜像从DockerHub/Docker Registry下载。下一步骤是创建从该镜像的容器。
要创建容器,可以使用docker create 或 docker run
docker create ubuntu:14.04
docker create 命令会创建一个新的容器,但不会启动它。所以现在你需要使用运行命令:
docker run -i -t ubuntu:14.04 /bin/bash
此命令将创建并运行一个基于 Ubuntu14.04 镜像的容器,容器内并运行一个命令/bin/bash,您将在容器内自动运行命令。
当你输入 Exit 命令退出容器时,容器也是停止运行,如果你想容器在后台运行需要在命令后面添加 -d 参数。
docker run -i -t -d ubuntu:14.04 /bin/sh -c “while true; do echo hello world; sleep 1; done”
/bin/sh -c “while true; do echo hello world; sleep 1; done” this is bash script to echo “hello word” forever.
现在你可以看到容器在后台运行通过命令:
docker ps
如果你想从 bash 命令看日志结果,使用命令:
docker logs NAMES/ContainerID
怎样在后台访问容器 shell?这个命令将会连接你的容器 shell:
docker exec -i -t NAMES/ContainerID
你可以看到主机名和容器ID是相等的,这意味着你在容器shell内。当你在shell 上键入’exit`,会离开的shell,但容器仍在运行。
你会经常使用的另一个命令是:
docker stop NAME/ContainerID
这将停止容器而不将其删除,这样你就可以用命令重新启动它:
docker start NAME/ContainerID
如果你想删除的容器,先停止它,然后用命令将其删除:
docker rm NAME/ContainerID
㈢ 如何编译Docker源码
本文根据docker官方给出的docker代码编译环境搭建指南做更深入的分析。官方给出的指导比较简单,但是由于国内的网络问题经常会编译失败,了解了编译步骤后,也可以结合自身遇到的网络问题进行“规避”。
docker的编译环境实际上是创建一个docker容器,在容器中对代码进行编译。 如果想快速的查看编译环境搭建指导,而不关注环境搭建的机制和细节,可以直接跳到最后一章“总结”。
前提
机器上已经安装了docker,因为编译环境是个docker容器,所以要事先有docker(daemon),后面会创建个编译环境容器,在容器里面编译代码。本文中使用物理机,物理机上运行着docker (daemon)。
机器(物理机)上安装了git 。 后续使用git下载docker源码
机器(物理机)上安装了make。
下载ubuntu 14.04的docker镜像
㈣ linux怎么安装docker
1 在 CentOS 6.4 上安装 docker
docker当前官方只支持Ubuntu,所以在 CentOS 安装Docker比较麻烦(Issue #172)。
docker官方文档说要求Linux kernel至少3.8以上,CentOS 6.4是2.6的内核,于是我哼哧哼哧的编译安装了最新的kernel 3.11.6,重启后运行docker还是失败,最后找到原因,是因为编译时忘记集成aufs模块了。aufs 需要和 kernel 一起编译,很麻烦。
不过不需要这么麻烦,有强人已经编译好了带aufs模块的内核,见这里Installing docker.io on centos 6.4 (64-bit)
1.1 取消selinux,因为它会干扰lxc的正常功能
sudo vim /etc/selinux/config
SELINUX=disabled
SELINUXTYPE=targeted
1.2 安装 Fedora EPEL
sudo yum install http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
1.3 添加 hop5 repo地址
cd /etc/yum.repos.d
sudo wget http://www.hop5.in/yum/el6/hop5.repo
1.4 安装 docker-io
sudo yum install docker-io
会自动安装带aufs模块的3.10内核,以及docker-io包。
1.5 将 cgroup 文件系统添加到 /etc/fstab , 只有这样docker才能正常工作
sudo echo "none /sys/fs/cgroup cgroup defaults 0 0" >> /etc/fstab
1.6 修改grub引导顺序
sudo vim /etc/grub.conf
default=0
设置default为新安装的内核的位置,一般是0
1.7 重启
sudo reboot
1.8 检查新内核是否引导成功
重启后,检查一下新内核是否引导起来了
uname -r
3.10.5-3.el6.x86_64
说明成功了
看一下 aufs是否存在
grep aufs /proc/filesystems
nodev aufs
说明存在
1.9 启动 docker daemon 进程
sudo docker -d &
如果你在公司,且公司内部都是通过代理上网,则可以把代理服务器告诉docker,用如下命令(参考这里):
sudo HTTP_PROXY=http://xxx:port docker -d &
1.10 下载 ubuntu 镜像
sudo docker pull ubuntu
1.11 运行 hello world
sudo docker run ubuntu /bin/echo hello world
hello world
安装成功了!!
㈤ 如何在"特殊"的网络环境下编译 Docker
由于 Docker 编译需要依赖于 Docker Daemon ,所以只能在 64 位的 Linux 环境下先安装 Docker 程序,再从 Github 上克隆 Docker 的代码进行编译。
在 Docker 的目录下执行 make 命令将默认执行 Makefile 中 make binary 指令进行编译。
?
default: binary
all: build
$(DOCKER_RUN_DOCKER) hack/make.sh
binary: build
$(DOCKER_RUN_DOCKER) hack/make.sh binary
cross: build
$(DOCKER_RUN_DOCKER) hack/make.sh binary cross
从以上的 Makefile 可以看出,执行 make、make binary、make all 或 make cross 都可以得到可运行的 Docker 程序。
在 Mac OS 环境下使用 brew 的命令安装 Docker ,只能得到一个 docker client 的二进制程序,如果以 daemon 的方式运行,会得到 ‘This is a client-only binary - running the Docker daemon is not supported.’ 的错误提示信息。
方法 1.
使用 VirtualBox 或者 VMWare Workstation 安装一个 Linux 的虚拟机。宿主机使用 VPN 等方案使网络“正常”访问各种“服务”,虚拟机网卡使用 NAT 模式。在 Linux 虚拟机内使用 make 进行编译 Docker 不会有任何网络问题。只是编译速度受限于 VPN 等网络解决方案,有可能等待时间很长。
方法 2.
Docker 每次发布新版本,都会在 docker-dev 的镜像仓库发布一个新的标签,这个镜像仓库包含了编译 Docker 镜像所依赖的所有环境,只需替换 Docker 代码目录下的 Dockerfile 即可实现编译 Docker 。
?
FROM docker.cn/docker/docker-dev:v1.2.0
VOLUME /var/lib/docker
WORKDIR /go/src/github.com/docker/docker
ENV DOCKER_BUILDTAGS apparmor selinux
ENTRYPOINT [“hack/dind”]
COPY . /go/src/github.com/docker/docker
Dockerfile 中只保留必要的步骤就可以实现编译了。
方法 3.
对 Docker 代码中的 Docker 进行彻底的改造,用国内的各种镜像替换其中不能在“正常”网络条件下访问的镜像,使得代码能够快速编译通过。
?
FROM docker.cn/docker/ubuntu:14.04.1
MAINTAINER Meaglith Ma <[email protected]> (@genedna)
RUN echo "deb http://mirrors.aliyun.com/ubuntu trusty main universe" > /etc/apt/sources.list && echo "deb-src http://mirrors.aliyun.com/ubuntu/ trusty main restricted" >> /etc/apt/sources.list && echo "deb http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted" >> /etc/apt/sources.list && echo "deb-src http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted" >> /etc/apt/sources.list && echo "deb http://mirrors.aliyun.com/ubuntu/ trusty universe" >> /etc/apt/sources.list && echo "deb-src http://mirrors.aliyun.com/ubuntu/ trusty universe" >> /etc/apt/sources.list && echo "deb http://mirrors.aliyun.com/ubuntu/ trusty-updates universe" >> /etc/apt/sources.list && echo "deb-src http://mirrors.aliyun.com/ubuntu/ trusty-updates universe" >> /etc/apt/sources.list && echo "deb http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted" >> /etc/apt/sources.list && echo "deb-src http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted" >> /etc/apt/sources.list && echo "deb http://mirrors.aliyun.com/ubuntu/ trusty-security universe" >> /etc/apt/sources.list && echo "deb-src http://mirrors.aliyun.com/ubuntu/ trusty-security universe" >> /etc/apt/sources.list
RUN apt-get update && apt-get install -y \
aufs-tools \
automake \
btrfs-tools \
build-essential \
curl \
dpkg-sig \
git \
iptables \
libapparmor-dev \
libcap-dev \
libsqlite3-dev \
lxc=1.0* \
mercurial \
parallel \
reprepro \
ruby1.9.1 \
ruby1.9.1-dev \
s3cmd=1.1.0* \
unzip \
--no-install-recommends
RUN git clone --no-checkout https://coding.net/genedna/lvm2.git /usr/local/lvm2 && cd /usr/local/lvm2 && git checkout -q v2_02_103
RUN cd /usr/local/lvm2 && ./configure --enable-static_link && make device-mapper && make install_device-mapper
RUN curl -sSL http://docker-cn.qiniudn.com/go1.3.1.src.tar.gz | tar -v -C /usr/local -xz
ENV PATH /usr/local/go/bin:$PATH
ENV GOPATH /go:/go/src/github.com/docker/docker/vendor
ENV PATH /go/bin:$PATH
RUN cd /usr/local/go/src && ./make.bash --no-clean 2>&1
ENV DOCKER_CROSSPLATFORMS \
linux/386 linux/arm \
darwin/amd64 darwin/386 \
freebsd/amd64 freebsd/386 freebsd/arm
ENV GOARM 5
RUN cd /usr/local/go/src && bash -xc 'for platform in $DOCKER_CROSSPLATFORMS; do GOOS=${platform%/*} GOARCH=${platform##*/} ./make.bash --no-clean 2>&1; done'
RUN mkdir -p /go/src/github.com/gpmgo \
&& cd /go/src/github.com/gpmgo \
&& curl -o gopm.zip http://gopm.io/api/v1/download?pkgname=github.com/gpmgo/gopm\&revision=dev --location \
&& unzip gopm.zip \
&& mv $(ls | grep "gopm-") gopm \
&& rm gopm.zip \
&& cd gopm \
&& go install
RUN gopm bin -v code.google.com/p/go.tools/cmd/cover
RUN gem sources --remove https://rubygems.org/ \
&& gem sources -a https://ruby.taobao.org/ \
&& gem install --no-rdoc --no-ri fpm --version 1.0.2
RUN gopm bin -v -d /go/bin github.com/cpuguy83/go-md2man@tag:v1
RUN git clone -b buildroot-2014.02 https://github.com/jpetazzo/docker-busybox.git /docker-busybox
RUN /bin/echo -e '[default]\naccess_key=$AWS_ACCESS_KEY\nsecret_key=$AWS_SECRET_KEY' > /.s3cfg
RUN git config --global user.email '[email protected]'
RUN groupadd -r docker
RUN useradd --create-home --gid docker unprivilegeser
VOLUME /var/lib/docker
WORKDIR /go/src/github.com/docker/docker
ENV DOCKER_BUILDTAGS apparmor selinux
ENTRYPOINT ["hack/dind"]
COPY . /go/src/github.com/docker/docker
以上的命令把 Ubuntu 镜像中的源替换为国内速度较快的阿里源;把 lvm2 镜像到国内的 Git 托管服务 coding.net;从 七牛云存储 保存的 Golang 源码进行获取和编译;使用 gopm 下载编译所需要的 Library ;最后把其中 gem 源切换到淘宝。至此,可以在“特殊”的网络条件下快速编译 Docker 。
㈥ debian 8 怎么安装Docker
1 系统安装
为了保险、省事,我刻录光盘安装的系统。光盘启动时,界面显示Install,以及其他选项。如果您需要安装其他桌面,请选择下方的Advanced Options,选择其他桌面。看到初中英语都有强迫症的人,请出门左转,选择Windows系统使用。
安装过程相对Ubuntu、openSUSE等系统来说比较复杂,所以安装过程必须仔细阅读每一步的提示文字,并要谨慎操作。安装结束后,就要进行系统配置了。
如果您选择让系统自动帮您分区,系统也会提示您是否将/home单独分区。个人强烈建议将/home单独分区,如果系统需要重装,就可以读取之前的配置文件,重装后的软件就不需要配置了。当然,如果系统因为配置文件错误而崩溃,则需要重新生成配置文件,那时将配置文件全部删除即可,个人存储的文件,比如文档、音乐、视频、图片等,可以免遭破坏。
2 系统配置
在配置系统之前,必须刷新软件源,否则软件是安装不上的,你再着急都没用。如何刷新软件源,请参见2.1。
系统装好后,一些版权受限的插件已经被安装了,系统可以播放mp3、mp4等格式的音频和视频,而且不会出现乱码问题。但flash需要手动更新,详情参见2.4。
2.1 软件源
对于Ubuntu用户来说,我强烈不建议选用中国境内的镜像源,最好使用主源。因为根据我的经验,中国境内的镜像源(如华中科技大学开源镜像站等)的软件包不全,一部分软件包没有,但是官方的主源则不存在这个问题。然而,经过我的摸索,Debian源不存在这个问题,但是选用一部分源时,要么提示Hash校验和不符,要么在安装软件包时提示“软件包未经验证”。经过我的摸索,中国科技大学的Debian源不存在这个问题。
修改软件源,网上很多帖子都建议直接修改sources.list,我个人不建议这样做。因为对于新手来说,这种敏感操作非常容易出问题,而且这样需要使用命令操作,给习惯了windows系统的新手感觉Linux很难用。不管是Ubuntu还是Debian,都可以在图形界面修改。方法是:新立得软件包管理器——设置——软件库。参照已经给出的源列表进行修改。
选用了速度比较快的源,对于系统中软件安装和更新来说,是比较重要的。但是,有些人却不清楚我为何安装软件需要插入DVD光盘,原因就是默认将DVD作为本地源加入了源列表。如果您不需要,可以在“软件库”设置中,将cdrom://这个源取消勾选。但是个人建议保留,因为Debian的DVD里面包含了很多软件,其中DVD 1 中是最常见的软件,配置基本的桌面都需要从DVD 1 中抓取软件包进行安装。如果您打算使用unstable或者testing,请去掉cdrom源,并修改其他源为对应的版本,详情请参见官方wiki,在此我不赘述了。
刷新软件源方法:在新立得软件包管理器点击“刷新”,也可以按照如下命令:
# apt-get update
或
# aptitide update
如果添加cdrom源,那么在插入光盘后,在新立得软件包管理器中,编辑——添加CD-ROM,或者运行如下命令:
# apt-cdrom add
2.2 无线网卡驱动
这个是最棘手的,最头痛的。我第一次安装时,查了一个下午的资料,试验了各种方法。我最先参考官方wiki,但是wiki中提供的方法无效。我有Linux经验,所以我的操作是没有丝毫错误的。在搜索了几十个网页后,最终安装成功。方法如下:
2.2.1 执行如下命令:
# apt-get install linux-headers-$(uname -r|sed 's,[^-]*-[^-]*-,,') build-essential dkms broadcom-sta-moles
2.2.2 安装驱动:
# dpkg -i wireless-bcm43142-dkms_6.20.55.19-1_amd64.deb
这个驱动程序您可以从网络上下载到。实际上,也可以手工编译出来。如果您想自己编译出这个文件,可以上网搜索一下,由于我学校网络情况特别糟糕,我无法打开这个网页(这个网页是我们国内的网站,但是我学校的网络封锁了大量国内外网站,比如CSDN、linuxsir、网络贴吧、网络快照、bing快照等,所以我无法打开这个网页)。
2.2.3 激活网卡:
# modprobe wl
2.3 添加32位运行库
声明:如果您的系统是64位,请仔细阅读,如果是32位,跳过此节,继续阅读2.4。
对于Ubuntu系的用户(如Ubuntu、Linuxmint等),以及openSUSE等,系统已经默认安装了32位运行库。但是对于Debian,系统没有默认安装。不安装32位运行库的后果是,你安装wps时,提示wps的架构不适用于64位系统。所以,下面我介绍一下安装32位运行库的方法:
# dpkg --add-architecture i386
# apt-get update
# apt-get install ia32-libs libncurses5:i386
2.4 flash
系统默认自带了Iceweasel,这个浏览器实际上就是firefox。对于firefox的flash,官方不再升级版本,永久停留在11.2,但是,官方说明,他们会一直给11.2版本的flash提供更新!!系统刚安装时,flash版本很低,所以需要手动升级。升级方法如下:
# apt-get install flashplugin-nonfree
# update-flashplugin-nonfree --install
如果您使用chromium浏览器,需要安装pepperflashplugin。在debian 7.8中,pepperflashplugin是无法直接从新立得中安装的,需要添加backports源。但是,backports源里的部分软件可能会对系统主版本升级造成影响,所以谨慎使用。如果您使用了backports源,在发行版主版本升级时,请参照releases notes进行设置。安装pepperflashplugin方法如下:
# aptitude -t wheezy-backports install pepperflashplugin-nonfree
# update-pepperflashplugin-nonfree --install
2.5 输入法配置
这个是比较麻烦的。如果您在安装过程中是联网安装,这个问题就不是问题。但是如果您是断网安装,那么,系统刚装好时,fcitx输入法是不能打字的。或者能打字,但是没有输入界面。这个需要怎么办呢?
原因就是,fcitx一整套的软件包系统没有完整安装,这个可能是开发者的疏忽。那么,请你打开新立得软件包管理器,输入fcitx进行检索,确认以下包都已经全部安装:
fcitx
fcitx-bin
fcitx-config-common
fcitx-config-gtk
fcitx-config-gtk2
fcitx-data
fcitx-frontend-all
fcitx-frontend-gtk2:amd64
fcitx-frontend-gtk3:amd64
fcitx-frontend-qt4:amd64
fcitx-googlepinyin
fcitx-libs:amd64
fcitx-mole-dbus
fcitx-mole-kimpanel
fcitx-mole-x11
fcitx-moles
fcitx-pinyin
fcitx-sunpinyin
fcitx-table
fcitx-table-wubi
fcitx-tools
fcitx-ui-classic
全部安装后,重启系统之后就可以使用了。
㈦ 如何编译Docker源码
本文根据docker官方给出的docker代码编译环境搭建指南做更深入的分析。官方给出的指导比较简单,但是由于国内的网络问题经常会编译失败,了解了编译步骤后,也可以结合自身遇到的网络问题进行“规避”。
docker的编译环境实际上是创建一个docker容器,在容器中对代码进行编译。 如果想快速的查看编译环境搭建指导,而不关注环境搭建的机制和细节,可以直接跳到最后一章“总结”。
前提
机器上已经安装了docker,因为编译环境是个docker容器,所以要事先有docker(daemon),后面会创建个编译环境容器,在容器里面编译代码。本文中使用物理机,物理机上运行着docker (daemon)。
机器(物理机)上安装了git 。 后续使用git下载docker源码
机器(物理机)上安装了make。
下载ubuntu 14.04的docker镜像
下载docker源码
git clone
会把代码下载到当前目录下,后面会把代码拷贝到容器中。
编译前分析
官方给的编译方法是make build 和 make binary等。下面先分析Makefile,看懂Makefile后,编译环境的准备流程就比较清楚了。
Makefile
在下载的docker源码中可以看到它的Makefile,Makefile中比较关键的几个参数:
DOCKER_MOUNT := $(if $(BIND_DIR),-v "$(CURDIR)/$(BIND_DIR):/go/src/github.com/docker/docker/$(BIND_DIR)") DOCKER_MOUNT 表示创建容器时的mount参数。因为编译环境是一个容器,在后续的步骤中启动容器时使用DOCKER_MOUNT参数,会将物理机上的目录mount给容器容器,容器中该目录是编译生成docker二进制文件的目录。
DOCKER_FLAGS := docker run --rm -i --privileged $(DOCKER_ENVS) $(DOCKER_MOUNT) 这是后面创建docker容器时的命令行的一部分,其中包含了前面的DOCKER_MOUNT参数。
DOCKER_IMAGE := docker-dev$(if $(GIT_BRANCH),:$(GIT_BRANCH)) 这是docker image参数,镜像的名字是docker-dev,以当前git中docker版本作为tag名。这个镜像是在make build一步做出来的。
DOCKER_RUN_DOCKER := $(DOCKER_FLAGS) "$(DOCKER_IMAGE)" 创建docker容器的命令行,组合了前面的DOCKER_FLAGS 和 DOCKER_IMAGE 。 从命令行中可以看出,启动容器使用的参数有 --rm -i --privileged,使用了一些环境变量,还有使用了-v参数把物理机上目录mount给容器,在容器中编译好二进制文件后放到该目录中,在物理机上就能获得docker二进制文件。启动的的docker 容器镜像名字是docker-dev。下文会介绍docker-dev镜像是怎么来的。
由于官方给出的“构建编译环境”的方法是执行 make build,下面在Makefile中看到build分支是这样的:
make build时会调用 docker build -t "$(DOCKER_IMAGE)" . 去制作一个叫做DOCKER_IMAGE的镜像。
进行源码编译的方式是执行 make binary来编译代码,在Makefile中make binary的分支如下:
make binary除了进行 make build以外,会执行$(DOCKER_RUN_DOCKER),即上文提到的docker run命令行。由于执行过了build,会build出来docker-dev镜像,所以在docker run时直接使用前面build出来的镜像。docker run时的命令行参数是hack/make.sh binary。make binary的过程实际上是创建一个容器,在容器中执行hack/make.sh binary脚本。接下来会详细介绍make build和make binary所做的内容。
make build
根据官方的指导,先执行make build来搭建编译环境。上面分析了,make build实际上是制作了一个镜像,这个镜像里会包含编译代码所需的环境。下面来介绍下这个镜像。
Dockerfile
在和Makefile相同的目录下(源码的根目录),有Dockerfile。执行make build 相当于调用docker build,使用的就是该Dockerfile。Dockerfile中的几个主要步骤(有些步骤这里略过):
FROM ubuntu:14.04 使用ubuntu 14.04作为基础镜像;在宿主机上,要事先下载好ubuntu 14.04镜像。
安装一些编译需要的软件;
用git下载lvm2源码,并编译安装;
下载并安装GO 1.5.1;
安装GO相关的tools 可以做code coverage test 、 go lint等代码检查
安装registry和notary server;
安装docker-py 后面跑集成测试用的
将物理机的contrib/download-frozen-image.sh 脚本拷贝到镜像中/go/src/github.com/docker/docker/contrib/
运行contrib/download-frozen-image.sh 制作镜像 实际上这一步只是下载了3个镜像的tar文件。注意:docker build相当于创建一个临时的容器(在临时的容器中执行Dockerfile中的每一步,最后在保存成镜像),“运行contrib/download-frozen-image.sh 制作镜像”这个动作出现在Dockerfile中,相当于在docker build所创建的临时的容器中下载docker镜像,有docker-in-docker容器嵌套的概念。下一小节会对download-frozen-image.sh脚本做详细分析。
ENTRYPOINT ["hack/dind"] 做出来的镜像,使用它启动的容器可以自动运行源码目录中的hack/dind脚本。 dind这个脚本是a wrapper script which allows docker to be run inside a docker container 。后面的小节会对hack/dind脚本做详细的分析。
COPY . /go/src/github.com/docker/docker 把物理机上的docker源码文件打入到镜像中
download-frozen-image.sh脚本
上一小节里提到,在Dockerfile中,有一步会调用contrib/download-frozen-image.sh ,它主要作用是下载3个镜像的tar包,供后续docker load。在Dockerfile中的调用方式如下:
download-frozen-image.sh脚本中会依次解析参数,其中/docker-frozen-images作为base dir,后面下载的东西全放到这里。之后的3个参数是镜像,里面包含了镜像名(例如busybox)、镜像tag(例如latest)、镜像id(例如),后面会在循环中依次下载这3个镜像的tar文件。
download-frozen-image.sh脚本中会通过curl从registry上获取如下信息:
token:获取token,后面curl获取的其他信息时都需要使用token。例如本例中 token='signature=,repository="library/busybox",access=read'
ancestryJson:把镜像相关联的历史层次的id也都获取到,因为每一层的tar都需要下载。本例中 ancestryJson='["", ""]'
这里可以看到这个镜像只有2层,两层的id这里都列了出来。 每个镜像包含的层数不同,例如。第三个镜像jess/unshare共有10层。
VERSION、json、tar: 每一层镜像id的目录下,都下载这3个文件,其中VERSION文件内容目前都是“1.0”,json文件是该层镜像的json文件,tar文件是该层镜像的真正内容,以.tar保存。
下载好的各层镜像目录结构如下:
$ls
$tree
hack/dind脚本
在Dockerfile中,ENTRYPOINT ["hack/dind"] ,表示在镜像启动后,运行该脚本,下面分析一下这个脚本的功能。
脚本在代码根目录下的hack目录中,作者对脚本的描述是 DinD: a wrapper script which allows docker to be run inside a docker container.
就是可以在docker容器中创建docker容器。它就做了一个事,那就是在容器中创建好cgroup目录,并把各个cgroup子系统mount上来。
为了方便理解,我们可以先看看物理机。在宿主机上如果创建docker容器,需要宿主机上必须事先mount cgroup子系统,因为cgroup是docker容器的一个依赖。同理docker-in-docker也要求外层的docker容器中有cgroup子系统,dind脚本在容器启动后,先去/proc/1/cgroup中获取cgroup子系统,然后依次使用mount命令,将cgroup mount上来,例如mount -n -t cgroup -o "cpuset" cgroup "/cgroup/cpuset"
最终在运行make build后,会制作出一个叫docker-dev的镜像。
make binary
执行make binary 就可以编译出docker二进制文件。编译出来的二进制文件在源码目录下的bundles/1.10.0-dev/binary/docker-1.10.0-dev ,其中还包含md5和sha256文件。
Makefile中的binary
Makefile中关于make binary流程是
先执行build,即上一节介绍的,制作docker-dev编译环境镜像。
再执行DOCKER_RUN_DOCKER,创建容器,DOCKER_RUN_DOCKER就是执行docker run,使用docker-dev镜像启动容器,并且会mount -v 将容器生成二进制文件的路径与宿主机共享。DOCKER_RUN_DOCKER在“编译前分析”一章中有介绍。启动的容器运行的命令行是 hack/make.sh binary 。docker run完整的形式如下:
docker run --rm -i --privileged -e BUILDFLAGS -e DOCKER_CLIENTONLY -e DOCKER_DEBUG -e DOCKER_EXECDRIVER -e DOCKER_EXPERIMENTAL -e DOCKER_REMAP_ROOT -e DOCKER_GRAPHDRIVER -e DOCKER_STORAGE_OPTS -e DOCKER_USERLANDPROXY -e TESTDIRS -e TESTFLAGS -e TIMEOUT -v "/home/mu/src/docker/docker/bundles:/go/src/github.com/docker/docker/bundles" -t "docker-dev:master" hack/make.sh binary
hack/make.sh脚本
上一节提到的make binary中创建的容器启动命令是hack/make.sh binary,运行容器中的(docker源码目录下的)hack/make.sh脚本,参数为binary。
make.sh中根据传入的参数组装后续编译用的flags(BUILDFLAGS),最后根据传入的参数依次调用 hack/make/目录下对应的脚本。例如我们的操作中传入的参数只有一个binary。那么在make.sh的最后,会调用hack/make/binary脚本。
hack/make/binary脚本中,就是直接调用go build进行编译了,其中会使用BUILDFLAGS LDFLAGS LDFLAGS_STATIC_DOCKER等编译选项。
如果最终生成的docker二进制文件不在bundles/1.10.0-dev/binary/目录下,那么可能是编译参数BINDDIR设置的不正确,可以在执行make binary时增加BINDDIR参数,例如
make BINDDIR=. binary , 将BINDDIR设置为当前目录。
总结
编译步骤总结:
1、编译前在物理机上安装好make、git,并下载好docker代码。下载好ubuntu:14.04镜像
2、执行make build 。这步执行完会在物理机上创建出一个docker-dev的镜像。
3、执行make binary 。 这步会使用docker-dev镜像启动一个容器,在容器中编译docker代码。编译完成后在物理机上直接可以看到二进制文件。默认二进制文件在 bundles/1.10.0-dev/binary/目录下
4、docker代码里有很多test,可以使用此套编译环境执行test,例如 make test 。 更多参数可以看Makefile
搭建环境心得:
1、在make build时,使用Dockerfile创建制作镜像,这个镜像有40多层,其中一层失败就会导致整个build过程失败。由于Dockerfile中很多步骤是要连到国外的网站去下载东西,很容易失败。好在docker build有cache机制,如果前面的层成功了,下次重新build时会使用cache跳过,节省了很多时间。所以如果make build中途失败(一般是由于国内连国外的网络原因),只要重新执行make build就会在上次失败的地方继续,多试几次可以成功。
2、如果其他人已经build出了docker-dev镜像,可以把它下载到自己的环境上。这样在自己make build时,会跳过那些已经在本地存在的层,可以节省时间。
3、每一次编译会自动删除掉前面已经生成的二进制文件,所以不用担心二进制文件不是最新的问题。
㈧ 如何编译Docker源码
经过研究docker的官方编译脚步,发现本地编译也很简单,只需要在docker源码的目录下执行如下命令即可:
./hack/make.sh binary
上面这条命令就只会生成docker的二进制文件,不过肯定不会这么顺利的,执行这个命令你就会发现错误。如果第一次执行报的错误应该是找不到相应的go依赖包。那么现在就开始解决第一个问题,go依赖包。
解决go依赖包最直接的方法就一个一个去github或者其他地方去下载到本地,但是这样做很麻烦,docker依赖的go语言包很多,然后依赖包可能又依赖其他包。这里有一个简单实用的办法,也是go语言管理项目的方便之处。通过go get命令来自动下载,例如发现报错的是docker某一个目录下的依赖包,那么可以如下执行:
go get -v ./src/github.com/docker/docker/...
这条命令执行以后整个docker目录下源文件依赖的包都会被自动下载。如果发现其他目录下源文件也报同样的错误,可以按照次方法解决。不过这里需要强调一点, 这些下载都是会下载最新的包,如果编译老的docker肯定会出问题 ,如果编译最新的docker代码肯定不会有问题,因为官方的编译是这种方式。
上面执行的命令都是建立在go语言环境建立成功的基础上,我安装的go遇到是1.3.3版本的,采用源码方式安装。安装在/export/servers/go下面,然后所有的go语言工程源码目录放在 /export/servers/gopath。然后配置环境变量在用户的根目录下的.bashrc文件里面如下:
export GOPATH=/export/servers/gopath
export GOROOT=/export/servers/go
export GOARCH=amd64
export GOOS=linux
然后docker的代码目录如下:/export/servers/gopath/src/github.com/docker/docker。这样才能在gopath下面进行依赖包的下载。通过上面的方法把所有依赖包下载完以后就可以进行编译了。
㈨ aria2 编译docker
docker的编译环境实际上是创建一个docker容器,在容器中对代码进行编译。
操作方法:
1.在dockerHub上注册一个共有账户。
2.编译系统下(假设ubuntu)安装docker,并登录hub账户。
3.编译系统下创建一个docker镜像,安装并调试好aria2。
4.镜像保存好后,就可以将本地docker镜像推送到hub上了。
5.通过dockerhub,大家就可以直接pull你的aria2镜像了。
㈩ wsl中安装docker
最近又开始研究win10自带的linux子系统(wsl), 在将自己公司用的编译环境配置好之后, 相继配置了tftp和ssh, 现在用xshell直接ssh登录感觉不要太好, 已经满足了自己平时的开发需求, 考虑到自己偶尔也会用到docker, 所以想在wsl中配置一下docker环境, 也算是自己开始学习了解docker这一进来比较火的东东.
网上找了很多教程, 最后发现还是官方的最靠谱, 先上网址 https://docs.docker.com/install/linux/docker-ce/ubuntu/
再附上纯命令
如果运行显示如下的话, 说明服务没起, 需要先用命令 sudo service docker start 起一下:
hello-world运行结果如下说明成功:
刚开始按照上面的步骤安装, hello-world是无法运行的, 我不确定是不是所以的wsl都这样, 所以上面只是给了正常的流程, 如果很不幸你按照上面的步骤最后也失败了, 那不妨继续往下看, 说不定咱们的问题相同哦.
问题的现象是:
出现上面的现象, 应该是因为docker的版本太新导致的(起码我的是), 这时需要我们安装旧一点版本的docker, 方法如下:
安装成功后验证一下:
这里要特别感谢一下 这位仁兄 , 因为我的安装历程就是就此止步, 达到成功的.
自己安装docker也是经历了诸多绝望, 之前已经失败过一次了, 好在这第二次挺住了, 最终安装成功, 当然, 现在还没有学习过要怎么使用, 后面加油吧. 最后, 如果这篇文章对你有所帮助, 就请给个赞吧, 也希望您能浏览下本人的其他文章, 说不定还会有点收获, 谢谢.
