Docker 基础篇之快速上手

  • 1. 镜像原理
  • 1.1 镜像是什么
  • 1.2 镜像的特点
  • 1.3 Docker 镜像 commit 操作补充
  • 1.3.1 Docker 方式启动 tomcat,访问首页出现 404 错误如何解决
  • 1.3.2 以守护进程方式启动 Tomcat
  • 2. Docker 容器数据卷
  • 2.1 是什么
  • 2.2 能干吗
  • 2.3 数据卷
  • 2.3.1 容器内添加
  • 2.3.2 DockerFile 添加
  • 2.3.3 备注
  • 2.4 数据卷容器
  • 2.4.1 是什么
  • 2.4.2 容器间传递共享【volumes-from】
  • 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 镜像创建容器(也叫运行镜像)
  • 3.1 使用 mysql 镜像
  • 3.2 如何操作 mysql
  • 4. 外部 windows 来测试连接在 docker 上的 mysql 服务
  • 5. 数据备份小测试
  • 3.4 安装 redis
  • 1. 拉取 redis
  • 2. 运行 redis 镜像
  • 3. 测试 redis-cli 连接上来
  • 4. 测试持久化文件生成


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 错误如何解决
  1. 从 hub 上下载 tomcat 镜像到本地并成功运行
docker run -it -p 8888:8080 tomcat
  1. 发现运行过 tomcat 后访问页面发生 404 问题,如何解决
    使用命令 :docker exec it tomcat容器ID /bin/bash 进入 tomcat 的目录
    【tomcat 默认的欢迎页面实际上是放在 webapps/ROOT/index.jsp这里面】然后我们进入其中发现 webapps目录是空的,这里的文件都放了一个叫 webapps.dist 目录中,估计是因为 tomcat 新版本升级的原因。这样如何解决问题,我们可以将 webapps.dist文件夹名称改成 webapps 就能解决这个问题。【当然这只是暂时性的解决了这个问题,如果在启动一个新的 tomcat 还会存在这样的问题,我们需要从根处解决】

  2. 将我们修改过的 tomcat 镜像映射成本地镜像【可解决根本问题】
    使用 docker commit 命令来将修改后的容器生成新的镜像
docker commit -a="bjb" -m="new tomcat" d8b1bc9c527a atguigu/tomcat:1.2

增加docker环境内存_mysql


这次我们启动新的 tomcat 测试以下结果是否正确

增加docker环境内存_mysql_02


最后也是能成功访问 tomcat,也是从根本上解决了这个问题

增加docker环境内存_增加docker环境内存_03

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 能干吗

  • 容器的持久化
  • 容器间继承+共享数据

特点:

  1. 数据卷可在容器之间共享或重用数据
  2. 卷中的更改可以直接生效
  3. 数据卷中的更改不会包含在镜像的更新中
  4. 数据卷的生命周期一直持续到没有容器使用它为止

2.3 数据卷

2.3.1 容器内添加
docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
  1. 查看数据卷是否挂载成功
// 首先查看正在运行的 centos 实例
docker inspect centos

看到其中具有这两个就代表挂载成功过了

增加docker环境内存_增加docker环境内存_04

  1. 容器和宿主机之间数据共享


    最后我们发现容器和宿主机之间可以达到数据共享
  2. 容器停止退出后,主机修改后数据是否同步
    可以达到同步操作
  3. 命令(带权限)
    此命令作用也是建立起宿主机和容器文件共享,但只具备读操作
docker run -it -v /宿主机绝对路径目录:/容器内目录:or 镜像名
2.3.2 DockerFile 添加
  1. 根目录下新建 mydocker 文件夹进入其中
// 进入根目录
cd /
// 新建文件夹并进入其中
mkdir mydocker
cd mydocker
  1. 可在 Dockerfile 中使用 VOLUME 指令来给镜像添加一个或多个数据卷
vim Dockerfile
// 添加内容
# volume test
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished,------- success1"
CMD /bin/bash
  1. File 构建【.不能缺少】
docker build -f /mydocker/Dockerfile -t centos02 .
  1. build 后生成镜像
  2. 增加docker环境内存_mysql_05

  3. run 容器
    运行刚才构建的centos02镜像
docker run -it centos02
  1. 通过上述步骤,容器内的卷目录地址已经知道对应的主机目录地址哪?
    容器内的卷目录地址如下:

    对应的主机地址如下:
// 首先查询正在运行的 docker 镜像
docker ps
// 找到我们刚刚运行的 centos,并查看详细信息
docker inspect centosID号

看到如下结果图:

增加docker环境内存_mysql_06

主机对应默认地址

增加docker环境内存_mysql_07

2.3.3 备注

Docker 挂载主机目录Docker 访问出现 cannot open directory :Permission decied
解决办法:在挂载目录后面多加一个 --pricileged=true参数即可

2.4 数据卷容器

2.4.1 是什么

命名的容器挂载数据卷,其他容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器

2.4.2 容器间传递共享【volumes-from】
  1. 先启动一个父容器 dc01【再 dataVolumeContainer2新增内容】
// 启动一个父容器
docker run -it --name dc01 centos02
// 进入 dataVolumeContainer2 目录中去
cd dataVolumeContainer2
// 新增一个文本文件
touch dc01_add.txt
  1. 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

增加docker环境内存_docker_08


增加docker环境内存_docker_09

  1. 回到 dc01 可以看到 02/03 各自添加的都能共享了

增加docker环境内存_docker_10

  1. 删除 dc01,dc02修改后dc03可否访问
  2. 删除 dc02后dc03可否访问【测试后可以访问】
  3. 新建 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 镜像

增加docker环境内存_docker_11

2. 从 docker hub 上拉取mysql镜像到本地【标签为5.6】

增加docker环境内存_mysql_12

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 即可】

增加docker环境内存_tomcat_13


【3. 剩下的就是对数据库的操作了】

增加docker环境内存_docker_14

4. 外部 windows 来测试连接在 docker 上的 mysql 服务
  1. 首先查看自己的虚拟机地址什么
ifconfig
  1. 然后通过 navcat 连接即可
  2. 我们对其进行操作
  3. 再回到 docker 中去查询发现数据同步到位了
5. 数据备份小测试
docker exec 正在运行的mysql ID sh -c 'exec mysqldump --all-databases -uroot -p"123456"'  > /opt/all-databases.sql

增加docker环境内存_tomcat_15

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

增加docker环境内存_mysql_16

4. 测试持久化文件生成

增加docker环境内存_docker_17