初识 Docker


Docker 简介


Docker 的用途

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,发布到任何流行的 Linux 或 Windows 机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。

编程开发一般会经历开发环境,测试环境以生产环境,Docker 就是将开发环境和程序代码一起打包到服务器中运行的技术,例如以下的过程:

java 语言 --> apk 程序 --> 发布到应用商店 --> 客户下载 apk --> 安装使用(必须要有环境才能安装成功)

java 语言 --> jar 环境 --> 打包项目和环境(镜像) --> 上传到 docker仓库(商店) --> 下载仓库中的镜像 --> 运行使用

Docker 的核心思想就是来自集装箱(集装箱的概念是隔离货物,所以Docker 的核心就是隔离机制),Docker 使用可移植镜像,所以部署以及运维极其方便快捷。


Docker 引擎架构

Docker 引擎(Docker Engine)是目前主流的容器引擎,Docker 引擎是一个包含以下组件的 C/S 架构的应用程序,如下图所示:

docker_engine.png

  • 服务器:Docker 守护进程(Daemon),这是 Docker 的后台应用程序,可使用 docker 命令进行管理。Docker 守护进程监听来自 Docker API 的请求,可用于创建和管理 Docker 对象,如镜像、容器、网络和卷,一台主机运行一个 Docker 守护进程。

  • REST API:定义程序与 Docker 守护进程交互的接口,便于编程操作 Docker 平台和容器,REST API 是一套目前比较成熟的 Internet 应用程序 API 架构。

  • 客户端:命令行接口(Command-Line Interface,CLI),可使用 docker 命令进行操作。命令行接口又称命令行界面,可以通过命令或脚本使用 Docker 的 REST API 接口来控制 Docker 守护进程或者与 Docker 守护进程进行交互。


Docker 基本组成

Docker 的基本组成,如下图所示:

  • 镜像(image)

Docker 镜像相当于是一个 root 文件系统,比如官方镜像 Ubuntu:16.04 就包含一套 Ubuntu:16.04 最小系统的 root 文件系统。

  • 容器(container)

容器和镜像的关系就像是面向对象程序设计中的类和对象语言,镜像是静态的定义,容器是镜像运行的实体,容器可以被创建、启动、停止、删除、暂停等。

  • 仓库(repository)

仓库可看成一个代码控制中心,用来保存镜像。

说明

(1)Docker 客户端与 Docker 守护进程通信,而 Docker 守护进程相当于 Docker 服务器,负责构建、运行和分发容器的繁重任务。

(2)Docker 客户端与守护进程可以在同一个系统上运行,也可以让 Docker 客户端连接到远程主机上的 Docker 守护进程。

(3)Docker客户端和守护进程使用 REST API 通过 UNIX 套接字(Socket)或网络接口进行通信,Docker守护进程和 Docker 客户端属于 Docker 引擎的一部分。

(4)Docker 注册中心用于存储和分发 Docker 镜像。默认情况下,Docker 守护进程会到 Docker Hub 中查找镜像,除此之外还可以运行自己的私有注册中心。


Docker 底层技术

(1)名称空间(Namespace):又称命名空间,Linux 的名称空间机制提供了一种资源隔离的解决方案,Docker 通过名称空间机制为容器提供隔离的工作空间,运行容器时,Docker 会为该容器创建 一系列的名称空间。

(2)控制组(Control Group):Linux 可以通过控制组设置进程使用 CPU 、内存和 I/O 资源的限额, Linux 上的 Docker 引擎正是依赖这种底层技术来限制容器使用的资源。

(3)联合文件系统(Union File System,UnionFS):这是为 Linux、FreeBSD 和 NetBSD 操作系统设计的一种文件系统,可以将其它文件系统合并到一个联合挂载点。作为轻量级的高性能分层文件系统,联合文件系统支持将文件系统中的变更信息进行提交,联合文件系统是实现 Docker 镜像的技术基础,Docker 镜像可以通过分层来实现继承。

(4)容器格式(Container Format):Docker 引擎将名称空间、控制组和联合文件系统打包到一起所使用的就是容器格式,默认的容器格式是 Libcontainer 。


Docker 容器与虚拟机的区别

  • 虚拟机:通过虚拟化技术模拟真实的硬件从而创建出来的一台拥有完整功能的逻辑计算机。

  • Docker 容器:docker 容器也是一种虚拟化技术,但与传统虚拟化不一样的是docker 只模拟一个程序最核心的运行环境,所以十分小巧,启动更快。

Docker虚拟化技术和传统虚拟化技术架构对比:

对比特点
虚拟机完整的系统功能,隔离性更好,占用空间大(通常以G为单位),运行占用资源较多,启动慢(分钟级启动)
容器只有程序运行的核心环境,不需要安装直接运行镜像即可,隔离性一般,十分小巧占用空间极小(一般以M为单位),启动快(秒级启动)

Docker 的安装与配置


  • 配置仓库
# 1.首先
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
  • 卸载旧的版本
yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
  • 设置镜像的仓库
yum-config-manager \
   --add-repo \
   https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 推荐使用阿里云的。
  • 安装
# 4.安装容器相关的。docker-ce(社区版)docker-ee(企业版)
yum install docker-ce 


- 启动 docker 服务并设置开机自启

```bash
# 5.启动docker
systemctl start docker
systemctl enable docker
  • 使用 docker version 查看是否安装成功
docker version

# 7.测试hello-world
docker run hello-world

  • 查看下载的这个 hello-world 镜像
# 8.


配置 Docker 镜像加速器

默认情况下,从 docker hub 上下载镜像网速缓慢,因此需要配置镜像加速器,新建 docker-ce 的配置文件 /etc/docker/daemon.json ,Docker 的加速器有如下的几种:

  • docker cn
  • 中国科技大学加速器
  • 阿里云加速器
  • 网易云
  • 腾讯云

阿里云加速器的配置:

  • 登录之后点击左上角 控制台 ,在点击左上角 产品与服务 ,如下图所示:

  • 弹性计算 里找到 容器镜像服务 ,如下图所示:

  • /etc/docker 目录下新建 daemon.json 文件,将加速器的地址写入,依次输入如下命令:

mkdir -p /etc/docker
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://此处地址为自己阿里云镜像加速地址.mirror.aliyuncs.com"]
}
  • 重启服务
systemctl daemon-reload
systemctl restart docker
  • 卸载 Docker
# 1.卸载依赖
apt-get remove docker-ce 
# 2.删除资源
# /var/lib/docker  docker的默认工作路径
rm -rf /var/lib/docker
rm -rf /var/lib/containerd

Docker 基本操作


帮助相关命令

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

进程相关命令

  • 启动 docker 服务
systemctl start docker
  • 停止 docker 服务
systemctl stop docker
  • 重启 docker 服务
systemctl restart docker
  • 查看 docker 服务状态
systemctl status docker
  • 设置开机启动 docker 服务
systemctl enable docker

镜像相关命令

  • 查看镜像:查看本地主机上所有的镜像
docker images

REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
hello-world   latest    feb5d9fea6a5   10 months ago   13.3kB
列表说明
REPOSITORY镜像的仓库源
TAG镜像的标签
IMAGE ID镜像的 ID
CREATED镜像的创建时间
SIZE镜像的大小
命令参数可选项说明
-a / --all显示所有镜像 (docker images -a)
--digests显示镜像的摘要信息(docker images --digests)
-q / --quiet仅显示镜像的 ID (docker images -q)
  • 搜索镜像
docker search mysql
NAME      DESCRIPTION                            STARS     OFFICIAL   AUTOMATED
mysql     MySQL is a widely used, open-source relation…   12966     [OK]       
......
列表说明
NAME镜像仓库源的名称
DESCRIPTION表示该镜像的功能
STARS表示下载热度
OFFICIAL是否由 docker 官方发布
AUTOMATED自动构建
命令参数可选项说明
--filter=STARS=3000搜索出来的镜像 stars大于 3000
  • 拉取镜像:镜像名称格式为 名称:版本号
# 下载镜像:docker pull 镜像名[:tag]
[root@localhost ~]# docker pull mysql
Using default tag: latest						#如果不写tag,默认就是latest,最新的版本
latest: Pulling from library/mysql
32c1bf40aba1: Pull complete 				 # 分层下载,docker image的核心,联合文件下载
3ac22f3a638d: Pull complete 
b1e7273ed05e: Pull complete 
20be45a0c6ab: Pull complete 
410a229693ff: Pull complete 
1ce71e3a9b88: Pull complete 
c93c823af05b: Pull complete 
c6752c4d09c7: Pull complete 
d7f2cfe3efcb: Pull complete 
916f32cb0394: Pull complete 
0d62a5f9a14f: Pull complete 
Digest: sha256:ce2ae3bd3e9f001435c4671cf073d1d5ae55d138b16927268474fc54ba09ed79
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest			# 真实地址

# 指定版本下载
[root@localhost ~]# 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
  • 删除镜像:删除本地镜像
[root@localhost ~]# docker rmi -f 镜像id              # 删除指定的镜像
[root@localhost ~]# docker rmi -f 镜像id 镜像id 镜像id    # 删除多个镜像(空格分隔)
[root@localhost ~]# docker rmi -f $(docker images -aq)    # 删除全部的镜像
  • 获取镜像的详细信息
[root@localhost ~]# docker inspect 镜像名:标签
  • 添加镜像别名
[root@localhost ~]# docker tag 镜像名:标签 新镜像名:新标签

# 示例:
[root@localhost ~]# docker tag mysql:5.7 mysql:alone
[root@localhost ~]# docker images 
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
mysql        5.7      3147495b3a5c   8 days ago      431MB
mysql        alone     3147495b3a5c   8 days ago      431MB

容器相关命令

说明:有了镜像才可以创建容器,下载一个 centos 镜像来测试学习。

docker pull centos
  • 创建新的容器
[root@localhost ~]# docker create 镜像名

# 示例:
[root@localhost ~]# docker create centos
1f8c0d836c2751fd39b46922d256505626925a7519154e2d0b811ede561bb097
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS    PORTS     NAMES
1f8c0d836c27   centos    "/bin/bash"   10 seconds ago   Created             jovial_chaum
  • 创建并运行容器
docker run [可选参数] image
# 参数说明
--name="name"        容器名字:用来区分容器
-d                    后台方式运行:相当于nohup
-it                    使用交互式运行:进入容器查看内容
-p                    指定容器的端口(四种方式)小写字母p
    -p ip:主机端口:容器端口
    -p 主机端口:容器端口
    -p 容器端口
    容器端口
-P                     随机指定端口(大写字母P)

#使用centos镜像启动一个名为centos0的容器
[root@localhost ~]# docker run --name centos0 centos

# 使用centos镜像启动容器并分配一个bash shell的终端进入容器
[root@localhost ~]# docker run -it centos /bin/bash
[root@6c39cc898c6c /]# ls		 # 查看容器内的centos(基础版本,很多命令都是不完善的)
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@6c39cc898c6c /]# exit
exit
# 注意:
1.指定-it选项为容器分配shell后,启动容器时运行的命令将会被shell替代
2.不加-d选项的容器一旦使用exit退出容器shell,容器就终止运行;ctrl+p+q可以退出shell,容器仍将继续运行

# 使用 mysql镜像启动一个名为 mysql1的容器并在后台运行
[root@localhost ~]# docker run --name mysql1 -d mysql
867c0734a5f21ae1fb607f5cdf2eb03bb4494eb5dc1056caa164689d0a2dc76f

#使用 mysql镜像启动一个名为 mysql2的容器,该容器在后台运行,访问宿主机的8080端口可以访问到容器的80端口
[root@localhost ~]# docker run --name mysql2 -d -p 8080:80 mysql
c07b515d0041fbb6905990c9377971fd0353cdb63e1adb80f5f05648d850baf8
  • 查看容器
docker ps 		// 	查看容器运行状态
# 选项:
-a 				// 显示所有的容器,包括未运行的
-q				// 只显示容器id
-l				// 显示最近创建的容器。
-f "筛选条件"	// 根据条件过滤显示的内容

# 示例:
示例:
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE        COMMAND    CREATED          STATUS           PORTS     NAMES
c8af463c6e52   hello-world   "/hello"   14 seconds ago  Exited (0) 13 seconds ago     strange_cartwright

# 解释
CONTAINER ID		 //容器 ID
IMAGE			     //使用的镜像
COMMAND			   //启动容器时运行的命令
CREATED			   //容器的创建时间
STATUS			  //容器状态
# 容器状态有7种:
	created(已创建)
	restarting(重启中)
	running(运行中)
	removing(迁移中)
	paused(暂停)
	exited(停止)
	dead(死亡)
PORTS			//容器的端口信息和使用的连接类型(tcp\udp)。
NAMES			//容器名称
  • 查看容器详细信息
# 示例:
[root@localhost ~]# docker inspect test
..............
  • 删除容器(若容器是运行状态则删除失败,需停止容器才能删除)

docker rm 删除容器

docker rm 容器名			//删除容器,无法删除运行状态下的容器
选项:
-f				//强制,可以删除运行状态下的容器

# 示例:
//删除mysql1容器
[root@localhost ~]# docker rm nginx01
mysql1

//批量删除所有容器
[root@localhost ~]# docker rm $(docker ps -qa)
9b2fa686b4ae
a4f41fb35ac3
  • 容器生命周期管理命令
docker start   容器名	//开启容器
docker stop    容器名	//停止容器
docker kill    容器名	//杀死容器
docker restart  容器名	 //重启容器
docker pause   容器名	//暂停容器中所有的进程
docker unpause  容器名	 //恢复容器中所有的进程
  • 容器占用资源查看命令
docker stats  容器名	//查看容器使用资源信息
docker top    容器名	//查看容器中运行的进程信息,支持ps命令参数
docker port   容器名	//查看宿主机端口和容器端口之间的端口映射
  • 容器日志查看命令
# 当容器创建失败时,因为容器没有启动成功则无法看到错误日志,无法判断问题所在,下面命令可以查看日志,不管容器时候启动成功

docker logs   容器名	//获取容器的日志信息
选项:
-f			//跟随打印最新的日志追加在最后面
-t			//显示日志打印的时间戳
--tail 数量		//只显示最新的指定数量的几条日志信息

  • 容器内进程连接和命令执行

docker attach 连接到正在运行的容器进程中,默认连接到容器启动时启动的进程

# 连接到httpd03容器中的nginx进程,此时可以看到httpd03工作日志
[root@localhost ~]# docker attach httpd03
172.17.0.1 - - [04/Aug/2022:09:06:29 +0000] "GET / HTTP/1.1" 304 -
# 注意:使用attach连接到容器容器进程,一旦终止容器内的进程,容器就终止运行

# 如果容器启动时运行的命令是shell进程,则连接shell终端
[root@localhost ~]# docker attach httpd04
root@6b830320e24a:/usr/local/apache2# exit
exit

docker exec 不进入容器执行容器中的命令

# docker exec 容器名 执行命令	
选项:
-d				//后台执行,不显示结果
-it				//为容器分配一个始终运行的伪终端,需要指定shell;-i保持运行状态,-t是分配伪终端

# 示例:
#不进入容器执行容器中的ls命令
[root@localhost ~]# docker exec httpd04 ls			
bin
build
cgi-bin
......

# 使用docker exec命令打开一个shell进入到容器中,使用exit退出shell,容器也不会终止运行
[root@localhost ~]# docker run --name httpd05 -it -d httpd /bin/bash	
1b656ba8a5b5689c0b2e688537358779964a9e43f174ce3ab5ff7196dac4e402
[root@localhost ~]# docker exec -it httpd05 /bin/bash
root@1b656ba8a5b5:/usr/local/apache2# exit
exit

注意:docker exex # 进入容器后开启一个新的终端,可以再里面操作;docker attach # 进入容器正在执行的终端,不会启动新的进程。

镜像管理指令:

创建容器常用选项:


管理容器:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

물の韜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值