centos7下docker二进制文件编译

文章目录

[隐藏]

  • 系统环境与软件版本
  • 浅谈docker源码编译
  • Golang的安装与配置
  • docker编译二进制文件
    • 安装依赖软件
    • 编译docker等二进制文件
    • 编译containerd等二进制文件
    • 编译docker-runc二进制文件
    • 编译docker-init二进制文件
    • 编译docker-proxy二进制文件
  • 运行docker
  • 制作docker的systemd-unit
    • docker.service
    • 启动docker服务
  • TroubleShooting
系统环境与软件版本
  • OS:Centos7 64bit

  • Kernel Version:3.10.0-693.2.2.el7.x86_64

  • Golang Version: go1.8.4 linux/amd64

  • Docker: 17.05.0-ce

浅谈docker源码编译

官方提供编译步骤依次为:make build和make binary。先看懂Makefile会帮助理解docker基本结构。

  • make build
    其实就是docker build,于是要看Dockerfile文件。其制作一个叫docker-dev的镜像,镜像中会生成源码编译的环境。

  • make binary
    其实就是docker run docker-dev,即运行docker-dev一个容器,并在容器中的bundles文件夹下生成dockers所需的二进制文件。

通过查看Dockerfile以下内容:

# Install tomlv, vndr, runc, containerd, tini, docker-proxy  # Please edit hack/dockerfile/install-binaries.sh to update them.  COPY hack/dockerfile/binaries-commits /tmp/binaries-commits  COPY hack/dockerfile/install-binaries.sh /tmp/install-binaries.sh  RUN /tmp/install-binaries.sh tomlv vndr runc containerd tini proxy bindata  

可以看出具体的binary来自脚本install-binaries.sh。

  • install-binaries.sh
    此脚本涉及到docker-containerd系列,docker-runc,docker-init和docker-proxy等组件的源码地址,以及编译命令

  • binaries-commits
    此文件涉及到各类组件的commit编号,使用git checkout -q xxxxxxxx来切换到相对应的tree上

以下内容,实际便是抽出install-binaries.sh中的内容,独立完成,从而获得docker所有编译后的二进制文件。如要生成rpm文件,需进一步研究

Golang的安装与配置

可以在 下载 – Golang中国 (https://www.golangtc.com/download) 中下载相对应的安装包。安装包go1.9.linux-amd64.tar.gz和脚本install_go.sh放在同一个目录下。

代码下载: https://o-my-chenjian.com/download/Make-Docker-Executable-File-On-CentOS7/install_go.sh

#!/bin/bash    cur_path=`pwd`    # 解压go包  sudo tar zxvf ${cur_path}/go1.8.4.linux-amd64.tar.gz -C /usr/local    # 创建GOPATH文件夹  sudo mkdir -p /home/mygo    # 设置go环境变量  sudo echo "export GOROOT=/usr/local/go" >> /etc/profile  sudo echo "export GOPATH=/home/mygo" >> /etc/profile  sudo echo "export PATH=$PATH:$GOROOT/bin" >> /etc/profile  . /etc/profile    # 安装wget  sudo yum install -y wget    # 更新为aliyun源  sudo wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo    # 安装git  sudo yum install -y git    # 安装go包管理工具govendor  go get -u github.com/kardianos/govendor  cp ${GOPATH}/bin/govendor /usr/local/go/bin/  

结果如下:

go version  <<'COMMENT'  go version go1.8.4 linux/amd64  COMMENT    ls /home/mygo/ /home/mygo/src/ /home/mygo/src/github.com/ /usr/local/go/bin/    <<'COMMENT'  /home/mygo/:  bin  pkg  src    /home/mygo/src/:  github.com    /home/mygo/src/github.com/:  kardianos    /usr/local/go/bin/:  go  godoc  gofmt  govendor  COMMENT  
docker编译二进制文件

安装依赖软件

yum install -y gcc make cmake device-mapper-devel btrfs-progs-devel libarchive libseccomp-devel glibc-static  

编译docker等二进制文件

组件:

  • docker: docker-client端
  • dockerd: docker-server端

操作:

cd $GOPATH/src/github.com/    mkdir docker && cd docker    # 下载相关版本的docker源码  git clone -b v17.05.0-ce https://github.com/moby/moby.git    cp -R moby/ docker && rm -rf moby/    # docker编译  cd  $GOPATH/src/github.com/docker/docker/cmd/docker  go build  cp docker /usr/local/bin/    # dockerd编译  cd  $GOPATH/src/github.com/docker/docker/cmd/dockerd  go build  cp dockerd /usr/local/bin/  

编译containerd等二进制文件

组件:

  • docker-containerd
  • docker-containerd-ctr
  • docker-containerd-shim

操作:

# 下载相关版本的container源码  git clone https://github.com/containerd/containerd.git "${GOPATH}/src/github.com/docker/containerd"  cd "${GOPATH}/src/github.com/docker/containerd"  git checkout -q 9048e5e50717ea4497b757314bad98ea3763c145    # 组件编译  cd  ${GOPATH}/src/github.com/docker/containerd    make static  <<'COMMENT'  cd ctr && go build -ldflags "-w -extldflags -static -X github.com/docker/containerd.GitCommit=9048e5e50717ea4497b757314bad98ea3763c145 " -tags "" -o ../bin/ctr  cd containerd && go build -ldflags "-w -extldflags -static -X github.com/docker/containerd.GitCommit=9048e5e50717ea4497b757314bad98ea3763c145 " -tags "" -o ../bin/containerd  cd containerd-shim && go build -ldflags "-w -extldflags -static -X github.com/docker/containerd.GitCommit=9048e5e50717ea4497b757314bad98ea3763c145 " -tags "" -o ../bin/containerd-shim  COMMENT    cp bin/containerd /usr/local/bin/docker-containerd  cp bin/containerd-shim /usr/local/bin/docker-containerd-shim  cp bin/ctr /usr/local/bin/docker-containerd-ctr  

编译docker-runc二进制文件

组件:

  • docker-runc

操作:

cd $GOPATH/src/github.com/    mkdir opencontainers && cd opencontainers    # 下载相关版本的runc源码  git clone -b v1.0.0-rc2 https://github.com/opencontainers/runc.git "${GOPATH}/src/github.com/opencontainers/runc"    # runc编译  cd  ${GOPATH}/src/github.com/opencontainers/runc    make BUILDTAGS="${RUNC_BUILDTAGS:-"selinux"}" static    <<'COMMENT'  CGO_ENABLED=1 go build -i -tags "selinux cgo static_build" -ldflags "-w -extldflags -static -X main.gitCommit="c91b5bea4830a57eac7882d7455d59518cdf70ec-dirty" -X main.version=1.0.0-rc2" -o runc .  COMMENT    cp runc /usr/local/bin/docker-runc  

编译docker-init二进制文件

组件:

docker-init  

操作:

cd $GOPATH/src/github.com/    mkdir krallin && cd krallin    # 下载相关版本的tini源码  git clone https://github.com/krallin/tini.git "$GOPATH/tini"  cd "$GOPATH/tini"  git checkout -q 949e6facb77383876aeff8a6944dde66b3089574    cmake .  <<'COMMENT'  -- The C compiler identification is GNU 4.8.5  -- Check for working C compiler: /usr/bin/cc  -- Check for working C compiler: /usr/bin/cc -- works  -- Detecting C compiler ABI info  -- Detecting C compiler ABI info - done  -- Performing Test HAS_BUILTIN_FORTIFY  -- Performing Test HAS_BUILTIN_FORTIFY - Failed  -- Configuring done  -- Generating done  -- Build files have been written to: /home/mygo/tini  COMMENT    make tini-static  <<'COMMENT'  Scanning dependencies of target tini-static  [100%] Building C object CMakeFiles/tini-static.dir/src/tini.c.o  Linking C executable tini-static  [100%] Built target tini-static  COMMENT    cp tini-static /usr/local/bin/docker-init  

编译docker-proxy二进制文件

组件:

docker-proxy  

操作:

cd $GOPATH/src/github.com/docker    # 下载相关版本的proxy源码  git clone https://github.com/docker/libnetwork.git "$GOPATH/src/github.com/docker/libnetwork"  cd "$GOPATH/src/github.com/docker/libnetwork"  git checkout -q 7b2b1feb1de4817d522cc372af149ff48d25028    # proxy编译  go build -ldflags="$PROXY_LDFLAGS" -o /usr/local/bin/docker-proxy github.com/docker/libnetwork/cmd/proxy  
运行docker
ll /usr/local/bin/docker*    <<'COMMENT'  -rwxr-xr-x. 1 root root 25845680 Oct 10 14:00 /usr/local/bin/docker  -rwxr-xr-x. 1 root root 12474568 Oct 10 14:01 /usr/local/bin/docker-containerd  -rwxr-xr-x. 1 root root 11435336 Oct 10 14:03 /usr/local/bin/docker-containerd-ctr  -rwxr-xr-x. 1 root root  3858880 Oct 10 14:04 /usr/local/bin/docker-containerd-shim  -rwxr-xr-x. 1 root root 55072232 Oct 10 14:02 /usr/local/bin/dockerd  -rwxr-xr-x. 1 root root   824568 Oct 10 14:59 /usr/local/bin/docker-init  -rwxr-xr-x. 1 root root  2528043 Oct 10 15:10 /usr/local/bin/docker-proxy  -rwxr-xr-x. 1 root root 10894408 Oct 10 14:16 /usr/local/bin/docker-runc  COMMENT    groupadd docker    dockerd  <<'COMMENT'  INFO[0000] libcontainerd: new containerd process, pid: 9024  WARN[0000] containerd: low RLIMIT_NOFILE changing to max  current=1024 max=4096  WARN[0001] failed to rename /var/lib/docker/tmp for background deletion: %!s(<nil>). Deleting synchronously  INFO[0001] [graphdriver] using prior storage driver: overlay  INFO[0001] Graph migration to content-addressability took 0.00 seconds  INFO[0001] Loading containers: start.  INFO[0001] Default bridge (docker0) is assigned with an IP address 172.17.0.0/16. Daemon option --bip can be used to set a preferred IP address  INFO[0001] Loading containers: done.  INFO[0001] Daemon has completed initialization  INFO[0001] Docker daemon                                 commit=library-import graphdriver=overlay version=library-import  INFO[0001] API listen on /var/run/docker.sock  COMMENT    ps aux|grep docker  <<'COMMENT'  root     11753  0.2  2.8 343472 28860 pts/1    Sl+  14:09   0:00 dockerd  root     11756  0.0  0.6 267908  6240 ?        Ssl  14:09   0:00 docker-containerd -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --metrics-interval=0 --start-timeout 2m --state-dir /var/run/docker/libcontainerd/containerd --shim docker-containerd-shim --runtime docker-runc  root     11890  0.0  0.0 112660   976 pts/2    R+   14:10   0:00 grep --color=auto docker  COMMENT    docker version  <<'COMMENT'  Client:   Version:      library-import   API version:  1.29   Go version:   go1.8.4   Git commit:   library-import   Built:        library-import   OS/Arch:      linux/amd64    Server:   Version:      library-import   API version:  1.29 (minimum version 1.12)   Go version:   go1.8.4   Git commit:   library-import   Built:        library-import   OS/Arch:      linux/amd64   Experimental: false  COMMENT    docker pull busybox    docker run -idt busybox  <<'COMMENT'  b6f61b4b5ec9ce2b4331a47a1e8a3552b2162ca0f152ec2e02dfbf169d64a80a  COMMENT    docker ps -a  <<'COMMENT'  CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES  b6f61b4b5ec9        busybox             "sh"                27 minutes ago      Up 27 minutes                           loving_noether  COMMENT  

可以看到,在启动dockerd后,会启动另一个程序docker-containerd。

制作docker的systemd-unit

docker.service

cat > docker.service <<EOF  [Unit]  Description=Docker Application Container Engine  Documentation=http://docs.docker.io    [Service]  Environment="PATH=/usr/local/bin:/bin:/sbin:/usr/bin:/usr/sbin"  EnvironmentFile=-/run/flannel/docker  ExecStart=/usr/local/bin/dockerd --log-level=error $DOCKER_NETWORK_OPTIONS  ExecReload=/bin/kill -s HUP $MAINPID  Restart=on-failure  RestartSec=5  LimitNOFILE=infinity  LimitNPROC=infinity  LimitCORE=infinity  Delegate=yes  KillMode=process    [Install]  WantedBy=multi-user.target  EOF  

启动docker服务

sudo cp docker.service /etc/systemd/system/docker.service  sudo systemctl daemon-reload    sudo systemctl enable docker  <<'COMMENT'  Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /etc/systemd/system/docker.service.  COMMENT    sudo systemctl start docker    sudo systemctl status docker  <<'COMMENT'  ● docker.service - Docker Application Container Engine     Loaded: loaded (/etc/systemd/system/docker.service; enabled; vendor preset: disabled)     Active: active (running) since Wed 2017-10-11 15:27:51 CST; 3s ago       Docs: http://docs.docker.io   Main PID: 1152 (dockerd)     Memory: 67.2M     CGroup: /system.slice/docker.service             ├─1152 /usr/local/bin/dockerd --log-level=error             └─1156 docker-containerd -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --metrics-interval=0 --start-timeout 2m --state-dir /var/run/docker/libcontainerd/containerd...    Oct 11 15:27:51 localhost.localdomain systemd[1]: Started Docker Application Container Engine.  Oct 11 15:27:51 localhost.localdomain systemd[1]: Starting Docker Application Container Engine...  COMMENT  
TroubleShooting
  • /bin/bash^M: bad interpreter:没有那个文件或目录

参考: http://blog.csdn.net/yongan1006/article/details/8142527

  • Linux环境下gcc静态编译/usr/bin/ld: cannot find -lc错误

参考: http://blog.csdn.net/shudaqi2010/article/details/32938715

原文出处:chenjian -> https://o-my-chenjian.com/2017/10/11/Make-Docker-Executable-File-On-CentOS7/

本站所发布的一切资源仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如果侵犯你的利益,请发送邮箱到 [email protected],我们会很快的为您处理。