Docker是基于go语言开发实现,基于Linux内核的cgroup
和namespace
,以及OverlayFS
类的Union FS
等技术,对进程 进行封装隔离,位于操作系统层面的虚拟化技术
。由于隔离的进程独立于其他的隔离的进程,也称之为容器,Docker充当容器引擎。Docker是一个划时代的开源项目,它彻底释放了计算虚拟化的威力!
[TOC]
Docker在容器的基础之上,进一步提高了封装技术,做到从文件系、网络互连到进程隔离等等,极大的简化了容器的创建和维护,使得Docker技术比虚拟机技术更为轻便、快捷。
Docker与Virtual Machines技术的区别
从图中可以看出,在虚拟机技术中,要先在宿主机操作系统中虚拟出一套硬件之后,在其上运行一个完整的操作系统,然后在此操作系统上运行所需的应用进程。
而在容器中,应用进程直接运行于宿主的内核,容器没有自己的内核,也没有进行硬件虚拟,节约了大量的资源。
特性
容器
虚拟机
启动速度
秒级
分钟级
硬盘使用
一般为MB
一般为GB
性能
接近原生
更弱
系统支持量
单机支持上千个容器
一般几十个
Doker的优点
更高效的利用系统资源
更快速的启动时间
应用开发、测试、部署一致的运行环境
持续交付和部署
更轻松的迁移
更轻松的维护和扩展
Docker配置及部署
1 2 3 $ cd /etc/yum.repos.d $ wget https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo $ sed -i 's#download.docker.com#mirrors.ustc.edu.cn/docker-ce#g' docker-ce.repo
1 $ yum -y install docker-ce
1 2 3 4 5 6 7 8 9 10 11 12 13 $ vim /etc/docker/daemon.json { "registry-mirrors": [ "http://hub-mirror.c.163.com", "https://docker.mirrors.ustc.edu.cn", "https://mirror.ccs.tencentyun.com", ] } # 这将提高我们从docker仓库中拉取镜像的速度和稳定性 $ systemctl daemon-reload $ systemctl restart docker.service
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 # 查看docker版本 $ docker version # 查看docker信息 $ docker info # 启动docker服务 $ systemctl start docker.service # 关停docker服务 $ systemctl stop docker.service # 重启docker服务 $ systemctl stop docker.service # 查看docker运行状态 $ systemctl status docker.service
Docker基本概念 Docker的基本概念主要包括
镜像(image
)
容器(container
)
仓库(repository
)
理解了这三个概念,就理解了Docker的整个生命周期
image基本操作 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 # 列出镜像文件 $ docker image ls # 搜索镜像 $ docker search <iamge_name> # 拉取镜像 $ docker pull <iamge_name>:<tag> # 导出镜像 $ docker iamge save <image_name>:<tag> > /path/<image_name>.tar.gz # 导入镜像 $ docker iamge load -i /path/<iamge_name>.tar.gz # 删除镜像 $ docker image rmi <iamge_name>:<tag>/<image_id> # 查看镜像详细信息 $ docker image inspect <image_name>:<tag>
container基本操作 1 2 3 4 5 6 7 8 9 10 11 12 13 # 列出容器 $ docker container ls # 停止/杀死/重启容器 $ docker container stop/kill/restart <container_name/id> # 删除容器 $ docker container re <container_name/id> # 退出容器 $ exit # or $ crtl+p -> crtl+q
1 $ docker container run -itd -p 8080:80 --name websever nginx:1.21
docker container run
: 这是启动 Docker 容器的命令。
-itd
: 这是一组选项,表示:
-i
:与容器的标准输入保持开放(interactive)。
-t
:为容器分配一个伪终端(tty)。
-d
:在后台运行容器。
这组选项通常用于在后台运行交互式容器。
-p 8080:80
: 这个选项表示将主机的端口 8080 映射到容器的端口 80。这样,外部请求通过主机的 8080 端口可以访问容器内运行的 Nginx 服务。
--name websever
: 这个选项为容器指定一个名称,即 “websever”。这使得你可以使用容器名称而不是容器 ID 来引用该容器。
nginx:1.21
: 这是要运行的 Docker 镜像的名称及其标签。在这里,它是 Nginx 镜像的版本 1.21。
综合起来,这个命令的作用是在后台运行一个交互式的 Nginx 容器,将主机的 8080 端口映射到容器的 80 端口,并指定容器的名称为 “websever”。
进入容器的两种方法以及区别
1 2 3 4 5 # 第一种 $ docker container exec -it <container_name_or_id> /bin/bash # 第二种 $ docker container attach <container_name_or_id>
区别:
使用 docker exec
不会改变容器主进程,而是在容器的运行时环境中执行一个新的进程。
可以多次使用 docker exec
进入同一个容器,每次进入都是一个新的 shell。
如果没有指定 <command>
,默认是在容器的默认 shell 中执行。
使用 docker attach
将连接到容器的主进程(通常是启动容器时指定的主命令,例如 shell)。
docker attach
不支持在容器内启动新的进程,而是将当前终端附加到容器的标准输入、输出和错误流上。
如果从容器中断开连接(Ctrl + P, Ctrl + Q),容器将保持运行状态。
exit
ctrl+p->ctrl+q
exec
退出不停止容器
退出不停止容器
attach
退出停止容器
退出不停止容器
容器与宿主机之间传输文件 1 2 3 4 # 容器到宿主机 $ docker cp <container_id_or_name>:/container_path/ /os_path/ $ docker cp /os_path/ <container_id_or_name>:/container_path/
repository基本操作 1 2 3 4 5 6 7 8 9 10 $ docker login Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one. Username: lgq007 Password: WARNING! Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store $ docker logout Removing login credentials for https://index.docker.io/v1/
按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用数据卷(Volume)
、或者绑定宿主目录
,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。
数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器删除或者重新运行之后,数据却不会丢失。
数据卷 1 2 3 4 5 6 7 8 9 # 创建数据卷 $ docker volume create <volume_name> # 查看数据卷 $ docker volume ls # 查看数据卷信息 $ docker volume inspect <volume_name>
创建数据卷 1 2 3 4 $ docker volume create --name webserver_volume \ --opt type =tmpfs \ --opt device=tmpfs \ --opt o=size=100m
1 2 3 4 5 $ docker container run -itd --name webserver -p 80:80 -v webserver_volume:/usr/share/nginx/html nginx:1.21 /bin/bash
查看数据卷详细信息 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 $ docker volume inspect webserver_volume [ { "CreatedAt": "2023-12-09T21:41:28+08:00", "Driver": "local", "Labels": null, #<-数据卷的挂载位置-> "Mountpoint":"/var/lib/docker/volumes/docker_volume/_data", "Name": "webserver_volume", "Options": { "device": "tmpfs", "o": "size=100m", "type": "tmpfs" }, "Scope": "local" } ] # 测试: $ echo "hello docker volume create" >/var/lib/docker/volumes/docker_volume/_data/index.html$ curl http://192.168.57.100:80
挂载宿主机目录 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 # 以安装nginx为例 # 1.在宿主机先创建一个目录 $ mkdir /usr/local/docker_volume# 2.挂载命令 -v <hostpath>:<containerpath> # 3.挂载到宿主机目录 $ docker container run -itd --name webserver -p 80:80 -v /usr/local/docker_volume:/usr/share/nginx/html nginx:1.21
1 2 # 拉取一个网页主要信息到指定目录 wget www.baidu.com -O /usr/local/docker_volume
-O
: 指定保存下载文件的路径和文件名。在这个例子中,文件将被保存为 /usr/local/docker_volume
。