文章目录
- Docker的基本概念
- Docker的底层隔离机制
- Linux安装Docker
- Docker基本命令
- Docker限制容器资源
- Docker中的网络
- Docker中的卷
- Docker镜像
- Docker仓库
Docker的基本概念
Docker是一个开源的应用容器 引擎,也是当前使用最广泛的容器技术之一。
容器的概念
容器(Container)是 一种轻量级 的虚拟化技术,也称为操作系统虚拟化,允许同一操作系统上的用户空间被分割成几个相对独立的单元在内核中运行,彼此互不干扰。
容器的特点
- 自包含:打包了应用程序及其所有依赖,可以直接运行。
- 可移植:可以在几乎任何地方以相同的方式运行。
- 轻量级:占用资源很少,可以秒级启动。
- 隔离性:同一主机上运行的多个容器,不会互相影响。
容器与虚拟机的区别
- 共同点:都是虚拟化技术。
- 差异点:容器隔离性较差,CPU、内存、磁盘资源消耗少,启动速度快,易于扩展。
容器的三个核心概念
- 镜像:是一个文件,里面包含了一个微型操作系统+核心代码程序+依赖库环境。
- 仓库:存放镜像的地方。
- 容器:运行镜像的地方,本质上是一个进程,需要消耗cpu、内存、磁盘、网络等资源。
Docker的底层隔离机制
NameSpace
命名空间是Linux内核提供的一种资源隔离机制,它可以将系统资源划分为不同的命名空间,使得不同的进程或容器在各自的命名空间中运行,彼此之间互不干扰。Docker利用了多种命名空间来实现资源的隔离,主要包括:
- PID命名空间:隔离进程ID,使得容器中的进程拥有自己的PID空间,与宿主机和其他容器隔离。
- 网络命名空间:隔离网络接口,允许每个容器拥有自己的IP地址和路由表,实现网络隔离。
- IPC命名空间:隔离容器内部的进程间通信(IPC),防止容器之间的IPC冲突。
- Mount命名空间:隔离文件系统挂载点,防止容器访问主机文件系统,实现文件系统隔离。
- UTS命名空间:为容器提供独立的主机名和域名设置。
Cgroup
Cgroup(Control Group)是Linux内核提供的一种资源限制和管理机制,可以对进程或容器的资源使用进行限制和监控。
Cgroup的组成:
- 控制组:表示一组进程和一组带有参数的子系统的关联关系。
- 层级数:由一系列的控制组按照树状结构排列组成的。
- 子系统:一个内核的组件,一个子系统代表一类资源调度控制器。在
/sys/fs/cgroup/
这个目录下可以看到子系统如:cpu、cpuacct、cpuset、memory、pids等。
Cgroup的两个版本v1和v2:
- Cgroup v1提供了一种层次化的组织结构来管理进程组的资源,通过
/proc
目录下的虚拟文件和目录实现资源控制,各资源类型子系统相对独立,配置较为复杂。 - Cgroup v2是对cgroup v1的重大改进和扩展,旨在提供更灵活、更统一的资源控制机制,采用
/sys/fs/cgroup
下的统一文件系统结构,简化了配置流程,提供了更丰富的功能和更强的灵活性,支持跨多个资源的增强资源分配管理和隔离。
Union文件系统
Union文件系统(如AUFS、OverlayFS等)是一种分层的轻量级文件系统,它可以把多个目录内容联合挂载到同一目录下,从而形成一个单一的文件系统,这种特性可以让使用者像是使用一个目录一样使用联合文件系统。Docker使用Union文件系统将容器镜像和主机的底层文件系统结合起来,使得容器可以访问镜像中的文件,同时仍然能够覆盖主机文件系统中的某些文件。
Linux安装Docker
CentOS
1、配置阿里云的centos7.9的源的仓库文件(软件下载网站)
bash
[root@docker ~]# cd /etc/yum.repos.d/
[root@docker yum.repos.d]# rm -rf *
[root@docker yum.repos.d]# curl -O http://mirrors.aliyun.com/repo/Centos-7.repo
2、安装yum相关的工具,下载docker-ce.repo文件
bash
[root@docker ~]# yum install yum-utils -y
3、下载安装docker的仓库文件
bash
[root@docker ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
4、生成安装docker的缓存
bash
[root@docker ~]# yum makecache fast
5、安装启动docker
bash
[root@docker ~]# yum -y install docker-ce
[root@docker ~]# systemctl start docker
[root@docker ~]# systemctl enable docker
Ubuntu
1、安装依赖的软件
bash
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
2、Docker 的官方 GPG 密钥
bash
curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
3、下载中国科技技术大学的仓库文件
bash
sudo add-apt-repository "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/ $(lsb_release -cs) stable"
4、安装docker
bash
sudo apt-get install docker-ce docker-ce-cli containerd.io
5、查看docker进程是否运行
bash
sudo ps aux|grep docker
Docker基本命令
docker version
:查看docker版本信息
docker images
:查看镜像仓库
docker login
:登录远程仓库
docker pull nginx
:远程拉取nginx镜像
docker load -i nginx.tar
:本地加载nginx镜像
docker save -o mysql-5-7-41.tar mysql:5.7.41
:从本地镜像仓库中导出mysql镜像
docker tag 0018a8d83892 mysql:5.7.41
:更改镜像仓库中指定的镜像名
docker run -d -p 80:80 --name nginx-1 nginx
:创建并启动容器,-d
在后台运行程序-it
开启一个终端,在前台运行--rm
当容器退出的时候,自动删除容器
docker create -p 80:80 --name=nginx-1 nginx
:创建容器
docker start nginx-1
:启动容器
docker ps
:查看启动容器列表,-a
参数查看所有容器列表
docker exec -it nginx-1 bash
:进入容器内部
docker rm sc-mysql-1
:删除容器
docker rmi mysql:5.7.41
:删除镜像
docker inspect
:查看容器信息
docker cp nginx-1:/.../html/index.html .
:复制/上传容器文件
docker logs nginx-1
:查看容器日志
docker top nginx-1
:用于实时监控容器内部进程状态、资源使用情况
docker stats
:用于监控容器资源使用情况、进行性能分析
docker network
:docker网络相关命令
docker volum
:
Docker限制容器资源
在docker run
中添加参数来限制容器的使用资源:
--cpu-shares
:设置容器相对于其他容器的CPU优先级
--cpus
:限制容器可以使用的CPU核心数
--cpuset-cpus
:指定容器可以使用的具体CPU核心
--memory
:限制容器可以使用的内存大小
--memory-swap
:设置容器可以使用的虚拟内存大小
例如:启动一个nginx的容器,发布的端口号9900:80
名字linux-nginx
限制使用20%的cpu资源 ,内存50M:
docker run -d -p 9900:80 --name linux-nginx --cpu-shares 200 -m 50M nginx
Docker中的网络
Docker网络模式
Docker支持多种网络模式,每种模式都有其特定的应用场景和配置方式。常见的Docker网络类型包括:
-
Bridge模式:
- 默认网络模式 :Docker安装后会自动创建名为
docker0
的虚拟网桥,新建的容器默认会连接到这个网桥上。 - 特点:通过iptables的NAT表配置,容器可以与宿主机或其他容器通信,但外部网络无法直接通过容器的IP地址访问容器,除非进行了端口映射。
- 使用场景:适用于大多数标准应用场景,特别是当你希望容器之间能够通信,同时又与外部网络隔离时。
- 默认网络模式 :Docker安装后会自动创建名为
-
Host模式:
- 特点:容器直接使用宿主机的网络栈,容器和宿主机共享网络命名空间、IP地址和端口等。
- 适用场景:适用于需要高性能网络连接的应用,或者需要访问外部网络资源的容器。
-
Container模式:
- 特点:允许容器拥有自己的MAC地址,从而可以直接与物理网络中的设备进行通信。
- 适用场景:需要容器直接与物理网络交互的场景。
-
None模式:
- 特点:容器拥有自己的网络命名空间,但不进行任何网络配置,即没有网卡、IP地址等。
- 适用场景:需要完全自定义容器网络环境的场景。
-
Overlay模式(非默认,但常用)
-
特点:Overlay模式用于连接跨主机的容器,Docker会创建一个虚拟网络,所有连接到这个虚拟网络的容器都可以相互通信,无论这些容器运行在哪个主机上,但是需要使用Docker Swarm集群管理工具来管理多个Docker主机之间的通信。
-
适用场景:适用于需要在多个Docker守护进程之间部署容器,并需要容器跨主机通信的场景。
-
-
Macvlan和Ipvlan模式(高级网络模式)
-
概述:Macvlan和Ipvlan模式允许容器直接连接到主机的物理网络接口。
-
特点:这些模式提供了更好的网络性能和灵活性,容器可以获得自己的MAC地址或IP地址,并在网络上像主机一样运行。
-
适用场景:适用于需要高性能网络或需要容器直接与物理网络交互的场景。
-
Docker网络配置
Docker网络配置包括多个方面,如网络使用、IP地址分配、网络别名和网络作用域等。Docker提供了丰富的命令和选项来管理网络配置,如:
docker network ls
:查看所有Docker网络。docker network create
:创建一个新的Docker网络。docker network connect
:将容器连接到一个已存在的Docker网络。docker network inspect
:检查一个Docker网络的详细信息。docker network rm
:删除一个已存在的Docker网络。
在docker run
命令中添加参数--network [网络名]
指定容器的网络。
Docker中的卷
卷是存放数据的载体,用于保存数据、共享数据,实现容器与外界的数据交换。
docker volume ls
:查看docker卷
docker volume create [卷名]
:创建docker卷
通过cd /var/lib/docker/volumes/[卷名]/_data/
进入docker卷位置
挂载文件系统到容器
1、在docker run
后接参数--mount source=[卷名],target=[容器中需要挂载的目录]
,比如挂载卷html
到nginx
容器中nginx
配置中的html
目录:docker run -d -p 80:80 --name nginx-1 --mount source=html,target=/usr/share/nginx/html nginx
2、在docker run
后接参数-v [卷名]:[容器中需要挂载的目录]:[读写方式]
,比如挂载卷html
到nginx
容器中nginx
配置中的html
目录:docker run -d -p 80:80 --name nginx-1 -v html:/usr/share/nginx/html:ro nginx
,读写方式中ro
为read only只读方式挂载,这里的只读是限制容器里的程序对卷只有读权限。
3、通过nfs
实现挂载,可以实现不同主机容器之间的数据交互,实现步骤如下:
- 搭建好
nfs
服务器,配置好共享目录/pmq/web
,在容器宿主机中安装nfs
服务。 - 在容器宿主机上创建支持
nfs
功能的卷:docker volume create --driver local --opt type=nfs --opt o=addr=192.168.163.123,nolock,soft,rw,sync --opt device=:/pmq/web nfs-web-1
。 - 使用上述两种方式挂载刚刚创建的
nfs-web-1
卷到容器中。
[注意]:当卷里有内容的情况:容器使用卷的时候,本质就是容器挂载了宿主机的某个文件夹到容器里,所以最开始的时候以宿主机卷里的内容为主,挂载后,容器可以对卷里的数据进行修改。当卷里没有内容的情况: 只是一个空文件夹,容器启动的时候也会挂载卷的这个空文件夹,但是会把容器里的数据写到卷里。
Docker镜像
Docker镜像是一种轻量级、独立的可执行软件包,它包含了运行一个应用所需要的所有内容,包括代码、运行时环境、系统工具、库文件等。简而言之,镜像就是用于创建Docker容器的模板。
Docker基础镜像提供了一个最基本的环境或者某个程序所依赖的环境,常见的linux基础镜像有:alpine、centos、ubuntu、debian、busybox
等。
Docker镜像的特点
- 轻量级:Docker镜像采用分层的结构,每个层都代表了镜像的一个修改或者操作。这种结构使得镜像的构建、存储和传输变得高效和灵活。
- 独立性:Docker镜像为应用程序提供了一个独立的、可移植的运行环境,使得应用程序与其运行时环境解耦。这意味着开发者可以将应用程序及其依赖项打包到一个镜像中,并在任何支持Docker的环境中运行,而无需担心环境配置的问题。
- 版本控制:由于Docker镜像采用了分层的结构,每个层都可以单独管理和追踪。这使得开发者可以轻松地进行版本控制,比如创建、推送、拉取和回滚镜像版本。
- 快速部署和启动:Docker镜像可以快速部署和启动,无需像传统虚拟机那样等待较长的启动时间。此外,由于Docker容器是轻量级的,可以在几秒钟内启动,使得应用程序的扩展变得更加简单和高效。
Dockerfile中的指令
Dockerfile文件是制作镜像的配置文件类似于配方,通过编写Dockerfile文件来制作镜像
From
:指定使用的基础镜像。
WORKDIR
:工作目录,进入容器的时候是在哪个目录下,如果工作目录不是/
根目录,就会增加,是/
根目录就不增加镜像的层数。
COPY
:复制宿主机里的文件或者目录到容器的某个目录下。
ADD
:作用同COPY
,如果复制的是.tar.gz压缩文件,拷贝到容器里会自动解压
RUN
:在制作镜像的时候运行的指令。
CMD
:启动容器时执行的命令。
ENTRYPOINT
:作用同CMD
,当与CMD
同时存在的时候,CMD
里的内容会成为ENTRYPOINT
里的参数。
ENV
:定义环境变量。
EXPOSE
:申明开放的端口号。
ARG
:定义一个变量,用户可以在构建时使用docker build命令使用。
VOLUME
:将容器里的某个路径挂载到宿主机的卷上。
STOPSIGNAL
:设置将发送到容器以退出的系统调用信号。
HEALTHCHECK
:docker用来检测容器是否还在正常运行,能给对外提供服务。
SHELL
:允许覆盖用于命令SHELL形式的默认SHELL。
LABEL
:标签。
如何使制作的镜像较小
镜像小的优点:下载快,存储占用磁盘空间小,运行容器的时候占用内存小
如何使制作的镜像较小:
- 使用的基础镜像小
- 尽量减少使用RUN、COPY、ADD、WORKDIR等新增数据的操作
- 尽量不把数据拷贝到容器里,当容器启动起来后,可以使用挂载卷的方法,减少镜像的数据
制作以go语言编写的程序镜像
1、将go语言程序上传到linux系统里
2、部署go语言环境
bash
[root@docker Dockerfile]# yum install epel-release -y
[root@docker Dockerfile]# yum install golang -y
3、将go代码编译成二进制程序
bash
[root@docker Dockerfile]# go mod init web
// 配置一个国内的go语言下载库的代理网站
[root@docker Dockerfile]# go env -w GOPROXY=https://goproxy.cn,direct
[root@docker Dockerfile]# go mod tidy
// 编译网站成一个二进制程序
[root@docker Dockerfile]# go build -o server server.go
4、开始制作go语言程序镜像
在一个空文件夹下创建并编写Dockerfile
文件:
bash
[root@docker docker]# cat Dockerfile
FROM centos:7.9 # 指定容器里使用的微型的系统是centos7.9 -->基础镜像
WORKDIR /go # 进入容器会进入这个目录,工作目录,在执行镜像的时候会自动创建--》家目录 ---》docker exec
COPY . /go # 复制宿主机当前目录下的所有的内容到容器的/go目录下 --》docker cp
ENTRYPOINT ["/go/server"] # 容器启动运行的时候执行的命令,使用的是绝对路径执行/go/server程序
CMD ["/go/server"] # command 命令
复制二进制程序+static+templates文件夹到Dockerfile
的目录下执行:docker build -t goweb:1.0 .
创建镜像,使用docker images
查看是否创建成功。
Docker仓库
公共镜像
目前docker官方镜像仓库无法正常访问,可以通过修改配置文件/etc/docker/daemon.json
来使用阿里云的公共镜像仓库加速。
bash
[root@docker docker]# mkdir -p /etc/docker
[root@docker docker]# tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://ruk1gp3w.mirror.aliyuncs.com"]
}
EOF
[root@docker docker]# systemctl daemon-reload
[root@docker docker]# systemctl restart docker
docker search nginx
:到公共仓库中查找需要的镜像