Docker理解与实践

142 阅读8分钟

前言

本篇文章主要学习“狂神说java”关于Docker的视频后总结的知识点,加深理解以及未来项目实战时,若哪个知识点模糊时,能够看到之前的总结,快速掌握该知识点的含义;

1、概念讲解

Docker是什么?

Docker是一个开源的应用容器引擎,可以让开发者打包他们的应用以及依赖到一个轻量级、可移植的容器中,然后发布到各种机器上;

什么是容器?

容器是一种轻量级、可移植和隔离的软件环境,允许开发人员在不同平台上运行和打包应用程序及其依赖项。它们有助于简化应用程序的开发、部署和管理过程,同时确保应用程序在不同基础架构下运行一致;

容器是如何工作的?

与传统虚拟化不同,传统虚拟化会模拟一个完整的操作系统及其硬件资源,而容器共享主机的操作系统内核,并利用轻量级虚拟化技术创建隔离的进程。这种方法带来的几个好处:

  • 高效性:容器的开销较小,可以共享公共库和可执行文件,从而在单个主机上运行比虚拟机(VM)更多的容器。
  • 可移植性:容器封装了应用程序及其依赖项,因此它们可以轻松地在不同的环境和平台上移动和运行。
  • 一致性:容器为应用程序的开发、测试和生产阶段提供了一致的环境,从而减少了“它在我机器上可以运行,在别的机器上不能运行”的问题。

容器和Docker

Docker是一种简化创建、部署和管理容器的平台。它为开发人员提供了一组工具和API,用于管理容器化的应用程序。使用Docker,您可以将应用程序代码、库和依赖项构建和打包成一个容器镜像,该镜像可以支持在Docker的任何环境中分发和一致地运行。

2、Docker安装

Docker基本组成

Docker基本组成.png

安装教程

官方指导

本文以CentOS操作系统为例,进行讲解Docker的安装。
其实Docker官方文档步骤很详细,不过是英文版的,对英语基础弱的朋友不太友好。

Docker安装指南.png

注意事项:

  • CentOS版本要求至少从7开始,之前的版本不行

安装过程

1、 检查操作系统环境是否符合条件

cat /etc/os-release

操作系统环境检查.png

2、卸载Docker旧版本

sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

卸载Docker旧版本.png

3、安装需要的安装包

sudo yum install -y yum-utils

若报如下错

安装Docker安装包失败.png

可按照如下教程进行修复:
blog.51cto.com/yimiyinei/6…

修复后执行成功效果:

安装Docker安装包成功.png

4、设置镜像仓
官方教程默认指定的是国外的镜像仓,不过速度太慢了,我这里使用的是阿里云的镜像仓:
mirrors.aliyun.com/docker-ce/l…

sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

添加Docker镜像仓成功.png

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引擎安装完成.png

如果想要安装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是否安装成功.png

如果如上图所示:代表Docker安装成功

7、测试一条Docker命令

docker run hello-world

测试docker-hello-world.png

从上图中,我们可以看到:
本地没找到hello-world镜像,从远程拉取。拉取成功,响应一堆信息回来。

8、查看本地下载的镜像

docker images

查看docker下载下来的镜像.png

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、配置阿里云镜像加速

  • 先登录阿里云后,去到首页,点击产品

阿里云镜像加速菜单.png

  • 点击管理控制台

管理控制台.png

  • 点击镜像工具,选择镜像加速器后,操作文档选择CentOS

镜像加速器.png

操作命令

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

镜像加速器执行.png

Docker Run工作原理

Docker Run运行流程图.svg

底层原理

Docker 底层原理.svg

Docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上。通过Socket从客户端访问!DockerServer接收到Docker-Client的指令,就会执行这个命令!

Docker为什么比VM快

  • Docker有着比虚拟机更少的抽象层,不需要实现硬件资源虚拟化,运行在Docker容器上的程序直接使用的都是实际物理机的硬件资源,因此在CPU、内存使用率上Docker将会在效率上有明显优势。
  • Docker利用的是宿主机的内核,而不需要Guest OS,因此,在新建一个容器的时候,Docker不需要跟虚拟机一样重新加载一个操作系统内核,Docker由于直接利用宿主机的操作系统,因此新建一个Docker容器只需要几秒钟。

虚拟机与Docker架构对比图.png

3、Docker的常用命令

Docker官方文档操作命令查找入口

  • 首页-> Developers-Docs

Docker Docs.png

  • 找到Reference

Docker reference.png

  • 左边导航栏,Command-line reference -> Docker CLI(docker)

Docker CLI.png

帮助命令

docker version #查看docker版本
docker info    #显示docker的系统信息,包括镜像和容器的数量
docker --help  #帮助命令

Docker-info.png

Docker--help.png

镜像命令

docker images

Docker-images.png

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镜像.png

列出镜像的id.png

搜索命令

docker search mysql

Docker-Search命令展示.png

  • 可以带条件搜索
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-Search-filter.png

下载命令

docker pull mysql[:tag]

#tag版本号,需要去dockerHub上寻找,不指定,默认下载latest(最新版)

Docker-pull命令.png

[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

image.png 可以发现之前下载好的文件,无需再次下载了;(分层的好处)

删除命令

  • 删除指定的镜像
docker rmi -f 容器镜像ID #删除指定容器镜像ID
docker rmi -f 容器镜像ID 容器镜像ID 容器镜像ID #删除多个容器镜像ID
docker rmi -f ${docker images -aq} #删除全部的容器镜像ID

image.png

image.png

容器命令

  • 新建容器并启动
docker run [#可选参数] image

# 参数说明
--name="name" 容器名字,比如tomcat1,用来区分容器
-d            后台方式运行
-it           指定交互方式运行,进入容器查看内容
-p            指定容器端口 -p 8080:8080
  -p ip:主机端口:容器端口
  -p 主机端口:容器端口(常用)
  -p 容器端口
  容器端口
-P            随机指定端口

进入容器

当前在此之前,需要先下载镜像

docker pull centos

image.png

docker run -it centos /bin/bash

image.png

退出容器

退出并停止

exit

image.png

退出不停止

ctrl + P + Q

image.png

查看容器

查看运行中的容器

docker ps

      #列出当前正在运行的容器
-a    #列出当前正在运行的容器+带出历史运行的容器
-n=?  #显示最近创建的容器
-q    #只显示容器的编号

image.png

删除容器

docker rm 容器id               #删除指定的容器,不能删除正在运行的容器,强制删除需要使用-f
docker rm -f $(docker ps -aq)  #删除所有的容器
docker ps -a -q|xargs docker rm #删除所有的容器

image.png

启动和停止容器

docker start 容器id   #启动容器
docker restart 容器id #重启容器
docker stop 容器id    #停止当前正在运行的容器
docker kill 容器id    #强制停止当前容器

image.png

常用其他命令

后台启动容器

#命令 docker run -d [image]
[root@centos8 ~]# docker run -d centos
#问题docker ps 发现centos停止了
#常见的坑:docker 容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止,比如nginx,容器启动后,发现自己没有提供服务,就会立即停止

image.png

查看日志

docker logs -tf [容器id]

-tf           #显示日志
--tail number #要显示的日志条数

查看容器中进程信息

docker top [容器id]

image.png

查看镜像中的元数据

docker inspect [容器id]

image.png

进入当前正在进行的容器

  • 我们通常容器都是使用后台方式运行的,需要进入容器,修改一些配置

方式一 exec

docker exec -it [容器id] [bashShell]

image.png

方式二 attach

docker attach [容器id]

#进去后,显示正在执行的代码...

image.png

两种区别

docker exec   #进入容器后开启一个新的终端,可以在里面操作(常用)
docker attach #进入容器正在执行的终端,不会启动新的进程

从容器内拷贝文件到主机上

docker cp [容器id:容器内路径 目的的主机路径]

image.png

  • 拷贝是一个手动过程,未来我们使用 -v 卷的技术,可以实现自动拷贝

命令小结

image.png