目录
Docker概念
docker其实是个虚拟机,只不过它是一个主要应用在linux和后台一些应用的虚拟机,它和我们常用的vmware workstation有很多相似的地方,也有很多不同的地方。
首先docker中最重要的两个概念,镜像和容器,这两个概念在vmware中也有,但是在docker里面多了一些其他概念
镜像:类似于我们去创建虚拟机之前需要下载的一些系统镜像文件,比如iso文件、img文件等一些镜像文件
容器:可以类比做正在运行的一个虚拟机
tar文件:tar文件就类似于vm使用时的vmdk文件,它可以将一个镜像直接保存成一个tar文件,然后这样给别人,别通过一条load指令,重新加载成一个镜像,然后通过run指令就起来一个正在运行的虚拟机了(容器)
Dockerfile:dockerfile是一个配置文件,很短的一个配置文件,通过写“如何构建”的步骤,来指定一个镜像是如何构建的,然后通过docker build指令可以将dockerfile构建成一个镜像
仓库:docker有个特别厉害的远程仓库,这个仓库保存了很多镜像,包括一些公有的第三方已经做好的镜像,比如ubantu镜像、Nginx镜像、MySQL镜像、tomcat镜像等等,我们可以通过docker pull指令下载这些镜像到本地,当然也可以吧自己的镜像通过push指令传上去
playwithdocker
下面不介绍如何安装docker,因为每个人系统不同安装方式也不同,直接使用playwithdocker工具来介绍,注册
通过dockerID登录(我的是waffle666)
登录之后可以看到这有4个小时的倒计时,就是说它免费给你使用这个机器只能用四小时,四个小时之后你要重新再申请
这里我们点击添加一个实例(+ADD NEW INSTANCE),立马就进入了ssh页面
docker使用
然后,我们看如何去获得一个镜像,其实最简单的方法就是从远程仓库去下载镜像
比如说通过pull指令下载Nginx镜像
docker pull nginx
这样docker pull Nginx就下载了,它其实等于docker pull nginx:latest(latest是版本,如果你不指定版本,默认就是最新版本),这样我们就把这个镜像下载下来了
我们可以通过docker images查看我们本地有哪些镜像,下图只显示了一个镜像,因为我们就下载了这一个
docker images
然后我们就完成了这一步,我们通过run指令将这个镜像运行成一个真正在运行的容器(虚拟机)
docker run nginx
但是这样只是简单运行起来一个服务器,我们通过指定一些参数,比如-d让它再后台运行不要阻塞住shell指令窗口,-p来指定内外的端口映射,
比如我们将内部端口80和外部端口80做一个简单的映射,然后回车:
docker run -d -p 80:80 nginx(-p参数是指定端口映射先写外部端口再写内部端口)
还有cans,比如--name指定容器运行起来后的名字,nginx后不写:默认是最新版本
-p: 指定端口映射,格式为:主机(宿主)端口:容器端口
通过docker ps可以查看正在运行的容器有哪些,
docker ps
可以看到容器端口 80 绑定主机端口 80
上图可以看到它运行了2分钟(STATUS: UP 2 minutes),然后它运行在80端口,我们注意到上面这会多一个80字样,我们点击,就转过来了
或者:点击OPEN PORT输入80,会弹出如下页面,发现它已经运行起nginx,就说明我们外部端口映射到里面的80了
当然你也可以启动多个,比如我们再启动一个,但是我们就不能再使用外部端口80了,我们可以指定一个81端口
docker run -d -p 81:80 nginx
-p: 指定端口映射,格式为:主机(宿主)端口:容器端口
我们再点击OPEN PORT输入81,输入后发现也是正在运行中的nginx
那我们就通过pull和run指令将一个nginx容器给运行起来了,
例如我们想对这个nginx进行写修改,我们可以通过docker exec -it,然后指定这个容器的id(nginx的id),比如第一个8191,它的id虽然很长,但是我们只要简单能区分,通过指定少数几个字就行。然后通过bash进去,进去之后可以看到前面变成root@xxxx,说明已经进到这个nginx容器里面了
docker exec -it 8191 bash
docker exec :在运行的容器中执行命令
index文件在/usr/share/nginx/html中
cd /usr/share/nginx/html
上图框起来的文件就是默认的index文件了,我们直接修改这个index文件。比如我们改成hello
echo hello > index.html
通过修改了这个index文件,我们来看一下这个80端口(浏览器有缓存:按住Ctrl+F5强制刷新页面),可以看到它已经变成了hello,这就是我们如何进到容器里面做一些操作
我们可以exit退出,通过docker rm -f 强制删除我们创建的81端口的这个容器,因为81端口我们暂时用不到
docker rm -f 81端口的容器ID
然后我们通过docker commit指令先指定一个容器(ID),如何后面是提交的镜像的名称,比如m1
通过docker images查看,发现有个镜像叫m1了,跟我们之前pull下来的nginx镜像一样,他们并列放在这里,
然后我们也可以通过docker run -d -p 90:80 m1来运行
然后通过访问90端口,可以看到这里是hello,说明我们修改过后的容器保存成镜像,重新运行,它可以保存这个变化
再有一种方式就是dockerfile,我们新建一个dockerfile文件,在该文件中(大家可以学一下dockerfile文件的语法,这里就不过多提dockerfile的语法)
vim Dockerfile
我们可以通过FROM指定docker构建的基础镜像,是基于nginx这个镜像,然后我们将当前目录下的所有文件拷贝到/usr/share/nginx/html这个文件夹下
然后我们创建一个index.html,里面写外部的文件
然后通过docker build -t m2,之后要加一个.指定是当前目录下的dockerfile去构建
docker build -t m2 .(最后面加个点)
通过docker run -d -p 100:80 m2(100号端口去映射内部的80端口的m2镜像),回车运行,然后通过docker ps查看,可以看到这已经运行了
我们点击OPEN PORT 输入100,可以看到外部文件这个样子已经出来了,这说明我们通过dockerfile构建出了一个镜像,并且跑成了一个容器,也完成了这一步
然后另外我们也可以通过docker save指令去将一个镜像,比如说这里的b9(写名zi)保存到一个文件里,比如叫1.tar
docker save m2>1.tar
通过ls查看,这解压1.tar,
比如现在我们docker rmi将这个镜像删除,将m2镜像直接删除,
报错,它说有个容器是基于这个镜像的所以无法删除,那我们将这个容器也删了
docker rm -f b9
docker rmi m2
删掉之后用docker images查看,就只有m1镜像,m2没了
然后我们再通过docker load < 1.tar
再通过docker images查看,发现m2镜像又从tar'文件重新拿过来了,这就同时验证了load和save功能,然后push的话,需要自己去dockerhub或者其他官方仓库注册