跟着狂神学Docker!
Docker概述 开发即运维。(别问我,复杂又费力)
基本概念 Docker:将一个项目带上环境进行统一打包,称为镜像。
Docker开发与传统开发的区别&核心与本质
传统:开发做jar,运维负责将jar部署上线维护什么的。jar部署的环境什么的都由运维去解决。 现在:开发打包部署上线,一条龙服务(高级开发)– 只有一个人负责,没分开发和运维。 java – apk – 发布(应用商店) – 张三使用apk — 安装即用 java – jar(环境)— 打包项目带上环境 — 发布到Docker仓库(商店)—下载我们发布的镜像–直接运行即可
说白了,Docker能力强大,把开发和运维全干了,合成了一块儿。
Docker核心思想 :打包装箱,每个箱子之间互相隔离。(隔离机制,能压榨空间)本质 :所有的技术因为出现了一些问题,我们需要去解决,才去学习。
Docker历史 2010年,几个搞IT的年轻人,在美国成立了一家公司 DOTCLOUD 提供 PASS云计算服务,LXC有关的容器技术。 他们将自己的容器化技术进行统一的简化命名:Docker Docker刚诞生的时候:没引起行业注意,活不下去。==>做起了开源。 2013年,Docker开源。越来越多的人发现了Docker的优点,爆火。每个月更新一个版本(社区很活跃)。Docker十分轻巧。 2014年,Docker 1.0发布。
Docker火爆的原因: 在容器技术出来之前,我们使用的是虚拟机技术。 在VMware等软件虚拟出一台或多台电脑,差不多是一台真实的电脑。非常笨重,不过好处是每个电脑相互隔离。 虚拟机也是属于虚拟化技术,Docker也是虚拟化技术,但Docker还是一种容器技术。
Docker与VM VM:Linux Centos 原生镜像,需要开多个虚拟机 几个G,几分钟 Docker:隔离,镜像(最核心环境 4M+jdk+mysql)十分小巧,运行镜像就可以了! 几个M KB 秒级启动!
到现在,所有的开发人员必须学Docker
Docker是基于GO语言开发的开源项目。 官网:https://www.docker.com/ 文档:https://docs.docker.com/ Dockerhub:https://www.docker.com/products/docker-hub/
虚拟机技术缺点 1.资源占用十分多 2.冗余步骤多 3.启动很慢
容器技术 容器化技术不是模拟一个完整的操作系统。 比较Docker和虚拟机技术的不同:
传统虚拟机, 虚拟出一条硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件。
容器内的应用直接运行在宿主机的内核当中,没有虚拟化硬件,所以就轻便了。
每个容器间是互相隔离的,每个容器都有属于自己的容器系统,互不影响。
开发人员对docker产生的依赖:不想自己装环境(坏处)==> 最好还是学会怎么装环境再使用Docker去封装搬运等。
DevOps(开发运维) 应用更快速的交付和部署 传统:一堆帮助文档,安装程序 Docker:打包镜像,发布测试,一键运行
更便捷的升级和扩缩容 使用Docker后,部署应用如同搭建积木 升级时可以使整体环境进行升级 项目横向扩展
更简单的系统运维 在容器化之后,我们的开发测试环境是高度一致的。
更高效的计算机资源利用 DOcker是内核级的虚拟化,可以在一个物理机上运行很多的容器实例。服务器的性能能被压榨到极致。
Docker安装 Docker基本组成 Docker架构
docker build 创建Docker docker pull 拉取Docker docker run 运行Docker
专业术语以及阐释 镜像:image docker镜像好比一个模板,可以通过这个模板来创建容器服务 Tomcat镜像 –> run –> Tomcat容器(提供服务器) 通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器当中的)。 个人理解:这个镜像类似于VM的ISO文件,我们可以通过ISO创建多台虚拟机,也就表示着我们可以通过image创建多个容器。
容器:container Docker利用容器技术,独立运行一个或者一组应用,通过镜像来创建的。 基本操作:启动,停止,删除 目前理解:一个极简的虚拟机,简易的Linux系统
仓库:repository 存放镜像的地方,分为公有仓库和私有仓库。 DockerHub(默认是国外的) 源默认是国外的,有需要可以配置阿里云加速。
安装 环境准备 一点Linux基础,Centos7,Xshell连接。 系统内核环境:3.10以上
// 查看系统内核是否大于3.1 [root@kpl]# unmae -r
安装 官方帮助文档
# 使用命令清除旧版本docker(卸载) [root@syw]#yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine # 安装需要的依赖包 yum install -y yum-utils# 设置docker存储库 # 阿里云国内docker镜像仓库配置 yum -config-manager # yum更新索引 yum makecache fast# 安装最新版docker引擎,docker相关依赖 # docker-ce 社区版,ee为企业版 yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin# 启动Docker systemctl start docker# 测试是否安装成功 [root@localhost ~]# docker version Client : Docker Engine - Community Version : 23.0 .6 API version: 1.42 Go version: go1.19.9 Git commit: ef23cbc Built : Fri May 5 21 :21 :29 2023 OS /Arch : linux/amd64 Context : default Server : Docker Engine - Community Engine : Version : 23.0 .6 API version: 1.42 (minimum version 1.12 ) Go version: go1.19.9 Git commit: 9dbdbd4 Built : Fri May 5 21 :20 :38 2023 OS /Arch : linux/amd64 Experimental : false containerd: Version : 1.6 .21 GitCommit : 3dce8eb055cbb6872793272b4f20ed16117344f8 runc: Version : 1.1 .7 GitCommit : v1.1.7 -0 -g860f061 docker-init: Version : 0.19 .0 GitCommit : de40ad0 # 获取镜像 docker pull hello-world# 查看镜像 docker images# 运行镜像 docker run hello-world仅供参考 # 卸载docker yum remove docker的相关依赖# 删除docker运行文件(默认工作路径) rm -rf /var/lib/docker# 镜像加速 # 使用阿里云docker容器镜像服务,找到镜像加速地址,按照阿里云相关资料自己配 # 阿里云内选择:容器镜像服务 > 镜像加速(这是免费的) # 下方有开发文档,下面是截取出来的内容,顶多链接不一样,其它内容是一样的。 sudo mkdir -p /etc/dockersudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors" : ["https://tjn8a2dr.mirror.aliyuncs.com" ] } EOF sudo systemctl daemon-reloadsudo systemctl restart docker
镜像源 网易: http://hub-mirror.c.163 .com 中科大镜像地址: http://mirrors.ustc.edu.cn/ 中科大github地址: https://github.com/ustclug/mirrorrequest Azure 中国镜像地址: http://mirror.azure.cn/Azure 中国github地址:https://github.com/Azure /container-service-for-azure-chinaDockerHub 镜像仓库: https://hub.docker.com/ 阿里云镜像仓库: https://cr.console.aliyun.com google 镜像仓库: https://console.cloud.google.com/gcr/images/google-containers/GLOBAL (如果你本地可以翻墙的话是可以连上去的 )coreos 镜像仓库: https://quay.io/repository/ RedHat 镜像仓库: https://access.redhat.com/containers
工作原理 CS结构守护进程运行在主机上,通过Socket从客户端访问。S接收到客户端C的指令后执行 Docker比VM快的原因:
1.Docker抽象层小于虚拟机 2.docker调用宿主机内核,VM需要Guest OS
益处:新建容器不二次加载操作系统内核,避免引导性操作。省略了复杂的过程,达到秒级启动。
Docker基本命令 帮助命令
docker version docker info docker 命令 --help 命令相关的帮助文档的地址:https:
镜像命令 docker images 显示信息 [root@localhost ~] REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest 9c7a54a9a43c 9 days ago 13.3kB REPOSITORY 镜像的仓库源 TAG 镜像的标签 IMAGE ID 镜像的ID CREATED 镜像的创建时间 SIZE 镜像的大小 Options: -a, --all -q, --quiet
docker search 搜索镜像 docker search # 搜索命令https ://hub.docker.com/ # 在线搜索docker(类似于docker商店)# 可选项,通过收藏来过滤 [root@localhost ~]# docker search mysql NAME DESCRIPTION STARS OFFICIAL AUTOMATED mysql MySQL is a widely used, open-source relation… 14124 [OK ] mariadb MariaDB Server is a high performing open sou… 5394 [OK ]
docker pull下载 # 下载镜像:docker pull 镜像 [:tag(指定版本)] docker pull[root@localhost docker]# docker pull mysql Using default tag: latest # 如果不写tag,默认下载latest(最新版本)latest : Pulling from library/mysql72a69066d2fe: Pull complete # 分层下载,docker images核心 联合文件系统 93619dbc5b36: Pull complete # 联合文件系统:之前下载过的层,在下载mysql的其它版本时,也能调用这几个层,防止重复下载 99da31dd6142: Pull complete 626033c43d70: Pull complete 37d5d7efb64e: Pull complete ac563158d721 : Pull complete d2ba16033dad : Pull complete 688ba7d5c01a: Pull complete 00e060b6d11d: Pull complete 1c04857f594f: Pull complete 4d7cfa90e6ea: Pull complete e0431212d27d : Pull complete Digest : sha256:e9027fe4d91c0153429607251656806cc784e914937271037f7738bd5b8e7709 # 签名信息,防止伪造Status : Downloaded newer image for mysql:latestdocker .io/library/mysql:latest # 真实地址# docker pull mysql 等价于 dokcer pull .io/library/mysql:latest # 指定版本下载 # 指定的版本是可以在docker仓库官方那里看到的,不能瞎写 docker pull mysql:5.7 [root@localhost docker]# docker pull mysql:5.7 5.7 : Pulling from library/mysql72a69066d2fe: Already exists 93619dbc5b36: Already exists 99da31dd6142: Already exists 626033c43d70: Already exists 37d5d7efb64e: Already exists ac563158d721 : Already exists d2ba16033dad : Already exists 0ceb82207cd7: Pull complete 37f2405cae96: Pull complete e2482e017e53 : Pull complete 70deed891d42: Pull complete Digest : sha256:f2ad209efe9c67104167fc609cca6973c8422939491c9345270175a300419f94Status : Downloaded newer image for mysql:5.7 docker .io/library/mysql:5.7
docker rmi 删除镜像 # 删除指定镜像 docker rmi [镜像名称或ID ]docker rmi -f 镜像ID # 删除多个镜像 docker rmi 镜像id 镜像id 镜像id ...# 删除所有的镜像,且按照ID一个一个递归删除 docker rmi -f $(docker images -aq)
容器命令
docker run命令 docker run [可选参数] images --name="Name" -d -it -p -p ip:主机端口:容器端口 -p 主机端口:容器端口 (常用的) -p 容器端口 容器端口 -P [root@localhost ~] [root@6 be243feda49 /] bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var [root@localhost docker]
docker ps 查看命令 -a -n=? -q [root@localhost docker] [root@localhost docker]
退出容器
删除容器 docker rm 容器ID docker rm -f 容器ID docker rm -f $(docker iamges -aq) docker ps -aq|xargs docker rm
启动和停止容器的操作 docker start id docker restart id docker stop id docker kill id
常用其它命令(重要) 后台启动 [root@localhost docker]# # 命令docker run -d 镜像名 [root@localhost docker]# docker run -d centos 2c41b7d4115cd2bc9e71a9d1d9a8a341da89fa275cc27541ca7012b75c7ba4c1 [root@localhost docker]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES # 后台启动,发现没有前台进程,直接被杀掉了