docker入门

一 Docker概述

提一嘴:现在podman似乎越来越火了,大有取代docker之势,所以还得学一下podman

1. 虚拟化技术 virtualization

虚拟化技术是一种计算机资源管理技术,是将计算机的各种硬件资源,比如服务器,网络,CPU,内存及存储等,予以抽象和转换后呈现出一套新的硬件资源环境,在这一套新的硬件环境下可以安装我们的操作系统,部署我们的应用运行环境等,它打破了计算机硬件资源不可切割的障碍,使我们可以比源本的计算机硬件资源结构更好的方式来组合应用这些资源。

2.虚拟化分类

虚拟化一般分为:
硬件级虚拟化
操作系统级虚拟化

硬件级虚拟化是运行在硬件之上的虚拟化技术,核心技术是hypervisor,hypervisor是一种运行在基础物理服务器硬件之上的软件层,可以虚拟化硬件资源,例如cpu,硬盘,内存资源等。然后可以在虚拟出来的硬件资源上安装操作系统,也就是所谓的虚拟机,例如VMWare,VirtualBox等都是使用该技术。
docker入门_第1张图片

操作系统级虚拟化是运行在操作系统之上的,它模拟的是运行在操作系统上的多个不同进程,并将其封装在一个密闭的容器里面,也称为容器化技术。Docker正是容器虚拟化中目前最流行的一种实现。Docker基于LXC技术,即linux container,是一种内核虚拟化技术,可以提供轻量级的虚拟化。以便隔离进程和资源,他与宿主机使用同一个内核,性能损耗小。

3.Docker

  1. docker是一个开源的应用容器引擎,基于Google的go语言实现
  2. docker技术让开发者可以打包应用以及依赖包到一个可移植的容器中,打包好的容器可以发布到任何流行的Linux服务器上运行,这样就可以解决开发环境与运维环境不一致的问题了。docker到底是什么?,基于我粗浅的理解,就是环境复制,我的某个程序需要特定环境,现在我想在另一台机器上跑这个程序,那我就可以用docker复制这个程序的运行环境,打包上传,在另一台机器下载后,环境就部署好了,程序也就可以直接运行了。
  3. docker和虚拟机的区别docker入门_第2张图片
    容器是在本地操作系统层面上实现虚拟化,直接复用本地主机操作系统,不需要单独安装操作系统, 而传统的虚拟化技术方式则需要单独安装每个虚拟机的操作的系统
  4. docker优势
    1. docker启动比虚拟机快,秒级
    2. docker对系统资源利用率高,一台主机同时运行数千docker容器
    3. 容器除了运行其中的应用外,基本不消耗额外的系统资源
    4. docker可以更加快速的交付和部署,节约开发测试部署时间
    5. 更高效的虚拟化,docker容器的运行不需要额外的hypervisor支持,他是内核级的虚拟化,因此可以实现更高的性能和效率
    6. 更轻松的迁移和扩展,docker容器可以在任意平台运行

二 Docker环境搭建

1. docker安装

  1. 先看看有没有安装
yum list installed |grep docker
  1. 安装docker
yum install docker -y 	#这条似乎有问题,安装好后用上一条命令查看,发现安装的是podman-docker.noarch,
#启动时会说docker.service找不到
#按着网上另一套教程安装docker
yum install -y yum-utils device-mapper-persistent-data lvm2	#安装yum工具包,Device Mapper 
#是 Linux2.6 内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理的块设备驱动
#提供了一个高度模块化的内核架构。
#LVM(Logical Volume Manager)逻辑卷管理。它是对磁盘分区进行管理的一种机制,建立在硬盘和分区之上的一个逻辑层,
#用来提高磁盘管理的灵活性。通过LVM可将若干个磁盘分区连接为一个整块的卷组(Volume Group),
形成一个存储池。
#可以在卷组上随意创建逻辑卷(Logical Volumes),并进一步在逻辑卷上创建文件系统,
#与直接使用物理存储在管理上相比,提供了更好灵活性。
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo	#添加阿里源
yum install docker-ce	#安装docker
#安装成功后
docker -v #docker version,docker --version查看docker是否安装成功

3.卸载docker

yum remove docker -y	#建议通过yum list_installed查看与docker相关的内容,一个一个卸载,避免卸不干净

2. docker服务启动

启动:systemctl start docker 或者 service docker start
停止:systemctl stop docker 或者 service docker stop
重启:systemctl restart docker 或者service docker restart

检查docker进程的运行状态:
systemctl status docker 或者 service docker status

查看docker进程:
ps -ef|grep docker

3. docker 服务信息

docker info 查看 docker系统信息
docker 查看所有的帮助信息
docker commond -help 查看某个commond命令的帮助信息
docker images 显示所有已下载镜像

三 docker初体验 ><

docker 底层运行原理:
docker服务启动->下载镜像->启动该镜像得到一个容器->容器里运行着我们想要的程序
docker入门_第3张图片

3.1 docker容器

  1. 启动docker
  2. 下载一个镜像,docker运行一个容器前需要本地存在对应镜像,如果不存在,docker会从镜像仓库下载(默认是https://hub.docker.com)
docker search images	#搜索需要的镜像
docker pull images	#下载对应镜像
docker run images	#运行对应镜像  前台运行,后台运行加 -d
docker run -d -p 8080:8080 images	#-p是端口映射,将os中的8080端口映射到docker中的8080,
#因为你想想,docker是虚拟出一个运行环境,肯定和物理机不一样,你直接使用8080端口,那肯定是物理机的端口,所以要映射
docker ps #打印在运行的容器信息,能查到容器ID
docker stop container_ID 停止容器运行

#试着下载tomcat并在浏览器进入tomcat页面
docker search tomcat
docker pull tomcat
docker run romcat -d -p 8080:8080
#如果这样进不去,建议看这个https://blog.csdn.net/elsostal/article/details/104408838
#大概率是容器内的webapps内部文件没有,需要按照上面连接操作一下

3.进入docker容器

docker exec -it cef0d139bfd6 bash 
# 其中i表示交互式的,也就是保持标准输入流打开,
# t表示虚拟控制台,分配到一个虚拟控制台
# 退出容器
exit

第四章 Dockers核心组件

4.1 docker架构

docker使用客服端/服务器架构模式,使用远程API来管理和创建docker容器

4.2 dockers核心要素

4.2.1 镜像

**镜像:**类似于面对对象中的类
docker镜像就是一个只读的模板,可以用来创建docker容器
**镜像的组成结构:**镜像是由许多层文件系统叠加构成的,最下面是一个引导文件系统bootfs,第二层是一个root文件系统rootfs,root文件系统通常是某种操作系统,比如centos,unbuntu,在root文件系统之上又有很多层文件系统,这些文件系统叠加在一起,构成docker中的镜像;
镜像的操作

1.下载镜像
docker pull tomcat:latest#冒号后面接版本号
或者通过dockerfile文件自己构建
2.列出已下载镜像
docker images
docker images redis	#列出指定的镜像,应该也可以通配符吧,没试
3. 后台运行镜像
docker run -d -p port:port images 
4. 删除镜像
docker rmi redis:latest #rmi是删除镜像,rm是删除容器

4.2.2 容器

容器:运行的镜像就是容器
启动容器有两种方式,一种是基于镜像新建一个容器并启动,另一个是将在终止状态的容器重新启动

1.通过镜像启动容器
docker run -d redis
2.查看运行中的容器
docker ps
3.查看所有的容器,包括停止的容器
docker ps -a
4.停止容器
docker stop 容器id或容器名称
5.启动容器
docker start 容器id或容器名
docker inspect+容器id或容器名 #查看容器的更过信息
6.停止全部运行中的容器
docker stop $(docker ps -q)
7.删除全部容器
docker rm $(docker ps -aq)
8.停用并删除容器
docker stop $(docker ps -q) &docker rm -f $(docker ps -aq)

4.2.3 仓库

仓库:存放镜像
有时候会把仓库和仓库注册服务器看作同一事物,并不严格区分,实际上仓库注册服务器上往往存放着多个仓库,每个仓库包含了多个镜像,每个镜像有不同标签(tag)
仓库分为公开public仓库和私有private仓库
用户可以在本地网络内创建一个私有仓库

1.搜索镜像
docker search images
2.上传镜像
docker push images

客服端:命令行发命令
daemon:docker引擎,控制程序

5. docker使用实例

5.1 docker 安装MySQL

1.下载mysql镜像
docker pull mysql:latest
2. 启动mysql镜像
#-p 端口映射,-e 环境变量配置,MYSQL_DATABASE 数据库名字,MYSQL_ROOT_PASSWORD数据库密码
docker run -p 3306:3306 -e MYSQL_DATABASE=workdb -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest
3.进入容器
docker exec -it containerID bash

5.2 docker 安装nginx

docker pull nginx
docker run -p 80:80 -d nginx
docker exec -it containerID bash

#部署静态网页
docker cp test.html containerID:/usr/share/nginx/html/	#将主机文件复制到容器中
docker cp containerID:src_path dest_path	#反向复制文件
 

5.3 docker 安装zookeeper

docker pull zookeeper 
docker run -p 2181:2181 -d zookeeper
docker exec -it containerID bash

5.4 docker 安装rabbitmq

docker pull rabbitmq 
docker run -p 15672:15672 -p 5672:5672 -d rabbitmq
docker exec -it containerID bash

rabbitmq-plugins enable rabbitmq_management	#启动管理器不然进不了控制台

6 docker自定义镜像

6.1 dockerfile文件

dockerfile用于构建docker镜像,dockerfile文件是由一行行命令语句组成,基于这些命令即可构建一个镜像.
dockerfile文件样例:

FROM xxx/jdk:8
MAINTAINER docker_user
ENV JAVA_HOME /usr/local/java
ADD apache-tomcat-8.0.32.tar.gz /usr/local/
RUN mv apache-tomcat-8.0.32 tomcat8
EXPOSE 8080
RUN chmod u+x /usr/local/tomcat8/bin/*.sh
CMD /usr/local/tomcat8/bin/catalina.sh start

一般而言,Dockerfile分为四个部分:
基础镜像信息
维护者信息
镜像操作指令
容器启动时执行指令

6.2 dockerfile指令

FROM
格式为FROM 或者FROM :
Dockerfile文件第一条指令必须是FROM指令.并且,如果在同一个dockerfile中创建多个镜像时,可以使用多个FROM指令(每个镜像一次);

MAINTAINER
格式为MAINTAINER ,指定维护者信息;

ENV
格式为ENV ,指定一个环境变量,会被后续RUN指令使用,并在容器运行时保持;

ADD
格式为ADD
复制指定的到容器中的

EXPOSE
格式为 EXPOSE [ …]
告诉docker服务端容器暴露的端口号,供互联系统使用,在启动容器时需要通过 -p 映射端口,Docker主机会自动分配一个端口转发到指定的端口

RUN
格式为RUN
RUN指令将在当前镜像基础上执行指定命令,并提交为新的镜像,当命令较长时可以使用\来换行

CMD
指定启动容器时执行的命令,每个Dockerfile只能有一条CMD命令,如果指定了多条cmd命令,只有最后一条会被执行.
如果用户启动容器时制定了运行的命令,则会覆盖掉cmd指定的命令.

6.3Dockerfile自定义JDK镜像

FORM centos:latest	#以centos:latest为基础镜像,自定义镜像将以这个镜像为基础,就相当于最基础的环境
MAINTAINER egoist	#镜像的作者是egoist
ADD jdk-8u121-linux-x64.tar.gz /usr/local	#将主机环境中的jdk包复制到镜像指定的位置当中去
ENV JAVA_HOME /usr/local/jdk1.8.0_121	#配置镜像中的环境变量,上一步的jdk的位置被配置成JAVA_HOME
ENV CLASSPATH $JAVA_HOME/lib/dt/java:$JAVA_HOME/lib/tools.jar	#配置了两个classpath的环境变量,用:分割
ENV PATH $PATH:$JAVA_HOME/bin	#将java的bin加入到path中去,:表示衔接的意思
CMD java -version	#启动容器时执行该条命令

构建镜像:docker build -t egoist_jdk1.8.0_121 .	#-t 指定一个标签 后面是自定义名字 最后有一个点,表示当前目录下有一个Dockerfile文件
运行容器:docker run egoist_jdk1.8.0_121	#运行后执行docker ps 会发现没有容器在运行
#这是因为Docker容器后台运行,就必须有一个前台进程.
#容器运行的命令如果不是那些一直挂起的命令(eg. 运行top,tail等),就是会自动退出
#这个是 docker 的机制问题

6.4Dockerfile自定义tomcat镜像

FORM egoist_jdk1.8.0_121	
MAINTAINER egoist	
ADD apache-tomcat-8.5.24.tar.gz /usr/local	
ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.24	
ENV PATH $PATH:$CATALINA_HOME/lib:$CATALINA_HOME/bin	
EXPOSE 8080
CMD /usr/local/apache-tomcat-8.5.24/bin/catalina.sh run	#启动容器时执行该条命令,脚本catalina.sh用于启动和关闭tomcat服务器

docker build -t egoist-tomcat-8.5.24 .
docker run -d -p 8080:8080 containerID

6.5Dockerfile自定义mysql镜像

FORM centos:centos6
MAINTAINER egoist
RUN yum install -y mysql-server mysql
RUN /etc/init.d/mysqld start &&\
	mysql -e "grant all privileges on *.* to 'root'@'%' identified by '123456' WITH GRANT OPTION;"&&\
	mysql -e "grant all privileges on *.* to 'root'@'localhost' identified by '123456' WITH GRANT OPTION;"&&\
	mysql -uroot -p123456 -e "show databases;"
EXPOSE 3306
CMD /user/bin/mysqld_safe	

docker build -t egoist-mysql .
docker run -d -p 3306:3306 containerID

6.6Dockerfile自定义redis镜像

FORM centos:latest
MAINTAINER egoist
RUN yum install -y epel-release && yum install -y redis && yum install -y net-tools
EXPOSE 6379
CMD /usr/bin/redis-server --protected-mode no	#设置保护模式为no,否则远程连不上

docker build -t egoist-redis .
docker run -d -p 6379:6379 containerID

6.7 镜像发布到仓库

阿里云仓库:dev.ailyun.com 需要注册一下
docker仓库:hub.docker.com

#具体操作阿里云里都有写,只要你能创建好仓库,不会找不到
docker login --username=aliyunID registry.cn-hangzhou.aliyuncs.com	
docker pull registry.cn-hangzhou.aliyuncs.com/你的命名空间/你的仓库名:[镜像版本号]	#从Registry中拉取镜像

#将镜像推送到Registry
docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/你的命名空间/你的仓库名:[镜像版本号]
docker push registry.cn-hangzhou.aliyuncs.com/你的命名空间/你的仓库名:[镜像版本号]

6.8 镜像加速配置

左侧找到这个
docker入门_第4张图片
配置json文件,其中的地址每个人大概不同,同页面会显示你自己的地址
docker入门_第5张图片

7.docker应用部署

1.将开发好的springboot程序打成jar包或war包
package打包:
docker入门_第6张图片docker入门_第7张图片

2.将打好的jar包或war包上传到linux
3.定义dockerfile文件,用于创建项目镜像
docker入门_第8张图片
docker入门_第9张图片

7.1 将改变了的容器保存为新镜像

运行容器时,有可能改变了容器内的一些东西,想将这种变化保存下来.

修改容器并保存
docker commit containerID 镜像名

你可能感兴趣的:(Java学习笔记,docker,运维,服务器)