Docker是什么?
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口,它基于 Google 公司推出的 Go 语言实现。
为什么要使用 Docker?
1.更高效的利用系统资源
容器不需要进行硬件虚拟以及运行完整操作系统等额外开销.
2.更快速的启动时间
容器直接运行与宿主内核.
3.一致的运行环境
Docker的镜像提供了除内核外完整的运行时环境.
4.更轻松的迁移
Docker确保了执行环境的一致性,使得应用的迁移更加容易.
5.更简单的管理
所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理。
对比传统虚拟机总结
特性 | 容器 | 虚拟机 |
---|---|---|
启动 | 秒级 | 分钟级 |
硬盘使用 | 一般为 MB | 一般为 GB |
性能 | 接近原生 | 弱于 |
系统支持量 | 单机支持上千个容器 | 一般几十个 |
关于docker容器
docker的整个生命周期有三部分组成:镜像(image)+容器(container)+仓库(repository)
Registry(注册中心)仓库
Docker用Registry来保存用户构建的镜像。Registry分为公共和私有两种。Docker公司运营公共的Registry叫做Docker Hub。用户可以在Docker Hub注册账号,分享并保存自己的镜像(说明:在Docker Hub下载镜像巨慢,可以自己构建私有的Registry).
Docker安装
···
镜像相关命令
1.查看镜像
输入 docker images
REPOSITORY:镜像名称
TAG:镜像标签
IMAGE ID:镜像ID
CREATED:镜像的创建日期(不是获取该镜像的日期)
SIZE:镜像大小
搜索镜像:如果你需要从网络中查找需要的镜像,可以通过以下命令搜索
输入 docker search mysql(镜像名称)
NAME:镜像名称
DESCRIPTION:镜像描述
STARS:用户评价,反应一个镜像的受欢迎程度
OFFICIAL:是否官方
AUTOMATED:自动构建,表示该镜像由Docker Hub自动构建流程创建的
拉取镜像:就是从中央仓库中下载镜像到本地
docker pull 镜像名称
拉取特定的版本请去dockerhub 查看软件的tag 来进行拉取,例如:
docker pull 镜像名称:tag
docker pull tomcat:latest
删除镜像
docker rmi 镜像ID
//得先把容器都删了才能删除镜像
强制删除镜像:
docker rmi -f c85fb9b8cc4f
镜像重命名:
docker tag 旧镜像名称 新镜像名称
docker tag 192.168.204.129:5000/springapp:v1 springapp
创建运行容器
1、创建容器常用的参数说明:
创建容器命令:docker run
-i:表示运行容器
-t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。 即分配一个伪终端。
--name :为创建的容器命名。
-v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
-d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t两个参数,创建后就会自动进去容器)。
-p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射
(1)交互式方式创建容器:
docker run -it --name=容器名称 镜像名称:标签 /bin/bash
-it还可以分开写 例如:
docker run -i -t --name=容器名称 镜像名称:标签 /bin/bash
只有加了-t参数这个容器才是交互式容器,交互式是指跟运行的容器进行交互。
如果不要交互式-t参数可以不加。
例如:运行一个centos容器,而且还得给这个容器创建一个伪终端。
这个伪终端主要就是连接了centos,就例如一些工具连接了linux,然后通过这个工具
跟centos交互。
后面的/bin/bash主要是让这个伪终端执行容器的命令行。
使用-t参数会直接进入容器,如下图:
退出当前容器
exit
(2)守护式方式(后台运行)创建容器:
docker run -di --name=容器名称 镜像名称:标签
docker run -id --name=mycentos7 centos:7
进入容器:
docker exec -it 容器名称 (或者容器ID) /bin/bash
因为上面是以后台运行的方式启动容器的,所以当执行exit命令退出容器的时候。
容器还是在后台运行着。
进入容器:
docker exec -it 容器名称 (或者容器ID) /bin/bash
//创建容器的时候,容器名称必须唯一,否则创建不了容器。
容器相关命令
查看正在运行的容器
docker ps
查看所有容器(包含运行过的)
docker ps –a
查看最后一次运行的容器
docker ps –l
查看停止的容器
docker ps -f status=exited
停止容器:
docker stop 容器名称(或者容器ID)
启动容器:
docker start 容器名称(或者容器ID)
文件拷贝:如果我们需要将文件拷贝到容器内可以使用cp命令
docker cp 需要拷贝的文件或目录 容器名称:容器目录
也可以将文件从容器内拷贝出来
docker cp 容器名称:容器目录 需要拷贝的文件或目录
进入容器:
docker exec -it 容器名称 (或者容器ID) /bin/bash
删除容器
docker rm 容器名称(容器ID)
目录挂载
我们可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器。
docker run -di -v /usr/local/myhtml:/usr/local/myhtml --name=mycentos3 centos:7
如果你共享的是多级的目录,可能会出现权限不足的提示。
这是因为CentOS7中的安全模块selinux把权限禁掉了,我们需要添加参数 --privileged=true 来解决挂载的目录没有权限的问题
查看容器IP地址
我们可以通过以下命令查看容器运行的各种数据
docker inspect 容器名称(容器ID)
也可以直接执行下面的命令直接输出IP地址
docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称(容器ID)
Dockerfile
Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。
1、对于开发人员:可以为开发团队提供一个完全一致的开发环境;
2、对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了;
3、对于运维人员:在部署时,可以实现应用的无缝移植。
执行命令构建镜像
docker build -t='jdk1.8' .
//注意后边的空格和点,不要省略
部署第一个Springboot项目
使用Dockerfile文件构建jar成镜像
1.此次例子使用的是Springboot的jar包构建成镜像。
2.使用maven将springboot项目打包成jar包
3.将此jar包上传到linux
构建开始
//在jar目录下生成Dockerfile
vi Dockerfile
-----------------------------------------------------------------------
#基于哪个镜像去构建镜像,如果当前环境没有 openjdk:8-jdk镜像,
#则会去dockerhub下载openjdk:8-jdk镜像然后再构建
FROM openjdk:8-jdk
#此镜像的创作者
MAINTAINER ZHIMINGZOU
#将宿主机中的dockerdemo-0.0.1-SNAPSHOT.jar 复制到openjdk:8-jdk镜像里 别名:webapp.jar
ADD dockerdemo-0.0.1-SNAPSHOT.jar webapp.jar
#ENTRYPOINT 指令用于设定容器启动时第一个运行的命令及其参数。
ENTRYPOINT ["java","-jar","/webapp.jar"]
#容器启动完成后对外的端口映射
EXPOSE 8080
-----------------------------------------------------------------------
//不管有没有Dockerfile文件,都可以vi 保存之后就生成Dockerfile文件了
构建镜像
// -t后面指的是新构建成的镜像的名称,也可以写成-t='springapp:v1'
//后面的空格+. 不能漏,指的是根据当前目录下的Dockerfile文件去构建镜像
//中v1是此镜像的标签,也可以不加 不加默认是latest
docker build -t springapp:v3 .
启动项目
docker run -it -p 8089:8080 springapp:v3
加上-d:后台运行
docker run -itd -p 8089:8080 springapp:v3
给springapp:v3 名命为springapp,方便stop 或者进入容器
docker run -itd -p 8089:8080 --name=springapp springapp:v3
//后台运行后,可以查看实时日志
docker logs -f --tail=100 springapp(容器name)
-d参数是让容器后台运行
-p 是做端口映射,此时将服务器中的8080端口映射到容器中的8089(项目中端口配置的是8089)端口
访问项目
http://192.168.204.131:8089/demo