Docker 笔记

Nov 21, 2019


更新于2023-02-24


使用Docker构建Nmap本地扫描容器


使用nmap扫描local LAN网络时,假设我们希望nmap中的arp功能也能正常work,就需要nmap运行的网络和目标网络处于同一个网段内。但是由于容器化nmap进程后,容器网络本身是隔离的,所以默认情况下容器内的nmap运行网络和目标网络不会处于同一个网段。这时就需要特殊的设置来修改。

macvlan

实战环境


在一台服务器上通过docker部署web service、MQTT broker、以及nmap scan 3个容器,该服务器使能了2个物理网口,其中enp125s0f2网口配置了公网IP,方便ssh远程登录该服务器进行操作,另外一个网口enp125s0f1(192.168.3.2)连接到了路由器的LAN口,路由器的WLAN口并没有连接到公网。

  • 需求: 容器中的nmap scan可以扫描enp125s0f1网口的局域网中的设备。

网络配置


  • 创建一个macvlan驱动的网络
  docker network create -d macvlan -o parent=enp125s0f1 \
  --subnet 192.168.3.0/24 \
  --gateway 192.168.3.1 \
  --ip-range 192.168.3.192/27 \
  --aux-address 'host=192.168.3.223' \
  nmap-scan

上面的ip-range和aux-address设置至关重要,其中ip-range的设置关系到后面的路由设置,而aux-address是为了防止docker将同样的ip地址分配给了某个container而造成最后的ip地址冲突。 创建成功后执行docker network inspect nmap-scan可以查看所创建网络的具体信息。

docker_0.png

上面的Containers表示的是当前挂在此网络下的容器实例。

初始的设想是,nmap scan的容器是挂在nmap-scan这个macvlan网络下的,这个虚拟设备和服务器的enp125s0f1网口在同一个局域网网段内,所以应该可以访问服务器上的service的,只要这个service启动时bind的是IPANY,即0.0.0.0。但是docker网络是有意隔离host和container网络的,即nmap scan容器是无法ping通host的。解决办法就是在host上新建一个虚拟网卡,并且该网卡也是挂在nmap-scan这个macvlan驱动的网络里。

  • 创建macvlan驱动的虚拟网卡
  ip link add saiyn-shim link enp125s0f1 type macvlan  mode bridge

  • 设置ip并使能网卡
  ip addr add 192.168.3.223/32 dev saiyn-shim 
  ip link set saiyn-shim up

注意上面的192.168.3.223就是通过aux-address选项保留下来的ip。

docker_1.png

  • 设置路由
  ip route add 192.168.3.192/27 dev nmap-shim

这里的路由设置非常重要,前面通过--ip-range的选项将基于enp125s0f1网卡而创建的子虚拟网卡saiyn-shim隔离到一个子网中,然后这里就很自然的可以设置相关的路由了。

  • 启动nmap scan容器
  docker run -itd --network=nmap-scan -e SERVICE_IP=$service -v `pwd`/data:/opt/thingsScan/data thingsscan/thingsscan:normal_arm64

也可以直接指定容器的ip地址

  docker run -itd --network=namp-scan-new -e SERVICE_IP=$service --ip=$ip -v `pwd`/data:/opt/thingsScan/data thingsscan/thingsscan:normal_arm64

docker_2.png

  • 验证网络

在host ping 容器ip

docker_3.png


使用Docker构建交叉编译环境


  • Dockerfile

假设我们的toolchain文件为RT6125VW_SET.tgz,这里面包含有编译工具和rootfs

    FROM ubuntu:18.04

    RUN dpkg --add-architecture i386 && \
        apt-get update && \
        apt-get install --fix-missing -y --no-install-recommends libz-dev libexpat-dev \
        bison flex bsdmainutils build-essential libc6:i386 libstdc++6:i386 m4 automake \
        pkg-config libtool && \
        rm -rf /var/lib/apt/lists/*

    ARG TOOLCHIAN_ROOT=/opt/toolchain
    ADD ./RT6125VW_SET.tgz ${TOOLCHIAN_ROOT}


    WORKDIR /build

    ENV ARCH=arm-linux
    ENV CROSS_COMPILE=aarch64-poky-linux-
    ENV TOOLCHAIN_PATH=${TOOLCHIAN_ROOT}/RT6125VW_SET/bsp/aarch64-venus/usr
    ENV PATH="${PATH}:${TOOLCHAIN_PATH}/bin/aarch64-poky-linux"


上面的Dockerfile中通过dpkg --add-architecture i386让build环境支持multiarch, 这样可以兼容32bit平台的交叉编译。具体关于multiarch的细节参见这里.

  • build image

假设Dockerfile和toolchain压缩文件都在当前目录下 , 执行docker build -t poky-image . 创建docker image

  • pipeline

image准备好后就是启动容器去run build了,假设我们使用githun action的pipeline去做,

    jobs:
      poky:
        
        ...

        steps:
          - name build
            run: docker run -i -e PROGVER=1.0.$ -v $:/build  poky-image bash -c "make clean && make all"

          ...




Basic


安装docker


参考这个


基本命令


  • 进入container内的shell -> sudo docker container exec -it 3695c98d9f78 /bin/bash
  • 清除系统中所有的container和images -> sudo docker system prune -a
  • 清除系统中所有的docker volumes -> sudo docker volume prune
  • 清除所有container的log -> sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"


DockerHub的使用


基于别人public的image进行开发后,可以commit然后push到自己的DokcerHub仓库下。

比如上传修改后的image到我的elk仓库:saiyn/elk

  • 执行docker container ps查看elk的CONTAINER ID, 假设为c78ade920bae.
  • 执行docker commit -m "refine index pattern;add one more filebeat input" c78ade920bae saiyn/elk:v1.0.3生成一个新的image,并且打上tag:v1.0.3
  • 执行docker push saiyn/elk:v1.0.3将新image推送到dockerHub的elk仓库.


docker-compose的应用


重新build并启动某一个service


在我们更新了ui容器的js代码后,如果只是执行docker-compose restart ui会发现网页并没有更新 这时可以依次执行如下命令:

  • docker-compose stop ui
  • docker-compose build –no-cache ui
  • docker-compose up -d –no-deps ui



docker in Pycharm


pycharm in windows


requirement: pycharm professional version + windows 10 enterprise

key step to set docker-compose env for pycharm

  • install docker desktop
  • exec docker pull busybox in docker desktop to install busybox image
  • enable Expose daemon on tcp://localhost:2375 without tls in docker desktop setting page
  • set Engine API URL to tcp://localhost::2375 in pycharm FILE->Setting->Build,Execution,Deployment setting page
  • Add python Interpreter in pycharm FILE->Setting->Project:xxx ->Docker Compose setting page

上面这一步是可以让我们直接在pycharm中调试docker container中的python工程,比如你的docker-compose是搭建一个web server项目,里面构建了7、8个container, 其他一个叫api 的contaienr可能就是你基于flask构建的web server,这时你在docker compose setting apge中的serice选项中选择api。

pycharm in ubuntu


在window上设置Docker的Expose daemon on tcp://localhost:2375 without TLS很方便,当时ubuntu上有点免费,查询了各种解决方案,发现使用nmap的ncat工具可以轻松解决问题。

$sudo ncat -lknvp 2375 -c “ncat -U /var/run/docker.sock”


dockerfile for RockyLinux

centos 宣布EOS之后,前centos的创始人基于centos创立了RockyLinux发行版

  FROM rockylinux:8

  RUN yum -y groupinstall "Development Tools" && \
      yum -y install tar && \
      yum -y install perl && \
      yum -y install wget && \
      yum -y install expat-devel && \
      yum -y install zlib zlib-devel && \
      yum -y install bison openssl-devel && \
      wget ftp://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz && \
      tar zxvf autoconf-2.69.tar.gz && \
      cd autoconf-2.69 && \
      ./configure --prefix=/usr/ && \
      make && make install && \
      cd .. && \
      rm -f autoconf-2.69.tar.gz