玩命加载中🤣🤣🤣

Docker实战


Docker实战

Docker 的安装及配置见 往期 Docker 安装

多说一嘴镜像加速

mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://jcgnocdi.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker

常见命令

镜像相关

docker image prune ## 移除游离镜像
docker rmi -f $(docker iamges -aq) ## 删除全部镜像

## 标签
docker tag 原镜像:标签 新镜像:标签 ## 重命名镜像
docker push 仓库网址/名称地址/仓库名:版本号

## 导入导出 export/import
docker export [OPTIONS] CONTAINER  ## 将容器导出
docker export -o deenginx.tar mynginx
docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]] ## 导入成镜像
docker import deenginx.tar mynginx:v2
#补充说明:
# 1. 导出是将容器导出, 导入后是镜像
# 2. 导出前的启动命令和导出后的要一致,不然启动不起来
## 附:
## 查看启动命令 >>> 方式一
docker ps --no-trunc ## 看一下之前完整的启动命令, 并且记录下 COMMAND, 复制不带双引号的部分
docker run -d -P mynginx:v2 /docker-entrypoint.sh nginx -g 'daemon off;'
## 查看启动命令 >>> 方式二
docker image inspect nginx ## 查看nginx镜像内部信息
## 拼接 Entrypoint + Cmd 的所有东西

## save/load 注意: 这里是将镜像导出
docker save -o saveimg.tar redis:latest alpine:latest
docker load -i saveimg.tar

容器相关

docker run -d --name mynginx -p 88:80 nginx
docker logs -f mynginx ## 跟踪日志(就是在前台能输出的内容)

## 进入容器
docker exec -it -u 0:0 --privileged nginx /bin/bash ## 0用户, 以特权身份进入容器

复制文件

docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-  ## 把容器里面的复制出来
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH  ## 把外部的复制进去

echo 1111 >> index.html
docker cp index.html mynginx:/usr/share/nginx/html
docker cp mynginx:/etc/nginx/nginx.conf nginx.conf
  • SRC_PATH 指定为一个文件
    • DEST_PATH 不存在:文件名为 DEST_PATH,内容为SRC的内容
    • DEST_PATH 不存在并且以 / 结尾:报错
    • DEST_PATH 存在并且是文件:目标文件内容被替换为 SRC_PATH 的文件内容。
    • DEST_PATH 存在并且是目录:文件复制到目录内,文件名为 SRC_PATH 指定的名字
  • SRC_PATH 指定为一个目录
    • DEST_PATH 不存在: DEST_PATH 创建文件夹,复制源文件夹内的所有内容
    • DEST_PATH 存在是文件:报错
    • DEST_PATH 存在是目录
      • SRC_PATH 不以 /. 结束:源文件夹复制到目标里面
      • SRC_PATH 以 /. 结束:源文件夹里面的内容复制到目标里面

得到容器变化

docker diff 容器id/容器名
## 提交
docker commit -a dee -m "first commit" mynginx deenginx:v2

网络和存储原理

Docker存储

1、镜像如何存储

以 nginx 为例

  1. 首先查看镜像的图形驱动

    • docker image inspect nginx

    • 找到 GraphDriver

    • “LowerDir”:(从下往上看)(这里选取的是镜像底层)

      • /var/lib/docker/overlay2/aafb7182fd71d4f8d08a506a8e18a28a2420aaf76271cd9e4c128da9b534782c/diff: 用户文件

        image-20240728170532252

      • /var/lib/docker/overlay2/b906910d19ea6a2dc6ecac175306c7c6a344bb000173954eb732c511acba808e/diff:

        image-20240728170501409

      • /var/lib/docker/overlay2/399e253a20f137bb5d4a4fc17949a3b514524c07130dec3a714481a53e5ca0ef/diff: nginx启动shell脚本

        image-20240728170444853

      • /var/lib/docker/overlay2/e66871b59323b901b6204390173bcfe2bf076c68b92a17f9fc6456ccc24c76c5/diff: nginx配置文件

        image-20240728170427538

      • /var/lib/docker/overlay2/6f4b2f6df7ba55a75a98d4db3d1d91ec0959e18df3e65f177f9129ff39ede6ad/diff: 小 linux 系统

        image-20240728170404333

    • docker ps -s 可以看到每个容器真正用到的文件大小

      • “MergedDir”: 合并目录,容器最终的完整工作目录全内容都在合并层,数据卷在容器层产生所有的增删改都在容器层
    • “UpperDir”: 上层目录(这里选取的是容器UpperDir)

      • 通过 docker inspect “容器id” >>> 找到 GraphDriver
      • “UpperDir”: “/var/lib/docker/overlay2/6a62820fd0c875f810d9319a3d5471fbcfa40c4ac4e797760d2d318f6c457518/diff”,
      • cat etc/nginx/nginx.conf >>> 可以发现,在容器内部更改的文件在这里会体现
    • “WorkDir”: 工作目录(临时层),pid等

LowerDir(底层) >>> MergedDir >>> UpperDir >>> WorkDir

docker 底层的 storage driver 完成了以上的目录组织结果

一旦容器移除,容器修改的所有配置全部丢失,并不会映射到镜像里

docker commit 提交容器变化为一个新的镜像

哪些东西适合容器运行?

2、容器如何挂在

每一个容器都支持三种挂在方式:

  1. docker 自动在外部创建文件夹自动挂载容器内部指定的文件夹内容【Dockerfile VOLUME指令的作用】
  2. 自己在外部创建文件夹,手动挂载
  3. 可以把数据挂在到内存中

文章作者: 👑Dee👑
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 👑Dee👑 !
  目录