前言
本篇文章主要学习“狂神说java”关于Docker的视频后总结的知识点,加深理解以及未来项目实战时,若哪个知识点模糊时,能够看到之前的总结,快速掌握该知识点的含义;
1、概念讲解
Docker是什么?
Docker是一个开源的应用容器引擎,可以让开发者打包他们的应用以及依赖到一个轻量级、可移植的容器中,然后发布到各种机器上;
什么是容器?
容器是一种轻量级、可移植和隔离的软件环境,允许开发人员在不同平台上运行和打包应用程序及其依赖项。它们有助于简化应用程序的开发、部署和管理过程,同时确保应用程序在不同基础架构下运行一致;
容器是如何工作的?
与传统虚拟化不同,传统虚拟化会模拟一个完整的操作系统及其硬件资源,而容器共享主机的操作系统内核,并利用轻量级虚拟化技术创建隔离的进程。这种方法带来的几个好处:
- 高效性:容器的开销较小,可以共享公共库和可执行文件,从而在单个主机上运行比虚拟机(VM)更多的容器。
- 可移植性:容器封装了应用程序及其依赖项,因此它们可以轻松地在不同的环境和平台上移动和运行。
- 一致性:容器为应用程序的开发、测试和生产阶段提供了一致的环境,从而减少了“它在我机器上可以运行,在别的机器上不能运行”的问题。
容器和Docker
Docker是一种简化创建、部署和管理容器的平台。它为开发人员提供了一组工具和API,用于管理容器化的应用程序。使用Docker,您可以将应用程序代码、库和依赖项构建和打包成一个容器镜像,该镜像可以支持在Docker的任何环境中分发和一致地运行。
2、Docker安装
Docker基本组成
安装教程
官方指导
本文以CentOS操作系统为例,进行讲解Docker的安装。
其实Docker官方文档步骤很详细,不过是英文版的,对英语基础弱的朋友不太友好。
注意事项:
- CentOS版本要求至少从7开始,之前的版本不行
安装过程
1、 检查操作系统环境是否符合条件
cat /etc/os-release
2、卸载Docker旧版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
3、安装需要的安装包
sudo yum install -y yum-utils
若报如下错
可按照如下教程进行修复:
blog.51cto.com/yimiyinei/6…
修复后执行成功效果:
4、设置镜像仓
官方教程默认指定的是国外的镜像仓,不过速度太慢了,我这里使用的是阿里云的镜像仓:
mirrors.aliyun.com/docker-ce/l…
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
4、安装Docker引擎
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
注意:一路选Y即可
- docker-ce:社区办
- docker-ee:企业版
- docker-ce-cli:Docker客户端
- containerd.id:容器
- docker-buildx-plugin:Docker构建插件
- docker-compose-plugin:Docker容器编排插件
如果想要安装Docker指定版本,使用以下的命令
yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io docker-buildx-plugin docker-compose-plugin
5、启动Docker
sudo systemctl start docker
6、验证Docker是否安装成功
docker version
如果如上图所示:代表Docker安装成功
7、测试一条Docker命令
docker run hello-world
从上图中,我们可以看到:
本地没找到hello-world镜像,从远程拉取。拉取成功,响应一堆信息回来。
8、查看本地下载的镜像
docker images
9、如何卸载Docker
- 先卸载引擎
sudo yum remove docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras
- 再删除资源
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
Docker默认核心工作目录:
/var/lib/docker
/var/lib/containerd
10、配置阿里云镜像加速
- 先登录阿里云后,去到首页,点击产品
- 点击管理控制台
- 点击镜像工具,选择镜像加速器后,操作文档选择CentOS
操作命令
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://nenwl1oz.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
Docker Run工作原理
底层原理
Docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上。通过Socket从客户端访问!DockerServer接收到Docker-Client的指令,就会执行这个命令!
Docker为什么比VM快
- Docker有着比虚拟机更少的抽象层,不需要实现硬件资源虚拟化,运行在Docker容器上的程序直接使用的都是实际物理机的硬件资源,因此在CPU、内存使用率上Docker将会在效率上有明显优势。
- Docker利用的是宿主机的内核,而不需要Guest OS,因此,在新建一个容器的时候,Docker不需要跟虚拟机一样重新加载一个操作系统内核,Docker由于直接利用宿主机的操作系统,因此新建一个Docker容器只需要几秒钟。
3、Docker的常用命令
Docker官方文档操作命令查找入口
- 首页-> Developers-Docs
- 找到Reference
- 左边导航栏,Command-line reference -> Docker CLI(docker)
帮助命令
docker version #查看docker版本
docker info #显示docker的系统信息,包括镜像和容器的数量
docker --help #帮助命令
镜像命令
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest 9c7a54a9a43c 4 months ago 13.3kB
REPOSITORY #镜像的仓库源
TAG #镜像的标签
IMAGE ID #镜像的id
CREATED #镜像的创建时间
SIZE #镜像的大小
#可选项
-a, --all #列出所有的镜像
-q, --quiet #只列出镜像的id
搜索命令
docker search mysql
- 可以带条件搜索
docker search --help
Options:
-f, --filter filter Filter output based on conditions provided #加过滤条件
--format string Pretty-print search using a Go template #格式化输出
--limit int Max number of search results #最大输出结果
--no-trunc Don't truncate output
- filter条件过滤
docker search mysql --filter=STARS=3000 #搜索收藏数大于3000
下载命令
docker pull mysql[:tag]
#tag版本号,需要去dockerHub上寻找,不指定,默认下载latest(最新版)
[root@centos8 ~]# docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql #默认下载最新版本
72a69066d2fe: Pull complete #分层下载,docker image的核心,联合文件系统
93619dbc5b36: Pull complete
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:5.7
可以发现之前下载好的文件,无需再次下载了;(分层的好处)
删除命令
- 删除指定的镜像
docker rmi -f 容器镜像ID #删除指定容器镜像ID
docker rmi -f 容器镜像ID 容器镜像ID 容器镜像ID #删除多个容器镜像ID
docker rmi -f ${docker images -aq} #删除全部的容器镜像ID
容器命令
- 新建容器并启动
docker run [#可选参数] image
# 参数说明
--name="name" 容器名字,比如tomcat1,用来区分容器
-d 后台方式运行
-it 指定交互方式运行,进入容器查看内容
-p 指定容器端口 -p 8080:8080
-p ip:主机端口:容器端口
-p 主机端口:容器端口(常用)
-p 容器端口
容器端口
-P 随机指定端口
进入容器
当前在此之前,需要先下载镜像
docker pull centos
docker run -it centos /bin/bash
退出容器
退出并停止
exit
退出不停止
ctrl + P + Q
查看容器
查看运行中的容器
docker ps
#列出当前正在运行的容器
-a #列出当前正在运行的容器+带出历史运行的容器
-n=? #显示最近创建的容器
-q #只显示容器的编号
删除容器
docker rm 容器id #删除指定的容器,不能删除正在运行的容器,强制删除需要使用-f
docker rm -f $(docker ps -aq) #删除所有的容器
docker ps -a -q|xargs docker rm #删除所有的容器
启动和停止容器
docker start 容器id #启动容器
docker restart 容器id #重启容器
docker stop 容器id #停止当前正在运行的容器
docker kill 容器id #强制停止当前容器
常用其他命令
后台启动容器
#命令 docker run -d [image]
[root@centos8 ~]# docker run -d centos
#问题docker ps 发现centos停止了
#常见的坑:docker 容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止,比如nginx,容器启动后,发现自己没有提供服务,就会立即停止
查看日志
docker logs -tf [容器id]
-tf #显示日志
--tail number #要显示的日志条数
查看容器中进程信息
docker top [容器id]
查看镜像中的元数据
docker inspect [容器id]
进入当前正在进行的容器
- 我们通常容器都是使用后台方式运行的,需要进入容器,修改一些配置
方式一 exec
docker exec -it [容器id] [bashShell]
方式二 attach
docker attach [容器id]
#进去后,显示正在执行的代码...
两种区别
docker exec #进入容器后开启一个新的终端,可以在里面操作(常用)
docker attach #进入容器正在执行的终端,不会启动新的进程
从容器内拷贝文件到主机上
docker cp [容器id:容器内路径 目的的主机路径]
- 拷贝是一个手动过程,未来我们使用 -v 卷的技术,可以实现自动拷贝