docker-基础
概述
一、起源
最初的容器是以chroot为代表的文件隔离方式,但这并不完美,如主机名、网络、系统进程、用户等都无法隔离。
二、名称空间与控制组
1、名称空间
为了实现完美的隔离机制,Linux引入了一种由内核直接提供的全局资源封装的全新隔离机制(名称空间)用来解决隔离的问题。Linux内核支持UTS、IPC、PID、NETWORK、MOUNT等多个名称空间。
2、控制组
Linux解决资源配额的方案是控制组(Cgroups),它与名称空间一样直接由内核提供功能,用于隔离或者说分配并限制某个进程组能够使用的资源量,包括占用CPU时间、内存大小、磁盘I/O速度等等。
三、Docker容器技术
以应用为核心,对程序文件、运行时环境、软件依赖包都可以封装打包、部署的技术手段。
Docker 的容器中没有系统。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接,,更重要的是容器性能开销极低。
Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版)。
四、三大概念
容器:容器是一个运行在隔离环境中的程序
镜像:镜像是只读的模板,包含了创建容器所需的所有文件和配置信息
仓库:用来存储、分发、管理镜像的地方
镜像管理
一、镜像概述
镜像是创建容器的核心
镜像使用CoW技术
镜像采用分层设计
镜像始终都是只读的
二、如何创建容器
首先使用Cow为镜像创建一个读写层,容器在读写层运行;
这种方式可以让一个镜像创建无数个容器。
三、镜像加速添加
[root@docker ~]# vim /etc/docker/daemon.json
{
"registry-mirrors": ["这里配置镜像仓库加速器地址"],
"insecure-registries":[]
}
[root@docker ~]# systemctl restart docker
# 查看 docker 服务配置信息
[root@docker ~]# docker info
四、镜像管理命令
镜像管理命令 | 说明 |
---|---|
docker images | 查看本机镜像 |
docker pull 镜像名称:标签 | 下载镜像 |
docker save 镜像名称:标签 -o 文件名 | 备份镜像为tar包 |
docker load -i 备份文件名称 | 导入备份的镜像文件 |
docker history 镜像名称:标签 | 查看镜像的制作历史 |
容器管理
一、容器管理命令
容器管理命令 | 说明 |
---|---|
docker run -it(d) 镜像名称:标签 [启动参数] | 创建容器 |
docker ps [-a 显示所有容器,-q 只显示id] | 查看容器的信息 |
docker inspect 镜像名称|容器名称 | 查询(容器/镜像)的详细信息 |
docker [start|stop|restart] 容器id | 启动、停止、重启容器 |
docker exec -it 容器ID 命令 | 在容器内执行命令 |
docker cp 本机文件路径 容器id:容器内路径 docker cp 容器id:容器内路径 本机文件路径 | 拷贝文件 |
docker rm 容器ID | 删除容器 |
docker logs 容器ID | 查看容器日志 |
docker tag 镜像ID:标签 镜像名称:新的标签 | 创建新的镜像名称和标签 |
docker rmi 镜像名称:标签 | 删除镜像(必须先删除该镜像启动的所有容器) |
二、docker run 常用参数
-i 交互式
-t 分配终端
-d 后台运行
--name 容器名字
--rm 容器结束后自动删除
传入后台快捷键(ctrl-p + ctrl-q)
镜像与服务
一、自定义镜像
镜像采用分层设计
创建读写层
修改配置
重新打包
二、简单镜像制作
使用现有镜像启动容器,在该容器基础上修改
使用commit制作新镜像
# 使用基础镜像创建一个容器
[root@docker ~]# docker run -itd --name linux rockylinux:8.5
# 删除容器内的Yum配置文件
[root@docker ~]# docker exec -it linux rm -rf /etc/yum.repos.d
# 拷贝宿主机的Yum配置文件到容器内
[root@docker ~]# docker cp /etc/yum.repos.d linux:/etc/
# 在容器内安装工具软件包
[root@docker ~]# docker exec -it linux dnf install -y net-tools vim-enhanced tree bash-completion iproute procps-ng psmisc
# 清理缓存文件
[root@docker ~]# docker exec -it linux dnf clean all
# 停止容器
[root@docker ~]# docker stop linux
# 把容器制作成镜像
[root@docker ~]# docker commit linux mylinux:latest
sha256:7a4449e20f4c59d1f6c4db838b4724cbf63c8f4195513c5f17d053c7752891d5
# 查看新制作的镜像
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mylinux latest b64da40467ae 3 seconds ago 249MB
rockylinux 8.5 210996f98b85 13 months ago 205MB
# 删除制作镜像的容器
[root@docker ~]# docker rm -f linux
linux
三、容器部署应用
1、安装部署apache
如何在容器内启动服务?
- 由于容器内没有 systemd,参考服务文件手工执行启动程序
- 服务文件路径:/usr/lib/systemd/system/httpd.service
- 查看服务文件,设置环境变量执行服务启动程序
- 如果没有 service 文件,自己想办法喽(官方手册配置、启动服务,网上资料)
# 删除所有容器
[root@docker ~]# docker rm -f $(docker ps -aq)
# 创建一个名为 myweb 的容器
[root@docker ~]# docker run -it --rm --name myweb mylinux:latest
# 在容器内安装部署 apache
[root@a7f9d0c3e3e2 /]# dnf install -y httpd
[root@a7f9d0c3e3e2 /]# echo "Hello World ." >/var/www/html/index.html
[root@a7f9d0c3e3e2 /]# cat /usr/lib/systemd/system/httpd.service
[root@a7f9d0c3e3e2 /]# export LANG=C
[root@a7f9d0c3e3e2 /]# /usr/sbin/httpd -DFOREGROUND
# 在另一个终端完成访问验证
2、为apache添加解析php文件的支持
# ctrl + c 终止 httpd 服务运行
# 安装 php 软件包
[root@a7f9d0c3e3e2 /]# dnf install -y php
# 修改配置文件
[root@a7f9d0c3e3e2 /]# vim /etc/httpd/conf.modules.d/00-mpm.conf
11: LoadModule mpm_prefork_module ... ... # 去掉注释
17: # LoadModule mpm_event_module ... ... # 注释配置
# 重新启动服务
[root@a7f9d0c3e3e2 /]# /usr/sbin/httpd -DFOREGROUND
# 服务不要关闭,在其他终端完成测试
3、验证配置
[root@docker ~]# docker cp info.php myweb:/var/www/html/
[root@docker ~]# curl http://172.17.0.2/info.php
<pre>
Array
(
[REMOTE_ADDR] => 172.17.0.1
[REQUEST_METHOD] => GET
[HTTP_USER_AGENT] => curl/7.61.1
[REQUEST_URI] => /info.php
)
php_host: 616e75df56ae
1229
四、容器服务原理
1、上帝进程
1)、什么是上帝进程
系统创建之初产生的第一个进程
2)、特点
- 没有父进程,PID == 1
- 是所有程序的根进程
- 上帝进程死亡系统实例也就关闭了
2、容器有没有上帝进程
- 容器的启动进程就是上帝进程
- 如果容器的启动进程关闭等同于容器关闭
3、前台服务VS后台服务
- 前台服务是占有控制终端的进程,可以在终端与用户交互式的访问与操作,一旦终端关闭,这个进程也随之消失
- 后台进程也叫守护进程,不受终端控制,它不需要交互;后台进程的本质是向系统托管进程服务
4、容器的启动进程能否放在后台运行
- 容器没有操作系统,所以无法实现进程托管
- 如果强行把容器的启动进程放后台,将导致容器直接关闭
- 容器的启动进程必须放在前台运行