容器基础

docker是什么

docker 是go语言编写的容器引擎,遵守Apache2.0 开源协议,而容器实际上是宿主机上的一个进程。

容器基于linux内核的namespace、cgroup、aufs 技术。

  1. cgroup(linux control group) 限制cpu mem disk 带宽。 /sys/fs/cgroup/
  2. namespace 的资源隔离 pid mount uts ipc network user
  3. chroot 和 aufs

为什么选择容器

  1. 资源利用率高。相比于虚拟机技术,容器不需要硬件虚拟化,不需要运行完整的操作系统
  2. 秒级启动
  3. 保证运行环境的一致性
  4. 更轻松的迁移
  5. 持续的交付和部署

docker三要素

安装docker wget https://get.docker.com/ -O getdocker.sh;sh ./getdocker.sh --mirror Aliyun
安装指定版本docker wget https://get.docker.com/ -O getdocker.sh;sh ./getdocker.sh --mirror Aliyun --version 20.10.24
curl https://get.docker.com|bash -s -- --mirror Aliyun --version 20.10.24

/etc/docker/daemon.json
{ 
  "registry-mirrors" : 
    [ 
      "https://docker.m.daocloud.io", 
      "https://noohub.ru", 
      "https://huecker.io",
      "https://dockerhub.timeweb.cloud" 
    ] 
}

卸载docker

yum remove docker-ce docker-ce-cli containerd.io
rm -rf /var/lib/docker
rm -rf /var/lib/containerd

docker容器的三个要素:image container repositry

  1. 操作系统分为内核空间和用户空间,内核启动后会挂载root文件系统提供用户空间。 容器中的镜像共用宿主机的内核,镜像本身只提供用户空间

    image

    docker search --filter=stars=3 alpine 
    docker pull alpine 
    docker tag 7731472c3f2a 1209233066/alpine 
    docker login 
    docker save 1209233066/alpine >/tmp/alpine.tar 
    docker rmi 1209233066/alpine
    docker load < /tmp/alpine.tar
    docker commit -p 容器名 alpine:with_curl
    docker rmi $(docker images -q)
    docker rmi $(docker images -q -f dangling=true)
    
  2. container是image 的实例化

    container

    docker run --rm alpine echo $((1+2))
    docker run -d --rm alpine sleep 100
    docker run -d --rm --name alpine01 alpine sleep 100
    # --volumes
    docker run -d --rm --name alpine01 -v /data alpine sleep 100  # # 随机挂载路径到 容器/data
    # 查看挂载信息 docker inspect -f {{.Mounts}}  alpine01 
    docker run -d --rm --name alpine01 -v /data:/data alpine sleep 100
    docker run -d --rm --name alpine01 -v /etc/hosts:/etc/hosts:ro alpine sleep 100
    docker run -d --rm --name nginx01 --volumes-from alpine01  nginx
    # --publish
    # --publish-all
    docker run -d --rm --name nginx01 -v /usr/share/nginx/html:/usr/share/nginx/html -P nginx 
    docker run -d --rm --name nginx01 -v /usr/share/nginx/html:/usr/share/nginx/html -p80:80 nginx 
    docker run -d --rm --name nginx01 -v /usr/share/nginx/html:/usr/share/ngixn/html -p127.0.0.1:80:80 nginx 
    docker run -d --rm --name nginx01 -v /usr/sahre/nginx/html:/usr/share/ngixn/html -p127.0.0.1::80 ngnix 
    
    # --privileged
    docker run -d --rm --name nginx01 -v /usr/share/nginx/html:/usr/share/nignx/html -P --privileged=true nginx
    # --net
    docker run -d --rm --name nginx01 -v /usr/share/nginx/html:/user/share/nginx/html -P --privileged=true --net=brige nginx
    docker run -d --rm --name nginx01 -v /usr/share/nginx/html:/user/share/nginx/html -P --privileged=true --net=none nginx
    docker run -d --rm --name nginx01 -v /usr/share/nginx/html:/user/share/nginx/html -P --privileged=true --net=host nginx 
    docker run -d --rm --name nginx01 -v /usr/share/nginx/html:/user/share/nginx/html -P --privileged=true --net=container:alpine nginx
    # --env
    docker run -d --rm --name mysql01 -e MYSQL_ROOT_PASSWORD=123 mysql
    # -m, --memory 限制最大内存
    docker run -d --rm --name mysql01 -m 1g -e MYSQL_ROOT_PASSWORD=123 mysql
    cat /sys/fs/cgroup/memory/docker/[容器id]/memory.limit_in_bytes
    动态调整memory 限制
    echo 1073741824 >/sys/fs/cgroup/memory/docker/[容器id]/memory.limit_in_bytes
    通过 docker stats 观察
    
    # --cpus  限制最大cpu
    docker run -d --rm --name mysql01 --cpus 0.5 -e MYSQL_ROOT_PASSWORD=123 mysql
    # --netrypoint
    docker run --rm --entrypoint echo alpine "$((1+1))"
    # --restart 
    # --add-host (host:ip)  在/etc/hosts中添加信息
    

    进入容器

    docker exec -it nginx01 echo $((1+2))
    
    yum install util-linux -y
    docker inspect -f "{{ .State.Pid }}" nginx01
    nsenter --target 7917 --mount --uts --ipc --net --pid
    

    删除容器

    docker rm -fv nginx01
    docker rm -fv `docker ps -qa -f status=exited`
    

    查看容器

    docker inspect nginx01
    docker inspect -f '{{.Mounts}}' nginx01
    docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' nginx01 
    docker port nginx01
    docker inspect -f "{{ .State.Pid }}" nginx01
    docker inspect -f "{{ .Name }}" nginx01
    docker ps
    docker ps -a
    docker ps -aq
    docker ps -a -f status=exited
    docker ps -a -f status=running
    

    从容器拷贝文件

    docker cp e58886d76204:/guacamole-client .
    

    清理docker 磁盘空间占用

    #https://blog.csdn.net/y19910825/article/details/106943392
    [root@ceph addons]# docker system df
    TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
    Images          37        29        7.578GB   2.958GB (39%)
    Containers      152       70        57.36MB   51.71MB (90%)
    Local Volumes   78        5         10.53GB   10.53GB (100%)
    Build Cache     0         0         0B        0B
    

    清理所有停止的containers、network、dangling images、buid cache

    docker system prune
    

    下面bash来在github,打包多平台的镜像包。知道docker 有跨平台打包能力即可。

    #!/bin/bash
    
    arch_list=(amd64 arm arm64 ppc64le s390x)
    manifest="kubernetesui/metrics-scraper";
    
    # Concat arch_list with ,
    platforms=$(IFS=,; echo "${arch_list[*]}")
    
    image_name="${manifest}:${TRAVIS_TAG:="latest"}"
    
    echo "--- docker buildx build --push --platform $platforms --tag $image_name .";
    # docker buildx build --push --platform amd64,arm,arm64,ppc64le,s390x --tag kubernetesui/metrics-scraper:latest
    docker buildx build --push --platform ${platforms} --tag ${image_name} .
    
    
  3. repostry

    最大的公用仓库 dockerhub

    私有仓库

    docker pull registry
    docker run -d -P registry
    docker run -d --name docker-registry  -p 5000:5000 -v /data/docker-registry:/tmp/registry registry 
    docker tag alpine 127.0.0.1:5000/alpine
    docker push 127.0.0.1:5000/alpine
    

FQA

Q:指定container的ip时报错

  936  docker network create mybridge -d bridge 
  937  docker network ls
  938  docker network inspect mybridge
[root@ceph-mon2 ~]# docker run --rm -it --net=mybridge --ip 172.20.0.10 centos:centos7.9.2009 bash
docker: Error response from daemon: user specified IP address is supported only when connecting to networks with user configured subnets

🅰️如果需要在容器中指定ip 需要新建一个网桥并指定 --subnet--gateway 参数

docker network create -d bridge --subnet=172.16.100.0/24 --gateway=172.16.100.1 mybridge

🅰️ 单独进入container的网络名称空间

nsenter -t $(docker inspect -f '{{ .State.Pid }}' <container-id>) -n bash
posted @ 2021-10-02 14:42  mingtian是吧  阅读(53)  评论(0编辑  收藏  举报