什么是Docker
- Docker是一个开源的应用容器引擎 ,它可以让开发者将应用程序及其依赖项打包到一个可移植的镜像 中,并发布到任何流行的操作系统上。Docker使用沙箱机制来隔离容器,使其相互独立,并简化了应用程序的部署和管理。
- 沙箱机制 :限制应用程序对系统资源访问的机制,通过重定向技术将程序生成和修改的文件定向到自身文件夹中,并加载自身的驱动来保护底层数据,防止程序随意操作系统资源,造成数据损坏或泄露。
- 系统资源 :被操作系统 使用或管理的硬件和软件资源。这些资源包括CPU、内存、磁盘、网络连接、输入设备、输出设备、电源管理等。
Docker的特点
-
轻量级:Docker容器与传统虚拟机相比,更加轻量级。它共享操作系统内核,并且只包含运行应用程序所需的最小化组件,因此启动速度更快,占用资源更少。
-
可移植性:Docker容器可以在不同的环境中运行,无论是开发环境、测试环境还是生产环境。容器化应用程序可以在不同的主机之间进行简单、可靠的迁移。
-
高效性:由于共享操作系统内核和资源隔离的特性,Docker容器可以更高效地利用服务器资源。多个容器可以在同一台主机上同时运行,互相之间不会产生干扰。
-
可伸缩性:Docker容器可以根据应用程序的需求进行快速水平扩展或缩减。通过使用容器编排工具,如Docker Compose或Kubernetes,可以实现自动化的容器管理和扩展。
-
简化部署和管理:Docker提供了一致的部署方式,将应用程序及其依赖项打包成一个镜像,并通过镜像进行部署。这使得应用程序的部署和管理变得简单和可靠。
-
生态系统支持:Docker拥有庞大的生态系统,社区提供了大量的公开可用的镜像和工具,可以方便地构建、分享和管理容器化应用程序。
Docker主要组件
- Docker Client(Docker客户端):Docker客户端是命令行界面,用于与Docker守护进程进行交互。通过Docker客户端,用户可以执行各种Docker命令来管理Docker守护进程和容器。
- Docker Server(Docker服务器):Docker服务器是运行Docker守护进程的计算机,它负责管理Docker容器。Docker服务器可以是一台物理机或虚拟机,只要在其上安装了Docker守护进程,就可以作为Docker服务器使用。
- Docker Daemon(Docker守护进程):Docker守护进程是后台运行的服务,负责管理Docker容器。
- Docker Images(Docker镜像):Docker镜像是用于创建Docker容器的模板。它包含了一个应用程序及其依赖项,以及一个完整的运行环境。Docker镜像可以通过Dockerfile构建,也可以从公共仓库中下载。
- Docker Registry(Docker注册中心):Docker注册中心是存储和管理Docker镜像的中央仓库(Docker Hub)。用户可以从公共注册中心中下载镜像,也可以将自己的镜像上传到私有注册中心。
- Docker Container(Docker容器):Docker容器是Docker镜像的运行实例。每个容器都是独立的运行环境,包含了一个应用程序及其依赖项和运行环境。用户可以使用Docker CLI(命令行界面)或API来启动、停止、删除和管理容器。
Docker工作原理
- Docker的工作原理基于客户端-服务器(Docker引擎)结构,其中Docker的守护进程运行在宿主主机上(Docker服务器),客户端(容器)通过Socket向Docker引擎发送相应的指令,Docker服务器就会执行相应的命令。
- Docker利用Linux中的核心分离机制,例如Cgroups,以及Linux的核心Namespace(名字空间)来创建独立的容器。一句话概括起来,Docker就是利用Namespace做资源隔离,用Cgroup做资源限制,利用Union FS做容器文件系统的轻量级虚拟化技术。
- 当Docker引擎在本地查找镜像时,如果本地没有找到镜像,则会根据Docker引擎配置的仓库地址,远程去查找镜像。
- Docker容器的本质还是一个直接运行在宿主机上面的特殊进程,看到的文件系统是隔离后的,但是操作系统内核是共享宿主机OS,所以说Docker是轻量级的虚拟化技术。
Docker的安装
- 第一步:添加Docker的yum库
sudo yum install -y yum-utils device-mapper-persistent-data lvm2 #添加yum库
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo #配置软件源
- 第二步:安装Docker
sudo yum -y install docker-ce
- 第三步:启动Docker
sudo systemctl start docker
- 第四步:镜像加速
执行vi /etc/docker/daemon.json
进入文件,添加以下内容,保存并退出
{
"registry-mirrors": ["https://5pfmrxk8.mirror.aliyuncs.com"]
}
- 第五步:重启Docker
systemctl start docker
- 如果想要Docker开机自启,使用
systemctl enable docker
Docker相关命令
【systemctl命令是系统服务管理器指令它是 service和chkconfig两个命令组合,sudo是以管理员身份运行】
- 启动docker:systemctl start docker
- 停止docker:systemctl stop docker
- 重启docker:systemctl restart docker
- 查看docker状态:systemctl status docker
- 开机启动:systemctl enable docker
- 查看docker概要信息:docker info
- 查看docker帮助文档:docker --help
- 重新加载配置:sudo systemctl daemon-reload
Docker镜像相关命令
- 查看本地镜像:docker images 【镜像都存储在/var/lib/docker下】
- 删除指定镜像:docker rmi 镜像名/镜像id:版本号
- 删除所有镜像:
c
docker rmi `docker images -q`
- 搜索远程镜像:docker search 镜像名
- 拉取镜像到本地:docker pull 镜像名:版本号
- 推送本地镜像到远程:docker push 镜像名:版本号
Docker容器相关命令
- 查看所有容器:docker ps -a
- 查看所有容器id:docker ps -a -q
- 查看正在运行中的容器:docker ps
- 查看最近一次运行的容器:docker ps -1
- 查看已经停止运行的容器:docker ps -f status=exited
- 创建并运行一个容器:docker run
- 交互式:docker run -i -t --name=容器名字 -p=外端口:内端口 镜像名字:版本号 /bin/bash 或者/bin/sh
退出容器:exit或者ctrl + p + q - 后台式:docker run -i -d --name=容器名字 -p=外端口:内端口 镜像名字:版本号
退出容器:exit - i运行容器
- -t交互式
- -d后台式
- --name 容器名
- -v目录映射
- -p端口映射
- 交互式:docker run -i -t --name=容器名字 -p=外端口:内端口 镜像名字:版本号 /bin/bash 或者/bin/sh
- 删除容器:docker rm 容器名/容器id
- 删除所有容器
c
docker rm `docker ps -a -q`
- 停止容器:docker stop 容器名/容器id
- 停止容器: docker kill 容器名/容器id
- 停止所有容器
c
docker kill `docker ps -a -q`
- 把停止的容器启动起来:docker start 容器名/容器id
- 查看容器的运行日志:docker logs 容器名/容器id :
- 查看容器的配置: docker inspect 容器名/容器id:
- 进入容器里面:docker exec ;exit 退出容器
- 拷贝文件:docker cp
- --privileged=true 来解决挂载的目录没有权限的问题
- 容器运行的数据:docker inspect 容器名/容器id
- 查看容器ip(容器每次启动都会变化):docker inspect --format='{{.NetworkSettings:IPAddress}}' 容器名/容器id
常用Docker容器的安装
Mysql安装
- 拉取镜像:
docker pull mysql:5.7
- 查看镜像:
docker images
- 创建映射目录【-p是创建多级目录】,目录映射是为了修改文件时直接修改映射目录,而不用进入容器中修改
mkdir -p /usr/local/docker_data/mysql/data
mkdir -p /usr/local/docker_data/mysql/conf/conf.d
mkdir -p /usr/local/docker_data/mysql/conf/mysql.conf.d
mkdir -p /usr/local/docker_data/mysql/logs
- 运行容器
docker run --privileged=true --name mysql5.7
-p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d
-v /usr/local/docker_data/mysql/data:/var/lib/mysql
-v /usr/local/docker_data/mysql/conf:/etc/mysql/
-v /usr/local/docker_data/mysql/logs:/var/log/mysql
mysql:5.7
--privileged=true #使容器拥有root权限
mysql5.7是容器名,mysql:5.7是刚刚拉取到本地的镜像
-p是端口映射,前面是系统端口,后面的是容器的端口
-e是环境,MYSQL_ROOT_PASSWORD是mysql中root用户的密码
-v是目录映射,前面是系统的目录,后面是容器内的目录
- 测试【虚拟机的ip用ifconfig命令得到,ens33那一个】
JDK安装(1.8)
- 拉取镜像:
docker pull openjdk:8
- 创建容器:
docker run -it --name jdk1.8 -d openjdk:8
- 查看容器:
docker ps - a
- 进入jdk容器,查看jdk是否安装正确
docker exec -it jdk1.8 /bin/bash
,执行java -version
。
Redis安装
- 拉取镜像:
docker pull redis:5
- 创建容器:
docker run -id --name redis5 -p 6379:6379 --restart=always --memory=400m redis:5 --requirepass=123456
--restart=always 无论容器以何种方式退出,Docker都会自动重启该容器
--memory=400m 容器最大内存为400m
--requirepass redis的密码
- 查看是否成功
docker ps -a
- 尝试连接
可以添加key
- 进入容器中查看这个key是否存在
docker exec -it redis5 /bin/bash
进入容器,redis-cli
进入客户端,auth 123456
身份验证,keys *
查看所有key