一、创建容器的两种方式docker run vs docker create1. docker run最常用创建并启动一条命令完成创建容器 启动容器bash运行# 完整格式 docker run -dit --name 容器名 -p 宿主机端口:容器端口 镜像名:版本 [启动命令] # 案例创建并启动一个nginx容器 docker run -dit --name mynginx -p 8080:80 nginx:latest参数解释-d后台守护进程运行-i保持标准输入打开-t分配伪终端--name给容器起名字-p端口映射2. docker create只创建不启动只创建容器容器处于停止状态需要手动docker start才会运行。bash运行# 完整格式 docker create --name 容器名 -p 宿主机端口:容器端口 镜像名:版本 # 案例只创建不启动 docker create --name mynginx2 -p 8081:80 nginx:latest # 手动启动 docker start mynginx23. 两者区别表格命令作用适用场景docker run创建 启动一步到位99% 场景都用这个docker create只创建不启动需要提前准备好容器、稍后再启动的特殊场景二、docker commit把容器的改动保存为新镜像作用你在容器里装了软件、改了配置想把这个状态保存成一个新的镜像以后直接用这个镜像启动容器不用再重新装一遍。命令格式bash运行docker commit -p 容器名/ID 新镜像名:版本-pcommit 时暂停容器保证数据一致性实战案例bash运行# 1. 先进入容器装个vim模拟你对容器做了修改 docker exec -it mynginx /bin/bash apt update apt install -y vim exit # 2. 把修改后的容器保存成新镜像 docker commit -p mynginx mynginx-vim:v1 # 3. 查看本地镜像能看到新生成的 mynginx-vim:v1 docker images # 4. 用新镜像启动容器进去直接就有vim了不用再装 docker run -dit --name test2 mynginx-vim:v1注意事项commit 适合临时保存、测试用生产环境推荐用 Dockerfile 构建镜像更规范、可追溯commit 保存的是容器可写层的变化基于原镜像增量生成新镜像三、容器导出导入 vs 镜像导出导入两对命令别搞混1. 容器导出导入export /import作用把运行中的容器整个导出成一个压缩包可以传到别的机器上导入成镜像。导出容器bash运行# 格式docker export -o 导出的包名 容器名/ID docker export -o mynginx.tar mynginx注意export 导出的是容器的文件系统会丢失镜像的历史层、启动命令、元数据导入后只是一个光秃秃的文件系统镜像。导入容器包成镜像bash运行# 格式docker import 包名 新镜像名:版本 docker import mynginx.tar mynginx-import:v1导入后直接变成镜像不是容器需要用 docker run 启动。2. 镜像导出导入save /load作用把镜像完整导出成压缩包传到别的机器上完整导入保留所有镜像层、元数据、启动命令。导出镜像bash运行# 格式docker save -o 导出的包名 镜像名:版本 docker save -o nginx.tar nginx:latest导入镜像包bash运行# 格式docker load -i 包名 docker load -i nginx.tar3. 两对命令对比重点别搞混表格对比项export / importsave / load操作对象容器镜像导出内容容器文件系统单层完整镜像所有层 元数据丢失信息丢失启动命令、镜像历史、环境变量等完整保留什么都不丢导入后变成镜像需要自己指定启动命令还原成和原来一模一样的镜像文件大小更小更大适用场景迁移容器状态了解即可不常用镜像迁移、离线部署生产常用记忆容器用 export镜像用 save。生产环境镜像迁移一律用 save/load。四、写时复制CoW与镜像分层原理1. 什么是写时复制 Copy-on-Write镜像作为容器的基础环境是只读的。 所有容器共用同一份镜像文件容器启动时在镜像上面加一层可写层。读文件直接从镜像层读写文件先把文件从镜像层复制到可写层然后在可写层修改好处多个容器共用镜像节省大量磁盘空间启动快2. 联合文件系统四层结构OverlayFSDocker 用 OverlayFS 实现联合挂载一共四层目录表格层级名称读写性作用第 1 层lowerdir只读镜像层所有镜像文件都在这里可以有多个 lowerdir镜像有多少层就有多少个第 2 层upperdir可读可写容器层容器运行产生的所有修改都存在这一层第 3 层merged统一视图给用户看的合并视图把 lowerdir 和 upperdir 的文件合并展示upperdir 里有的就展示 upperdir 的没有的展示 lowerdir 的第 4 层workdir工作目录内部临时工作目录文件拷贝、原子操作时用用户不用管通俗理解lowerdir 公共课本大家都能看不能改upperdir 你自己的笔记本你可以在上面写东西merged 你看书的视角书上有的直接看你记了笔记的地方看你的笔记workdir 草稿纸写东西时先打草稿再誊上去验证命令bash运行# 查看容器的分层信息能看到UpperDir、LowerDir、MergedDir、WorkDir docker inspect 容器名 | grep -A 10 GraphDriver五、数据卷 -v 参数详解持久化存储为什么需要数据卷容器的可写层upperdir数据是临时的容器删了数据就没了。 数据卷把容器里的数据存到宿主机上容器删了数据还在实现持久化。-v 参数的三种用法用法 1bind 绑定挂载绝对路径模式把宿主机的指定目录和容器目录绑定。bash运行# 格式docker run -v 宿主机绝对路径:容器内路径 docker run -dit --name mynginx -v /root/html:/usr/share/nginx/html -p 8080:80 nginx特点宿主机路径必须是绝对路径宿主机目录不存在会自动创建你完全知道数据存在宿主机哪个位置方便管理适合配置文件、网站代码、日志等需要手动管理的文件用法 2volume 卷存储具名卷模式Docker 自己在宿主机上找个地方存数据你只需要给卷起个名字。bash运行# 格式docker run -v 卷名:容器内路径 docker run -dit --name mynginx -v nginx-html:/usr/share/nginx/html -p 8080:80 nginx特点冒号前面是卷名不是路径没有斜杠开头Docker 自动管理存储位置一般在/var/lib/docker/volumes/下卷不存在会自动创建已存在就直接用适合数据库数据、应用产生的数据等不需要手动找路径的文件用法 3匿名卷不推荐了解即可只写容器路径不写宿主机的部分Docker 自动创建一个随机名字的卷。bash运行docker run -dit --name mynginx -v /usr/share/nginx/html nginx特点卷名是随机哈希不好找、不好管理容器删了卷还在但你不知道哪个是哪个基本没人用了解就行bind 和 volume 对比表格对比项bind 绑定挂载volume 卷存储-v 写法绝对路径容器路径卷名容器路径存储位置你指定的任意目录Docker 统一管理/var/lib/docker/volumes权限控制受宿主机目录权限影响Docker 统一管理权限问题少可移植性差换机器路径可能不一样好只认卷名适用场景配置文件、代码、日志数据库数据、应用数据六、docker volume 卷管理命令常用命令bash运行# 1. 创建一个卷 docker volume create 卷名 # 案例 docker volume create mydata # 2. 查看所有卷 docker volume ls # 3. 查看卷的详细信息能看到存在宿主机哪个路径 docker volume inspect 卷名 # 案例 docker volume inspect mydata # 输出里的 Mountpoint 就是真实存储路径 # 4. 删除一个卷容器在用的卷删不掉要先删容器 docker volume rm 卷名 # 5. 清理所有没被使用的卷释放空间 docker volume prune实战案例bash运行# 1. 先创建一个卷 docker volume create mysql-data # 2. 启动mysql容器把数据存在这个卷里 docker run -d --name mysql -v mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD123456 mysql:5.7 # 3. 进去建个库、插点数据模拟业务数据 docker exec -it mysql mysql -uroot -p123456 create database testdb; exit # 4. 删掉容器模拟容器挂了 docker rm -f mysql # 5. 重新启动一个mysql容器挂载同一个卷 docker run -d --name mysql2 -v mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD123456 mysql:5.7 # 6. 进去看之前的testdb还在数据没丢 docker exec -it mysql2 mysql -uroot -p123456 show databases;七、--restart 容器开机自启策略作用设置容器的重启策略Docker 服务重启、服务器重启后容器要不要自动起来。四种策略表格策略值作用no不自动重启默认always总是自动重启不管什么原因退出的都重启on-failure只有异常退出退出码非 0时才重启unless-stopped总是重启除非你手动 stop 了它实战案例bash运行# 启动容器时设置开机自启 docker run -dit --name mynginx --restartalways -p 8080:80 nginx # 给已经存在的容器修改重启策略 docker update --restartalways 容器名怎么选生产环境重要服务--restartalways或unless-stopped临时测试容器默认 no 就行批处理任务跑完就结束的on-failure八、完整的容器创建命令带所有常用参数bash运行docker run -dit \ --name 容器名 \ -p 宿主机端口:容器端口 \ -v 宿主机路径/卷名:容器内路径 \ -e 环境变量名值 \ --restartalways \ 镜像名:版本 \ [启动命令]完整案例启动一个带持久化的 nginxbash运行docker run -dit \ --name myweb \ -p 80:80 \ -v /root/web:/usr/share/nginx/html \ -v /root/nginx.conf:/etc/nginx/nginx.conf \ --restartalways \ nginx:1.24参数逐个解释-dit后台交互式运行--name myweb容器名叫 myweb-p 80:80宿主机 80 端口映射到容器 80-v /root/web:/usr/share/nginx/html网站目录挂载到宿主机-v /root/nginx.conf:/etc/nginx/nginx.conf配置文件挂载到宿主机改配置不用进容器--restartalways开机自动重启nginx:1.24用的镜像
Docker 进阶笔记(存储 + 镜像分层 + 数据卷|纠错 + 案例 + 注释版)
一、创建容器的两种方式docker run vs docker create1. docker run最常用创建并启动一条命令完成创建容器 启动容器bash运行# 完整格式 docker run -dit --name 容器名 -p 宿主机端口:容器端口 镜像名:版本 [启动命令] # 案例创建并启动一个nginx容器 docker run -dit --name mynginx -p 8080:80 nginx:latest参数解释-d后台守护进程运行-i保持标准输入打开-t分配伪终端--name给容器起名字-p端口映射2. docker create只创建不启动只创建容器容器处于停止状态需要手动docker start才会运行。bash运行# 完整格式 docker create --name 容器名 -p 宿主机端口:容器端口 镜像名:版本 # 案例只创建不启动 docker create --name mynginx2 -p 8081:80 nginx:latest # 手动启动 docker start mynginx23. 两者区别表格命令作用适用场景docker run创建 启动一步到位99% 场景都用这个docker create只创建不启动需要提前准备好容器、稍后再启动的特殊场景二、docker commit把容器的改动保存为新镜像作用你在容器里装了软件、改了配置想把这个状态保存成一个新的镜像以后直接用这个镜像启动容器不用再重新装一遍。命令格式bash运行docker commit -p 容器名/ID 新镜像名:版本-pcommit 时暂停容器保证数据一致性实战案例bash运行# 1. 先进入容器装个vim模拟你对容器做了修改 docker exec -it mynginx /bin/bash apt update apt install -y vim exit # 2. 把修改后的容器保存成新镜像 docker commit -p mynginx mynginx-vim:v1 # 3. 查看本地镜像能看到新生成的 mynginx-vim:v1 docker images # 4. 用新镜像启动容器进去直接就有vim了不用再装 docker run -dit --name test2 mynginx-vim:v1注意事项commit 适合临时保存、测试用生产环境推荐用 Dockerfile 构建镜像更规范、可追溯commit 保存的是容器可写层的变化基于原镜像增量生成新镜像三、容器导出导入 vs 镜像导出导入两对命令别搞混1. 容器导出导入export /import作用把运行中的容器整个导出成一个压缩包可以传到别的机器上导入成镜像。导出容器bash运行# 格式docker export -o 导出的包名 容器名/ID docker export -o mynginx.tar mynginx注意export 导出的是容器的文件系统会丢失镜像的历史层、启动命令、元数据导入后只是一个光秃秃的文件系统镜像。导入容器包成镜像bash运行# 格式docker import 包名 新镜像名:版本 docker import mynginx.tar mynginx-import:v1导入后直接变成镜像不是容器需要用 docker run 启动。2. 镜像导出导入save /load作用把镜像完整导出成压缩包传到别的机器上完整导入保留所有镜像层、元数据、启动命令。导出镜像bash运行# 格式docker save -o 导出的包名 镜像名:版本 docker save -o nginx.tar nginx:latest导入镜像包bash运行# 格式docker load -i 包名 docker load -i nginx.tar3. 两对命令对比重点别搞混表格对比项export / importsave / load操作对象容器镜像导出内容容器文件系统单层完整镜像所有层 元数据丢失信息丢失启动命令、镜像历史、环境变量等完整保留什么都不丢导入后变成镜像需要自己指定启动命令还原成和原来一模一样的镜像文件大小更小更大适用场景迁移容器状态了解即可不常用镜像迁移、离线部署生产常用记忆容器用 export镜像用 save。生产环境镜像迁移一律用 save/load。四、写时复制CoW与镜像分层原理1. 什么是写时复制 Copy-on-Write镜像作为容器的基础环境是只读的。 所有容器共用同一份镜像文件容器启动时在镜像上面加一层可写层。读文件直接从镜像层读写文件先把文件从镜像层复制到可写层然后在可写层修改好处多个容器共用镜像节省大量磁盘空间启动快2. 联合文件系统四层结构OverlayFSDocker 用 OverlayFS 实现联合挂载一共四层目录表格层级名称读写性作用第 1 层lowerdir只读镜像层所有镜像文件都在这里可以有多个 lowerdir镜像有多少层就有多少个第 2 层upperdir可读可写容器层容器运行产生的所有修改都存在这一层第 3 层merged统一视图给用户看的合并视图把 lowerdir 和 upperdir 的文件合并展示upperdir 里有的就展示 upperdir 的没有的展示 lowerdir 的第 4 层workdir工作目录内部临时工作目录文件拷贝、原子操作时用用户不用管通俗理解lowerdir 公共课本大家都能看不能改upperdir 你自己的笔记本你可以在上面写东西merged 你看书的视角书上有的直接看你记了笔记的地方看你的笔记workdir 草稿纸写东西时先打草稿再誊上去验证命令bash运行# 查看容器的分层信息能看到UpperDir、LowerDir、MergedDir、WorkDir docker inspect 容器名 | grep -A 10 GraphDriver五、数据卷 -v 参数详解持久化存储为什么需要数据卷容器的可写层upperdir数据是临时的容器删了数据就没了。 数据卷把容器里的数据存到宿主机上容器删了数据还在实现持久化。-v 参数的三种用法用法 1bind 绑定挂载绝对路径模式把宿主机的指定目录和容器目录绑定。bash运行# 格式docker run -v 宿主机绝对路径:容器内路径 docker run -dit --name mynginx -v /root/html:/usr/share/nginx/html -p 8080:80 nginx特点宿主机路径必须是绝对路径宿主机目录不存在会自动创建你完全知道数据存在宿主机哪个位置方便管理适合配置文件、网站代码、日志等需要手动管理的文件用法 2volume 卷存储具名卷模式Docker 自己在宿主机上找个地方存数据你只需要给卷起个名字。bash运行# 格式docker run -v 卷名:容器内路径 docker run -dit --name mynginx -v nginx-html:/usr/share/nginx/html -p 8080:80 nginx特点冒号前面是卷名不是路径没有斜杠开头Docker 自动管理存储位置一般在/var/lib/docker/volumes/下卷不存在会自动创建已存在就直接用适合数据库数据、应用产生的数据等不需要手动找路径的文件用法 3匿名卷不推荐了解即可只写容器路径不写宿主机的部分Docker 自动创建一个随机名字的卷。bash运行docker run -dit --name mynginx -v /usr/share/nginx/html nginx特点卷名是随机哈希不好找、不好管理容器删了卷还在但你不知道哪个是哪个基本没人用了解就行bind 和 volume 对比表格对比项bind 绑定挂载volume 卷存储-v 写法绝对路径容器路径卷名容器路径存储位置你指定的任意目录Docker 统一管理/var/lib/docker/volumes权限控制受宿主机目录权限影响Docker 统一管理权限问题少可移植性差换机器路径可能不一样好只认卷名适用场景配置文件、代码、日志数据库数据、应用数据六、docker volume 卷管理命令常用命令bash运行# 1. 创建一个卷 docker volume create 卷名 # 案例 docker volume create mydata # 2. 查看所有卷 docker volume ls # 3. 查看卷的详细信息能看到存在宿主机哪个路径 docker volume inspect 卷名 # 案例 docker volume inspect mydata # 输出里的 Mountpoint 就是真实存储路径 # 4. 删除一个卷容器在用的卷删不掉要先删容器 docker volume rm 卷名 # 5. 清理所有没被使用的卷释放空间 docker volume prune实战案例bash运行# 1. 先创建一个卷 docker volume create mysql-data # 2. 启动mysql容器把数据存在这个卷里 docker run -d --name mysql -v mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD123456 mysql:5.7 # 3. 进去建个库、插点数据模拟业务数据 docker exec -it mysql mysql -uroot -p123456 create database testdb; exit # 4. 删掉容器模拟容器挂了 docker rm -f mysql # 5. 重新启动一个mysql容器挂载同一个卷 docker run -d --name mysql2 -v mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD123456 mysql:5.7 # 6. 进去看之前的testdb还在数据没丢 docker exec -it mysql2 mysql -uroot -p123456 show databases;七、--restart 容器开机自启策略作用设置容器的重启策略Docker 服务重启、服务器重启后容器要不要自动起来。四种策略表格策略值作用no不自动重启默认always总是自动重启不管什么原因退出的都重启on-failure只有异常退出退出码非 0时才重启unless-stopped总是重启除非你手动 stop 了它实战案例bash运行# 启动容器时设置开机自启 docker run -dit --name mynginx --restartalways -p 8080:80 nginx # 给已经存在的容器修改重启策略 docker update --restartalways 容器名怎么选生产环境重要服务--restartalways或unless-stopped临时测试容器默认 no 就行批处理任务跑完就结束的on-failure八、完整的容器创建命令带所有常用参数bash运行docker run -dit \ --name 容器名 \ -p 宿主机端口:容器端口 \ -v 宿主机路径/卷名:容器内路径 \ -e 环境变量名值 \ --restartalways \ 镜像名:版本 \ [启动命令]完整案例启动一个带持久化的 nginxbash运行docker run -dit \ --name myweb \ -p 80:80 \ -v /root/web:/usr/share/nginx/html \ -v /root/nginx.conf:/etc/nginx/nginx.conf \ --restartalways \ nginx:1.24参数逐个解释-dit后台交互式运行--name myweb容器名叫 myweb-p 80:80宿主机 80 端口映射到容器 80-v /root/web:/usr/share/nginx/html网站目录挂载到宿主机-v /root/nginx.conf:/etc/nginx/nginx.conf配置文件挂载到宿主机改配置不用进容器--restartalways开机自动重启nginx:1.24用的镜像