先说说什么是镜像(image),什么是容器吧?
这两者有点像《奇异博士》里的那个镜像。镜像就是虚拟出来的世界, 那么我们如何进入到镜像里呢?电影里法师会念咒语,启动程序,才能进入镜像。docker也是一样,启动image,我们就能进去了,进去后的镜像世界就称为容器。
简单点说,没启动的是镜像,启动的是容器。
docker是一种容器打包技术,和虚拟机有点类似,区别不同的是:
1,虚拟机虚拟的是整个计算机,包括CPU,内存等等。而docker虚拟的是操作系统的内核,(可以理解成:它能让你在虚拟的操作系统上自由玩耍,和真的操作系统一样)。
2,docker不只虚拟一个,它可以虚拟N多个,数字很吓人,而且N多
个之间互不干>扰,它们之间具有进程级别的隔离,且享受底层资源。
那么,docker怎么玩呢?
1,很简单,首先要先安装docker(我这里是在centos下安装的),因为我用了阿里88的yum源,所以一个命令就搞定yum install docker
2,安装成功后,需要一个基本image,你才能启动起来玩,所以这一步需要下载一个基本image。可以在dockerHub下找一个官方的pull下来,我的基本image是centOs。也可以通过命令docker search (你要找的image)。
3,看了很多资料,有两种方法:1,通过dockerfile来构建 2,通过commit 方式来构建。本人用的是第2种方法。这里贴下步骤吧:
我的基本image是docker.io/centos。有了image,我就可以启动它,并且进入到容器里去玩耍。
docker run -i -t -v /web/:/web/ 67591570dd29 /bin/bash(这是启动命令)
其中,相关参数包括:
-i:表示以“交互模式”运行容器
-t:表示容器启动后会进入其命令行
-v:表示需要将本地哪个目录挂载到容器中,格式:-v <宿主机目录>:<容器目录>
假设我们的所有安装程序都放在了宿主机的/web/目录下,现在需要将其挂载到容器的/web/目录下。
需要说明的是,不一定要使用“镜像 ID”,也可以使用“仓库名:标签名”,例如:docker.io/centos:latest
初始命令表示一旦容器启动,需要运行的命令,此时使用“/bin/bash”,表示什么也不做,只需进入命令行即可。
4,此时就进入容器内部了,进去后命令头就是这样的 [root@fcd41e085baf /]#
在容器里,你想怎么疯都可以,就像电影里一样,玩疯了都影响不到外面的世界,大不了把这个容器Kill掉。
想在容器里搭建一个开发环境怎么办?刚才启动image时我把主机里/web下的所有内容(jdk,tomcat)都挂载到容器的/web下了。(有人会问,你怎么知道容器里有个web目录呢)
简单分析一下:我启动的image是centos,那么它的目录结构和centos是一样的,命令操作方式也是一样的。当然centos根目录下是没有web目录的,挂载到容器时自动生成的。
5,这个时候,容器里就有了jdk,tomcat了(都是以压缩包的形式传送的),解压配置环境变量:
设置环境变量
首先,编辑.bashrc文件
vi ~/.bashrc
然后,在该文件末尾添加如下配置:
export JAVA_HOME-/jdk
export PATH=$PATH:$JAVA_HOME
最后,需要使用source命令,让环境变量生效:
source ~/.bashrc
编写运行脚本
我们需要编写一个运行脚本,当启动容器时,运行该脚本,启动 Tomcat,具体过程如下:
首先,创建运行脚本:vi /root/run.sh
然后,编辑脚本内容如下:
!/bin/bash
source ~/.bashrc
sh /tomcat/bin/catalina.sh run
注意:这里必须先加载环境变量,然后使用 Tomcat 的运行脚本来启动 Tomcat 服务。
最后,为运行脚本添加执行权限:chmod u+x /root/run.sh
6,exit退出容器,这时就从虚拟世界出来了。可以通过docker ps -a查看容器
7,到了这一步,就可以通过容器(带有JDK,tomcat的)来构建一个新的image,有人问,为什么要再构建一个image呢?没有JDK,tomcat,你的应用程序能在容器里自由的玩耍吗?
docker commit 9169b9b235e2 wjb/javaweb:0.1 这个命令可以把刚才带有JDK,tomcat的容器构建成一个新的image。
9169b9b235e2 是刚才那个容器的ID,wjb/javaweb:0.1是我给这个新的image起的名字。
8,可以通过docker images查看你拥有的所有镜像,没出错的话,应该能看到刚才新构建的image了。
与上次启动容器不同的是,我们现在不再进入容器的命令行,而是直接启动容器内部的 Tomcat 服务。这里有另一种方式:
docker run -d -p 8090:8080 --name javaweb wjb/javaweb:0.1 /root/run.sh
稍作解释:
-d:表示以“守护模式”执行/root/run.sh脚本,此时 Tomcat 控制台不会出现在输出终端上。
-p:表示宿主机与容器的端口映射,此时将容器内部的 8080 端口映射为宿主机的 8090 端口,这样就向外界暴露了 8090端口,可通过 Docker 网桥来访问容器内部的 8080 端口了。
--name:表示容器名称,用一个有意义的名称命名即可。
关于 Docker 网桥的内容,需要补充说明一下。实际上 Docker 在宿主机与容器之间,搭建了一座网络通信的桥梁,我们可通过宿主机 IP 地址与端口号来映射容器内部的 IP 地址与端口号,
在一系列参数后面的是“镜像名”或“镜像 ID”,怎么方便就怎么来。最后是“初始命令”,它是上面编写的运行脚本,里面封装了加载环境变量并启动 Tomcat 服务的命令。
当运行以上命令后,会立即输出一长串“容器 ID”,我们可通过docker ps命令来查看当前正在运行的容器。
9,此时新的镜像启动了,并且启动了容器内部的tomcat命令,可以在宿主机输入http://localhost:8090访问,没错的话,应该是tomcat首页。
再介绍点基本命令:
1,docker stop 你要停止的容器ID
2,docker start 你要启动的容器ID
3,直接进入容器的命令 docker exec -t -i 你的容器ID /bin/bash
4, 删除容器 docker rmi 你的容器ID
5,停止所有的容器,才能对image进行删除操作。docker stop $(docker ps -a -q)