跟着狂神学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 --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 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/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://tjn8a2dr.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo 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-china
DockerHub镜像仓库: 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版本信息
docker info # 显示docker更加详细的信息,系统信息,镜像/容器数量等。
docker 命令 --help # 万能命令

命令相关的帮助文档的地址:https://docs.docker.com/reference/

镜像命令

docker images 显示信息

[root@localhost ~]# docker images
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 # 只显示镜像的ID

docker search 搜索镜像

docker search           # 搜索命令
https://hub.docker.com/ # 在线搜索docker(类似于docker商店)

# 可选项,通过收藏来过滤
--fiter-STARS=3000 # 搜索出来的镜像就是STAEAS(收藏量)大于3000的
[root@localhost ~]# docker search mysql --filter=STARS=3000
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/mysql
72a69066d2fe: 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:latest
docker.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/mysql
72a69066d2fe: 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:f2ad209efe9c67104167fc609cca6973c8422939491c9345270175a300419f94
Status: 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)

容器命令

# 下载容器
[root@localhost docker]# docker pull centos
# 新建容器+启动容器

docker run命令

docker run [可选参数] images
# 参数说明
--name="Name" # 容器命名,用于区分容器
-d # 后台方式运行
-it # 使用交互方式运行,进入容器,查看内容
-p # 指定容器端口
-p ip:主机端口:容器端口
-p 主机端口:容器端口 (常用的)
-p 容器端口
容器端口
-P # 随机指定端口

# 测试
# 进入容器,并且打开控制台
[root@localhost ~]# docker run -it centos /bin/bash
[root@6be243feda49 /]# ls # (证明主机名是镜像ID)基础版本,很多命令都是不完善的
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var

# 从容器当中退出主机
[root@localhost docker]# exit
# 查看当前正在运行的容器

docker ps 查看命令

# 参数:
# 留空,无参数代表 列出当前正在运行的容器
-a # 列出当前正在运行的容器+历史运行过的容器
-n=? # 显示最近创建的容器 使用-n=1,显示最近创建的一个容器
-q # 只显示容器的编号

[root@localhost docker]# docker ps
# 查看运行过的容器
[root@localhost docker]# docker ps -a

退出容器

exit      # 直接容器停止并退出 
Ctrl+P+Q # 容器不停止的退出(要打开大写锁)

删除容器

# 和刚刚的删除差不多
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
# 后台启动,发现没有前台进程,直接被杀掉了