前言
小编我将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识,有兴趣的小伙伴可以关注一下!
也许一个人独行,可以走的很快,但是一群人结伴而行,才能走的更远!让我们在成长的道路上互相学习,让我们共同进步,欢迎关注!
目录
2:docker run -d -p 映射端口:本地默认端口 tomcat
Docker架构主要包括Client、Docker_HOST和Register三部分:
2.将jdk.gz文件放在root/web-docker目录下
3.创建文件Dockerfile,将以下内容拷贝到root/web-docker/Dockerfile 下
1.将原Dockerfile文件更名为Dockerfile-jdk创建新的文件Dockerfile
2.将tomcat.gz上传到/root/web-docker目录下
1.首先先新建两个文件,一个redis.conf, 一个Dockerfile,放在一个文件夹web-docker里
一、Docker入门
1.什么是docker?
Docker是一个开源的应用容器引擎..............
通俗一点讲: Docker其实就是可以打包程序和运行环境(虚拟机,只能在linux下运行),
把环境和程序一起发布的容器。当你需要发布程序时你可以使用Docker将运行环境一起发布。
其他人拿 到你的程序后可以直接运行,避免 出现一次编译到处调试时的尴尬局面。
docker的出现主要解决,在我的机器上是正常的,为什么到你的机器上就不正常的问题,但是,随着Docker的进步以及k8s等编排软件的流行,docker的使用场景大大扩展,
docker已经成为高可用服务集群 持续交付、持续集成以及云原生的关键技术!
Docker 是一个开源项目,这个项目旨在通过把应用程序打包为可移植的、自给自足的容器(引用语)
DocKer一次构建可放在任何地方就可以运行,不需要进行任何改变DocKer 就类似于一个容器。这个容器就好像咱们常用的虚拟机一样,当我们虚拟机里面安装过VS、SQL、浏览器 ...... 之后咱们就把虚拟机镜像备份下来、等到下一次需要重新搭一个环境的时候,就可以省去很多事情了,直接把备份的虚拟机运行起来,该有的就都有了,省去了很多事情。
在用DocKer的情况下,咱们可以直接把项目发布在DocKer容器上面进行测试,当项目需要正式上线的时候我们直接可以把做好的DocKer 镜像部署上去就行了,如果测试的好,就不必担心项目上正式版本的时候再出现什么问题了,(比如说 咱们的Confing 配置信息很多项目都是什么测试环境地址,正式环境地址的,但是用过DocKer之后就一个就行了)DocKer可以在 云、Windows、Linux 等环境上进行部署,就单说这一点就省去了我的很多费用、还有项目部署上线的风险,不必每次项目上线都留守一堆人才等着项目报错.
2.Docker 优势劣势
虚拟机和DocKer对比
1.DocKer 启动速度是虚机万万不敢调戏的了,(这里声明一下,在同一台电脑)。
2.在资源的利用上也比虚机高多了,同一台机器上我相信能跑100台DocKer,咱们肯定不赶跑这么多台虚拟机,有效的节约资源。
3.传统虚拟机, 虚拟出一条硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件
4.容器内的应用直接运行在宿主机的内部,容器是没有自己的内核的,也没有虚拟硬件,所以轻便
5.每个容器间是相互隔离的,每个容器内都有一个属于自己的文件系统,互不影响
应用更快速的交互和部署
传统:一堆帮助文档,安装程序
Docker: 打包镜像发布测试,一键运行
更便捷的升级和扩缩容
更简的系统运维
更高效的计算资源利用
图中我们可以看到DocKer 相比于虚拟机来说不需要一个完成的系统,但是对于隔离性也就没有虚拟机好了.
3.docker历史
2010年,几个搞IT的年轻人,就在美国成立了一家公司 dotcloud故一些 pass 的云计算服务! LXC 有关的容器技术 !他们将自己的技术(容器化技术) 命名 就是 Doker !Docker 刚刚诞生的时候,没有引起行业的注意! dotCloud,就活不下去!
开源
开发源代码!
2013年,Docker开源!
Docker越来越多的人发现了docker的优点!火了,Docker 每个月都会更新一个版本!
2014年4月9日,Docker1.0发布 !
Docker为什么这么火?十分的轻巧 !
在容器技术出来之前,我们都是使用虚拟机技术!
虚拟机:在window中装一个Vmware,通过这个软件我们可以虚拟出来一台或者多台电脑!笨重!
虚拟机也是属于虚拟化技术,Docker 容器技术,也是一种 虚拟化技术!
linux centos原生镜像 (一个电脑!) 隔离,需要开启多个虚拟机!几个G 几分钟wm:镜像(最核心的环境 4m + jdk + mysgl)十分的小巧, 运行像就可以了! 小巧!ps:几个MCKB 秒级启动!hadocker:隔离,
4.docker执行过程
名词解释:Docker三个重要的构念
①镜像:镜像是只读的文件,提供了运行程序完整的软硬件资源,是应用程序的"集装箱";
- Docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,tomcat镜像 ===> run ===> tomcat01容器, 通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的)
②容器:是镜像的实例,由 Docker 负责创建,容器之间彼此隔离;
- Docker利用容器技术,独立运行一个或者一组应用, 通过镜像来创建的
- 启动,停止,删除,基本命令!
- 就目前可以把这个容器理解为一个建议的linux系统
③仓库:
- 存放镜像的地方
- Docker Hub(默认是国外的)远程仓库地址: https://hub.docker.com/
- 阿里云,,,都有容器服务(配置镜像加速!)
Docker file: 是一个配置文件 如何构建的步骤 来指定一个镜像是如何构建的
通过Docker build指令可以将Dockerfile构建成一个镜像
二、Docker在ubuntu上的安装
# step 1: 安装必要的一些系统工具
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# step 2: 安装GPG证书
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# Step 3: 写入软件源信息
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# Step 4: 更新并安装 Docker-CE
sudo apt-get -y update
sudo apt-get -y install docker-ce
#查看是否安装成功 查看容器的运行情况
docker ps
Docker安装时错误:安装完docker,运行指令时,出现了以下错误提示:
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/version": dial unix /var/run/docker.sock: connect: permission denied。
意思是试图连接unix:///var/run/docker.sock:,但权限不够。
解决办法:
原因分析:这是因为你当前的用户没有这个权限。默认情况下,docker 命令会使用 Unix socket 与 Docker 引擎通讯。而只有 root 用户和 docker 组的用户才可以访问 Docker 引擎的 Unix socket。出于安全考虑,一般 Linux 系统上不会直接使用 root 用户。即我们当前的用户不是root用户。
解决办法:把我们当前的用户添加到docker组中就可以了,这样他们就是一家人了。
第一步:sudo gpasswd -a username docker #将普通用户username加入到docker组中,username这个字段也可以直接换成$USER。
第二步:newgrp docker #更新docker组
第三步:再执行你报错的命令,此时就不会报错了。
Docker ps
三、Docker映射文件路径
在创建Docker容器时,想要与本地路径进行映射共享文件,使用docker run -v指令,例如我需要将本地的的/root/code路径映射到容器内的/data/code路径(数据卷),使用如下指令,冒号前为宿主机路径,冒号后为容器路径,其中xxx为镜像完整路径
docker run -it -v /root/code:/data/code xxx /bin/bash
docker容器文件映射到宿主机
四.docker下载
1.下载nginx
1.查看可用的 Nginx 版本docker search
默认是在公共仓库找,如果有私有仓库,会在私有仓库找
直接去官网搜索nginx版本:https://hub.docker.com/
docker search nginx
2.下载最新版本的nginx镜像 docker pull
如果下载镜像时不指定标签,则默认会下载仓库中最新版本的镜像,即选择标签为 latest 标签
docker pull nginx:latest
3.查看本地镜像 docker images
docker images
4.运行容器
docker run --name nginx-test -p 8080:80 -d nginx
参数说明:
- --name nginx-test:容器名称。
- -p 8080:80: 端口进行映射,将本地 8080 端口映射到容器内部的 80 端口
- -d nginx: 设置容器在在后台一直运行。
列表参数说明:
- Repository 镜像名称
- Tag 镜像标签
- Image Id 镜像 的ID
- Created 镜像的创建日期
- Size 镜像的大小
注意:镜像默认存放位置:/var/lib/docker目录下
5.本地测试
在浏览器中输入url访问8080端口 ,出现如图一下的则是成功了!
注意:ubuntu是默认开通远程端口,但cent os需要手工打开端口
6.获取镜像信息docker inspect 镜像id
2.相关命令
1.镜像命令
docker命令总结:
1.docker pull nginx:latest 拉取镜像
2.docker images 查看镜像
3.docker run -d -p 81:80 nginx 创建容器
4.docker ps 查看正在运行的容器
5.docker ps -a 查看所有的容器(包括没运行的容器)
6.docker exec -it 2d bash 登录容器
- -i 让容器的标准输入保持打开
- -t 让docker分配一个伪终端并保存到容器的标准输入
7.exit或者Ctrl+D 退出容器
8.docker rm -f 容器id 删除容器
9.docker commit 2d m1 将2d容器保存为m1镜像
10.docker rmi -f 镜像id 删除镜像
11.docker save m2>1.tar 将m1镜像保存到1.tar文件中(备份镜像)
12.docker load < 1.tar 将1.tar文件中加载为镜像(加载镜像)
13.docker tag 添加镜像标签
eg: docker tag nginx:latest nginx:lnmp #给nginx打上标签lnmp,原来的标签是latest
14.docker images -q 查询镜像的id
15.docker rmi `docker images -q` 批量删除所有镜像
16. docker build -t 镜像名称 . dockerfile构建镜像
17.docker container run 启动新容器
18.docker diff 查看容器文件系统改动详情。
19.docker ps -aq |wc -l 查找容器数量
20. docker info Docker实例的状态和配置
2.容器命令
1.docker container run
启动新容器的命令。该命令的最简形式接收镜像和命令作为参数。镜像用于创建容器,而命令则是希望容器运行的应用。
eg:docker run -it -d -p 81:80 nginx #命令会在前台启动一个 Ubuntu 容器,并运行 Bash Shell。
2.docker container ls
列出所有在运行(UP)状态的容器。如果使用 -a 标记,还可以看到处于停止(Exited)状态的容器。
3.docker container exec
用于在运行状态的容器中,启动一个新进程。该命令在将 Docker 主机 Shell 连接到一个运行中容器终端时非常有用。
eg: docker exec -it 97 bash #登录容器
4.docker container stop
grammer:docker stop container_ID
此命令会停止运行中的容器,并将状态置为 Exited(0)。
提示:该命令通过发送 SIGTERM 信号给容器内 PID 为 1 的进程达到目的。
如果进程没有在 10s 之内得到清理并停止运行,那么会接着发送 SIGKILL 信号来强制停止该容器。
5. docker container start
grammer: docker start container_ID
重启处于停止(Exited)状态的容器。可以在 docker container start 命令中指定容器的名称或者 ID。
6.docker container rm
删除停止运行的容器。可以通过容器名称或者 ID 来指定要删除的容器。推荐首先使用docker container stop 命令停止容器.然后使用 docker container rm 来完成删除(先停止再删除)
7. docker container inspect
显示容器的配置细节和运行时信息。
3.下载tomcat
1:docker pull tomcat
1.1如果拉取镜像慢怎么办?
方式一:买翻墙路由器
方式二:修改为国内镜像 ubuntu
sudo apt-get install systemd
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://yxzrazem.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker |
2:docker run -d -p 映射端口:本地默认端口 tomcat
将linux系统的8888端口映射到docker容器的8080端口。docker容器默认采用桥接模式与宿主机通信。需要将宿主机的ip端口映射到容器的ip端口上。
3:登录tomcat容器 ![](https://img-blog.csdnimg.cn/2a0d88a30b2f4c6db4b9482b728b9eb8.png)
登录tomcat容器后ls查看tomcat目录文件发现有两个webapps目录
注意:其中tomcat默认运行的是webapps目录下的资源文件,但是其中这里是空的,而tomcat的有效资源文件却存在webapps.dist目录下面
因此我们访问浏览器测试tomcat时会出现404出错页面,下面的解决此问题的方案:
然后就可以http://ip地址:8888回车访问tomcat成功了!表示tomcat在docker下载成功!
五.使用DockerFile构建镜像
我们先了解一下docker的运行机制:
1.Docker的引擎
Docker Engine(Docker引擎--发动机程序支持的核心组件)是Docker的核心部分,使用的是客户端---服务器(C/S)架构模式。其主要组成部分:
①、docker daemon:Docker的服务端组件,他是Docker架构中运行在后台的一个守护进程,可以接收并处理来自命令行接口及API接口的指令,然后进行相应的后台操作。
②、REST API:表示应用程序API接口,开发者通过该API接口可以与Docker的守护进程进行交互,从而指示后台进行相关操作。
③、docker CLI:表示Docker命令行接口,开发者可以在命令行中使用Docker相关指令与Docker守护进程进行交互,从而管理诸如image(镜像)、container(容器)、network(网络)和data volumes(数据卷)等实体。
2.Docker的底层容器运行原理:
①、客户端发送 docker pull tomcat 命令;
②、命令到达 Docker daemon(守护程序),守护进程首先检查本地是否有该 Tomcat 的镜像,如果没有,则从注册中心(仓库)拉取该镜像;
③、镜像拉取到本地后,客户端执行 docker run 命令,守护程序就会创建容器,启动应用。
Docker架构主要包括Client、Docker_HOST和Register三部分:
1. Client(客户端) docker CLI
Client即Docker客户端,也就是上一小节Docker Engine中介绍的docker CLI。开发者通过这个客户端使用Docker的相关指令与Docker守护进程进行交互,从而进行Docker镜像的创建、拉取和运行等操作。
2. DOCKER_HOST(Docker主机)
DOCKER_HOST即Docker内部引擎运行的主机,主要指Docker daemon(Docker守护进程)。可以通过Docker守护进程与客户端还有Docker的镜像仓库Registry进行交互,从而管理Images(镜像)和Containers(容器)等。
3.Registry(注册中心)
Registry即Docker注册中心,实质就是Docker镜像仓库,默认使用的是Docker官方远程注册中心Docker Hub,也可以使用开发者搭建的本地仓库。Registry中包含了大量的镜像,这些镜像可以是官网基础镜像,也可以是其他开发者上传的镜像。
我们在实际使用 Docker 时,除了会涉及图中的 3 个主要部分外,还会涉及很多Docker Objects(Docker对象),例如Images(镜像)、Containers(容器)、Networks(网络)、Volumes (数据卷)、Plugins(插件)等。其中常用的两个对象Image和Containers的说明如下。
·Images(镜像)
Docker镜像就是一个只读的模板,包含了一些创建Docker容器的操作指令。通常情况下,一 个Docker镜像是基于另一个基础镜像创建的,并且新创建的镜像会额外包含一些功能配置。 例如:开发者可以依赖于一个 Ubuntu 的基础镜像创建一个新镜像,并可以在新镜像中安装 Apache等软件或其他应用程序。
·Containers(容器)
Docker 容器属于镜像的一个可运行实例(镜像与容器的关系其实与 Java中的类与对象相似),开发者可以通过API接口或者CLI命令行接口来创建、运行、停止、移动、删除一个容器,也可以将一个容器连接到一个或多个网络中,将数据存储与容器进行关联。
3.认识 Dockerfile 文件
eg:
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
4.Dockerfile 的基本结构分为4部分
- 基础镜像信息;
- 维护者信息;
- 镜像操作指令;
- 容器启动时执行指令
5.Dockerfile 指令
FROM
格式为 FROM <image> 或 FROM <image>:<tag>
Dockerfile 文件的第一条指令必须为 FROM 指令。
并且,如果在同一个 Dockerfile 中创建多个镜像时,
可以使用多个 FROM 指令(每个镜像一次);
如果from没有该镜像,则从镜像仓库中找
MAINTAINER
格式为 MAINTAINER <name>,指定维护者信息;
ENV
格式为 ENV <key> <value>,指定一个环境变量,会被后续 RUN 指令使用,并在容器运行时保持;
ADD
格式为 ADD <src> <dest>;
复制指定的<src>到容器中的<dest>;
EXPOSE
格式为 EXPOSE <port> [<port>...]
告诉 Docker 服务端容器暴露的端口号,供互联系统使用,在启动容
器时需要通过 -p 映射端口,Docker 主机会自动分配一个端口转发到
指定的端口;
RUN
格式为 RUN <command>
RUN 指令将在当前镜像基础上执行指定命令,并提交为新的镜像,当命令较长时可以使用 \ 来换行;
CMD
指定启动容器时执行的命令,每个 Dockerfile 只能有一条 CMD 命令。
如果指定了多条命令,只有最后一条会被执行。
如果用户启动容器时候指定了运行的命令,则会覆盖掉 CMD 指定的命令。
WORKDIR
作用:切换到镜像中的指定路径,设置工作目录
在 WORKDIR 中需要使用绝对路径,如果镜像中对应的路径不存在,会自动创建此目录
一般用 WORKDIR 来替代 切换目录进行操作的指令
RUN cd <path> && <do something>
WORKDIR 指令为 Dockerfile 中跟随它的任何 RUN、CMD、ENTRYPOINT、COPY、ADD 指令设置工作目录
如果 WORKDIR 不存在,即使它没有在任何后续 Dockerfile 指令中使用,它也会被创建
6.通过Dockerfile文件自定义 jDK 镜像
1.切换到docker目录
root@ubuntu:~# mkdir /root/web-docker
root@ubuntu:~# cd /root/web-docker
2.将jdk.gz文件放在root/web-docker目录下
3.创建文件Dockerfile,将以下内容拷贝到root/web-docker/Dockerfile 下
eg:FROM ubuntu:latest
MAINTAINER obtk-fly
ADD jdk-8u291-linux-x64.tar.gz /usr/local
ENV JAVA_HOME /usr/local/jdk1.8.0_291
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH $PATH:$JAVA_HOME/bin
CMD java -version
4.构建jdk1.8镜像
docker build -t obtk_fly_jdk1.8.0_121 .
5. 运行镜像
出现jdk版本则代表成功!
docker run 镜像id
7.通过Dockerfile文件自定义 Tomcat镜像
1.将原Dockerfile文件更名为Dockerfile-jdk创建新的文件Dockerfile
root@ubuntu:~/web-docker# mv Dockerfile Dockerfile-jdk
root@ubuntu:~/web-docker# touch Dockerfile
2.将tomcat.gz上传到/root/web-docker目录下
3.将一下复制到DockerFile文件中
FROM obtk_fly_jdk1.8.0_121#(docker中镜像jdk中的名称)
MAINTAINER obtk-fly #(自取)
ADD apache-tomcat-9.0.48.tar.gz /usr/local/ #(将tomcat.gz文件放入到/usr/local目录中)
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.48
ENV PATH $PATH:$CATALINA_HOME/lib:$CATALINA_HOME/bin #(tomcat环境配置)
EXPOSE 8080 #(暴露的tomcat端口)
CMD /usr/local/apache-tomcat-9.0.48/bin/catalina.sh run #(容器运行)
4.构建镜像
docker build -t obtk-fly-tomcat-9.0.48 .
5. 运行镜像
docker run -d -p 8081:8080 d682230f4641
6.检验是否成功
在客户端运行,出现如下画面,代表tomcat安装成功。
8.通过Dockerfile文件自定义 redis镜像
1.首先先新建两个文件,一个redis.conf, 一个Dockerfile,放在一个文件夹web-docker里
2.复制一下内容到Dockerfile文件中,同理
# 拉取仓库的redis
FROM redis:5.0.14
MAINTAINER obtk-fly
# 将本地redis配置文件替换到镜像里
COPY redis.conf /usr/local/etc/redis/redis.conf
# 暴漏端口
EXPOSE 6379
# 启动命令
CMD [ "redis-server", "/usr/local/etc/redis/redis.conf" ]
3.拷贝redis.conf文件到web-docker目录
4.执行命令即可创建一个自己的redis镜像
docker build -t obtk-fly-redis .
5. 运行镜像
docker run -d -p 6379:6379 c5da061a611a
如果发现执行命令docker ps -a 发现redis容器是exited(1)状态那么可能是因为你的redis配置中你将daemonize 为yes
解决办法就是将deamonize改为:no
在运行一次,则redis容器启动了up
到此,这里docker中环境已经搭好了,运行springboot项目
六.docker中部署springboot项目
1.部署springboot项目打包成jar包
最重要的更改application.yml配置
连接redis和mysql的ip地址更改
将开发的springboot程序打成jar包或者war包,可以使用maven打包
<groupId>com.obtk</groupId>
<artifactId>just-redis-shiro</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
将打好的jar包或war包上传到Linux某个目录下,比如:/root/docker
定义jar包程序 /root/docker/Dockerfile文件内容
FROM obtk_fly_jdk1.8.0_121
MAINTAINER obtk_fly
ADD just-redis-shiro-1.0.jar /opt
RUN chmod +x /opt/just-redis-shiro-1.0.jar
CMD java -jar /opt/just-redis-shiro-1.0.jar
构建和运行 Jar 包程序的镜像
构建镜像:docker build -t just-redis-shiro-web-jar .
运行容器:docker run -d -p 8081:8081 13fdea939dfa
在客户端运行该程序,在浏览器中输入http://ip地址:tomcat端口号 回车