一、Docker 概述
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。
使用Docker后的开发部署流程:
开发:建立模型--环境--打包带上环境,即镜像--放到Docker仓库
部署:下载Docker中的镜像,直接运行即可
1、镜像:打包项目带上环境,即镜像
2、Docker仓库: 存放docker镜像
3、隔离
Docker的思想来自于集装箱,集装箱,对环境进行隔离
Docker通过隔离机制,可以将服务器利用到极致。
每个容器间是互相隔离,每个容器内都有一个属于自己的文件系统,互不影响。
4、容器化技术
- 容器化技术的命名就是docker
二、docker 为什么出现?
Docker出现的原因--应用环境配置费时费力
版本问题、底层依赖冲突问题
一般在公司我们制作一个产品通常需要开发和上线,这就涉及到开发人员和运维人员的工作。
而通常一个产品会有两套环境,一套环境是开发人员的开发时所用的环境,另一套则是运维人员根据开发人员的提示所配置的环境,
但这两套环境和应用配置难免会有不同或冲突,这就导致有时候在开发人员电脑上可以运行但上线时却无法运行。版本更新导致服务不可用。
三、docker优点
■ 轻巧
--相对于笨重的虚拟机
- docker容器技术和虚拟机一样都是虚拟技术,但是十分轻巧, docker模拟的不是完整的操作系统
- 比如安装centos 系统,只用到centos的最核心
vm: linux centos 原生镜像(一个电脑) 隔离,需要开启多个虚拟机 几个G 几分钟 docker: 隔离 镜像(最核心的环境,4m+jdk+mysql) 十分小巧, 秒级启动
容器化技术不是模拟的一个完整的操作系统
传统虚拟机:模拟出一套硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件
docker:容器内的应用直接运行在宿主机的内核,容器是没有自己的内核,也没有虚拟我们的硬件,所以就轻便了
四、Docker能干嘛(优点)
DevOps(开发、运维)
在开发和运维
过程中,Docker 具有以下几个方面的优势:
应用更快速的交付和部署
传统:一堆帮助文档,安装程序
Docker:打包镜像发布测试,一键运行
更便捷的升级和扩缩容
使用了Docker之后,我们部署应用就和搭积木一样!项目打包为一个镜像,扩展 服务器A!服务器B
更简单的系统运维
在容器化之后,我们的开发,测试环境都是高度一致的。
更高效的计算资源利用:
Docker是内核级别的虚拟化,可以再一个物理机上可以运行很多的容器实例!服务器的性能可以被压榨到极致。
五、Docker的基本组成
1、docker的三个重要概念:
(1)镜像:打包项目带上环境,即镜像
Docker镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的配置参数。镜像不包含任何动态数据,其内容在构建之后也不会被改变。镜像可以用来创建Docker容器,用户可以使用设备上已有的镜像来安装多个相同的Docker容器。
(2)容器:镜像创建的运行实例,Docker利用容器来运行应用
每个容器都是相互隔离的、保证安全的平台。我们可以把容器看做是一个轻量级的Linux运行环境。
(3)仓库:存放镜像(文件)的地方,分为共有仓库和私有仓库
Docker Hub:国外的
阿里云:配置镜像加速
六、了解docker的镜像命令、容器命令后,回来理解容器概念特性就非常容易了
☺ 通过命令观察到的结果来证明 docker容器相当一个轻量级的Linux运行环境。且证明容器的特性是相互隔离,各自运行各自的程序,各自有各自的环境。每个容器内都有一个属于自己的文件系统,互不影响。
证明1:docker容器相当一个轻量级的Linux运行环境:
可以看到,分别在centos容器、tomcat容器、nginx容器内部查看了系统的版本信息,发现他们底层系统都是Linux,通过命令,观察他们的版本信息,发现他们的系统版本,可以是不一样的,可以是linux发行版的RedHat系列(centos),也可以是linux发行版的Debian系列(debian)。
证明2:容器的特性是相互隔离,各自运行各自的程序,各自有各自的环境。每个容器内都有一个属于自己的文件系统,互不影响。
通过命令ls,分别在centos容器、tomcat容器、nginx容器内部查看到他们有属于自己的文件系统,都是不同的。
通过命令ip,分别在centos容器、tomcat容器、nginx容器内部查看到,在centos系统可以直接得到ip信息,而一开始tomcat、nginx容器内部,都是ip命令找不到,后来,咱通过给tomcat容器修改一下apt源的镜像,并更新一下命令,然后安装iproute2(没给nginx容器安装iproute2命令)的情况下,分别在tomcat、nginx容器内部查看ip命令,发现只有tomcat 容器可以正常使用ip命令。由此,证明了容器隔离的特性。
# 创建centos的容器 docker pull centos docker run -it --name centos01 centos /bin/bash # ———————————————————————————————————————— ls 命令查看目录信息———————————————————————————————————— [root@dfd0ef52fc43 /]# ls bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var # -----------------------------------这个时候,查看系统的版本信息--------------------------------- [root@dfd0ef52fc43 /]# cat /etc/os-release NAME="CentOS Linux" VERSION="8" ID="centos" ID_LIKE="rhel fedora" VERSION_ID="8" PLATFORM_ID="platform:el8" PRETTY_NAME="CentOS Linux 8" ANSI_COLOR="0;31" CPE_NAME="cpe:/o:centos:centos:8" HOME_URL="https://centos.org/" BUG_REPORT_URL="https://bugs.centos.org/" CENTOS_MANTISBT_PROJECT="CentOS-8" CENTOS_MANTISBT_PROJECT_VERSION="8" [root@dfd0ef52fc43 /]# cat /etc/redhat-release CentOS Linux release 8.4.2105 # ========================================使用命令 ip ===================================== [root@eed52d253e26 /]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 12: eth0@if13: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0 valid_lft forever preferred_lft forever
# 创建tomcat的容器 docker pull tomcat:9.0 docker run -it --name tomcat01 tomcat:9.0 /bin/bash # ———————————————————————————————————————— ls 命令查看目录信息———————————————————————————————————— root@f1cfb81dedfd:/usr/local/tomcat# ls BUILDING.txt LICENSE README.md RUNNING.txt conf logs temp webapps.dist CONTRIBUTING.md NOTICE RELEASE-NOTES bin lib native-jni-lib webapps work # -----------------------------------这个时候,查看系统的版本信息--------------------------------- root@f1cfb81dedfd:/usr/local/tomcat# cat /etc/os-release PRETTY_NAME="Debian GNU/Linux 11 (bullseye)" NAME="Debian GNU/Linux" VERSION_ID="11" VERSION="11 (bullseye)" VERSION_CODENAME=bullseye ID=debian HOME_URL="https://www.debian.org/" SUPPORT_URL="https://www.debian.org/support" BUG_REPORT_URL="https://bugs.debian.org/" root@f1cfb81dedfd:/usr/local/tomcat# cat /etc/debian_version 11.2 # ========================================使用命令 ip ===================================== root@f1cfb81dedfd:/usr/local/tomcat# ip a bash: ip: command not found # ~~~~~~~~~~~~~~~~~~~~~~~~ 给tomcat容器修改一下apt源的镜像,并更新一下命令,然后安装iproute2~~~~~~~~~~~~~~~~~~ # 修改apt下的sources.list # 先备份,可以选择创建一个文件夹,然后拷贝一份放进去 root@f1cfb81dedfd:/etc/apt# mkdir cat sources.list.backup root@f1cfb81dedfd:/etc/apt# cp sources.list ./sources.list.backup root@f1cfb81dedfd:/etc/apt/sources.list.backup# cd ../ # 使用命令 echo 覆盖+追加方式 deb https://mirrors.aliyun.com/debian bullseye main deb https://mirrors.aliyun.com/debian-security bullseye-security main deb https://mirrors.aliyun.com/debian bullseye-updates main # 执行一下更新命令: apt-get update -y # 执行下载 iproute2命令: apt install -y iproute2 # 再次执行ip 命令 root@f1cfb81dedfd:/usr/local/tomcat# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 6: eth0@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0 valid_lft forever preferred_lft forever
# 创建nginx的容器 docker pull nginx docker run -it --name nginx01 nginx /bin/bash # ———————————————————————————————————————— ls 命令查看目录信息———————————————————————————————————— root@7b002c0ac35e:/# ls bin dev docker-entrypoint.sh home lib64 mnt proc run srv tmp var boot docker-entrypoint.d etc lib media opt root sbin sys usr # -----------------------------------这个时候,查看系统的版本信息--------------------------------- root@7b002c0ac35e:/# cat /etc/os-release PRETTY_NAME="Debian GNU/Linux 11 (bullseye)" NAME="Debian GNU/Linux" VERSION_ID="11" VERSION="11 (bullseye)" VERSION_CODENAME=bullseye ID=debian HOME_URL="https://www.debian.org/" SUPPORT_URL="https://www.debian.org/support" BUG_REPORT_URL="https://bugs.debian.org/" root@7b002c0ac35e:/# cat /etc/debian_version 11.2 # ========================================使用命令 ip ===================================== root@f4cc7c858a88:/# ip a bash: ip: command not found # ~~~~~~ 在给tomcat容器修改一下apt源的镜像,并更新一下命令,然后安装iproute2(没给nginx容器安装iproute2命令哦),查看ip命令~~~~~~ root@f4cc7c858a88:/# ip a bash: ip: command not found
- 同一个镜像tomcat,创建出第二个tomcat容器tomcat02,发现,也是一样的,新创建的tomcat容器也是因为下载的Tomcat镜像是精简版的,利用这个镜像去打开一个容器的时候发现没有ip addr这个命令。