Docker 日常实践汇总

工作中的经验总结

Posted by pandaychen on October 5, 2020

0x00 前言

本文介绍下日常工作的一些基础 Docker 使用

0x01 docker 镜像制作和镜像打包

问题

作为一个入门级用户,很有可能写出下面的 Dockerfile:

From centos:7

LABEL maintainer="panda<ringbuffer@126.com>"

ADD requirements.txt /
ADD xxxx.sh    /
ADD xxxx-1.2.3.4.tar.gz /    ## 自动解压
ADD xxxx-master.zip /


WORKDIR /

RUN     export http_proxy=http://xxx.xx.com:8080 && \
        export https_proxy=http://xxx.xx.com:8080 && \
        yum install -y yum-utils        && \
        yum-config-manager --enable epel       && \
        yum -y install unzip zip && \
        unzip xxxx-master.zip && \
        mkdir -p /data/ &&      \
        mkdir -p /data/log/&& \
        yum install -y epel-release && \
        yum install -y yum-utils        && \
        yum -y install python && \
        yum -y install python-pip && \
        pip install --upgrade pip       && \
        yum -y install python-devel mysql-devel && \
        yum install gcc -y && \
        pip install --upgrade pip && \
        pip install -r requirements.txt && \
        cd xxxx-1.2.3.4 && \
        python setup.py install && \
        unzip /xxxx-master.zip && \
        cd /xxxx/ && \
        python setup.py install && \
        pip install cryptography &&\
        export http_proxy= && \
        export https_proxy= && \
        unset http_proxy && \
        unset https_proxy

CMD ["/bin/sh", "-c","cd /xxxx/bin/ && /usr/bin/python xxxxx.py"]

上面这个 Dockerfile 的问题在于,流程过于冗长,每次调用该 Dockerfile 生成镜像会耗费较长时间,那么如何优化呢?不考虑更换 From centos:7 的情况下,可以通过镜像制作的方式来解决,步骤如下:

制作 && 打包

docker pull centos:7    #拉取一个基础镜像
docker run -it --name=bfcentos centos:7   #创建一个交互式容器

docker cp  xxx.tar  bfcentos:/data/     #上传一些公共包到容器的 / data 目录

#在容器中安装软件

docker commit bfcentos bfcentos-python27  #将交互式的容器提交为一个新的镜像

通过 docker commit 将刚才部署好公共软件 / 包的容器提交为一个新的镜像,然后打上 tag 推送到公司的镜像仓库去:

[root@VM_120_245_centos /data/rootback/docker-python]# docker commit bfcentos bfcentos-python27
sha256:xxxxxxx

[root@VM_120_245_centos /data/rootback/docker-python]# docker tag bfcentos-python27:latest mirrors.xxxx.com/samp/bfcentos-python27:latest
[root@VM_120_245_centos /data/rootback/docker-python]# docker push  mirrors.xxxx.com/samp/bfcentos-python27:latest
The push refers to repository [mirrors.xxxx.com/samp/bfcentos-python27]
f77c094d51c9: Pushing [=========>                                         ]  73.25MB/404.9MB
174f56854903: Pushing [=================>                                 ]   70.4MB/203.9MB

这样,下次可以直接使用 From mirrors.xxxx.com/samp/bfcentos-python27:latest 构建:

From mirrors.xxxx.com/samp/bfcentos-python27:latest

LABEL maintainer="panda<ringbuffer@126.com>"

ADD xxxx-master.zip /

WORKDIR /

RUN     unzip /xxxx-master.zip
CMD ["/bin/sh", "-c","cd /xxxx/bin/ && /usr/bin/python xxxx.py"]

镜像 && 容器打包

docker save -o /root/xxxx.tar  <name>        #镜像打包
docker load -i /root/xxxx.tar               #导入镜像
docker export -o /root/xxxx.tar  <name>   #容器打包
docker import xxxx.tar <name>:latest  #导入容器

Docker 的代理配置

1、docker pull 代理

在执行 docker pull 指令时,是由守护进程 dockerd 来执行。 因此,代理需要配在 dockerd 的环境中。 此环境受 systemd 所管控,因此实际是 systemd 的配置,如下:

mkdir -p /etc/systemd/system/docker.service.d
touch /etc/systemd/system/docker.service.d/proxy.conf

[Service]
Environment="HTTP_PROXY=http://proxy.example.com:8080/"
Environment="HTTPS_PROXY=http://proxy.example.com:8080/"
Environment="NO_PROXY=localhost,127.0.0.1,.example.com"

需要重启 systemd 配置生效:

systemctl daemon-reload
systemctl restart docker

0x02 参考