# Docker
## 一、概述
在传统的开发过程中,以Java后端开发为例,一般都会打成jar包之后传送到服务器当中,然后在服务器中使用命令`java -jar *.jar`来运行。这种方式会使所有的项目都在宿主机上的操作系统运行,彼此之间没有隔离,很有可能出现因为一个服务内存泄漏占用大量的内存而导致所有的服务都不可用的情况。
采用容器技术就可以让服务之间彼此隔离,可以将每个容器都看成单独的操作系统(甚至可以看成单独的一台主机),对于运行在容器中的服务彼此之间是隔离的。
容器技术从本质上说就是一个与主机上其他进程相互隔离的进程,Docker就是容器技术的一种。
### 1.1 历史
1. 2010年,在美国成立的`dotCloud`公司做一些 pass (移动社交APP)的云计算服务和Linux相关的容器技术,并将自己做的容器化技术命名为Docker。Docker一开始并没有引起注意,但在2013年Docker开源之后,就引起越来越多人的注意了。开源之后每个月都会更新一个版本,并于2014年4月9日时发布Docker1.0版本。
2. Docker为什么这么火?
Docker的核心是容器技术,容器非常轻巧,在容器技术出来之前使用的是虚拟技术(例如Vmware软件),但是虚拟机的是非常笨重的,一台虚拟机就可以看成是完整的一台电脑了。而容器也是一种虚拟化技术。但是其使用的是镜像技术,其里面只包括运行所需要的操作系统最核心的环境,然后自己再根据需要安装其他的环境(在容器中甚至没有ll命令),这样要比虚拟机小很多。通常虚拟机是G级别的,容器是M级别的。
~~~
例如在虚拟机中安装centos7系统可能需要2个G,但是在docker中安装centos7镜像只要200MB左右。
~~~
架构对比:
:-: ![容器和虚拟机对比](https://blogs.vmware.com/china/files/2018/01/VM-vs-Container.png)
区别:
1. 虚拟机占用的资源非常多、同时启动也比较慢,分钟级别的;而容器占用的资源相对较少,启动也比较快,几秒就能启动一个应用。
2. 虚拟机是会模拟一个完整的操作系统的,而容器化技术并不会,只会安装操作系统最核心的组件。每个项目都可以和自己所需要的环境打包形成一个应用。
3. 容器内的应用直接运行在宿主机,容器是没有自己的内核的,也没有虚拟硬件功能。`并且每个容器是相互隔离的,每个容器都有自己的文件系统,互不影响。`
4. Docker能够充分的利用服务器的资源。
### 1.2 基本组成
架构图:
:-: ![](https://img.kancloud.cn/fe/34/fe3492019eb0afc564e995c0d2dfe2f6_1087x588.png)
由三个部分组成:`客户端,服务器,远程仓库docker hub。`
Docker服务的组件:
1. 镜像:image 好比是一个模板,可以用这个模板来创建容器服务,同时这个镜像可以创建多个容器,而最终的服务就运行在容器中的。
2. 容器:container 通过镜像创建,独立运行一个或一组应用,是一个相互隔离的进程。容器可以启动,停止,删除。每个容器都可以看成是简易的linux系统。在项目中每个组件可以看成一个容器,例如mysql,redis等。
3. 仓库:repository 存放镜像的地方。分为公有仓库和私有仓库。例如Docker Hub,阿里云等。
~~~
daemon:守护进程
~~~
### 1.3 Docker是怎么工作的?
Docker是一个C/S结构的系统,Server的守护进程(daemon)运行在主机上。客户端通过守护进程与容器进行通信。
:-: ![](https://img.kancloud.cn/fe/34/fe3492019eb0afc564e995c0d2dfe2f6_1087x588.png)
新建一个容器的时候,docker不需要像虚拟机一样重新加载一个操作系统内核,避免引导,虚拟机加载Guest OS,加载时间为分钟级别,而docker是利用宿主机的操作系统,省略了复杂的过程,加载时间是秒级别的。
简单来说,虚拟机技术通过软件模拟了一整套的操作系统,包括硬件设备;而容器技术仍然用的是宿主机中的硬件设备。
**其他:**
Docker是使用Go语言开发,开源 。
官网:[https://www.docker.com/](https://www.docker.com/),Docker的文档非常详细。
仓库地址:[https://www.docker.com/products/docker-hub](https://www.docker.com/products/docker-hub) 搜索镜像,查看镜像版本及其使用方法。
## 二、安装
以centos为例,其他操作系统的安装可以前往[官网](https://docs.docker.com/engine/install/centos/)查看。
1. 查看自己Linux的环境,确定当前Linux的发行版
查看发行版本
~~~
cat /etc/os-release
~~~
输出:
~~~
NAME="CentOS Linux"
VERSION="7 (Core)"
...
~~~
例如这里使用的是阿里云的Centos7的Linux,安装Docker时要安装相应的版本。
2. 查看是否有旧的docker版本,有的话卸载旧的版本
~~~
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
~~~
3. Centos要先安装yum下载工具,yum类似于Ubuntu中的apt
~~~
yum install -y yum-utils
~~~
yum是一个基于RPM的包管理工具,能够从指定的服务器中自动下载RPM包和一次性安装所有的依赖。
4. 正式安装Docker前先设置Docker的镜像仓库
~~~
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
~~~
现在的centos已经不再维护了,直接这样可能会出错,根据出错信息上网查找即可解决。
5. 更新yum软件包索引
~~~
yum makecache fast
~~~
6. 安装docker,其中docker-ce是社区版,docker-ee是企业版,docker-ce-cli是docker的客户端。
~~~
sudo yum install docker-ce docker-ce-cli containerd.io
~~~
7. 检查docker是否安装成功
~~~
docker version
~~~
输出:
~~~
Client: Docker Engine - Community
Version: 20.10.5
...
~~~
8. 启动docker
~~~
systemctl start docker
~~~
9. 运行docker中自带的hello-world镜像
~~~
docker run hello-world
~~~
输出:
~~~
Unable to find image 'hello-world:latest' locally # 在本地找不到镜像
latest: Pulling from library/hello-world # 从远程仓库进行拉取
b8dfde127a29: Pull complete # b8dfde127a29这是镜像id
Digest: sha256:308866a43596e83578c7dfa15e27a73011bdd402185a84c5cd7f32a88b501a24
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
...
~~~
10. 查看docker下的所有镜像
~~~
docker images
~~~
输出:
~~~
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest d1165f221234 2 weeks ago 13.3kB
~~~
`Image ID是镜像id,可以用来指示唯一这个镜像,后面中经常用到。`
11. 配置阿里云镜像
在网址:[https://cr.console.aliyun.com/cn-qingdao/instances/mirrors](https://cr.console.aliyun.com/cn-qingdao/instances/mirrors)找到镜像加速器。
:-: ![](https://img.kancloud.cn/d4/65/d4657ed9b6656cf77bee4bc59d1d9779_1215x704.png)
配置镜像加速器:
~~~
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://vawx0tcn.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
~~~
**拉取一个镜像的执行流程**
:-: ![](https://img.kancloud.cn/f2/bf/f2bff4fc9837930d7d68e93898300f7b_805x557.png)
**安装图形化界面**
Docker提供一个通过浏览器图形化界面操作的软件Portainer给我们使用,安装方式如下:
~~~
docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
~~~
访问地址为:http://ip:8080
## 三、命令
### 3.1 帮助命令
~~~
docker version # docker版本信息
docker info # docker系统信息,包括镜像和容器的数量
docker 命令 --help # 帮助命令
~~~
### 3.2镜像相关命令
~~~
docker images # 查看本地所有镜像
docker search mysql # 搜索mysql镜像
docker pull mysql:tag # 拉取Tag标签的镜像
docker rmi -f 镜像id # 删除镜像
~~~
### 3.3 容器相关命令
1. 创建一个容器
~~~
docker run -itd --name=容器name -p 主机端口:容器端口 镜像名
~~~
2. 查看运行中的容器
~~~
docker ps # 查看运行中容器
docker ps -a # 查看历史容器
~~~
3. 删除容器
~~~
docker rm [-f] 容器id #-f强制删除
docker rm -f $(docker ps -aq) # 删除所有的容器
docker rm -aq|xargs docker rm # 删除所有容器
~~~
4. 操作创建完成的容器
~~~
docker start 容器id # 启动容器
docker restart 容器id # 重新启动容器
docker stop 容器id # 停止容器
docker kill 容器id # 强制关闭容器
~~~
5. 查看容器日志
~~~
docker logs -tf --tail number 容器id
~~~
- -t 显示时间戳
- -f 格式化显示
- --tail number 显示的条数
只有容器在运行的时候才会有日志。
6. 查看容器中的进程信息
~~~
docker top 容器id
~~~
7. 查看容器元数据信息
~~~
docker inspect 容器id
~~~
和网络相关比较重要的是有个局域网的IPV4地址。
8. 拷贝容器内文件
~~~
docker cp 容器id:容器文件路径 主机保存文件路径
~~~
:-: ![](https://img.kancloud.cn/33/2a/332ac605e81e9a5e028615dc7ea8669f_1065x746.png)
- 第一章 Java基础
- ThreadLocal
- Java异常体系
- Java集合框架
- List接口及其实现类
- Queue接口及其实现类
- Set接口及其实现类
- Map接口及其实现类
- JDK1.8新特性
- Lambda表达式
- 常用函数式接口
- stream流
- 面试
- 第二章 Java虚拟机
- 第一节、运行时数据区
- 第二节、垃圾回收
- 第三节、类加载机制
- 第四节、类文件与字节码指令
- 第五节、语法糖
- 第六节、运行期优化
- 面试常见问题
- 第三章 并发编程
- 第一节、Java中的线程
- 第二节、Java中的锁
- 第三节、线程池
- 第四节、并发工具类
- AQS
- 第四章 网络编程
- WebSocket协议
- Netty
- Netty入门
- Netty-自定义协议
- 面试题
- IO
- 网络IO模型
- 第五章 操作系统
- IO
- 文件系统的相关概念
- Java几种文件读写方式性能对比
- Socket
- 内存管理
- 进程、线程、协程
- IO模型的演化过程
- 第六章 计算机网络
- 第七章 消息队列
- RabbitMQ
- 第八章 开发框架
- Spring
- Spring事务
- Spring MVC
- Spring Boot
- Mybatis
- Mybatis-Plus
- Shiro
- 第九章 数据库
- Mysql
- Mysql中的索引
- Mysql中的锁
- 面试常见问题
- Mysql中的日志
- InnoDB存储引擎
- 事务
- Redis
- redis的数据类型
- redis数据结构
- Redis主从复制
- 哨兵模式
- 面试题
- Spring Boot整合Lettuce+Redisson实现布隆过滤器
- 集群
- Redis网络IO模型
- 第十章 设计模式
- 设计模式-七大原则
- 设计模式-单例模式
- 设计模式-备忘录模式
- 设计模式-原型模式
- 设计模式-责任链模式
- 设计模式-过滤模式
- 设计模式-观察者模式
- 设计模式-工厂方法模式
- 设计模式-抽象工厂模式
- 设计模式-代理模式
- 第十一章 后端开发常用工具、库
- Docker
- Docker安装Mysql
- 第十二章 中间件
- ZooKeeper