1,Docker简介
Docker是一个用于创建、管理和编排容器的工具软件。Docker的出现,彻底改变了开发者和运维人员“构建、交付和运行(build,ship and run)”应用的方式。
1,应用容器化(在容器中运行应用程序)
Docker的核心功能是将应用整合到容器中运行,通过容器,实现了应用进程与底层系统的隔离,同时对不同的应用进程也实现了隔离。将应用整合到容器中并且运行起来的这个过程,称为“容器化”(Containerizing)。使用容器的目的是简化应用的构建、部署和运行过程。
容器技术能够提供的功能如下:
1、隔离不同的应用,解决环境冲突,避免互相影响。
2、能够快速、可靠、一致地部署应用程序,不受部署环境的影响。
3、多个容器运行在一台宿主机上,共享硬件和操作系统资源,提高了基础设施的利用率。
2, 容器和虚拟机的区别
虚拟机(如VMware)是在宿主操作系统上通过软件虚拟了另外一台主机硬件,然后安装相应的操作系统。
我们可以通过虚拟机软件虚拟出多台主机,分别安装不同的操作系统。每个虚拟机中都是一套完整的用户操作系统。
容器技术也能给用户虚拟出多个相对独立的操作系统,但容器并不是模拟完整的操作系统,而是采用隔离的进程,在进程的外面加了一个保护层。
对于容器里面的应用进程来说,它接触到的是容器提供的各种虚拟资源,实现了与底层系统的隔离。
容器和虚拟机技术最主要区别是:容器并不是虚拟了完整的操作系统,而是共享宿主机硬件资源及操作系统。
在宿主机操作系统中,每个容器对应一个独立的进程。
每个容器中可以包含不同的应用及其依赖的运行环境(配置,软件,库等)。
Docker和虚拟机的区别示意图:
Docker相对于虚拟机的优缺点:
优点:
1、docker 容器的启动非常快(秒级别),虚拟机则通常需要几分钟启动。
2、Docker容器运行效率高,性能优于传统虚拟机。
3、docker 更轻量,占用系统资源非常少,同样的硬件环境,可运行的 docker 容器数量远多于虚拟机数量。
下面这张表格是docker相比于传统虚拟机的优势:
特性 | docker | VM |
启动 | 秒级 | 分钟级 |
硬盘占用 | 一般为MB | 一般为GB |
性能 | 接近原生环境 | 弱于原生环境 |
系统支持量 | 单机支持上千个容器 | 一般是几十个 |
缺点:
1、docker 隔离性比较弱, docker 属于进程之间的隔离,而虚拟机则是系统级别的隔离。
2、docker 的安全性也较弱。 docker 容器中的 root用户 和宿主机 root用户等同,可进行无限制的操作。而虚拟机中的root 权限和宿主机中的 管理员不是一回事。
2,Docker的安装和使用
1,环境准备
Docker CE 需要64位版本的CentOS 7,并且内核版本不低于3.10。查看内核版本的命令:
uname -a
查看是否已经安装了Docker:
yum list installed | grep docker
rpm -qa | grep docker
要卸载旧版本的 Docker,可使用如下命令:
yum -y remove docker docker-common docker-selinux docker-engine
2,在线安装
1,安装yum-utils包,它提供了yum-config-manager 工具:
yum -y install yum-utils device-mapper-persistent-data lvm2
2, 通过yum-config-manager 添加阿里云仓库(该仓库中有docker-ce软件包):
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3, 更新yum缓存
yum makecache fast
4, 安装最新版的docker-ce引擎以及containerd:
yum -y install docker-ce docker-ce-cli containerd.io
5, 安装之后会创建 docker 组,但该组中没有添加任何用户。可以将普通用户加入到docker组,该用户后续不用加sudo就可以执行docker相关命令。
usermod -aG docker ${USER}
6, 启动Docker:
systemctl start docker
systemctl enable docker #启动电脑后,docker服务自启动
3,离线安装
1,下载Docker CE的.rpm 文件:
https://download.docker.com/linux/centos/7/x86_64/stable/Packages/
2, 安装Docker CE,按如下顺序安装各个rpm包:
rpm -ivh containerd.io-1.2.6-3.3.el7.x86_64.rpm
rpm -ivh docker-ce-cli-19.03.9-3.el7.x86_64.rpm
rpm -ivh docker-ce-19.03.9-3.el7.x86_64.rpm
3,启动Docker:
systemctl start docker
4,验证是否安装成功
四选一命令
docker -v
docker --version
docker version
docker info
3, Docker架构
Docker 采用的是 C/S 结构,即客户端/服务器体系结构。用户需要借助Docker Client(客户端)与 Docker daemon(服务端) 交互,如下图所示:
启动Docker daemon:
# systemctl start docker
如果希望机器重启后能自动启动docker服务,则执行如下命令:
# systemctl enable docker
提示:docker daemon启动后要绑定到一个Unix Socket上以便能够进行跨进程通信,默认的,该Unix Socket为root用户所有,因此,docker daemon总是以root用户运行。
普通用户每次执行Docker命令时也要使用sudo以便有权访问该Unix Socket。如果嫌每次都使用sudo命令太麻烦,可将该用户添加到docker组中:
# usermod -aG docker $USER
1,镜像、容器和仓库
1,Image (镜像)
镜像是一个只读文件,基于镜像可以创建和启动容器,镜像可以被看作是容器的定义文件(容器说明书或清单)。
2,Container (容器)
容器是基于镜像所启动的一个独立的运行环境。容器的实质是进程,与直接在宿主系统上运行的进程不同,容器中的进程受Docker管理。就是一个简易的 Linux系统
3,Registry (注册中心/远程镜像仓库)和Repository (仓库)
Registry是用来存储、分发镜像的服务器。一个Registry上会有很多个仓库(Repository),每个仓库中包含同一个软件不同版本的镜像。一般使用 <仓库名>:<标签> 格式来表示某个软件特定版本的镜像。当我们执行docker push、docker pull、docker search命令时,实际上是请求 Docker daemon 与 Docker Registry进行通信,完成相应的操作。
4,Docker常用命令
1,帮助命令
docker version ----------显示docker的版本信息。
docker info ----------显示docker的系统信息,包括镜像和容器的数量
docker 命令 --help ---------帮助命令
2,镜像命令
docker images---------查看本地镜像仓库中所有的镜像
docker pull <镜像名称:TAG>----------拉取镜像
docker rmi -f <镜像名称:TAG>或镜像ID-----------删除单个镜像
docker images -q--------------获取所有镜像的id
docker rmi -f $(docker images -q)-----------删除所有镜像
docker save -o xxx.tar <镜像名称:TAG>或镜像ID--------------制作本地的镜像tar文件
docker load -i xxx.tar---------------使用本地镜像tar文件载入镜像
3,Docker容器命令
docker ps -a-----------列出所有容器
docker start 容器名/容器ID-----------启动容器
docker stop 容器名/容器ID------------停止容器
docker rm -f 容器名/容器ID------------删除单个容器
docker rm -f $(docker ps -aq)---------删除所有容器
4,Docker启动命令
docker run [选项] image----------启动镜像容器
其中选项有:
--name ------------设置容器名称,容器名称不能冲突
--rm ------------容器关闭后,自动删除容器文件
-it ----------用于和容器进行交互
-d--------- 以后模式运行容器,当前终端会断开和容器的连接,可以使用docker attach进行连接。
-p [主机端口:容器端口]----------端口映射
-v -----------目录映射
-e------------ 设置环境变量
exit --------- 直接容器停止并退出
Ctrl + P + Q ------------- 容器不停止退出
5,进入容器命令
docker exec -it 容器id /bin/bash----------进入容器后开启一个新的终端,可以在里面操作
docker attach 容器id-----------进入容器正在执行的终端,不会启动新的进程
docker 容器id:/home/xxx.java /home--------在主机上 拷贝 centos 容器 /home 目录下xxx.java 文件 到主机 /home 目录
5, 数据卷和绑定挂载
如果希望容器中的应用产生的数据不会随着容器的删除而消失,可以使用数据卷和绑定挂载。数据卷(Volumes)和绑定挂载(Bind Mounts)都是在启动容器是通过-v参数进行配置。
1,绑定挂载
绑定挂载(Bind Mounts)是在容器启动时,直接指定宿主机上的某个目录挂载到容器内特定的目录上,这样容器内针对特定目录下的文件操作就相当于操作宿主机上的指定目录,绑定挂载也称为“目录映射”或“文件映射”。
格式:-v hostDir:containerDir
宿主机上的目录如果不存在,Docker会自动创建。
容器内的目录必须使用绝对路径。
# docker run --name fedora3 -it -v ~/data:/root/data fedora
注意:-v会自动创建data目录,不用手动创建
2,数据卷
创建数据卷:
# docker volume create nginx_pages 说明:数据卷默认保存在/var/lib/docker/volumes
查看数据卷:
# docker volume ls
启动容器使用数据卷:(如果nginx_pages这个卷不存在,则该命令会自动创建)
# docker run --name nginx01 -dit -p 8080:80 -v nginx_pages:/usr/share/nginx/html nginx
使用匿名卷:
# docker run --name nginx02 -dit -p 8080:80 -v /usr/share/nginx/html nginx
3,绑定挂载和数据卷的区别
1,绑定挂载可以是宿主机上的任何目录,Docker之外的进程也可以对其进行修改。而数据卷对应的目录则完全由Docker进行管理(/var/lib/docker/volumes),用户通过docker volume命令进行操纵。
2,绑定挂载不能通过docker volumes ls进行查看。
3,如果数据卷中初始没有文件,容器启动时Docker会自动将容器内目录下的文件拷贝到卷目录下,以后再次启动容器就使用卷中已有的文件了;绑定挂载时Docker不会将容器内目录下的文件拷贝到宿主机目录,需要手动给宿主机目录下放置文件。
因此,绑定挂载通常用来保存容器在运行过程中输出的数据。
4,环境变量
1,创建mysql数据卷
docker volume create mysql_conf
2,启动mysql容器
docker run --name mysql01 -e MYSQL_ROOT_PASSWORD=root -p 3308:3306 -v mysql_conf:/etc/mysql mysql:8.0
3, 使用sqlyog连接mysql容器时,远程访问报1521错误
4,解决1521错误:修改mysql配置文件
进入到/var/lib/docker/volumes/mysql_conf数据卷/_data/my.cnf添加配置:
default_authentication_plugin=mysql_native_password
5, 重新启动一个mysql容器
docker run --name mysql02 -e MYSQL_ROOT_PASSWORD=root -p 3309:3306 -v mysql_conf:/etc/mysql mysql:8.0
6,连接测试
安装tomcat 注意:
进入容器中的:/usr/local/tomcat中执行cp -r webapps.dist/* webapps才可以访问tomcat
6,制作自己的镜像
使用docker build命令生成镜像,编写Dockerfile文件
1,基于centos:7创建一个镜像
1,创建工作目录my_image1
mkdir my_image1
2,镜像添加jdk
cp jdk-11.0.2_linux-x64_bin.tar.gz my_image1/
3,复制springboot文件jar包
4, 在my_imag1下创建Dockerfile文件,编写内容
FROM centos:7
ADD jdk-8u221-linux-x64.tar.gz /opt----------添加jdk
WORKDIR /opt----------设置当前工作目录
RUN mv jdk1.8.0_221 jdk8----------重命名jdk
ENV JAVA_HOME /opt/jdk8----------jdk环境配置
ENV PATH $JAVA_HOME/bin:$PATH----------jdk环境配置
COPY springboot-demo-0.0.1-SNAPSHOT.jar .----------复制项目jar包
EXPOSE 8080----------公开容器中的端口
VOLUME ["/root/data"]----------容器内部的 /root/data 目录映射到本地的一个目录
CMD ["java","-jar","springboot-demo-0.0.1-SNAPSHOT.jar"]---------- Docker 在运行容器时,使用 "java" 命令启动一个 Java 进程,并运行
5, 创建镜像
docker build -t my_centos:1.0 .
6, 启动容器
docker run --name centos01 -it -p 8080:8080 my_centos:1.0
7,从阿里云镜像仓库上传和下载镜像
1,将镜像推送到Registry
2, 从Registry中拉取镜像