Docker基础知识

Docker基础知识

Docker简介

什么是Docker

Docker 使用 Google 公司推出的 Go语言 进行开发实现,基于 Linux 内核的 cgroupnamespace 等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次封装,到处运行”。

为什么要使用Docker

  • 更高效的利用系统资源

    ​ 由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统资源的利用率更高。无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应用。

  • 更快速的启动时间

    ​ 传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。

  • 一致的运行环境

    ​ 开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些 bug 并未在开发过程中被发现。而 Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性。

  • 持续交付和部署

    ​ 对开发和运维 DevOps 人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过 Dockerfile 来进行镜像构建,并结合 持续集成系统 进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合 持续部署系统 进行自动部署。而且使用 Dockerfile使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像。

Docker基本概念

  • 镜像

    ​ 包含应用本身,还包含应用运行所需要的环境、配置、系统函数库的文件系统,是一种轻量级、可执行的独立软件包。

  • 容器

    ​ 是镜像的运行实例,运行于属于自己的独立的命名空间(一个隔离的环境),拥有自己的文件系统、自己的网络配置、自己的进程空间等。这种特性使得容器封装的应用比直接在宿主运行更加安全。

  • 仓库

    ​ 存储和管理镜像的平台。

Docker镜像

基本命令

  • 获取镜像
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
docker pull name[:tag]

tag默认latest

2024.11.12可用镜像源,编辑/etc/docker/daemon.json
{
"registry-mirrors": [
"https://docker.registry.cyou",
"https://docker-cf.registry.cyou",
"https://dockercf.jsdelivr.fyi",
"https://docker.jsdelivr.fyi",
"https://dockertest.jsdelivr.fyi",
"https://mirror.aliyuncs.com",
"https://dockerproxy.com",
"https://mirror.baidubce.com",
"https://docker.m.daocloud.io",
"https://docker.nju.edu.cn",
"https://docker.mirrors.sjtug.sjtu.edu.cn",
"https://docker.mirrors.ustc.edu.cn",
"https://mirror.iscas.ac.cn",
"https://docker.rainbond.cc"
]
}
  • 查看镜像列表
1
2
3
4
5
6
7
8
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
redis 7.2.4 9b38108e295d 7 months ago 116MB
mysql 8.0.26 9da615fced53 3 years ago 514MB

-a :列出本地所有的镜像(含中间映像层)

列表中的镜像体积总和并非是所有镜像实际硬盘消耗。由于 Docker 镜像是多层存储结构,并且可以继承、复用,因此不同镜像可能会因为使用相同的基础镜像,从而拥有共同的层。
  • 删除镜像
1
2
3
docker rmi 镜像ID

-f 强制删除

实现原理

​ docker的镜像实际上由一层一层的文件系统组成,使用这种层级的文件系统 UnionFS 将这些不同的层结合到一个镜像中。当我们拉取一个一个镜像时,可能会看到多个下载操作,像是一层一层的在下载镜像。采取分层的结构更利于资源复用。

image-20241121110404029

DockerFile TODO

三、Docker容器

基本命令

  • 新建并启动容器
1
2
3
4
5
6
7
8
9
10
11
12
13
docker run [OPTIONS] name:tag

OPTIONS:
--name=“容器新名字” 为容器指定一个名称
-d 后台运行容器,并返回容器ID,即启动守护式容器
-i 让容器的标准输入保持打开
-t 为容器分配一个伪输入终端,并绑定到容器的标准输入上
-P 随机端口映射
-e 设置环境变量,KEY=VALUE
-p 指定端口映射,有以下几种格式
ip:hostPort:containerPort 指定地址的指定端口
ip::containerPort 指定地址的任意端口
hostPort:containerPort 所有地址的任意端口
  • 启动已终止容器
1
docker start
  • 获取容器的输出信息
1
2
3
docker logs

-f 持续输出
  • 终止容器
1
docker stop
  • 重新启动容器
1
docker restart
  • 容器执行命令(进入容器)
1
2
3
docker exec

如docker exec -it mysql /bin/bash
  • 查看容器列表
1
2
3
4
docker ps

-a 列出所有容器(包含stop的容器)
-n 显示最近n个创建的容器
  • 查看容器内运行的进程
1
docker top
  • 查看容器内部细节
1
docker inspect
  • 删除容器
1
docker rm
  • 拷贝容器内文件
1
docker cp 容器ID:容器内路径 主机路径

容器数据卷

​ 数据卷是一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁,可在容器之间共享或重用数据,卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷,对数据卷的修改会立马生效。

​ 在创建并启动容器时加上 -v 数据卷名称:容器内目录[:ro(只读权限共享数据)] 即可实现数据卷挂载,数据卷不存在时会自动创建。本地目录挂载 -v /目录:容器内目录

容器网络互联

​ 在同一个Docker自定义网络的容器相互之间可用通过容器名进行访问。在创建并启动容器时加上 --network 网络名 即可在创建时加入指定网络,创建时指定网络时该容器不会加入到默认的网络中。

  • 查看网络列表
1
docker network ls
  • 创建网络
1
docker network create 网络名
  • 加入网络
1
docker network connect 网络名 容器名

DockerCompose TODO

部分内容转载自Docker从入门到实践