容器基础

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

daemon.json配置文件

基于kvmdocker 运行macos

docker run --name macos \
-e RAM_SIZE="8G" \
-e CPU_CORES="4" \
-p 8008:8006 \
--device=/dev/kvm \
--device=/dev/net/tun \
--cap-add NET_ADMIN \
--stop-timeout 120 \
dockurr/macos

基于kvmdocker 运行windows

posted @   mingtian是吧  阅读(63)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
点击右上角即可分享
微信分享提示