概述
Docker是一种以应用为核心,对程序文件,运行时环境,软件依赖包都可以封装打包,部署的一种 技术手段
Docker的容器中没系统
开放理念
- 2014年,Docker开源罗 自己用Golang开发的Libcontainer
- 2015年,在Docker的倡导下,多个公司联合指定罗"开放容器交互标准",既OCI,这是一个关于容器格式和运行时规范文件,其中包含:
- 运行时标准(RUNTIME-SPEC)
- 容器镜像标准(IMAGE-SPEC)
- 镜像分发标准(DISTRIBUTION-SPEC)
- 三大概念
- 容器:一个运行在隔离环境中的程序
- 镜像:只读模板,包括篡创建容器所需要的文件和配置信息
- 仓库:存储,分发,管理镜像的空间
安装部署
bash
# 开启路由转发功能
[root@docker ~]# echo 'net.ipv4.ip_forward = 1' >>/etc/sysctl.conf
# 打印system配置
[root@docker ~]# sysctl -p
# 安装Docker相关软件包
[root@docker ~]# dnf install -y docker-ce
# 开启Docker服务并开机自启动
[root@docker ~]# systemctl enable --now docker
# 查看服务器与客户端版本
[root@docker ~]# docker version
# 添加daemon.json,配置镜像仓库加速地址,比如阿里云,华为云官方的镜像仓库
[root@docker ~]# vim /etc/docker/daemon.json
{
"registry-mirrors": ["这里配置镜像仓库加速器地址"],
"insecure-registries":[]
}
# 重启docker服务
[root@docker ~]# systemctl restart docker
# 查看 docker 服务配置信息
[root@docker ~]# docker info
镜像管理命令
docker images //查看本机镜像 -q 只打印镜像id列
docker pull 镜像名:标签 //从镜像加速地址提供的镜像库下载镜像
docker save 镜像名:标签 -o 备份文件名(比如:mylinux.tar) 将本机的镜像归档备份
// -o 用于指定保存生成docker镜像归档文件(通常为.tar文件)
docker load -i 备份文件名 导入备份镜像
docker history 镜像名:标签 查看镜像制作历史
docker rmi 镜像:标签 //删除镜像
docker tag 镜像id 镜像名:标签 //给镜像重命名
Vlog~删除镜像
docker rmi 镜像:标签 删除镜像 //删除单个镜像,后加多个,可删除多个
//对于已创建的容器的镜像无法删除
docker rmi -f ... //强制删除
会打印出 : Untagged: ... // 该容器的标签已删除
通过docker images 查询发现"<none> <none> ....." //没有了镜像名和标签
可以通过docker log id ... 重命名
docker rmi -f $(docker images -q) //删除所有本机镜像
容器管理命令
docker run -it(d) --name 容器名 镜像名:标签 //创建容器 -i 启动容器时保留其标准输入(交互) -t 请求docker分配一个pty伪终端 -d 后台运行
// 或者可以通过ctrl p + ctrl q 跳出容器并保持容器后台运行
docker ps //查看运行中的容器 -a 查看所有容器 -p 只打印容器id列
docker inspect 镜像:容器 //查看容器详细信息
docker start/stop/restart 容器id/NAMES //启动/停止/重启容器
docker exec -it 容器id/NAMES 启动命令 //交互式对容器执行指令
docker cp 本机路径 容器NAMES:/路径 //本机和容器之间拷贝文件
docker rm 容器id/NAMES //删除容器 -f 强制删除
docker logs 容器id/NAMES //查看容器日志
容器运行后台后如何进入交互式
docker run -itd 镜像:容器名 创建容器之后运行在后台中, 通过 docker exec -it /bin/bash 交互式命令即可进入容器内
docker exec -it /bin/ls 打印主目录ls 非交互式
案例
简单镜像制作
bash
# 使用基础镜像创建一个容器
[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
容器部署应用
- 部署 apache 服务
bash
# 删除所有容器
[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
# 在另一个终端完成访问验证
- 为 apache 添加解析 php 文件支持
bash
# ctrl + c 终止 httpd 服务运行
[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
# 服务不要关闭,在其他终端完成测试
- 验证配置
bash
# 在另一个终端拷贝 public/info.php 到 docker 主机
[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