目录
1 什么是Docker?
Docker 是一种用于构建、部署和运行应用程序的开源平台,它使用容器技术来实现轻量级、可移植和自包含的应用程序环境。Docker 的核心思想是将应用程序及其依赖项打包到一个称为容器的封闭单元中,从而消除了在不同环境中运行应用程序时可能出现的许多兼容性和依赖性问题。
相较于虚拟机技术而言
- 传统虚拟机需要需要虚拟出一套完整的硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件
- Docker使用容器化技术, 每个容器是相互隔离的,且每个容器都有一个属于自己的文件系统,互不影响.容器包含应用及其所有依赖项,可以在不同的系统上直接运行.
- 由于Docker容器共享宿主机的内核,无需额外的操作系统,占用资源较少。
2 Docker 和 DevOps[开发/运维]
1应用更快速的交付和部署
Docker 打包成镜像发布测试,一键运行 .
2更编辑的升级和扩缩容
使用Docker后,部署应用就像搭积木一样,项目打包成惊吓过后,可以水平直接扩容到其他的服务器上
3更简单的系统运维
在容器化之后,我们的开发和测试环境是高度一致的
4更高效的计算资源利用
Docker 是内核级别的虚拟化技术,可以在一个物理机上运行很多的容器实例,服务器的性能可以被压榨到极致
3 Docker 架构
3.1 Docker 中术语说明
-
镜像[Image]: 镜像是Docker中的关键概念,它是一个轻量级、独立的可执行软件包,包含运行应用程序所需的一切,包括代码、运行时、库、环境变量和配置文件。镜像是容器的基础,通过镜像可以创建并运行一个或多个容器实例。
-
容器[Container]: 通过镜像可以实例化多个容器实例 ,这意味着容器中也包含了应用程序所需的一切.对容器的操作包括 删除 运行 启动
镜像和容器的关系 相当于Java程式中.Class 和 实例对象. 一个.Class可以new出不同的实例对象. 镜像是模版,依靠模版可以创建不同的容器
-
仓库[Repository]: 仓库用于集中存储和管理 Docker 镜像,使得开发者和团队可以方便地访问和共享这些镜像。常用的镜像仓库为DockerHub 阿里云镜像库等.
-
客户端:
-
服务端:
4 Docker安装
环境说明
Centos8 [使用dnf指令来替代yum 下载依赖包]
安装步骤
- 卸载旧版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
- 配置Docker的国内仓库地址
sudo dnf config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo [官方文档默认是使用国外的镜像,不建议使用这个,下载慢]
- 安装docker相关的Package
sudo dnf install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
- 启动docker
sudo systemctl start docker
docker version
- 设置Docker镜像仓库 /etc/docker/daemon.json
registry-mirrors
是一个数组,它可以包含多个镜像加速地址。添加镜像加速地址可以让 Docker 优先从这些地址拉取镜像,而不是直接从 Docker Hub 拉取,从而提高拉取速度,特别是在国内网络环境下,可以有效避免网络连接问题和拉取速度慢的问题
{
"registry-mirrors":[ "https://docker.1ms.run", "https://doublezonline.cloud", "https://dislabaiot.xyz", "https://docker.fxxk.dedyn.io", "https://dockerpull.org", "https://docker.unsee.tech", "https://hub.rat.dev", "https://docker.1panel.live", "https://docker.nastool.de", "https://docker.zhai.cm", "https://docker.5z5f.com", "https://a.ussh.net", "https://docker.udayun.com", "https://hub.geekery.cn" ] }
- 测试运行docker
sudo docker run hello-world
-
查看镜像
docker images
6 Docker命令
6.1 镜像命令
- docker images 查询本地镜像 等价于 docker image ls
[root@hcss-ecs-b45b ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest d2c94e258dcb 20 months ago 13.3kB
# 说明
REPOSITORY[镜像名] TAG[标签] IMAGE ID[镜像ID] CREATED[创建时间] SIZE[大小]
# 可选项
-a 获得所有的镜像
-q 只获得镜像的ID
- docker image pull name[:tag] 下载镜像
[root@hcss-ecs-b45b ~]# docker pull mysql
Using default tag: latest # 当默认不写镜像的版本时,将会使用latest
latest: Pulling from library/mysql
2c0a233485c3: Pull complete # 分层下载,这个是docker image的核心 ,与联合文件系统挂钩
cb5a6a8519b2: Pull complete
570d30cf82c5: Pull complete
a841bff36f3c: Pull complete
80ba30c57782: Pull complete
5e49e1f26961: Pull complete
ced670fc7f1c: Pull complete
0b9dc7ad7f03: Pull complete
cd0d5df9937b: Pull complete
1f87d67b89c6: Pull complete
Digest: sha256:0255b469f0135a0236d672d60e3154ae2f4538b146744966d96440318cc822c6 #签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest # 真实地址 等价于 docker pull docker.io/library/mysql:latest
- docker image remove / docker rmi 删除镜像
# docker image remove 镜像ID 根据ID去删除镜像
docker image remove d2c94e258dcb -f
# docker image -aq 获得所有的镜像ID
docker image remove $(docker image -aq ) -f
# 可选项
-f 强制删除
6.2 容器命令
所有的容器操作都需要依赖于镜像的存在
- docker container run /docker run 新建一个容器并启动 docker run | Docker Docs
[root@hcss-ecs-b45b ~]# docker run -it --name centos_1 centos /bin/bash
[root@072e975e99e8 /]#
# 可选项
--name 給容器取別名
-p 设置运行端口
-it 内部交互运行
-d 后台运行 [ps:后台运行的容器存在一个坑,当容器中没有一个持续运行的服务/进程时,容器启动后将会很快退出]
- docker ps 查询当前正在运行的容器
[root@hcss-ecs-b45b ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ebd1e2a942ec centos "/bin/bash" 2 minutes ago Up 2 minutes centos_1
[root@hcss-ecs-b45b ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a88275c5bae6 centos "/bin/bash" About a minute ago Exited (0) About a minute ago cranky_rubin
5f4ecc20b3bc centos "-i bin/bash" 2 minutes ago Created xenodochial_keller
0d011149522d centos "-it bin/bash" 3 minutes ago Created affectionate_kowalevski
9ac64e0ecfd0 d2c94e258dcb "/hello" 9 days ago Exited (0) 9 days ago elegant_grothendieck
# 可选项
-a 查询所有的容器记录[包括已关闭的]
- 退出容器
exit 退出并关闭容器
ctrl+q+p 退出但不关闭容器
- 删除容器
docker rm 容器Id #根据容器ID制定删除容器
docker rm -f $(docker ps -aq) # 根据所有的容器ID删除所有存在的容器
- 启动和关闭容器
# docker stop 容器ID/name 停止容器
[root@hcss-ecs-b45b ~]# docker stop ebd1e2a942ec
ebd1e2a942ec
[root@hcss-ecs-b45b ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# docker start 容器ID/name 开启容器
[root@hcss-ecs-b45b ~]# docker start ebd1e2a942ec
ebd1e2a942ec
[root@hcss-ecs-b45b ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ebd1e2a942ec centos "/bin/bash" 12 minutes ago Up 4 seconds centos_1
# docker restart 容器ID/name 重启容器
# docker kill 容器ID/name 强制停止容器
docker stop和 docker kill 关闭容器的区别:
docker stop
命令会先向容器发送一个SIGTERM
信号,给容器内的进程一些时间来进行优雅的关闭操作(比如保存数据、关闭文件句柄等),如果一段时间后(默认等待 10 秒)容器内的进程还没有停止,就会再发送一个SIGKILL
信号强制终止容器内的进程,从而停止容器.
docker kill
命令会向容器发送一个SIGKILL
信号,直接强制终止容器内的所有进程,使得容器迅速停止运行。不过这种方式不建议在容器内有重要数据需要保存等情况时随意使用,因为可能会导致数据丢失或未保存完整等问题,更适合在容器出现无响应等异常情况且无法通过正常方式停止时采用.
6.3 常用其他命令
6.3.1查看日志
docker container logs/docker logs [docker logs [OPTIONS] CONTAINER]
[root@hcss-ecs-b45b ~]# docker logs centos_1
[root@ebd1e2a942ec /]#
[root@ebd1e2a942ec /]# ls
bi