Docker是个图标是鲸鱼的玩意 其实很早以前就知道Docker了 但一直没有深入接触(因为觉得可能比较难
这次稍微系统地学习一下 顺便记录一下
一、概述
Docker是一个开源的应用容器引擎 是一个轻量级容器技术
类似于虚拟机 但不是虚拟机 且实现了虚拟机的资源隔离 Docker的性能远远高于虚拟机(反正一大堆好处
Docker主要的应用场景:
若一个人要安装Windows原生系统 安装完毕还需要下载其它软件 例如QQ 微信等 还需要进行配置
另一个人也要安装Windows原生系统的话 同样安装完毕还需要下载其它软件 例如QQ 微信等 还需要进行配置
因此就有了Windows镜像系统:
一个人安装完了Windows原生系统 安装完了其它软件 配置好了 然后打包
另一个人直接安装镜像系统 安装完了就有了那些打包好的软件 包括配置好了的东西也会有
同样的 在开发或运维的过程中经常也需要给服务器安装各种各样的环境
例如MySQL Redis Tomcat等
尤其是在当今分布式集群趋势下 有很多服务器 要一个个安装 还要一个个进行配置 过于麻烦
那么 解决方案来了:
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级 可移植的容器中
然后发布到任何流行的Linux机器上 也可实现虚拟化
Docker支持将软件编译成一个镜像(就像windows系统的镜像) 然后在镜像中对各种软件做好配置
这样 就有了MySQL镜像 Redis镜像 Tomcat镜像 等各种软件的镜像 需要的时候直接下载对应的即可
将镜像发布出去之后 其他使用者可以直接使用这个镜像 直接放置于Docker中运行镜像即可
这个运行起来的镜像有一个专业术语 称为 容器
例:MySQL镜像运行后 就有了MySQL容器 MySQL就是在该容器之中运行
每个容器之间都是沙箱的隔离机制 相互之间不会有任何接口 且容器性能开销极低
二、核心概念
- Docker主机(Host):安装了Docker的机器
Docker是直接安装在操作系统之上的 无论是Windows还是Linux还是OS都可安装 - Docker客户端(Client):连接Docker主机从而进行操作
有命令行方式还有图形化界面方式操作 - Docker仓库(Registry):用于保存各种打包好的软件镜像
有公共仓库 也可以搭建私人仓库 - Docker镜像(Images):软件打包好的包
存放在Docker仓库中 - Docker容器(Container):镜像启动后的实例即容器
容器就是独立运行的一个或一组应用
例如 运行Tomcat容器就是运行Tomcat了
Docker的使用也很简单
使用流程:
- 1、安装Docker
- 2、去Docker仓库下载需要的镜像到本机
- 3、然后直接使用Docker来运行镜像
一运行镜像 就会产生一个容器
运行镜像几次 就有几个容器 - 4、对容器进行启动 停止 配置等操作
对容器的启动和停止就是对目标软件的启动和停止
三、常用操作
1、安装及使用
安装之前 首先需要查看内核:uname -r
Docker需要内核版本高于3.10
若机器内核过低 需要升级内核:yum update
然后就是安装Docker了:
yum install docker
Docker安装好之后 查看Docker版本(version):
docker -v
启动Docker(Centos7写法):
systemctl start docker
注:若启动Docker时出现Job for docker.service failed because the control process exited with error code. See “systemctl status docker.service” and “journalctl -xe” for details.
解决方法可看我另一篇文章:完美解决虚拟机Docker启动异常Job for docker.service failed because the control process exited with error code.
将Docker设为开机启动:
systemctl enable docker
停止Docker:
systemctl stop docker
2、镜像操作
✧、首先 需要搜索镜像:
docker search 镜像关键字
例:docker search mysql
默认是去Docker Hub搜索(然而有时候会很卡 毕竟国外网站
然后就会有一大堆结果 这些字段的意思是:
NAME:镜像名
DESCRIPTION:镜像描述
STARS:关注人数(以k为单位 类似于Github的star 相当于有多少人点赞)
OFFICIAN:是否为官方镜像
AUTOMATED:是否为自动配置的镜像(即 下载过来即可自动配置)
✧、当挑选到合适的镜像后 接下来就是下载/拉取镜像了:
docker pull 镜像名:tag
镜像名无须带docker.io 比如镜像的名称为docker.io/mysql 那么镜像名即为mysql
当然 全名也行
这个:tag是可选的 tag表示标签 即软件的版本号
不带标签的话 默认是latest 即最新的
若报错 请指定镜像仓库:docker pull 镜像仓库名/镜像名:tag
具体请参看我另一篇博客:解决Docker在pull的时候报错Get https://registry-1.docker.io/v2/: net/http: request canceled (Client.Timeout e
✧、镜像下载到本地之后 可以列出本地所有的镜像:
docker images
✧、最后 如果哪个镜像不想要了 可以删除镜像:
docker rmi 镜像id(IMAGE ID):版本号(TAG)
(rmi:remove image)
3、容器操作
使用流程:得到软件的镜像 --> 运行镜像 产生容器 得到真正的软件
也就是说 镜像就相当于安装程序 当运行安装程序就会产生真正运行的软件(可能比喻不太恰当 哪有程序安装完不跟你说就自动运行的2333
因此 当镜像下载好之后 接下来就需要根据镜像启动容器了
✧、首先是运行容器:
docker run --name 容器名 -d 镜像名
例如:docker run –name myredis –d redis
若镜像不是从官方仓库下载的 则需带上全名(下面图片上的案例即是如此)
注:
- –name:自定义容器名(也可不指定 不指定的话使用默认名)
- -d:后台运行
- image-name:指定要运行的镜像名
想要启动几个 执行几次即可
✧、然后 可以查看容器:
查看运行中的容器
docker ps
加上-a 查看所有容器(a:all)
docker ps -a
我就运行了一个 因此效果相同
✧、当容器未启动时 可启动容器:
docker start 容器名/容器id
✧、若想停止容器:
docker stop 容器名/容器id
✧、删除容器:
docker rm 容器id
✧、端口映射
让外部能访问远程服务器的Docker中的端口
-p 服务器的端口:容器中的端口
注:须在docker run的时候添加该参数
以Tomcat为例:docker run -d -p 8888:8080 docker.mirrors.ustc.edu.cn/library/tomcat
想要启动几个 执行几次即可(当然 每次的端口须不一样)
Tomcat启动成功
若出错 须关闭服务器的防火墙或开放指定端口
✧、查看容器日志
docker logs 容器名/容器id
✧、进入容器内部
docker exec -it 容器id bash
注:当然 bash也可改为容器内部的目录
若退出 输入exit
即可