Docker 基础篇之快速上手【二】
程序员文章站
2022-04-19 11:20:32
...
Docker 基础篇之快速上手
- 1. 镜像原理
- 2. Docker 容器数据卷
- 3. Docker 安装常用软件
- 3.1 总体步骤
- 3.2 安装 tomcat
- 1. docker hub 上面查询 tomcat 镜像
- 2. 从 docker hub 上拉取 tomcat 镜像到本地
- 3. docker images 查看是否由拉取到 tomcat
- 4. 使用 tomcat 镜像创建容器(也称作运行镜像)
- 3.3 安装 mysql
- 1.docker hub 上面查找 mysql 镜像
- 2. 从 docker hub 上拉取mysql镜像到本地【标签为5.6】
- 3. 使用 mysql5.6 镜像创建容器(也叫运行镜像)
- 4. 外部 windows 来测试连接在 docker 上的 mysql 服务
- 5. 数据备份小测试
- 3.4 安装 redis
1. 镜像原理
1.1 镜像是什么
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件
- UnionFs 【联合文件系统】
UnionFs 联合文件系统是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一虚拟文件系统下。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承、基于基础镜像【没有父镜像】,也可以制作各种具体的应用镜像。
特性:一次同时加载多个文件系统,但从外面来看,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录 - Docker 镜像加载原理
docker 的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。bootfs(boot file system)主要包括 bootloader 和 kernel,bootloader 主要是引导加载 kernel ,Linux 刚启动时会加载 bootfs 文件系统,在 Docker 镜像的最底层是 bootfs。这一层与我们典型的 Linux/Unix 系统是一样的,包含 boot 加载器和内核。当 boot 加载完成之后整个内核就都在内存中了,此时内存的使用权已由 bootfs 转交给内核,此时系统也会卸载 bootfs。
rootfs(root file system),在 bootfs 之上。包含的就是典型 Linux 系统中的 /dev,/proc,/bin,/etc等标准目录和文件,rootfs 就是各种不同的操作系统发行版,比如 Ubuntu,CentOS 等等。 - 分层的镜像
- 为什么 Docker 镜像要采用这种分层结构呢
最大的一个好处就是:共享资源
比如:有多个镜像都从相同的 base 镜像构建而来,那么宿主机只需在磁盘上保存一份 base 镜像,同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了,而且镜像的每一层都可以被共享。
1.2 镜像的特点
- Docker 镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”
1.3 Docker 镜像 commit 操作补充
docker commit 提交容器副本使之称为一个新的镜像
docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[TAG]
1.3.1 Docker 方式启动 tomcat,访问首页出现 404 错误如何解决
- 从 hub 上下载 tomcat 镜像到本地并成功运行
docker run -it -p 8888:8080 tomcat
- 发现运行过 tomcat 后访问页面发生 404 问题,如何解决
使用命令 :docker exec it tomcat容器ID /bin/bash 进入 tomcat 的目录
【tomcat 默认的欢迎页面实际上是放在 webapps/ROOT/index.jsp这里面】然后我们进入其中发现 webapps目录是空的,这里的文件都放了一个叫 webapps.dist 目录中,估计是因为 tomcat 新版本升级的原因。这样如何解决问题,我们可以将 webapps.dist文件夹名称改成 webapps 就能解决这个问题。【当然这只是暂时性的解决了这个问题,如果在启动一个新的 tomcat 还会存在这样的问题,我们需要从根处解决】
- 将我们修改过的 tomcat 镜像映射成本地镜像【可解决根本问题】
使用 docker commit 命令来将修改后的容器生成新的镜像
docker commit -a="bjb" -m="new tomcat" d8b1bc9c527a atguigu/tomcat:1.2
这次我们启动新的 tomcat 测试以下结果是否正确
最后也是能成功访问 tomcat,也是从根本上解决了这个问题
1.3.2 以守护进程方式启动 Tomcat
docker run -d -p 8080:8080 atguigu/tomcat:1.2
2. Docker 容器数据卷
- 将运用与运行的环境打包形成容器运行,运行可以伴随着容器,但是我们对数据的要求希望是持久化的
- 容器之间希望有可能共享数据
Docker 容器产生的数据,如果不通过 docker commit 生成新的镜像,使得数据作为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了。
为了能够保存数据再 docker 中我们使用卷。
2.1 是什么
一句话:类似于Redis中的 rdb 和 aof 文件
2.2 能干吗
- 容器的持久化
- 容器间继承+共享数据
特点:
- 数据卷可在容器之间共享或重用数据
- 卷中的更改可以直接生效
- 数据卷中的更改不会包含在镜像的更新中
- 数据卷的生命周期一直持续到没有容器使用它为止
2.3 数据卷
2.3.1 容器内添加
docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
- 查看数据卷是否挂载成功
// 首先查看正在运行的 centos 实例
docker inspect centos
看到其中具有这两个就代表挂载成功过了
- 容器和宿主机之间数据共享
最后我们发现容器和宿主机之间可以达到数据共享 - 容器停止退出后,主机修改后数据是否同步
可以达到同步操作 - 命令(带权限)
此命令作用也是建立起宿主机和容器文件共享,但只具备读操作
docker run -it -v /宿主机绝对路径目录:/容器内目录:or 镜像名
2.3.2 DockerFile 添加
- 根目录下新建 mydocker 文件夹进入其中
// 进入根目录
cd /
// 新建文件夹并进入其中
mkdir mydocker
cd mydocker
- 可在 Dockerfile 中使用 VOLUME 指令来给镜像添加一个或多个数据卷
vim Dockerfile
// 添加内容
# volume test
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished,------- success1"
CMD /bin/bash
- File 构建【.不能缺少】
docker build -f /mydocker/Dockerfile -t centos02 .
-
build 后生成镜像
-
run 容器
运行刚才构建的centos02镜像
docker run -it centos02
- 通过上述步骤,容器内的卷目录地址已经知道对应的主机目录地址哪?
容器内的卷目录地址如下:
对应的主机地址如下:
// 首先查询正在运行的 docker 镜像
docker ps
// 找到我们刚刚运行的 centos,并查看详细信息
docker inspect centosID号
看到如下结果图:
主机对应默认地址
2.3.3 备注
Docker 挂载主机目录Docker 访问出现 cannot open directory :Permission decied
解决办法:在挂载目录后面多加一个 --pricileged=true参数即可
2.4 数据卷容器
2.4.1 是什么
命名的容器挂载数据卷,其他容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器
2.4.2 容器间传递共享【volumes-from】
- 先启动一个父容器 dc01【再 dataVolumeContainer2新增内容】
// 启动一个父容器
docker run -it --name dc01 centos02
// 进入 dataVolumeContainer2 目录中去
cd dataVolumeContainer2
// 新增一个文本文件
touch dc01_add.txt
- dc02/dc03 继承自 dc01
// dc02 继承自 dc01
docker run -it --name dc02 --volumes-from dc01 centos
// dc03 继承自 dc01
docker run -it --name dc03 --volumes-from dc01 centos
- 回到 dc01 可以看到 02/03 各自添加的都能共享了
- 删除 dc01,dc02修改后dc03可否访问
- 删除 dc02后dc03可否访问【测试后可以访问】
- 新建 dc04 继承 dc03 后再删除 dc03【同上】
结论:容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止
3. Docker 安装常用软件
3.1 总体步骤
- 搜索镜像
- 拉取镜像
- 查看镜像
- 启动镜像
- 停止容器
- 移除容器
3.2 安装 tomcat
1. docker hub 上面查询 tomcat 镜像
docker search tomcat
2. 从 docker hub 上拉取 tomcat 镜像到本地
docker pull tomcat
3. docker images 查看是否由拉取到 tomcat
docker images
4. 使用 tomcat 镜像创建容器(也称作运行镜像)
-p 主机端口:docker 容器端口
-P:随机分配端口
i:交互
t:终端
docker run -it -p 8080:8080 tomcat
3.3 安装 mysql
1.docker hub 上面查找 mysql 镜像
2. 从 docker hub 上拉取mysql镜像到本地【标签为5.6】
3. 使用 mysql5.6 镜像创建容器(也叫运行镜像)
3.1 使用 mysql 镜像
docker run -p 3306:3306 --name mysql
-v /opt/mysql/conf:/etc/mysql/conf.d
-v /opt/mysql/logs:/logs
-v /opt/mysql/data:/var/lib/mysql
-e MYSQL_ROOT_PASSWORD=123456
-d mysql:5.6
命令说明:【提示:命令中不存在的路径均可以自动创建,不需要手动添加】
- -p 3306:3306 :将主机的 3306 端口映射到 docker 容器的 3306 端口
- –name mysql:运行服务名字
- -v /opt/mysql/conf:/etc/mysql/conf.d :将主机 /opt/mysql 目录下的 conf.my.cnf 挂载到容器的 /etc/mysql/conf.d 中去。
- -v /opt/mysql/logs:/logs:将主机 /opt/mysql/目录下的 logs 目录挂载到容器的 /logs 中去。
- -v /opt/mysql/data:/var/lib/mysql :将主机 /opt/mysql/ 目录下的 data 目录挂载到容器的 /var/lib/mysql 中去
- -e MYSQL_ROOT_PASSWORD=123456 :初始化 root 用户的密码。
- -d mysql:5.6 :后台运行 mysql5.6
3.2 如何操作 mysql
【如何进入 mysql 中进行操作呢?】
【1. 首先进入到 mysql 容器中去】
// 进入到正在运行的 mysql 容器中去
docker exec -it 正在运行的容器ID /bin/bash
// mysql 的登入命令不多说
mysql -uroot -p
回车后输入密码 123456 即可登陆成功
【2. 通过命令登陆到 mysql 即可】
【3. 剩下的就是对数据库的操作了】
4. 外部 windows 来测试连接在 docker 上的 mysql 服务
- 首先查看自己的虚拟机地址什么
ifconfig
- 然后通过 navcat 连接即可
- 我们对其进行操作
- 再回到 docker 中去查询发现数据同步到位了
5. 数据备份小测试
docker exec 正在运行的mysql ID sh -c 'exec mysqldump --all-databases -uroot -p"123456"' > /opt/all-databases.sql
3.4 安装 redis
1. 拉取 redis
// 拉取最新 redis 版本
docker pull redis
// 拉取固定版本 redis【标签名同等与版本号】
docker pull redis:标签名
2. 运行 redis 镜像
docker run -p 6379:6379 -v /opt/myredis/data:/data -v /opt/myredis/conf/redis.conf:/usr/local/etc/redis/redis.conf -d redis redis-server /usr/local/etc/redis/redis.conf -- appendonly yes
3. 测试 redis-cli 连接上来
docker exec -it 运行的Redis服务的容器ID redis-cli