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 为例
-
首先查看镜像的图形驱动
-
docker image inspect nginx
-
找到 GraphDriver
-
“LowerDir”:(从下往上看)(这里选取的是镜像底层)
-
/var/lib/docker/overlay2/aafb7182fd71d4f8d08a506a8e18a28a2420aaf76271cd9e4c128da9b534782c/diff: 用户文件
-
/var/lib/docker/overlay2/b906910d19ea6a2dc6ecac175306c7c6a344bb000173954eb732c511acba808e/diff:
-
/var/lib/docker/overlay2/399e253a20f137bb5d4a4fc17949a3b514524c07130dec3a714481a53e5ca0ef/diff: nginx启动shell脚本
-
/var/lib/docker/overlay2/e66871b59323b901b6204390173bcfe2bf076c68b92a17f9fc6456ccc24c76c5/diff: nginx配置文件
-
/var/lib/docker/overlay2/6f4b2f6df7ba55a75a98d4db3d1d91ec0959e18df3e65f177f9129ff39ede6ad/diff: 小 linux 系统
-
-
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、容器如何挂在
每一个容器都支持三种挂在方式:
- docker 自动在外部创建文件夹自动挂载容器内部指定的文件夹内容【Dockerfile VOLUME指令的作用】
- 自己在外部创建文件夹,手动挂载
- 可以把数据挂在到内存中