什么是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:版本号
  • 删除所有镜像:
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 rm 容器名/容器id
  • 删除所有容器
docker rm `docker ps -a -q`
  • 停止容器:docker stop 容器名/容器id
  • 停止容器: docker kill 容器名/容器id
  • 停止所有容器
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