基础概念

Docker使用go开发的一种沙箱工具,他使得应用可以单独运行在沙箱中,通过端口映射或者volumes与外界进行交互。这可以让一个机器上可以运行多种不同环境的应用且互不干扰,例如一个比较大型的引用,使用的此方式单独维护一个模块,使得系统的可靠性大大增强

  • 容器
    镜像运行的实例,一个镜像可以运行多个实例。
  • 镜像
    一个完整的可运行的资源集合
  • 仓库
    保存镜像

使用

这里记录高频次使用的功能,其他的后续记录

  • 镜像的管理

    • pull
    • push
    • commit
      修改一个容器之后,使用commit在此基础上构建自己的容器
    • build
      创建一个镜像,使用docker build语句创建,需要自己编写Dockerfile,具体的编写规则可以参考nosipage
    • rmi
  • 容器的管理

    • run
      创建新的容器,且会使用run指定启动规则,例如端口的映射,volumes文件的指定,以及其他重要参数等,这个命令可以说重要,因为同一个镜像,使用不同参数启动之后,效果是不一样的,对于开发来时,更多的是参与后期的开发,如果不是前期的项目设计,这里了解即可,但是最好的是知道他的只要参数的意义,因为和其他命令有的是通用的,例如-i -t -p等
    • start
    • stop
    • restart
    • exec
      使用此命令可以进入运行中的容器中区,exec -it xxx command
    • attach
    • rm
    • logs
    • cp
      在本地和容器中传输文件
    • export
    • ps

其他命令基本在遇到的时候,再去查看

权限问题

Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.39/containers/json": dial unix /var/run/docker.sock: connect: permission denied

sudo groupadd docker         #添加docker用户组
sudo gpasswd -a $USER docker #将当前用户添加到docker用户组
newgrp docker                #更新docker用户组

System has not been booted with systemd as init system (PID 1). Can’t operate.

  • 使用 –privileged=true
  • /sbin/init
  • 从一开始就最基础的镜像手动构建,使用docker file 构建镜像之后,即使指定 privileged 也无效
  • systemctl 验证
  • docker file 指定用户之后, 后续即使容器 systemctl 失败,暂时没有解决方案,gitlab中又需要指定非root用户~~
  • gitlab 不支持指定容器用户,gitlab有issue,也有解决方案,但是当前版本runner不支持 指定user
  • 解决方案
      1. 使用ssh到容器中执行,
      • 无法任务并行,会有端口冲突这类的问题
      1. ssh到宿主机中启动docker,然后copy代码到docker 中,或者build镜像然后执行
      • 可任务并发,后续研究怎么实现

常用命令


docker run -dit --name centos-p centos /sbin/init

docker run   \
 --mount type=bind,source=/home/asky/asky,target=/workspaces/asky \
 --mount type=bind,source=/home/asky/.workspaces,target=/workspaces/.common \
 --privileged=true  -itd regress:latest  /sbin/init

/home/wen/.workspaces:/workspaces/.common:rw

docker run   \
 --mount type=bind,source=/home/wen/.workspaces,target=/workspaces/.common \
 --mount type=bind,source=/var/lib/docker/volumes/runner-bpams8g-project-152-concurrent-0-cache-c33bcaa1fd2c77edfc3893b41966cea8/_data,target=/builds \
 --privileged=true  -itd asky:1  /sbin/init

                "Source": "/var/lib/docker/volumes/runner-a8wbhcvb-project-5-concurrent-1-cache-c33bcaa1fd2c77edfc3893b41966cea8/_data",
                "Destination": "/builds",

docker run    --mount type=bind,source=/home/wen/.workspaces,target=/workspaces/.common --privileged=true -itd asky:latest
docker run    --mount type=bind,source=/home/wen/.workspaces,target=/workspaces/.common --privileged=true -itd asky:1.0 /sbin/init

docker run -d -p 443:443 -p 80:80 -p 22:22 --name gitlab --restart always \
-v $GITLAB_HOME/config:/etc/gitlab:Z -v $GITLAB_HOME/logs:/var/log/gitlab:Z  -v $GITLAB_HOME/data:/var/opt/gitlab:Z gitlab/gitlab-ce

docker exec -it centos-p /bin/bash

docker commit -a "xxx" -m "a new centos 8 env" centos-p  centos-pre:1

docker cp /home/wen/xxxxx/.git  centos-p:/home/xxxxx


docker build -f DockerFile -t xxx ./

构建基础 pg centos镜像

FROM centos:8

LABEL description="build xxxxx regress env"

RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
RUN sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
RUN sed -e 's|^mirrorlist=|#mirrorlist=|g' \
         -e 's|^#baseurl=http://mirror.centos.org/$contentdir|baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos|g' \
         -i.bak \
         /etc/yum.repos.d/CentOS-*.repo
RUN yum makecache
RUN yum update -y

RUN yum install -y gcc flex bison make perl-ExtUtils-Embed python3 python3-devel readline-devel zlib-devel pam-devel libxml2 libxml2-devel libxslt libxslt-devel openldap openldap-devel wget git perl perl-devel sudo
RUN dnf -y --enablerepo=powertools install perl-IPC-Run perl-Capture-Tiny perl-DateTime

WORKDIR /home
RUN git clone --depth=1 https://ghproxy.com/https://github.com/linux-test-project/lcov -b v1.14 /home/lcov
WORKDIR /home/lcov
RUN make install
RUN genhtml

WORKDIR /home
RUN wget https://libssh2.org/download/libssh2-1.11.0.tar.gz
RUN tar -zxf libssh2-1.11.0.tar.gz
WORKDIR /home/libssh2-1.11.0
RUN ./configure
RUN make install
WORKDIR /home
RUN rm -rf /home/lcov
RUN rm libssh2-1.11.0.tar.gz
RUN rm -rf /home/libssh2-1.11.0

RUN useradd -ms /bin/bash centos

RUN echo 'centos ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers

USER centos
  • 使用命令 docker build -f DockerFile -t xxx ./
  • 构建失败时,存在中间镜像,可以从中间镜像开始构造
  • 后期需要修改的时候,如果是增量修改,可以直接从已构造的镜像继续
  • file中需要改变路径不能直接cd,必须使用WORKDIR
  • 指定用户使用 USER
  • 编写file过程中,如果需要添加某些操作,从文件尾部添加,尽量使用缓存

lcov 安装

使用perl实现的,极度依赖perl 的某些模块,但是perl模块有的不能直接yum安装,需要使用 powertools,且有的模块使用 powertools 也无法直接安装。。。 install 之后使用genhtml 验证是否安装完成



git clone --depth=1 https://github.com/linux-test-project/lcov -b v1.14 /home/lcov
make install

genhtml

查看 已案转perl 模块

sudo find perl -e 'print "@INC"' -name ‘*.pm’

docker run
–mount type=bind,source=/home/wen/.workspaces,target=/workspaces/.common
-itd centos-antdb