一、为什么要使用Docker
- 首先,我们要知道为什么要用Docker!
- 传统的虚拟化 要做硬件虚拟化,因此在性能上会打上折扣。而且还很占资源。
- Dokcer 不做硬件虚拟化,直接将应用程序运行在宿主的内核上,性能接近原生,而且资源消耗小。 使用Dokcer,就是快!
二、Docker 引擎
1.客户端
有一个cli命令行工具,可以通过输入命令。让客户端去请求服务器的rest api.
2.服务器
是一个守护进程,对外暴露了rest api,也就是说客户端可以通过rest api来操作服务器
Docker引擎管理着镜像、容器、网络、数据卷。
- 使用了Docker以后,就会得到这样的效果 开发了一个项目,部署到服务器上。此时,服务器上需要有java,tomcat.
所以我们需要安装java,tomcat,但是安装的过程非常繁琐,而且容易出现bug,而且配置信息还不一定是成功的,等等这些因素都可能出现。
所以可以使用Docker,直接从远程仓库,拉取一个Tomcat镜像。这个镜像里就已经拥有了Java,拥有了常用的配置信息。然后可以直接运行得到一个容器,启动容器,就能使用了!
三、容器和镜像的概念
1.镜像
镜像就好比面向对象中的类。
2.容器
容器就好比面向对象中的对象。
docker客户端通过命令去通知docker服务器,让docker服务器去远程仓库上拉取一个镜像到本地。
再通过docker客户端执行创建容器的命令。让docker服务器通过镜像创建出容器。
四、Docker镜像
- 镜像的分层构建
Docker镜像被设计时是按照分层构建的思路进行设计,也就是说每一次都是相对独立的事物,上一层和下一层之间的联系不大,这样在操作镜像时得到复用。
五、Docker 容器
镜像创建出的一个运行状态的事物。 容器和容器之间是独立的,是隔离的。
容器的操作:
1.启动容器
docker run tomcat
docker start 容器id/容器名
2.停止容器
docker stop 容器id/容器名
3.删除容器
docker rm容器id/容器名
4.查看容器
docker ps
5.查看所有容器,包括已经停止的容器
docker ps -a
6.以守护态的形式运行容器
docker run -d tomcat
7.运行容器时映射容器暴露的端口
docker run -p 80:8080 tomcat
docker run -P tomcat
-P: 提供一个随机映射的端口
8.运行容器时给容器命名
docker run -p 8080:8080 -d --name 容器名 镜像名
9.停止所有容器
docker stop $(docker ps)
10.删除所有容器
docker rm $(docker ps -a)
六、在Ubuntu上安装Docker
1.安装Docker
$ curl -fsSL get.docker.com -o get-docker.sh
--可能会出现 404 错误,请移步下面的特别说明
$ sudo sh get-docker.sh --mirror Aliyun
2.配置镜像加速器
vim /etc/docker/daemon.json
加入以下内容:
{
"registry-mirrors": [
"https://registry.docker-cn.com"
]
}
再重启docker服务
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
七、操作Docker镜像
1. 拉取镜像
docker pull 镜像名 ==> 从官方仓库中拉取镜像,拉取的是镜像的latest版本
docker pull tomcat:9.0.22 ==》 从官方仓库中拉取镜像,拉取的是9.0.22版本
docker pull 192.168.2.177:6533/tomcat:9.0.22 ==> 从私有仓库中拉取镜像
2.运行镜像,得到容器
1)直接运行容器
docker run 镜像名
2)以交互的方式运行容器并进入容器
docker run -it --rm 镜像名 bash
3)以交互的方式进入到正在运行的某一个容器
docker exec -it --rm 容器名/容器id bash
3.查看当前所有的镜像
docker images
4.删除镜像
docker image rm 镜像名
docker rmi 镜像名
八、自定义镜像
无论是官方的镜像,还是自定义镜像,都得通过Dockerfile文件来创建。
如何编写Dockerfile文件,来创建自定义镜像
1.Dockerfile文件中可以使用的命令有哪些?
FROM
RUN
2.如何通过Dockerfile文件创建出自定义镜像?
docker build -t 镜像名[:标签] .
目标:将项目整合在tomcat中,创建出一个自定义Docker镜像
九、Dockerfile命令
- 1.FROM 指明当前镜像的基础镜像
2.RUN 执行shell脚本的指令
3.WORKDIR 确定工作路径
4.COPY 将文件复制到指定路径内
5.ADD 往往用于将tar.gz压缩包复制到指定镜像内的路径内,然后自动解压,解压完后自动删除压缩包。
下面图示是通过运行dockerfile文件来将自己的一个项目压缩包copy到目标tomcat下,从而在该tomcat镜像获得的容器中可以访问到我copy过去的项目:
Dockerfile(这里使用的是ADD,效果和COPY一样,但是显得更加方便好用):
FROM tomcat
WORKDIR /usr/local/tomcat/webapps/ROOT/
RUN rm -rf *
ADD ./ROOT.tar.gz .
WORKDIR /usr/local/tomcat/
附上一些很常用也很基础的docker命令:
docker ps
docker images
docker ps -a
docker rm 容器id
docker stop 容器id
docker start 容器id
docker stop $(docker ps)
docker rm $(docker ps -a)
Dockerfile的指令:
1、FROM RUN WORKDIR COPY ADD
2、ENV
设置环境变量,通过设备变量,就可以在RUN中使用
ENV my_version 1.0
RUN $my_version
3、 CMD
运行一个文件。并传入参数
CMD ["catalina.sh", "run"] 运行catalina.sh文件并传入参数run
4、 VOLUME
指定数据卷
数据卷的作用就是将一些动态的数据和本地文件/文件夹进行绑定,在读写时使用的是本地的文件/文件夹。
5.ENTRYPOINT
和cmd类型,但是cmd只能执行一次,entrypoint可以执行多次。
十、Docker Compose
1.介绍
服务编排技术
Docker 搞微服务的程序员的春天
我们会了哪些技术:
Docker的常用命令、Dockerfile来自定义镜像、Docker数据卷
Docker Compose是对服务进行编排成项目的技术
1.服务: 一个容器
2.项目: 多个容器的组合
2.安装
请求安装包
curl -L https://github.com/docker/compose/releases/download/1.24.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
改变权限
chmod +x /usr/local/bin/docker-compose
3.使用docker-compose
1)编写docker-compose.yml文件
注意: yml实际上是一种配置文件的格式文件。
yml中不能使用tab键,层级关系必须使用空格来表示。
名字后的冒号后,必须带一个空格
示例:
version: '3' yml语法的版本
services: 编排的项目 固定的
web1: 服务名称 自定义
restart: always 当虚拟机重启后 服务也自动重启
image: 'tomcat' 该服务使用的镜像
ports: 映射的端口 (数组)
- '80:8080' - 表示一个数据项
web2:
image: 'tomcat'
container_name: 'tomcat1' 容器名字
ports:
- '81:8080'
mysql:
image: 'mysql:5.7.25'
container_name: 'mysql'
ports: - '3306:3306'
volumes: 数据卷
- '/usr/local/docker/mysql/conf:/etc/mysql'
- '/usr/local/docker/mysql/logs:/var/log/mysql'
- '/usr/local/docker/mysql/data:/var/lib/mysql'
2)使用docker-compose up命令来启动项目
注意: docker-compose up 命令不能随意使用。必须在docker-compose.yml相同路径下才能使用
docker-compose up 以主进程的方式启动项目中的所有服务,并且打印服务日志
docker-compose up -d 以守护太的方式启动所有服务
docker-compose restart 重启所有服务
3)docker-compose down 来关闭服务
如果向把服务删除,服务中又配置了restart always,那么必须先docker-compose down,再删除docker-compose.yml,否则restart always的容器是一直会在的。
补充
镜像的上下文路径
构建镜像时 实际上是docker服务器来完成,因此Dockerfile里的每一行指令都是Docker服务器在执行。
当执行到"ADD ./ROOT.zip ."时,这个ROOT.zip哪里来?
不是来自于客户端本地,而是客户端已经将该资源打包发送给Docker服务器。
客户端会把哪些资源打包发送给docker服务器呢?
就是通过构建的命令 : "docker build -t 自定义镜像名."
其中这个"."就是指明上下文路径,也就是说该路径下的所有的资源都会被打包,发送给docker 服务器。
画个简图:
以上就是我对docker理解的大概总结,希望能帮到大家,如果有错的话也欢迎指出,不喜勿喷。