百度百科:Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
那什么是容器呢,我们通过与虚拟机对比来理解容器:
虚拟机是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行应用程序进程,而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟,容器共享宿主机的操作系统。容器是计算机上的沙盒进程,与主机上的所有其他进程隔离。
虚拟机是一个完整的操作系统,需要占用大量的磁盘、内存和 CPU 资源,一台机器只能开启几十个的虚拟机。而 Docker只是一个进程,只需要将应用以及相关的组件打包,在运行时占用很少的资源,一台机器可以开启成千上万个 Docker。
启动虚拟机需要先启动虚拟机的操作系统,再启动应用,这个过程非常慢。而启动 Docker 相当于启动宿主操作系统上的一个进程。
通过容器技术将开发环境和测试环境以及生产环境保持版本和依赖上的统一,保证代码在一个高度统一的环境上执行,从而不会再出现 “这段代码在我机器上没问题啊” 这类问题。
使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。
可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。
Docker 的可移植性和轻量级特性还使得能够近乎实时地动态管理工作负载、根据业务需求扩展或拆除应用程序和服务变得容易。
容器技术天生带有回滚属性,因为每个历史容器或者镜像都会有保存,而替换一个容器或者某个历史镜像是非常快速和简单的。
在容器出现之前,我们往往构筑一个应用就需要一台新的服务器或者虚拟机。服务器的购置成本和运维成本都很高,而虚拟机需要占用很多不必要的资源。相比之下,容器技术就小巧轻便的多。
Docker 使用客户端-服务器(C/S)体系结构。
Docker 客户端与 Docker 守护程序进行通信,后者负责构建、运行和分发Docker 容器的繁重工作。
Docker 客户端和守护程序可以在同一系统上运行,也可以将 Docker 客户端连接到远程 Docker守护程序。大部分情况下,Docker服务端和客户端运行在一台机器上。Docker客户端和守护进程通过UNIX套接字或网络接口使用REST API进行通信。
Docker 守护进程运行在一台主机上,用户并不直接和守护进程进行交互,而是通过 Docker 客户端间接和其通信。
Docker 客户端是主要的用户与 Docker 交互方式,它接收用户指令并且与背后的 Docker 守护进程通信。
Docker 注册表存储 Docker 镜像(image)。Docker Hub 是任何人都可以使用的公共注册表,默认情况下,Docker配置为在 Docker Hub 上查找镜像,也可以运行自己的私有注册表。
Docker镜像可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数。
镜像不包含任何动态数据,其内容在构建之后也不会被改变。
容器是镜像的可运行实例
,容器的实质是进程,但与直接在宿主执行的进程不同,运行容器时,Docker 会为该容器创建一组命名空间(namespace),这些命名空间提供了一个隔离层。容器的每个方面都在单独的命名空间中运行,其访问权限仅限于该命名空间
。
镜像仓库是 Docker 用来集中存放镜像文件的地方
类似于代码仓库(github、gitee等)。有时候会把仓库(Repository)和注册表(Registry)混为一谈,并不严格区分。 实际上,一个Docker 注册表(Registry)中可以包含多个仓库(Repository),每个仓库可以包含多个标签(tag) ,每个标签对应着一个镜像(image)
。
参照Docker官网在Centos中安装Docker
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
sudo yum install -y yum-utils
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install docker-ce docker-ce-cli containerd.io
sudo systemctl start docker
systemctl enable docker
sudo docker run hello-world
出现如下图即代表Docker启动成功
不建议将便捷脚本安装方式用于生产环境,但可以用作示例来创建根据您的需求量身定制的预配脚本。
curl -fsSL https://test.docker.com -o test-docker.sh
sudo sh test-docker.sh
为解决国内下载镜像缓慢的问题,在 /etc/docker/daemon.json 中写入如下内容,如果该文件不存在请新建该文件
vim daemon.json
{"registry-mirrors":["https://registry.docker-cn.com"]}
也可以选择其它Docker 国内镜像
阿里云:https://help.aliyun.com/document_detail/60750.html
网易:http://hub-mirror.c.163.com
Docker官方中国加速器:https://registry.docker-cn.com
ustc :https://docker.mirrors.ustc.edu.cn
重新启动服务
sudo systemctl daemon-reload
sudo systemctl restart docker
在左上角的搜索框中输入mysql并回车:
可以搜索到非常多的镜像,Official lmage表示为官方镜像
这里我们选择第一个作为演示,点击Tag查看我们需要的版本及拉取该镜像的命令
docker pull mysql:5.7.37-oracle
复制该命令到Centos终端回车
docker images
docker run --name mysql-test -e MYSQL_ROOT_PASSWORD=123456 -p 3307:3306 -d mysql:5.7.37-oracle
docker ps
docker exec -it 830710e474d0 /bin/bash
mysql -uroot -p123456
123456为刚刚运行时设置的密码
exit