docker--学习(一)
一、什么是Docker
1.docker简介
之前的部署方式要想部署一个web应用,我们需要完成以下步骤:
- 安装jdk
- 安装tomcat
- 安装mysql
- 打包项目并部署
分布式微服务项目,意味着一个大型的项目将为拆分成很多个小应用(服务),30-100个服务都是有可能的。
Docker就出现了。
Docker解决什么问题:
-
将部署的工作提前完成,只需要通过一个命令就可以做到,一次打包,到处运行
-
docker充分使用了镜像+容器的技术方案,让部署做到秒级启动——快!
2.docker实现的虚拟化
1)docker实现了虚拟化
docker提供的是一个沙盒机制,每次运行将会产生一个沙盒——虚拟机。
使用docker创建了10个沙盒,相当于创建了10台虚拟机。
docker run tomcat
安装了tomcat,安装了一个ubuntu系统,该系统中安装了tomcat。
2)什么是虚拟化?
虚拟出的电脑。虚拟硬件,让软件在虚拟的硬件上跑。
-
vmware: 做虚拟化。
-
docker: 也在做虚拟化。
特点:占用的空间非常的小。
秒级甚至毫秒级启动。
方便管理、安全、沙盒。
3) docker是如何实现虚拟化的。
4)docker和传统虚拟机的比较
特性 | Docker容器 | 虚拟机 |
---|---|---|
启动 | 秒级 | 分钟级 |
硬盘使用 | 一般为 MB |
一般为 GB |
性能 | 接近原生 | 弱于 |
系统支持量 | 单机支持上千个容器 | 一般几十个 |
3.docker引擎的执行流程
4.docker引擎的内部结构
5.容器、镜像、仓库
- 仓库: 存放镜像的仓库,一般分为官方仓库和私有仓库。
- 公共仓库:官方:hub.docker.com、https://www.daocloud.io/
- 私有仓库: 企业内部建立的 比如 registry
- 镜像:好比面向对象中的类。一个模版,供下载,下载完后可以用镜像创建容器
- 容器:好比面向对象中的对象。使用镜像创建容器,一个镜像可以创建多个容器
二、docker的安装
执行该命令即可:
apt-get install docker.io
2.配置镜像加速器
- 编辑该文件
vi /etc/default/docker
,添加内容
{
"registry-mirrors": ["https://ohfqk9xf.mirror.aliyuncs.com"]
}
- 重启服务
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
三、镜像操作
1.常用的命令
# 拉去镜像
docker pull tomcat:8.5.23
# 查看当前本地所有的镜像
docker images
# 删除镜像,注意:要删除镜像的前提是保证该镜像没有运行相应的容器,要把容器先删掉。
docker rmi 镜像id(写前三位即可)
# 使用镜像创建容器
docker run -p 8080:8080 tomcat:8.5.23
# 运行并进入容器
docker run -it \ # 以交互式终端的方式进入到容器内部
--rm \ #退出容器后 该容器会被删除
tomcat
bash # shell命令, bash是shell命令(中文)中的一种语言(普通话)
#进入正在运行的容器
docker exec -it 容器id bash
其中的tag中的latest是拉取时默认的tag,latest会使用最近最稳定的版本,可以通过hub.docker.com来查看latest对应的版本。
重要的发现
- 当进入到容器内部时,原来tomcat镜像就是一个linux系统里装了tomcat软件而已。
可以通过tomcat镜像的Dockerfile文件来查看到,tomcat镜像是安装在ubuntu系统之上的。
- 官方打镜像的时候,是把tomcat安装在/usr/local下面的,而且进入到镜像中默认路径是:/usr/local/tomcat
2.镜像的体积
Tomcat8.5.23和tomcat8.5.24 在列出镜像时发现都是600多mb,但是镜像是分层存储的,因此这两个镜像中有很多层是相同的,所以会共用,因此两个镜像加起来的体积大小不会是600*2。
3.以交互方式进入到正在运行的容器
docker exec -it 容器id bash
4.虚悬镜像
在自定义镜像过程中,会出现覆盖之前构建好的镜像,那么之前构建好的镜像就成为了虚悬镜像。
通过命令来删除,删除时要先删除虚悬镜像创建出的容器
docker image prune
5.关于端口映射
用镜像启动容器时,使用-p进行端口映射,让宿主机的端口映射到容器暴露出的端口上。
docker run -p 8080:8080 tomcat
四、使用Dockerfile制作自定义镜像
1.前提
我们在使用docker pull tomcat的时候拉取的官方的tomcat镜像,实际上我们要用容器来部署我们的项目,我们要想实现的效果:使用官方的tomcat,在tomcat里部署我们自己的项目。
2.实现逻辑
3.Dockerfile的介绍
官方打包tomcat镜像时也是用Dockerfile文件的。要想实现自定义镜像,就必须通过Dockerfile文件来实现。
步骤:
- 创建Dockerfile文件
- 编写Dockerfile文件的内容:
FROM tomcat:8.5.23 # 设置基础镜像,表示当前镜像是基于8.5.23来打包的
WORKDIR /usr/local/tomcat/webapps/ROOT/ # 设置工作路径:进入到当前路径下,而且我们进入容器时默认的路径就是这个。
RUN echo “hello”>>index.html # RUN 执行具体的命令的指令
- 使用docker build命令来构建镜像
docker build -t 自定义镜像名 . #必须在Dockerfile的同级目录内构建,后面的.不要忘记了
-
使用自定义镜像来创建容器
-
具体步骤
##自己完成的具体步骤,使用Dockerfile制作自定义镜像(详细) 1.进入 cd /usr/local/docker/目录下 2.查看是否已有tomcat目录 :有的话删掉它 :rm -rf tomcat/ 3.继续在第一步目录下创建文件夹 mkdir dockerfile 4.进入cd dockerfile 文件下 5.在当前目录下创建 mkdir mytomcat 6.进入 cd mytomcat下 7.使用 vi dockerfile去配置文件 FROM tomcat:8.5.23 # 设置基础镜像,表示当前镜像是基于8.5.23来打包的 WORKDIR /usr/local/tomcat/webapps/ROOT/ # 设置工作路径:进入到当前路径下,而且我们进入容器时默认的路径就是这个。 RUN echo “hello”>>index.html # RUN 执行具体的命令的指令 8.docker build -t 自定义镜像名 . 上一步例如:docker build -t mytomcat:1.0.0 . #构建一个mytomcat:1.0.0的自定义镜像 9.成功后:可以查看一下所有镜像 docker images 10.使用命令运行:docker run -p 8080:8080 -d 自定义镜像名(mytomcat:1.0.0) 11.使用命令:docker exec -it CONTAINERID(容器ID:可通过 docker ps查看) bash 后,工作路径会发生改变,进入容器内部
4.用Dockerfile制作ssm项目的镜像
FROM tomcat:8.5.23
WORKDIR /usr/local/tomcat/webapps/ROOT/
RUN rm -rf * # 删除root下的所有的东西
COPY ./ROOT.tar.gz ./ # 复制当前docker客户端下的路径下的ROOT.tar.gz到当前工作路径下
RUN tar -zxvf ROOT.tar.gz # 解压缩
RUN rm -rf ROOT.tar.gz #删除压缩包
WORKDIR /usr/local/tomcat #切换回工作路径
简化之前的COPY命令,简化成ADD
FROM tomcat:8.5.23
WORKDIR /usr/local/tomcat/webapps/ROOT/
RUN rm -rf * # 删除root下的所有的东西
ADD ./ROOT.tar.gz ./ # 复制当前docker客户端下的路径下的ROOT.tar.gz到当前工作路径下,自动解压并删除
WORKDIR /usr/local/tomcat #切换回工作路径
具体步骤
#自己完成的具体步骤(详细)
1.将自己的ssm项目放到下载的文件tomcat中的webapps下运行bin/startup.sh命令,它会自动解压,然后将解压后的文件夹打包成zip
2.在虚拟机root用户下,进入cd /usr/local/docker/
3.创建 mkdir 项目文件夹(library_ssm) 并进入到此目录下
4.将刚刚打包的zip项目包上传到此文件目录下
5.将其 unzip library_ssm.zip 解压 并删除zip包 rm -rf library_ssm.zip
6.进入解压后的目录 cd library_ssm/后,将下面的文件打包 tar -zcvf ROOT.tar.gz ./ #其中的ROOT是自己定义的 ./表示当前目录下的文件
7.通过 mv ROOT.tar.gz ../ 移除到上一级目录,然后退出 cd ..,将刚刚的多余解压后的文件夹删除 rm -rf library_ssm/
8.在当前目录创建Dockerfile文件: vi Dockerfile
9.向Dockerfile中添加下面内容
FROM tomcat:8.5.23
WORKDIR /usr/local/tomcat/webapps/ROOT/
RUN rm -rf * # 删除root下的所有的东西
COPY ./ROOT.tar.gz ./ # 复制当前docker客户端下的路径下的ROOT.tar.gz到当前工作路径下
RUN tar -zxvf ROOT.tar.gz # 解压缩
RUN rm -rf ROOT.tar.gz #删除压缩包
WORKDIR /usr/local/tomcat #切换回工作路径
10.运行 docker run -p 8080:8080 -d library_ssm:1.0.0
11.浏览器中测试
五、Dockerfile中的指令
-
FROM 指定基础镜像
-
WORKDIR 指定工作路径
-
RUN 运行shell命令
-
COPY 复制当前路径下的文件内容到镜像里面
-
ADD 复制当前路径下的文件内容到镜像里面然后解压缩然后删除压缩包
-
EXPOSE: 镜像创建容器后,容器暴露出的端口,用于被宿主机映射
-
CMD 容器启动时执行的命令, 比如 容器启动时运行tomcat,这个命令在dockerfile中只能使用一次
-
ENTRYPOINT 如果让容器启动时执行多条命令。cmd只能执行一次,但是ENTRYPOINT可以执行多次
-
ENV 设置环境变量
-
VOLUME 数据卷
tomcat的官方dockerfile:https://blog.csdn.net/gongxiaojiu/article/details/74935947
1.创建mysql容器的docker命令:
docker run -p 3306:3306 --name mysql \
-v /usr/local/docker/mysql/conf:/etc/mysql \
-v /usr/local/docker/mysql/logs:/var/log/mysql \
-v /usr/local/docker/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7.25