Docker是一个开源的应用容器引擎,也是当前使用最广泛的容器技术之一。
容器(Container)是一种轻量级的虚拟化技术,也称为操作系统虚拟化,允许同一操作系统上的用户空间被分割成几个相对独立的单元在内核中运行,彼此互不干扰。
命名空间是Linux内核提供的一种资源隔离机制,它可以将系统资源划分为不同的命名空间,使得不同的进程或容器在各自的命名空间中运行,彼此之间互不干扰。Docker利用了多种命名空间来实现资源的隔离,主要包括:
Cgroup(Control Group)是Linux内核提供的一种资源限制和管理机制,可以对进程或容器的资源使用进行限制和监控。
Cgroup的组成:
/sys/fs/cgroup/
这个目录下可以看到子系统如:cpu、cpuacct、cpuset、memory、pids等。Cgroup的两个版本v1和v2:
/proc
目录下的虚拟文件和目录实现资源控制,各资源类型子系统相对独立,配置较为复杂。 /sys/fs/cgroup
下的统一文件系统结构,简化了配置流程,提供了更丰富的功能和更强的灵活性,支持跨多个资源的增强资源分配管理和隔离。Union文件系统(如AUFS、OverlayFS等)是一种分层的轻量级文件系统,它可以把多个目录内容联合挂载到同一目录下,从而形成一个单一的文件系统,这种特性可以让使用者像是使用一个目录一样使用联合文件系统。Docker使用Union文件系统将容器镜像和主机的底层文件系统结合起来,使得容器可以访问镜像中的文件,同时仍然能够覆盖主机文件系统中的某些文件。
1、配置阿里云的centos7.9的源的仓库文件(软件下载网站)
[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文件
[root@docker ~]# yum install yum-utils -y
3、下载安装docker的仓库文件
[root@docker ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
4、生成安装docker的缓存
[root@docker ~]# yum makecache fast
5、安装启动docker
[root@docker ~]# yum -y install docker-ce
[root@docker ~]# systemctl start docker
[root@docker ~]# systemctl enable docker
1、安装依赖的软件
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
2、Docker 的官方 GPG 密钥
curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
3、下载中国科技技术大学的仓库文件
sudo add-apt-repository "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/ $(lsb_release -cs) stable"
4、安装docker
sudo apt-get install docker-ce docker-ce-cli containerd.io
5、查看docker进程是否运行
sudo ps aux|grep 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 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网络类型包括:
Bridge模式:
docker0
的虚拟网桥,新建的容器默认会连接到这个网桥上。Host模式:
Container模式:
None模式:
Overlay模式(非默认,但常用)
特点:Overlay模式用于连接跨主机的容器,Docker会创建一个虚拟网络,所有连接到这个虚拟网络的容器都可以相互通信,无论这些容器运行在哪个主机上,但是需要使用Docker Swarm集群管理工具来管理多个Docker主机之间的通信。
适用场景:适用于需要在多个Docker守护进程之间部署容器,并需要容器跨主机通信的场景。
Macvlan和Ipvlan模式(高级网络模式)
概述:Macvlan和Ipvlan模式允许容器直接连接到主机的物理网络接口。
特点:这些模式提供了更好的网络性能和灵活性,容器可以获得自己的MAC地址或IP地址,并在网络上像主机一样运行。
适用场景:适用于需要高性能网络或需要容器直接与物理网络交互的场景。
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 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基础镜像提供了一个最基本的环境或者某个程序所依赖的环境,常见的linux基础镜像有:alpine、centos、ubuntu、debian、busybox
等。
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
:标签。
镜像小的优点:下载快,存储占用磁盘空间小,运行容器的时候占用内存小
如何使制作的镜像较小:
1、将go语言程序上传到linux系统里
2、部署go语言环境
[root@docker Dockerfile]# yum install epel-release -y
[root@docker Dockerfile]# yum install golang -y
3、将go代码编译成二进制程序
[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
文件:
[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官方镜像仓库无法正常访问,可以通过修改配置文件/etc/docker/daemon.json
来使用阿里云的公共镜像仓库加速。
[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
:到公共仓库中查找需要的镜像