docker lab1
1. 数据持久化
1.1 bind mount
1.1.1 创建
在当前目录下分别创建 log, data, conf 目录,分别持久化 mysql 的日志、数据以及配置文件,通过 -v 选项建立与容器内对应目录的映射。
1 | docker run -it -p 8888:3306 \ |
1.1.2 写入数据
1 | docker exec -it b10d0778405d mysql -u root -p |
使用 mysql 命令行客户端,创建 test 数据库。

1.1.3 销毁
1 | docker stop <container-id> |
1.1.4 重新创建
同 1.1.1
1.1.5 重新读取
上面几步的截图如下,可以看到基于干净的 mysql 镜像重新创建的容器仍然可以查询到先前创建的 test 数据库。

1.2 volumes
1.2.1 创建
1 | docker run -d \ |
由 docker 管理程序自动生成三个命名 volume .

1.2.2 写入数据
1 | docker exec -it mysql01 mysql -u root -p |
同样地,使用 mysql 命令行客户端,创建 test 数据库。

1.2.3 销毁
1 | docker stop mysql01 |
1.2.4 重新创建
同 1.2.1
1.2.5 重新读取
上面几步的截图如下,可以看到基于干净的 mysql 镜像重新创建的容器仍然可以查询到先前创建的 test 数据库。


1.3 方案对比
- 性能:bind mount 方式,docker 容器直接访问 host 的目录或文件,性能更佳。
- 权限:bind mount 方式,docker 容器对于该 host 目录可能会引入权限问题。 如果容器仅需要只读访问权限,最好是显式设定只读方式。
- 移植性:
- volume 方式,如果 host 中目录为空,docker 先将容器中的对应目录复制到 host 下, 然后再进行挂载操作。
- bind mount方式,挂载之前没有复制操作,容器要依赖 host 主机的一个绝对路径, 使得容器的移植性变差。
2. 构建 Nginx 的 Ubuntu 镜像
2.1 docker commit
2.1.1 更新 apt 并换源
这里使用的是阿里云的镜像站,由于使用的是干净的 Ubuntu22 镜像,无法通过常用的 vim, nano 等命令行工具创建或编辑文件,故先在宿主机创建该源文件,借助 docker cp 在宿主机和容器间传递文件。
1 | docker cp ./sources.list <container-id>:/etc/apt/ |
sources.list 内容如下,注释掉 deb-src 部分以提升 apt update 速度。
1 | deb http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse |
更新 apt
1 | apt update |
2.1.2 安装 nginx
安装 nginx
1 | apt install -y nginx |
2.1.3 修改 nginx 主页文件
nginx 的默认配置文件会将 /var/www/html/index.nginx-debian.html 作为主页,修改其内容包含学号。
1 |
|
同样使用 docker cp 传进容器内
1 | docker cp ./index.nginx-debian.html <container-id>:/var/www/html/index.nginx-debian.html |
2.1.4 构建新镜像
注意修改启动命令为 nginx -g daemon off ,防止容器后台模式启动后立刻退出。
1 | docker commit -c 'CMD ["nginx", "-g", "daemon off;"]' <container-id> ubuntu-nginx:dockercommit |
2.1.5 本地测试

2.1.6 登录并提交到镜像库
1 | docker login --username=21371337 scs.buaa.edu.cn:8081 |
2.2 Dockerfile
2.2.1 Dockerfile
1 | FROM ubuntu |
2.2.2 构建镜像

2.2.3 本地测试

2.2.4 上传
和 2.1.6 同理。