在理解docker之前必须得理解什么是沙箱机制?
引用:https://www.cnblogs.com/spydxk/p/9635800.html
1:为什么需要沙箱机制?
默认情况下,我们的应用程序是可以访问机器上的所有资源的,比如文件系统、cpu、内存、网络等。
这种其实是不安全的,如果随意操作资源,有可能破坏其他程序正在使用的资源,或者造成数据泄露。
(类似于Java中的多线程共享资源,Java用锁机制来解决)
如何解决这个问题?
1.1:为程序分配限定资源权限的账号:利用操作系统的权限管理机制进行限制
1.2:直接为该程序提供一个受限制的运行环境(沙箱机制)
因此:
沙箱机制提供的环境相对于每一个运行的程序是独立的,且不会对现有程序产生影响。
docker就是利用沙箱机制,这样使得应用组件经过docker的封装可以随意移植到其他服务器上,
每一个容器和容器之间复合沙箱机制。
docker概念:
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app)。几乎没有性能开销,可以很容易地在机器和数据中心中运行。
docker的几个比较重要的概念:
docker主机(host):安装了docker程序的机器
docker客户端(client):连接docker主机,进行操作
docker仓库(registry):用来保存各种打包好的软件镜像
当我们安装了docker之后,
docker最大的好处,它支持把我们安装配置好的软件打包成一个镜像,
而这些镜像就保存在docker仓库。
docker仓库也有公共仓库:docker hub,仓库里面都是我们软件打包好的镜像。
docker镜像(images):
软件打包之后就是镜像
镜像的作用?
举例:
比如我们要装mysql:
大概步骤:去docker仓库中把mysql的镜像下载到本地,然后用docker命令运行该镜像,一个镜像就会产生一个容器。
docker容器(container):
镜像启动后的实例,称为一个容器。
举例:
比如我有一个镜像tomcat,那么我想要在机器上部署3个tomcat容器怎么办?
那么我只需要把tomcat镜像下载下来,然后用docker命令把改镜像运行上3次(注意区分好端口号),
这样每次都会产生一个tomcat容器,这样就会有3个tomcat了。
因此:使用docker的基本步骤就是:
1:在你的服务器(本人使用 VritualBox 虚拟机,VMWare也可以)上安装docker;
2:去docker仓库下载你想要运行的软件对应的镜像(mysql、tomcat、mongodb、redis等等)
3:用docker命令运行该镜像,启动成功之后,就会产生一个docker容器,此容器就表示当前正在运行的应用软件。
(就类似于你windows打开了你的qq.exe)
4:如果不想跑该程序了,就直接把这个容器关掉(使用docker命令)
(就类似于kill掉你的qq)
简单理解步骤:
安装docker --->>> 下载镜像(images) --->>> 运行镜像(称为容器container) -->> 停止容器
---------------------------------分割线-----------------------------------------------------
我的测试:
linux虚拟机:VritualBox
系统:centos7
需要注意:
docker需要centos系统的内核版本高于3.10 (具体不清楚,应该是这样的)
使用 uname -r 查看内核版本
如果低于该版本,建议升级内核版本:
linux命令:yum update
步骤:
1:安装docker:
安装过程中提示:输入y,确认安装
出现该标志,表示安装成功。
2:启动docker:
[[email protected] ~]# systemctl start docker
[[email protected] ~]# docker -v
Docker version 1.13.1, build 07f3374/1.13.1
docker -v 查看docker版本号
3:停止docker:
[[email protected] ~]# systemctl stop docker
这里解释下systemctl 这个命令:
应该就是system + control 的简写,标识系统控制
问题:第一次我启动没有成功,报错如下:
网上找了各种办法解决,都没有成功,最后关掉虚拟机重新启动就可以了。不知道什么原因。
举例:
比如我要在docker中安装运行mysql程序,操作步骤:
1:搜索docker仓库中有没有相关的mysql镜像
命令:docker search mysql
默认就回去docker hub中搜索跟mysql相关的镜像。
搜索到了这么多的列表,其中该列表有几个字段需要注意:
NAME:这个是镜像的名字,只需要看docker/io 后面那一部分就可以了,当然全部也可以。
OFFICAL:这个意思是说该镜像是不是官方的
AUTOMA:意思是是不是我们自动构建,只要我们运行了该镜像,所有的配置都帮我们自动配置好了,
而官方的镜像一般都没有做这些配置,我们可以自定义配置。
2:搜索到镜像之后,下载该镜像
命令:docker pull mysql
注意:这里面有一句话:Using default tag:latest
使用默认的标签,latest:最新的
因为镜像是有很多版本的,比如mysql就有很多版本:5.0,4.8等一些版本(tag)
当我们下载镜像的时候,可以用命令指定版本:docker pull mysql:5.0
如果没有指定,默认就是用latest版本。
当出现该状态,就表示下载成功。
3:查看我们下载的镜像
命令:docker images 来查看所有的镜像
其中:
REPOSITORY:意思是从哪下载的该镜像
TAG:标签(也就是你镜像的版本)
IMAGE_ID:每个镜像都有一个唯一的id来标识它
如果我们想要下载其他版本的镜像,需要在docker hub上搜索,找到对应的版本
选择一个mysql的5.5的版本下载
这样docker里面就有mysql5.5版本的镜像了。
4:删除镜像
命令:docker rmi 镜像id
------------------------分割线-------------------------------------------------------------
下载好镜像之后就可以启动了:
具体的步骤:用tomcat举例:
1:搜索镜像 :
[[email protected] ~]# docker search tomcat
2:拉取镜像
[[email protected] ~]# docker pull tomcat
我这里拉取的是tomcat latest版本的。
3:根据镜像启动容器
[[email protected] ~]# docker run --name mytomcat -d tomcat:latest
--name 自定义容器的名称
-d 是以后台方式运行
4:docker ps 查看运行中的容器
注意:此时是访问不到tomcat的,
本地访问:http://虚拟机ip:8080/
原因:
因为我们此时访问的该端口是虚拟机的端口,而我们安装的tomcat,是安装在docker中的,
因此我们是访问不到docker中的8080端口的。
因此需要做一个映射。
5:停止运行中的容器
docker stop 容器id
[[email protected] ~]# docker stop 5c6e65eddc96
6:查看所有的容器(包括运行中的,和退出的)
[[email protected] ~]# docker ps -a
ps是查看运行中的,ps -a是查看所有的。
7:启动容器
docker start 容器id
[[email protected] ~]# docker start 5c6e65eddc96
8:删除一个容器
我们上面装的tomcat不能访问了,删掉它。
删除的时候,这个容器一定要是停止状态的。
docker rm 容器id
[[email protected] ~]# docker rm 5c6e65eddc96
rm 是删除容器的,rmi 是删除镜像的。
9:启动一个做了端口影射的tomcat
需要在启动命令上加多一个参数:-p 端口映射
把我们当前虚拟机的端口映射到我们容器内部的端口。
-p 虚拟机端口:容器端口
[[email protected] ~]# docker run --name mytomcat -d -p 8888:8080 tomcat
把虚拟机中的8888端口映射到容器中8080端口
可能还要关闭防火墙才能正常访问,或者虚拟机开放该8888端口。
其中在做安装mysql镜像的时候,启动有报错:
具体查错日志:
//错误日志
[[email protected] ~]# docker logs ca7da8cf7cfe
error: database is uninitialized and password option is not specified
You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD
这三个参数,必须指定一个
[[email protected] ~]# docker run -p 3306:3360 --name mysql02 -e MYSQL_ROOT_PASSWORD=123456 -d mysql
-e 表示指定相关参数。
用navicat链接,成功。
具体其他软件的启动可以百度,或者去docker hub上查看官方文档,有具体的启动命令。
基本上docker的一些简单操作就这些了。
之后有整理在补充。