容器与虚拟机
虚拟机
传统虚拟机如 VMware , VisualBox 之类的需要模拟整台机器包括硬件,每台虚拟机都需要有自己的操作系统,包括应用,必要的二进制和库,是一个完整的用户操作系统。
容器
容器是和宿主机共享硬件资源及操作系统,可以实现资源的动态分配。容器包含应用和其所有的依赖包,但是与其他容器共享内核。容器在宿主机操作系统中是以分离的进程运行的。容器不是模拟一个完整的操作系统,而是对进程进行隔离,相当于是在正常进程的外面套了一个保护层。容器可以帮助保证应用程序快速、可靠、一致地部署,其间不受部署环境的影响
虚拟机与容器的差异
虚拟机是一个运行在宿主机之上的完整的操作系统,虚拟机运行会占用较多的CPU、内存、硬盘资源,相对容器而言是重量级的
Docker的概念
Docker是基于GO语言实现的云开源项目,是Linux容器的一种封装,Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。每个容器运行着一个应用,不同的容器之间相互隔离,同时也可以建立通信。容器的启动和停止都非常快速,如同操作一个轻量级的虚拟机,并且用户无需关注系统底层的操作。
Docker的特点
你可以认为Docker就是在操作系统中的一个进程,而这个进程里面装着一个虚拟化的操作系统,Docker将你需要的应用和运行依赖都装了到里面,并且Docker为我们屏蔽了底层的操作系统,所以你并不需要关心它底层是怎么实现的,只需要简单的命令就能使用
核心概念
Docker镜像(Image)
Docker镜像是创建Docker容器的基础,Docker镜像类似虚拟机的镜像,是一个面向Docker引擎的只读模板。提供容器运行时所需的程序、库、资源、配置等文和一些为运行时参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。用户可以通过网上下载已经做好的应用镜像,通过简单的命令使用。或者是用户可以将通过自己制作镜像,将自己需要的应用及依赖打包起来成为镜像,然后就可以拿着这个镜像迁移到任何的系统中,同样只需要简单的命令就能实现
Docker容器(Container)
Docker仓库(Repository)
Docker仓库的概念跟Git 类似,是集中存放镜像文件的场所,而仓库注册服务器(Registry)可以理解为 GitHub 这样的托管服务。一个 仓库注册服务器中可以包含多个Docker仓库,每个仓库可以包含多个标签(Tag),每个标签对应着一个镜像。一个仓库可能会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本 。我们可以通过<仓库名>:<标签>的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 Latest 作为默认标签。仓库又可以分为两种形式Public(公有仓库)和 Private(私有仓库)Docker Registry 公有仓库是开放给用户使用、允许用户管理镜像的 Registry 服务。一般这类公开服务允许用户免费上传、下载公开的镜像,并可能提供收费服务供用户管理私有镜像。当用户创建了自己的镜像之后就可以使用 Push 命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上 Pull 下来就可以了。目前国外最大的公开仓库是Docker Hub,国内最大的公开仓库是Docker Pool,都可以提供用户下载镜像Docker的安装
安装docker需要在centos7以上版本
-
1、检查docker安装源 yum list docker
-
2、 yum install docker.x86_64 安装docker
提示时直接输入y
-
3、查看 docker 版本 : docker --version
-
4、启动 docker : systemctl start docker和查看 docker状态 : systemctl status docker
看到active (running)证明启动成功
Docker安装MySql5.7
-
拉去mysql5.7版本的镜像 docker pull mysql:5.7
-
查看镜像docker images
创建容器
docker run --name mysql5.7 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
命令说明:
-p 3306:3306:将容器的3306端口映射到主机的3306端口
--name mysql5.7:mysql5.7是容器的名称
-e MYSQL_ROOT_PASSWORD=123456:初始化root用户的密码
-
查看容器的进程信息docker ps -a
-
大功告成
Docker发布springcloud项目
我这里要部署一个8761和8762的注册中心
-
创建存放服务的文件夹
- 先部署eureka-server
这是我项目的配置文件
server:
port: 8761
eureka:
instance:
#eureka 实例的hostname,可以是hostname,也可以自定义配置hostname
hostname: localhost
#该实例的IP地址
ip-address: localhost
#该实例注册到服务中心的唯一ID
instance-id: localhost:eureka-server:8761
#注册时客户端是否使用自己的IP而不是主机名,默认是false
prefer-ip-address: true
service-url:
defaultZone: http://localhost:8762/eureka/
spring:
application:
name: eureka-server
profiles: pre01
---
server:
port: 8762
eureka:
instance:
#eureka 实例的hostname,可以是hostname,也可以自定义配置hostname
hostname: localhost
#该实例的IP地址
ip-address: localhost
#该实例注册到服务中心的唯一ID
#instance-id: ${eureka.instance.ip-address}:${spring.application.name}:${server.port}
instance-id: localhost:eureka-server:8762
#注册时客户端是否使用自己的IP而不是主机名,默认是false
prefer-ip-address: true
service-url:
defaultZone: http://localhost:8761/eureka/
spring:
application:
name: eureka-server
profiles: pre02
打包-
先拉取jdk8的镜像docker pull java:8
配置Dockerfile
先配置Dockerfile8761
FROM java:8
MAINTAINER tzb "1017432592@qq.com"
ENV LANG zh_CN.utf-8
USER root
RUN mkdir -p /home/springcloudconsole/eureka-server/8761
COPY ./eureka-server-0.0.1-SNAPSHOT.jar /home/springcloudconsole/eureka-server/8761/
COPY ./eureka8761.sh /home/springcloudconsole/eureka-server/8761/
WORKDIR /home/springcloudconsole/eureka-server
RUN chmod +x 8761/eureka8761.sh
EXPOSE 8761
ENTRYPOINT ["8761/eureka8761.sh"]
然后配置Dockerfile8762,只需将上面配置的写有8761的地方改为8762
- 配置eureka.sh
先配置eureka8761.sh,这段shell脚本下面的for循环只是为了docker在后台启动完springcloud注册中心后不要退出
#!/bin/bash
nohup java -jar /home/springcloudconsole/eureka-server/8761/eureka-server-0.0.1-SNAPSHOT.jar --spring.profiles.active=pre01 > /dev/null 2>&1 &
for (( ; ; ))
do
sleep 5
done
然后配置eureka8762.sh,同样的将上面配置的8761改为8762,pre01改为pre02
-
将文件全部扔到虚拟机的文件夹中
我这里全部扔到了/home/springcloudconsole/eureka-server中
- 构建镜像 docker build -f Dockerfile8761 -t eureka-server:8761 .
- 启动容器
docker run --privileged=true -d -p 8761:8761/tcp --name eureka-server eureka-server:8761 或者 docker run -itd -p 8761:8761 eureka-server:8761
其中8761:8761中第一个8761是宿主机对外暴露的端口,第二个8761是dockerfile配置的EXPOSE,是docker里应用程序的端口 - 查看容器运行状态docker ps -a
- 其他命令总结:
查看镜像文件docker images
查看容器运行状态docker ps -a
停止容器 docker stop 容器id
删除容器 docker rm 容器id
删除镜像文件 docker rmi 容器id
查看容器日志 docker logs -f --tail 2000 容器id
进入容器 docker exec -it 容器ID /bin/bash