Docker 是世界领先的软件容器平台,Go 语言进行开发实现,基于 Linux 内核提供的CGroup 功能和namespace 来实现的,以及AUFS 类的UnionFS 等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。 由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器,Docker能够自动执行重复性任务,用户可以方便地创建和使用容器,把自己的应用放入容器。容器可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。
1.镜像(Image):一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。
2.容器(Container):容器是镜像运行时的实体。可以被创建、启动、停止、删除、暂停等 。实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间。前面讲过镜像使用的是分层存储,容器也是如此。容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。
3.仓库(Repository):镜像仓库是 Docker 用来集中存放镜像文件的地方类似于我们之前常用的代码仓库。
1.更高效的利用系统资源
由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,docker对于资源利用率更高。无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此相比于虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应用。
2.更快速的启动时间
传统的虚拟机技术启动应用服务往往需要数分钟,而docker容器直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。
3.一致的运行环境
docker的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现 “这段代码在我机器上没问题啊” 这类问题。
4.持续支付和部署
使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。
5.隔离性
避免公用的服务器,资源会容易受到其他用户的影响。
6.弹性伸缩,快速扩展
善于处理集中爆发的服务器使用压力
7.迁移方便
可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。
1.轻量化:在一台机器上运行的多个 Docker 容器可以共享这台机器的操作系统内核;它们能够迅速启动,只需占用很少的计算和内存资源。镜像是通过文件系统层进行构造的,并共享一些公共文件。这样就能尽量降低磁盘用量,并能更快地下载镜像。
2.标准开放:Docker容器基于开放式标准,能够在所有主流Linux版本、Microsoft Windows以及包括VM、裸机服务器和云在内的任何基础设施上运行。
3.安全可靠:Docker赋予应用的隔离性不仅限于彼此隔离,还独立于底层的基础设施。Docker默认提供最强的隔离,因此应用出现问题,也只是单个容器的问题,而不会波及到整台主机。
Docker 使用客户端-服务器(C/S)体系结构。Docker 客户端与 Docker 守护程序进行通信,后者负责构建、运行和分发Docker 容器的繁重工作。Docker 客户端和守护程序可以在同一系统上运行,也可以将 Docker 客户端连接到远程 Docker守护程序。大部分情况下,Docker服务端和客户端运行在一台机器上。Docker客户端和守护进程通过UNIX套接字或网络接口使用REST API进行通信。
1.Docker 守护程序(Docker daemon)
Docker 守护进程运行在一台主机上,用户并不直接和守护进程进行交互,而是通过 Docker 客户端间接和其通信。
2.Docker 客户端(Docker client)
Docker 客户端是主要的用户与 Docker 交互方式,它接收用户指令并且与背后的 Docker 守护进程通信。
3.Docker 注册表(Docker registries)
Docker 注册表存储 Docker 镜像(image)。Docker Hub 是任何人都可以使用的公共注册表,默认情况下,Docker配置为在 Docker Hub 上查找镜像,也可以运行自己的私有注册表。
1.卸载旧版本docker(存在旧版本就先执行这一步,不存在跳过即可)
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
2. 设置仓库
sudo yum install -y yum-utils
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
3.安装Docker引擎
sudo yum install docker-ce docker-ce-cli containerd.io
4.启动Docker
sudo systemctl start docker
5.建议设置Docker开机自启动
systemctl enable docker
6.通过运行hello world映像,验证Docker引擎是否已正确安装
sudo docker run hello-world
出现下图,即代表docker启动成功
1.配置容器镜像加速
为解决国内下载镜像缓慢的问题,输入cd /etc/docker,进入文件后输入如下指令,如果该文件不存在请新建该文件
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
2.在Docker Hub上查找自己想要的mysql版本
可以搜索到非常多的镜像,Official lmage表示为官方镜像
这里我们选择其中一个作为演示,点击Tag查看我们需要的版本及拉取该镜像的命令
docker pull mysql:5.7.37-oracle
复制该命令到Centos终端回车
docker images
REPOSITORY为镜像名;
TAG为版本标志;
IMAGE ID为镜像id(唯一);
CREATED为创建时间,注意这个时间并不是我们将镜像下载到 Docker中的时间,而是镜像创建者创建的时间;
SIZE为镜像大小。
5.运行刚刚拉取的镜像(image)
docker run --name mysql-test -e MYSQL_ROOT_PASSWORD=123456 -p 3307:3306 -d mysql:5.7.37-oracle
–name mysql-test 设置容器名称为mysql-test
-e 设置环境变量,环境变量有哪些可以在官网查看mysql Offical Image -->Description–>Environment Variables
MYSQL_ROOT_PASSWORD=123456 设置root用户密码为123456
-p 3307:3306 容器端口映射,将容器内3306端口号映射到宿主机3307端口号(映射端口号是自己定义的)
-d 开启后台启动
mysql:5.7.37-oracle 镜像名:版本号(REPOSITORY:TAG),该项可以替换为镜像id(IMAGE ID)
6.查看已运行容器
docker ps
7.进入刚刚运行起来的容器(container)内
docker exec -it 830710e474d0 /bin/bash
-it 表示连写的 -i -t
-i: 允许你对容器内的标准输入 (STDIN) 进行交互
-t: 在新容器内指定一个伪终端或终端
830710e474d0为容器id(CONTAINER ID)
8.登录容器中的mysql
mysql -uroot -p123456
123456为刚刚运行时设置的密码
9.使用Navicat 连接容器中的mysql
主机:宿主机ip
端口:容器映射到宿主机的端口
密码:运行时设置的密码
这里有一篇文章可以了解docker:10分钟看懂Docker和K8S - 知乎