容器基础
docker是什么
docker 是go语言编写的容器引擎,遵守Apache2.0 开源协议,而容器实际上是宿主机上的一个进程。
容器基于linux内核的namespace、cgroup、aufs 技术。
- cgroup(linux control group) 限制cpu mem disk 带宽。 /sys/fs/cgroup/
- namespace 的资源隔离 pid mount uts ipc network user
- chroot 和 aufs
为什么选择容器
- 资源利用率高。相比于虚拟机技术,容器不需要硬件虚拟化,不需要运行完整的操作系统
- 秒级启动
- 保证运行环境的一致性
- 更轻松的迁移
- 持续的交付和部署
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
-
操作系统分为内核空间和用户空间,内核启动后会挂载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)
-
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} .
-
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