Docker详细使用

Docker

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 LinuxWindows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KvCcVTRR-1605595364269)(image\dockers图标.jpg)]

1.为什么会出现docker这个东西?

	一款产品从开发到上线,从操作系统,到运行环境,再到应用配置。作为开发+运维之间的协作我们需要关心许多东西,这也是很多互联网公司不得不面对的问题,特别是各个版本迭代之后,不同版本环境的兼容,对运维人员都是考验。

	Docker之所以会发展如此迅速,是因为它对以上问题给出了一个标准的解决方案。

	环境配置如此麻烦,换一台机器就要重新来一次,费时费力。很多人想到,能不能从根本解决问题,软件可以带环境一起安装?也就是说,安装的时候,把原始的环境一模一样的复制过来。开发人员的利用Docker可以消除协作编码时“在我的机器上可以正常运行”的问题。

	Docker可以将能运行一个应用程序的所有环境及配置一起打包,形成一个镜像。将这个镜像通过docker复制到另一台机器上,那么这台机器也就具有了原始机器上的环境和配置。那么这个应用程序也将可以运行在当前这台机器上。  

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-45lHx9S2-1605595364280)(image/1.png)]

2.Docker理念、概念

	Docker 是一个开源的应用容器引擎,基于Go 语言实现的云开源项目,并遵从 Apache2.0 协议开源。
	
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版),我们用社区版就可以了。

	Docker的主要目标是:"Build,Ship and Run Any App,Anywhere",也就是通过对应用组件的封装,分发,部署,运行等生命周期的管理,使用户的App(可以是一个Web应用或数据库应用等等)及其运行的环境能够做到“一次封装,到处运行”。  

	Linux容器技术的出现解决了这样的一个问题,而Docker就是在它的基础上发展过来的。将应用运行在Docker容器上面,而Docker容器在任何操作系统上都是一致的,这就实现了跨平台,跨服务器。只需要一次配置好环境,换到别的机器上就可以一键部署好。大大简化了操作。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3eqSUHle-1605595364284)(image\1562828723(1)].jpg)

2.1 docker能干什么:

  • 更快速的交付和部署
  • 更快捷的升级和扩缩容
  • 更简单的系统维护

2.2 一句话描述docker:

解决了运行环境和配置问题的软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术。
	an open platform to build, ship, and run any app, anywhere
	一个开放的平台,可以在任何地方构建,发布和运行任何应用程序

2.3 Docker容器虚拟化对比传统虚拟机

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2fRje0EI-1605595364289)(image/download.png)]

传统虚拟机Docker容器
磁盘占用几个GB到几十个GB左右几十MB到几百MB左右
CPU内存占用虚拟操作系统非常占用CPU和内存Docker引擎占用极低
启动速度(从开机到运行项目)几分钟(从开启容器到运行项目)几秒
安装管理需要专门的运维技术安装、管理方便
应用部署每次部署都费时费力从第二次部署开始轻松简捷
耦合性多个应用服务安装到一起,容易互相影响每个应用服务一个容器,达成隔离
系统依赖需求相同或相似的内核,目前推荐是Linux

3.Docker三大要素

  • 镜像:一台机器上打包好的应用程序和其依赖的环境配置。镜像可以创建容器,相当于模板,一个镜像可以创建多个容器

  • 容器:Docker利用容器独立运行一个或一组应用。容器是由镜像创建的运行实例。

  • 仓库:仓库是集中存放镜像的地方。类似Maven的中心仓库,或者github一样。DockerHub

    镜像和容器的关系类似于面向对象编程中的类和对象的关系

Docker面向对象
镜像
容器对象

4.Docker的安装

centOS中Docker的安装要求必须在6.5版本以上。这里是以centOS7.2作为演示

1.如果之前安装过docker要先卸载之前安装过的。执行以下命令

$ yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
**注意:\在此没有特别大的含义,就是换行的意思,为了让我们看到此处都卸载了什么东西

2.安装docker所需要的包和一些存储驱动程序

$ yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2

3.使用以下命令设置稳定存储库

$ yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

4.安装最新版本的 docker社区版(Docker CE)

$ yum install -y docker-ce docker-ce-cli containerd.io

5.启动docker

$ systemctl start docker
$ systemctl enable docker #开机自启动

6.通过运行 hello-world 镜像验证是否正确安装了Docker CE 。

$ docker run hello-world

7.配置镜像加速器

国内从 DockerHub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。Docker 官方和国内很多云服务商都提供了国内加速器服务,例如:

  • Docker官方提供的中国镜像库:https://registry.docker-cn.com
  • 七牛云加速器:https://reg-mirror.qiniu.com

当配置某一个加速器地址之后,若发现拉取不到镜像,请切换到另一个加速器地址。国内各大云服务商均提供了 Docker 镜像加速服务,建议根据运行 Docker 的云平台选择对应的镜像加速服务。

附:配置阿里云镜像(加速) 创建配置

针对Docker客户端版本大于 1.10.0 的用户
您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器
添加如下配置文件
{
  "registry-mirrors": ["https://hrm5ldj3.mirror.aliyuncs.com"]
}
$ systemctl daemon-reload  #从新加载配置文件
$ systemctl restart docker #重启docker

5.Docker run的运行流程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DSnHCyvX-1605595364292)(image/1562910758(1)].jpg)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-voOEUqFV-1605595364296)(image/2019-08-19_114027.png)]

6.Docker的常用命令

6.1 辅助命令

$ docker version	#显示 Docker 版本信息。
$ docker info		#显示 Docker 系统信息,包括镜像和容器数。
$ docker --help  	#帮助命令

6.2 镜像命令

1.查看镜像信息

$ docker images	[options]	#列出本地所有镜像
	-a			#列出所有镜像(包含中间映像层)
    -q			#只显示镜像id
    --digests	#显示镜像摘要信息
    --no-trunc	#不截断输出(默认截断过长的列) 完整展示

2.搜索镜像

$ docker search [options] 镜像名		#去dockerhub上查询当前镜像
	-s 指定值		#列出收藏数不少于指定值的镜像
    --no-trunc	  #不截断输出(默认截断过长的列) 完整展示

参数说明:

NAME: 镜像仓库源的名称

DESCRIPTION: 镜像的描述

OFFICIAL: 是否 docker 官方发布

stars: 类似 Github 里面的 star,表示点赞、喜欢的意思。

AUTOMATED: 自动构建。

3.下载镜像

$ docker pull 镜像名[:TAG|@DIGEST]	
$ docker pull 镜像名:版本

4.删除镜像

$ docker rmi 镜像名:版本	  #未指定版本删除最新版本
	-f		#强制删除 

6.3 容器命令

1.运行容器

$ docker run [OPTIONS] 镜像名 [cmd]			   #镜像名新建并启动容器
	-i							#以交互模式运行容器,通常与-t同时使用
	-t							#为容器重新分配一个伪终端,通常与-i同时使用
	--name 别名				   #为容器指定一个名字
	-d							#启动守护式容器(在后台启动容器),并返回容器ID
	-p 映射端口号:原始端口号		 #指定端口号启动,指定端口映射
	-P							#主机自动分配端口号,随机端口映射
	--rm                        #当容器停止自动移除                                  
	
例:$ docker run -it --name myTomcat -p 8888:8080 tomcat
    $ docker run -d --name myTomcat -P tomcat

注意:

#如果启动报以下错误:
docker: Error response from daemon: driver failed programming external connectivity on endpoint myTomcaaa (1148dccd5673fab421495087d352adc5428ab6ab7cf9f3fd708b662a25d92641):  (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 32807 -j DNAT --to-destination 172.17.0.5:8080 ! -i docker0: iptables: No chain/target/match by that name.
 (exit status 1)).
 
#原因:
#docker服务启动时定义的自定义链DOCKER由于某种原因被清掉
#重启docker服务及可重新生成自定义链DOCKER

#解决:
#重启docker服务后再启动容器
systemctl restart docker
docker start foo

2.查看运行的容器

$ docker ps		 #列出所有正在运行的容器
	-a			#显示所有的容器,包括未运行的。
	-l			#显示最近创建的一个容器
	-n 数值	   #显示最近n个创建的容器
	-q			#静默模式,只显示容器编号
	--no-trunc	 #不截断输出(默认截断过长的列) 完整展示

输出详情介绍:

CONTAINER ID: 容器 ID。

IMAGE: 使用的镜像。

COMMAND: 启动容器时运行的命令。

CREATED: 容器的创建时间。

STATUS: 容器状态。

状态有7种:

  • created(已创建)
  • restarting(重启中)
  • running(运行中)
  • removing(迁移中)
  • paused(暂停)
  • exited(停止)
  • dead(死亡)

PORTS: 容器的端口信息和使用的连接类型(tcp\udp)。

NAMES: 自动分配的容器名称

3.退出容器

$ exit		 #容器停止退出
$ Ctrl+p+q	 #容器不停止退出 

4.进入容器

$ docker attach 容器名字/容器id

5.删除容器

$ docker rm  容器名字/容器id		  #删除容器
$ docker rm -f 	容器名字/容器id	  #删除正在运行的容器
$ docker rm -f $(docker ps -aq)	   #删除所有容器

6.重启容器

$ docker start 容器名字/容器id  	    #开启容器
$ docker restart 容器名字/容器id  	#重启容器

7.停止正在运行的容器

$ docker stop 容器名字/容器id 	   	#正常停止容器运行
$ docker kill 容器名字/容器id     	#立即停止容器运行

8.查看容器日志

$ docker logs [OPTIONS] 容器名字/容器id	  		
	-t			 #加入时间
	-f			 #跟随最新的日志打印
	--tail 数字	#显示最后多少条

9.查看容器内的进程

$ docker top 容器名字/容器id   		

10.查看容器内部细节

$ docker inspect 容器名字/容器id    		

11.进入容器

$ docker exec [options] 容器名字/容器id 容器内命令   		
	-i		#以交互模式运行容器,通常与-t一起使用
	-t		#分配一个伪终端

eg: docker exec -it centoss ls 

docker exec -it mytomcat /bin/bash

12.拷贝

$ docker cp 容器名字/容器id:容器内资源路径 宿主机目录路径  		#将容器内资源拷贝到主机上

eg:
[root@localhost~]docker cp centoss:/aaa.txt /root/

#宿主机与容器之间可以相互分享文件
$ docker cp 宿主机目录路径 容器名字/容器id:容器内资源路径

eg:docker cp /root/bbb.txt centoss:/

宿主机:Docker安装在哪谁就是宿主机  centos
容器:在Docker种根据镜像启动的就是容器   centos容器

13.把一个容器副本打包镜像

$ docker commit -a="作者" -m="描述信息" 容器ID 目标镜像名称:TAG

例:docker commit -a="nan" -m="witout docs" b35d35f72b8d nan/mytomcat:1.2
	1.从dockerHub上下载tomcat镜像到本地并成功运行
	2.删除上一步镜像产生的容器的doc目录
	3.以当前没有doc目录的tomcat为模板commit生成一个新的镜像
	4.启动新的镜像并和原来的对比

7.Docker的镜像原理

7.1 镜像是什么?

	镜像是一种轻量级的,可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时所需的库、环境变量和配置文件。

7.2 为什么一个tomcat镜像会那么大?

镜像是一个千层饼。

7.3 UnionFS(Union File System)(联合文件系统):

	Union文件系统是一种分层,轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
	特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录 

7.4 Docker镜像加载原理:

	docker的镜像实际是由一层一层的文件系统组成。
	bootfs(boot file system)主要包含bootloader和kernel,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统。在docker镜像的最底层就是bootfs。这一层与Linux/Unix 系统是一样的,包含boot加载器(bootloader)和内核(kernel)。当boot加载完后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时会卸载bootfs。
	rootfs(root file system),在bootfs之上,包含的就是典型的linux系统中的/dev,/proc,/bin,/etc等标准的目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu/CentOS等等。
	我们平时安装进虚拟机的centos都有1到几个GB,为什么docker这里才200MB?对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令,工具,和程序库就可以了,因为底层直接使用Host的Kernal,自己只需要提供rootfs就行了。由此可见不同的linux发行版,他们的bootfs是一致的,rootfs会有差别。因此不同的发行版可以共用bootfs。
	linux :centos6 centos7  macos  

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s0LlJSvY-1605595364298)(image/1567585172(1)].jpg)

7.5 为什么docker镜像要采用这种分层结构呢?

	最大的一个好处就是资源共享。比如:有多个镜像都是从相同的base镜像构建而来的,那么宿主机只需在磁盘中保存一份base镜像。同时内存中也只需要加载一份base镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。
	特点:Docker镜像都是只读的。当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称为容器层,容器层之下都叫镜像层。

8.Docker容器数据卷

8.1 数据卷是什么

	简单来说就是做数据持久化的。类似磁带,移动硬盘或者U盘。或者类似Redis中的rdb和aof文件。主要做容器数据的持久化和容器之间数据共享。卷就是目录或者文件,存在一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System 提供一些用于持久储存或者共享数据的特性。卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此docker不会在容器删除时删除其挂载的数据卷。

8.2 数据卷的特点

1、数据卷可在容器之间共享或重用数据。
2、卷中的更改可以直接生效。
3、数据卷中的更改不会包含在镜像的更新中。
4、数据卷的生命周期一直持续到没有容器使用它为止。
5、数据卷也可以完成主机到容器或容器到主机之间的数据共享。

8.3 添加数据卷

容器内添加数据卷有两种办法。第一种直接命令添加。第二种是用DockerFile添加。
8.3.1 命令添加

1.添加

命令:docker run -it -v /宿主机的路径:/容器内的路径 镜像名

例子:docker run -it -v /hostDataValueme:/containerDataValueme centos

2.查看数据卷是否挂成功

运行 docker inspect 容器id 命令 检查json串里有没有以下内容,如果有则证明卷挂载成功。

"Mounts": [
            {
                "Type": "bind",
                "Source": "/hostDataValueme",
                "Destination": "/containerDataValueme",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ]

之后可检查容器与主机是否可以共享资源。或者容器关闭之后,再开启容器之后能不能读取并加载主机的卷中数据。

设置容器内数据卷只读。

命令:docker run -it -v /主机路径:/容器内路径:ro 镜像名
例子:docker run -it -v /hostDataValueme:/containerDataValueme:ro centos

检查配置文件

"Mounts": [
            {
                "Type": "bind",
                "Source": "/hostDataValueme",
                "Destination": "/containerDataValueme",
                "Mode": "ro",
                "RW": false,
                "Propagation": "rprivate"
            }
        ],
8.3.2 DockerFile添加

什么是Dockerfile

简单来说就是一个镜像的描述文件。

1. 在某个目录下新建一个file(dockerfile),在该file中添加以下脚本

例如:在/目录下创建一个mydocker的文件夹,在该文件夹下创建dockerfile文件

# volume test
FROM centos
VOLUME ["/containerDataValueme1","/containerDataValueme2"]
CMD echo "finished,-------success!"
CMD /bin/bash

备注:可在dockerfile中使用volume指令来给镜像添加一个或多个数据卷。

2. build后生产镜像 (用编写好的file文件构建镜像)

$ docker build -f mydocker/dockerfile -t zcn/centos .
	-f	#指定dockerfile文件路径 
	-t	#指定目标镜像名称
	.	#在当前文件夹

​ 当镜像创建出来后,以当前镜像运行一个容器实例。这时会发现,容器中已经有了我们之前写好的数据卷,但是容器里数据卷要和主机进行数据共享。那么主机的数据卷体现在哪里?别急,虽然我们不能用dockerfile指定主机的卷。但是docker会为我们提供了默认的主机数据卷。

运行docker inspect 检查一下,就会发现:

"Mounts": [
         {
             "Type": "volume",
             "Name": "459e7a4be53a96eee859f11d10bc0b26a6a91bbd6754ecb8e355e9fe4a31e0b9",
             "Source": "/var/lib/docker/volumes/459e7a4be53a96eee859f11d10bc0b26a6a91bbd6754ecb8e355e9fe4a31e0b9/_data",
             "Destination": "/containerDataValueme2",
             "Driver": "local",
             "Mode": "",
             "RW": true,
             "Propagation": ""
         },
         {
             "Type": "volume",
             "Name": "4bf41829e4afaebbb40cf3d0d4725343980afffa04f09a30680fa957d80b6af4",
             "Source": "/var/lib/docker/volumes/4bf41829e4afaebbb40cf3d0d4725343980afffa04f09a30680fa957d80b6af4/_data",
             "Destination": "/containerDataValueme1",
             "Driver": "local",
             "Mode": "",
             "RW": true,
             "Propagation": ""
         }

备注:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1bZlik5C-1605595364299)(image/1563261759(1)].jpg)

使用Dockerfile构建镜像的好处

出于可移植性的分享的考虑,用-v这种方式不能够直接在Dockerfile中实现。
由于宿主机目录是依赖于特定宿主机的,并不能保证在所有的宿主机上都存在这样的特定目录。

9.DockerFile解析

9.1.Dockerfile是什么

Dockerfile是用来构建docker镜像的构建文件,是由一系列命令和参数构成的脚本。

构建步骤

1.编写Dockerfile文件
2.Docker build  创建镜像
3.Docker run    运行容器

Dockerfile内容基础知识

1.每条保留字指令都必须为大写,且后面都要跟至少一个参数。
2.指令按照从上到下,顺序执行。
3.#表示注释。
4.每条指令都会创建一个新的镜像层,并对镜像进行提交。

Dockerfile中的保留字指令

保留字作用
FROM当前镜像是基于哪个镜像的
MAINTAINER镜像维护者的姓名和邮箱地址
RUN容器构建时需要运行的指令
EXPOSE当前容器对外暴露出的端口号
WORKDIR指定在创建容器后,终端默认登录进来的工作目录,一个落脚点
ENV用来在构建镜像过程中设置环境变量
ADD将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar包
COPY类似于ADD,拷贝文件和目录到镜像中
将从构建上下文目录中<原路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置
VOLUME容器数据卷,用于数据保存和持久化工作
CMD指定一个容器启动时要运行的命令
Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换
ENTRYPOINT指定一个容器启动时要运行的命令
ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及其参数
ONBUILD当构建一个被继承的Dockerfile时运行命令,父镜像在被继承后父镜像的onbuild被触发

9.2 Dockerfile构建过程解析

1.Docker从基础镜像运行一个容器
2.执行一条命令并对容器进行修改
3.执行类似docker commit的操作提交一个新的镜像层
4.docker再基于刚提交的镜像运行一个新容器
5.执行dockerfile中的下一条指令直到所有指令都执行完毕

9.3 小总结

1.从应用软件的角度来看,Dockerfile、docker镜像、docker容器分别代表软件的三个不同阶段
	Dockerfile 是软件的原材料
	docker镜像  是软件的交付品
	docker容器  可以认为是软件的运行状态
2.Dockerfile面向开发,docker镜像成为交付标准,docker容器则涉及部署与运维,三者缺一不可,合力充当docker体系的基石。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HP5s5GXB-1605595364301)(image/2019-08-20_094119.png)]

1.Dockerfile,需要定义一个Dockerfile,Dockerfile定义了进程需要的一切东西。Dockerfile涉及的内容包括执行代码或是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、进程服务和内核进程(当应用就进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等
2.docker镜像,在用Dockerfile定义一个文件之后,docker build 时会产生一个docker镜像,当运行docker镜像时,会真正开始提供服务
3.docker容器,容器是直接提供服务的

10.Dockerfile案例

Base镜像(scratch):Docker Hub中99%的镜像都是由base镜像中安装和配置需要的软件构建出来的。

10.1 自定义镜像myCentos

1. 先了解Docker Hub上的Centos是什么情况。

DockerHub上的centos镜像默认落脚点是/,默认不支持vim。那么现在我们想自定义一个centos,改变其默认落脚点,让其支持vim。

2. 编写Dockerfile

FROM centos
MAINTAINER ZCN<15236674712@163.com>
ENV MYPATH /tmp
WORKDIR $MYPATH
RUN yum -y install vim
EXPOSE 80
CMD echo $MYPATH
CMD echo "build-------success"
CMD /bin/bash

3. 构建镜像

$ docker build -f /myDocker/dockerfile -t zcn/mycentos .

4. 运行容器

$ docker run -it -P zcn/mycentos

10.2 自定义镜像myTomcat

1. 先创建/mydocekrfile/tomcat这个目录

将tomcat和jdk8的tar包放进此目录下。然后创建一个dockerfile文件。

2. 编写Dockerfile

FROM centos
MAINTAINER ZCN<15236674712@163.com>
#把宿主机当前上下文的c.txt拷贝进容器的/usr/local/路径下
COPY ./c.txt /usr/local/cincontainer.txt
#把tomcat和jdk的tar包拷贝到容器中
ADD ./apache-tomcat-9.0.22.tar.gz /usr/local/
ADD ./jdk-8u171-linux-x64.tar.gz /usr/local/
#安装vim编辑器
Run yum -y install vim
#设置登录落脚点/usr/local
ENV MYPATH /usr/local/
WORKDIR $MYPATH
#配置java和tomcat的环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_171
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar 
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.22
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.22
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#容器运行时监听的端口
EXPOSE 8080
#启动时运行tomcat
# ENTRYPOINT ["/usr/local/apache-tomcat-9.0.22/bin/startup.sh"]
# CMD ["/usr/local/apache-tomcat-9.0.22/bin/catalina.sh","run"]
CMD /usr/local/apache-tomcat-9.0.22/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.22/bin/logs/catalina.out

java项目创建镜像 jar包

FROM centos
MAINTAINER ZCN<15236674712@163.com>
#把宿主机当前上下文的c.txt拷贝进容器的/usr/local/路径下
#把jdk的tar包拷贝到容器中
ADD ./jdk-8u171-linux-x64.tar.gz /usr/local/
#设置登录落脚点/usr/local
ENV MYPATH /usr/local/
WORKDIR $MYPATH
#配置java和tomcat的环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_171
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH $PATH:$JAVA_HOME/bin
COPY ./yingx_zhangcn184s-0.0.1-SNAPSHOT.jar yingx_zhangcn184s-0.0.1-SNAPSHOT.jar
EXPOSE 9292
ENTRYPOINT ["java","-jar","./yingx_zhangcn184s-0.0.1-SNAPSHOT.jar"]

3. 构建镜像

$ docker build -t zcn/mytomcat .
这里没写-f是因为如果在当前目录下并且file文件名为正统的dockerfile 那么-f可以省略不写。

4. 运行容器

$ docker run -d -p 8888:8080 --name mytomcat -v /zcn/tomcat/test:/usr/local/apache-tomcat-9.0.22/webapps/test -v /zcn/tomcat/logs:/usr/local/apache-tomcat-9.0.22/logs --privileged=true zcn/tomcat

解释:创建数据卷,让容器中的webapps目录中的项目目录和主机中test目录做一个映射

10.3 总结

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DrusqUHC-1605595364302)(image/1563343532(1)].jpg)

11.安装mysql

11.1在DockerHub上查找mysql镜像

$ docker search mysql

11.2 将mysql拉到本地

$ docker pull mysql:5.6

11.3 运行mysql容器

$ docker run -p 3333:3306 --name mysql -v /zcn/mysql/conf:/etc/mysql/conf.d -v /zcn/mysql/logs:/logs -v /zcn/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6 

11.4 进入mysql容器

$ docker exec -it 容器id /bin/bash

11.5 mysql操作

#进入mysql  
mysql -u root -p 
#输入密码 123456

#查询mysql的库    
show databases;

#创建数据库    
create database ems;

#切换到db01     
use ems;

#建表
create table t_book(id int not null primary key, name varchar(20));

#查询所有表
show tables;

#向表中插入一条数据  
insert into t_book values(1,'java');

#查询这张表的数据 
select * from t_book;

#用我们外部win10的大黄navcat尝试连接这个mysql

12.安装redis

12.1 在DockerHub上查找redis镜像

$ docker search redis

12.2 将redis拉到本地

$ docker pull redis:4.0.14

12.3 运行redis容器

$ docker run -it --name redis -p 6379:6379 redis:4.0.14
#相当于
$ docker run -it --name redis -p 6379:6379 redis:4.0.14 redis-server

12.4.连接redis客户端

$ docker exec -it 容器id redis-cli

12.5 指定端口启动

$ docker run -d --name redise -p 6370:6379 redis:4.0.14
#指定端口连接
$ docker exec -it 容器id redis-cli -h 192.168.253.128 -p 6370

#命令说明:
-h 192.168.253.128 : 指定连接地址
-p 6370 : 指定连接端口

12.6 数据持久化方式启动

docker run -p 6379:6379 -v $PWD/data:/data --name redis -d redis:4.0.14 redis-server --appendonly yes

#命令说明:
-p 6379:6379 : 将容器的6379端口映射到主机的6379端口
-v $PWD/data:/data : 将主机中当前目录下的data挂载到容器的/data
redis-server --appendonly yes : 在容器执行redis-server启动命令,并打开redis持久化配置

12.7 指定配置文件启动

1.创建配置文件

#创建文件夹,新建配置文件贴入从官网下载的配置文件并修改

mkdir /usr/local/docker
vim /usr/local/docker/redis.conf

2.修改配置文件

bind 0.0.0.0 
port 7000  

配置文件介绍

bind 127.0.0.1       #bind:绑定redis服务器网卡IP,默认为127.0.0.1,即本地回环地址。这样的话,访问redis服务只能通过本机的客户端连接,而无法通过远程连接。如果bind选项为空的话,那会接受所有来自于可用网络接口的连接。

protected-mode yes    #默认yes,开启保护模式,限制为本地访问,改为 no关闭保护模式

port 6379           #指定redis运行的端口,默认是6379。由于Redis是单线程模型,因此单机开多个Redis进程的时候会修改端口。

timeout 0           #设置客户端连接时的超时时间,单位为秒。当客户端在这段时间内没有发出任何指令,那么关闭该连接。默认值为0,表示不关闭。

daemonize no   #默认no,改为yes意为以守护进程方式启动,可后台运行,除非kill进程,改为yes会使配置文件方式启动redis失败

databases 16   #数据库个数,默认值是 16,也就是说默认Redis有16个数据库。

appendonly no #默认redis使用的是rdb方式持久化,这种方式在许多应用中已经足够用了,改为yes开启aof持久化持久化

3.指定配置文件启动

docker run -p 7001:7000 --name myredis -v /usr/local/docker/redis.conf:/etc/redis/redis.conf -v /usr/local/docker/data:/data -d redis:4.0.14 redis-server /etc/redis/redis.conf --appendonly yes

#命令解释说明:
-p 6379:6379 端口映射:前表示主机部分,:后表示容器部分。
-v 挂载目录,规则与端口映射相同。
为什么需要挂载目录:个人认为docker是个沙箱隔离级别的容器,这个是它的特点及安全机制,不能随便访问外部(主机)资源目录,所以需要这个挂载目录机制。
-d redis 表示后台启动redis
redis-server /etc/redis/redis.conf 以配置文件启动redis,加载容器内的conf文件,最终找到的是挂载的目录/usr/local/docker/redis.conf

–-appendonly yes 开启redis 持久化

4.连接客户端

$ docker exec -it myredis redis-cli -h 192.168.253.128 -p 7000

13.远程仓库的使用

1.准备镜像

2.阿里云创建镜像库

3.将本地镜像推送到阿里云镜像库

$ sudo docker login --username=15236674712@qq.com registry.cn-beijing.aliyuncs.com 
#需要输入阿里云登录密码
$ sudo docker tag [ImageId] registry.cn-beijing.aliyuncs.com/nanan/mytomcat:[镜像版本号]
$ sudo docker push registry.cn-beijing.aliyuncs.com/nanan/mytomcat:[镜像版本号]

#eg:
$ sudo docker login --username=15236674712@qq.com registry.cn-beijing.aliyuncs.com
$ sudo docker tag zcn/mytomcat registry.cn-beijing.aliyuncs.com/nanan/mytomcat:1.0
$ sudo docker push registry.cn-beijing.aliyuncs.com/nanan/mytomcat:1.0

4.将阿里云远程仓库镜像拉到本地

$ docker pull 阿里云地址的镜像名:版本号
从官网复制就行
公网地址:registry.cn-beijing.aliyuncs.com/nanan/mytomcat

#eg:
$ docker pull registry.cn-beijing.aliyuncs.com/nanan/mytomcat:1.0

14.安装Elasticsearch

注意:调高JVM线程数限制数量

#在centos窗口中,修改配置sysctl.conf
	$ vim /etc/sysctl.conf
#加入如下配置
	$ vm.max_map_count=262144 
#启用配置
	$ sysctl -p
#注:这一步是为了防止启动容器时,报出如下错误:
bootstrap checks failed max virtual memory areas vm.max_map_count [65530] likely too low, increase to at least [262144]

14.1 将es拉到本地

$ docker pull elasticsearch:6.8.2

14.2 启动es容器

$ docker run -d --name es -p 9200:9200 -p 9300:9300 -e ES_JAVA_OPTS="-Xms128m -Xmx128m"  elasticsearch:6.8.2

#参数说明
-p:将docker镜像中的端口号映射宿主机器端口号,宿主机器端口号:docker容器端口号 ,可写多个,如果多个端口号是连续的,可以直接用-连接,如:4560-4600:4560-4600
-v:将docker镜像中的文件映射到宿主机器指定的文件,可以是文件夹,-v 宿主机文件:容器文件映射后可直接修改宿主机上的文件就可以改变docker中的配置,也可写多个。docker镜像中软件的配置文档默认在/usr/share”/{软件名}下
-e 指定环境变量;

14.3 访问测试

访问地址:http://192.168.253.128:9200/

安装成功es

14.4 安装kibana

1.下载kibana镜像到本地

$ docker pull kibana:6.8.2

2.启动kibana容器

$ docker run -d --name kibana -e ELASTICSEARCH_URL=http://192.168.253.128:9200 -p 5601:5601 kibana:6.8.2

3.访问kibana

访问地址:http://192.168.253.128:5601/

访问kibana

14.5 安装IK分词器

1.下载对应版本的IK分词器

$ wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.8.2/elasticsearch-analysis-ik-6.8.2.zip

2.解压到plugins/elasticsearch文件夹中

#安装unzip
$ yum install -y unzip  
#使用unzip解压zip
$ unzip -d plugins/elasticsearch elasticsearch-analysis-ik-6.8.2.zip 

3.添加自定义扩展词和停用词

cd plugins/elasticsearch/config
vim IKAnalyzer.cfg.xml

<properties>
	<comment>IK Analyzer 扩展配置</comment>
	<!--用户可以在这里配置自己的扩展字典 -->
	<entry key="ext_dict">ext_dict.dic</entry>
	<!--用户可以在这里配置自己的扩展停止词字典-->
	<entry key="ext_stopwords">ext_stopwords.dic</entry>
</properties>

4.创建配置文件

#在ik分词器目录下config目录中创建ext_dict.dic文件   编码一定要为UTF-8才能生效
$ vim ext_dict.dic 加入扩展词即可
#在ik分词器目录下config目录中创建ext_stopword.dic文件 
$ vim ext_stopwords.dic 加入停用词即可

5.将此容器提交成为一个新的镜像

$ docker commit -a="zcn" -m="with IKAnalyzer" 容器id zcn/elasticsearch:6.8.2

6.使用新生成的这个es镜像创建容器,并挂载数据卷

$ docker run -d --name es -p 9200:9200 -p 9300:9300 -e ES_JAVA_OPTS="-Xms128m -Xmx128m" -v /usr/local/IKAnalyzer:/usr/share/elasticsearch/plugins/elasticsearch/config zcn/elasticsearch:6.8.2

#参数说明
-p 将docker镜像中的端口号映射宿主机器端口号,宿主机器端口号:docker容器端口号 ,可写多个,如果多个端口号是连续的,可以直接用-连接,如:4560-4600:4560-4600
-e ES_JAVA_OPTS="-Xms256m -Xmx256m"  #指定环境变量,设置初始堆内存和最大内存 也可以调整虚拟机内存
-v:将docker镜像中的文件映射到宿主机器指定的文件,可以是文件夹,-v 宿主机文件:容器文件映射后可直接修改宿主机上的文件就可以改变docker中的配置,也可写多个。docker镜像中软件的配置文档默认在/usr/share”/{软件名}下.

15.安装RabbitMQ

15.1 在DockerHub上查找RabbitMQ镜像

$ docker search rabbitmq

15.2 将RabbitMQ拉到本地

$ docker pull rabbitmq:management

15.3 运行RabbitMQ容器

$ docker run -d --hostname rabbitmq -p 5671:5671 -p 5672:5672 -p 4369:4369 -p 25672:25672 -p 15671:15671 -p 15672:15672 --name okong-rabbit rabbitmq:management

#参数说明:

-d 后台运行容器;
–name 指定容器名;
-p 指定服务运行的端口(5672:应用访问端口;15672:控制台Web端口号);
-v 映射目录或文件;
–hostname 主机名(RabbitMQ的一个重要注意事项是它根据所谓的 “节点名称” 存储数据,默认为主机名);
-e 指定环境变量;(RABBITMQ_DEFAULT_VHOST:默认虚拟机名;RABBITMQ_DEFAULT_USER:默认的用户名;RABBITMQ_DEFAULT_PASS:默认用户名的密码)

15.4.访问RabbitMQ

http://serverip:15672

登录账号:guest,密码:guest

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QfDgMePy-1605595364304)(image\Rabbitmq.png)]

16.安装Nginx

16.1 在DockerHub上查找nginx镜像

$ docker search nginx

16.2 将redis拉到本地

$ docker pull nginx

16.3 运行Nginx容器

$ docker run --name nginx-test -p 8080:80 -d nginx

#参数说明:

--name nginx-test:容器名称。
-p 8080:80: 端口进行映射,将本地 8080 端口映射到容器内部的 80 端口。
-d nginx: 设置容器在在后台一直运行。

16.4.访问Nginx

访问地址:http://serverip:8080

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p3QYucIR-1605595364305)(image\docker-nginx6.png)]

17.Portainer 安装与配置

17.1 介绍

Portainer 是一个开源、轻量级Docker管理用户界面,基于Docker API,提供状态显示面板、应用模板快速部署、容器镜像网络数据卷的基本操作(包括上传下载镜像,创建容器等操作)、事件日志显示、容器控制台操作、Swarm集群和服务等集中管理和操作、登录用户管理和控制等功能。功能十分全面,基本能满足中小型单位对容器管理的全部需求。

17.2 安装使用

安装使用见官方手册:https://www.portainer.io/installation/。

建议建议直接使用 docker 安装,方便快捷。

17.3 先拉取docker镜像

# 搜索镜像
$ docker search portainer/portainer
# 拉取镜像
$ docker pull portainer/portainer

17.4 运行 portainer镜像

$ docker run -d -p 9001:9000 -v /root/portainer:/data -v /var/run/docker.sock:/var/run/docker.sock --name dev-portainer portainer/portainer

#参数说明:
-d #容器在后台运行
-p 9001:9000 # 宿主机9000端口映射容器中的9000端口
-v /var/run/docker.sock:/var/run/docker.sock # 把宿主机的Docker守护进程(docker daemon)默认监听的Unix域套接字挂载到容器中
-v /root/portainer:/data # 把宿主机目录 /root/portainer 挂载到容器 /data 目录;
–-name dev-portainer # 指定运行容器的名称

注意: 在启动容器时必须挂载本地 /var/run/docker.socker与容器内的/var/run/docker.socker连接。

17.2 连接 portainer

连接地址:http://192.168.253.128:9001

启动

18.SpringBoot项目制作镜像

1.导入maven依赖

<build>
    <resources>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.xml</include>
            </includes>
        </resource>
        <resource>
            <directory>src/main/resources</directory>
        </resource>
        <resource>
            <directory>src/main/webapp/</directory>
            <targetPath>META-INF/resources</targetPath>
        </resource>
    </resources>

    <plugins>
        <!--支持jsp的插件-->
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>

        <!--  springboot提供的项目编译打包插件  -->
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>1.4.2.RELEASE</version>
        </plugin>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-resources-plugin</artifactId>
            <configuration>
                <encoding>UTF-8</encoding>
                <useDefaultDelimiters>true</useDefaultDelimiters>
            </configuration>
        </plugin>
    </plugins>
</build>

注意事项:

1)springboot 打包插件的版本必须为1.4.2.RELEASE,只有这个版本支持jsp,高版本不行
2)webapp下所有的前端资源必须打包到jar包的META-INF/resources的目录下,否则无法识别

2.将项目打成jar包

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vnCiLLYK-1605595364306)(image\项目打jar包.jpg)]

注意事项:

打好jar包之后使用本地测试

java -jar jar包名.jar

3.将jar包放入宿主机

4.配置dockerfile

当前目录下准备: jdk-8u171-linux-x64.tar.gz yingx_zhangcn184s-0.0.1-SNAPSHOT.jar

FROM centos
MAINTAINER ZCN<15236674712@163.com>
#把jdk的tar包拷贝到容器中
ADD ./jdk-8u171-linux-x64.tar.gz /usr/local/
#设置登录落脚点/usr/local
ENV MYPATH /usr/local/
WORKDIR $MYPATH
#配置java的环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_171
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH $PATH:$JAVA_HOME/bin
COPY ./yingx192_zhangcns-0.0.1-SNAPSHOT.jar yingx192_zhangcns-0.0.1-SNAPSHOT.jar
EXPOSE 9292
ENTRYPOINT ["java","-jar","./yingx192_zhangcns-0.0.1-SNAPSHOT.jar"]

5.构建镜像

docker build -t yingx .
这里没写-f是因为如果在当前目录下并且file文件名为正统的dockerfile 那么-f可以省略不写。

6.运行镜像

注意:映射端口是项目的端口号

docker run -it --name yingx -p 9292:9090 yingx

7.访问项目

http://192.168.253.134:9292/yingx/main/main.jsp

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值