一、基础概念
Docker容器是一种轻量级、可移植的软件打包和部署技术。它允许开发者将应用程序及其依赖项、运行时环境等打包到一个称为容器的单一单元中。这个容器可以在支持任何支持Docker的环境中运行,而不需要担心底层系统的配置差异。
(一)Docker底层实现
Docker的底层原理涉及到多个组件,主要包括Linux内核特性(cgroup/namespace)、容器镜像、容器运行时、Union文件系统(联合文件系统)等技术。
- namespace(命名空间)
Linux内核特性,namespace用来隔离系统资源,包括:
* UTS:主机名和域名
* IPC:进程间通信
* PID:进程编号
* Network:网络设备、端口、网络栈
* Mount:文件系统
* User:用户和用户组
- cgroups(控制组)
Linux内核特性,cgroups可以限制和隔离Linux进程组所使用的物理资源,如CPU、内存、磁盘和网络IO
- image(容器镜像)
容器镜像是一个包含应用程序代码、运行时环境、系统工具和库等的只读文件。它是容器的静态表示,用于创建容器的运行实例。
- container(容器):
容器是用镜像创建的运行实例,可以被启动、停止、删除和迁移。
- 容器运行时
容器运行时负责在机器上创建和管理容器。Docker使用的容器运行时主要是containerd和runc。containerd是一个用于管理容器的守护进程,而runc是一个用于创建和运行容器的CLI工具它使用标准的容器格式和运行时。
- Docker Daemon
Docker Daemon是后台服务,负责管理容器的创建、运行、停止等操作。它接收来自Docker CLI或其他客户端的命令,并与容器运行时交互。
- Union文件系统
Docker使用联合文件系统来构建容器镜像。这使得镜像可以通过层叠的方式组合,每一层包含文件系统的增量变化,这种机制提高了镜像的重用行和效率。同时容器有写时复制的特性。当容器启动时,一个新的可写层会被加载到镜像的顶部,这一层通常被称作容器层。对于容器层的改动,无论添加、删除、修改都只会发生在容器层。只有容器层是可写的,镜像层都是只读的。
(二)Docker容器优势
- 轻量级:容器共享宿主系统的内核,因此他们比虚拟机更轻量。
- 可移植性:Docker容器在任何支持Docker的环境中都可以运行,而不受底层系统的影响。
- 一致性:由于容器包含所有应用程序的依赖项,因此在不同环境中都能保持一致。
- 快速部署:容器可以在几秒中内启动,相比传统的虚拟机部署更为迅速。
二、核心组件使用
(一)镜像
搜索官方Dockerhub镜像仓库
$ docker search 镜像名
拉取镜像
$ docker pull 镜像仓库:镜像名:标签
上传镜像
$ docker push 镜像仓库:镜像名:标签
查看镜像
$ docker imags ls
查看镜像详细信息
$ docker inspect image 镜像名
给镜像打标签
$ docker tag 原镜像 新镜像
删除镜像
$ docker image rm 镜像名
强制删除没有被使用的镜像
$ docker image prune -a -f
导出镜像
$ docker image save -o test.tar 镜像名
导入镜像
$ docker image load -i test.tar
(二)容器
查看所有容器
$ docker ps -a
查看正在运行中的容器
$ docker ps
查看所有容器的容器ID
$ docker ps -qa
查看已经停止的容器
$ docker ps -a -f status=exited
停止容器
$ docker stop 容器名/id
启动容器
$ docker start 容器名/id
查看容器所有日志
$ docker logs 容器名
查看容器日志并实时刷新
$ docker logs -f 容器名
复制文件到容器
$ docker cp 文件 容器名:路径
(三)网络
docker有四种网络模式
- bridge(桥接)模式
- 默认模式,容器通过Docker宿主机的网络栈与外界通信
- 容器可以通过指定的端口映射来将宿主机的端口映射到容器内部的端口
- 在这种模式下可以通过IP地址或者容器名字进行通信
将容器的80端口映射到宿主机的8080端口
$ docker run -d -p 8080:80 nginx
- host(主机)模式
- 容器共享宿主机的网络命名空间,直接使用宿主机的网络。
- 在这种模式下,容器无需映射端口,直接使用宿主机的网络
$ docker run -d --network host nginx
容器80端口直接显示在宿主机
- none(无网络模式)
- 容器拥有自己的网络命名空间,仅有lo网卡用于本地回环地址通信
$ docker run -d --network none nginx
- container(容器内部通信)
- 容器共享另一个容器的网络命名空间
- 这两个容器可以直接使用容器名字进行通信,就像它们运行在同一主机上一样。
$ docker run -d --name web nginx
$ docker run -d --network container:web php
2. 常用命令
查看网络
$ docker network ls
查看网络详细信息
$ docker network inspect 网络名
删除网络
$ docker network rm 网络名
创建网络
$ docker network create -d 网络类型 网络名称
(四)数据卷
volumes(数据卷)是用于持久化存储容器数据的一种机制。它本质上是容器上的一个或多个目录,这些目录可以绕过联合文件系统,与宿主机上的某个目录绑定关系。当容器中的程序对这些目录写入数据时,实际上是写入到与之绑定的宿主机目录上。
将宿主机的/root/test目录挂载到容器的/usr/local/test目录
$ docker run -d -v /root/test:/usr/local/test --name web nginx
查看卷
$ docker volume ls
删除卷
$ docke volume rm 卷名
创建卷,此卷的相关信息存储在本地,可使用docker volume inspect my-volume查看
$ docker volume create my-volume
使用创建的卷
$ docker run -d -v my-volume:/usr/local/test --name web nginx
(五)镜像仓库
Docker镜像仓库是Docker用来存储和管理镜像的服务,分为公共仓库(docker hub)和私有仓库(harbor)两种类型。公共仓库是开源的,任何人都可以注册,并将自己的镜像推送上去,进行共享。私有仓库是私有的,一般是公司内部部署,存储和管理容器镜像的。
登录镜像仓库,输入用户名/密码,登录之后可以向镜像仓库中推送拉取镜像
$ docker login 镜像仓库地址
退出镜像仓库地址
$ docker logout 镜像仓库地址
其中登录镜像仓库的用户名和密码存放在/root/.docker/config
文件中,可以此查看