容器
没有父进程,PID == 1
是所有程序的根进程
上帝进程死亡系统实例也就关闭了
1.概述
1.1 技术起源
-
Linux容器的起源
-容器的起源可以追溯到1979年 UNIX 系统中提供的 chroot 命令,容器的最初的设计目标是为了隔离计算机中的各类资源,以便降低软件开发、测试阶段的风险,或者充当蜜罐,吸引黑客的攻击,以便监视黑客的行为。
-最初的容器是以 chroot 为代表的文件隔离技术,但这并不完美,如主机名、网络、系统进程、用户等都无法隔离
-
名称空间与控制组
-为了实现完美的隔离机制,2002年 Linux引入了一种由内核直接提供的全局资源封装的全新隔离机制(名称空间)用来解决隔离的问题,至2009年,Linux内核已经支持了UTS、IPC、PID、NETWORK、MOUNT等多个名称空间
-Linux 解决资源配额的方案是控制组(Cgroups),它与名称空间一样直接由内核提供功能,用来隔离或者说分配并限制某个进程组能够使用的资源量,包括占用CPU 时间、内存大小、磁盘 I/O 速度,等等
-
容器诞生
-当文件系统、访问、资源都可以被隔离后,容器已经有它降生所需的全部条件,Linux 内核开始提供 Cgroups的同一时间,就马上发布了名为 LXC 的系统级虚拟化功能
-LXC 带着令人瞩目的光环登场,可惜的是,LXC 在设定自己的发展目标时,被前辈们的影响所局限住。LXC 眼中的容器是一种封装系统的强量化虚拟机。这种局限的思想也决定了LXC 不可能形成今天的容器生态的,所以,接下来舞台的聚光灯终于落到了 Docker身上。
2. Docker
容器故障排错:
1.使用inspect 查看有没有异常信息
2.使用logs 查看报错信息
解决思路:
1.cp和logs 在容器没有启动的时候还可以使用
2.1 概述
-
项目出现
2013年3月,一个名为 Docker的项目宣布开源
当时的人们并没有意识到这款软件将要带来怎样的技术变革。
它的出现促使“容器”从一个阳春白雪的只流传于机客口中的技术词汇,逐渐走向整个IT舞台的中央,短短数年时间,就已成为开发、测试、部署等各个环节都难以或缺的基础支撑。是什么样的魔力让 Docker可以从一问世就惊艳世间。
-
容器理念
-促使 Docker的一问世就惊艳世间的,不是什么黑科技式的秘密武器,而是其符合历史潮流的创意与设计理念,还有充分开放的生态环境
-早期的容器技术是一种封装系统的轻量级虚拟化,Docker 眼中“容器技术”是一种以应用为核心,对程序文件、运行时环境、软件依赖包都可以封装打包、部署的技术手段
-Docker 的容器中没有系统
-
开放的理念
-2014年,Docker开源了自己用 Golang开发的 Libcontainer
-2015年,在Docker 的主导和倡议下,多家公司联合制订了“开放容器交互标准”(OCI),这是一个关于容器格式和运行时的规范文件,其中包括:
-运行时标准(RUNTIME-SPEC)
-容器镜像标准(IMAGE-SPEC)
-镜像分发标准(DISTRIBUTION-SPEC)
-
三大概念
-容器:容器是一个运行在隔离环境中的程序
-镜像:镜像是只读的模板,包含了创建容器所需的所有文件和配置信息
-仓库:仓库是用来存储、分发、管理镜像的地方
2.2 docker安装
-
环境需求
需要64为操作系统
内核版本 > 2.6.32
-
配置自定义 Yum仓库
-华为云提供的 Yum 中没有docker 软件包
-向自定义 Yum 仓库中添加 docker软件包
-docker软件包位于 本阶段/docker 目录中
[root@ecs-proxy s4]# rsync -av docker/ /var/localrepo/docker/ [root@ecs-proxy s4]# createrepo --update /var/localrepo
-
开启路由转发(让容器里可以和外部通信)
[root@docker ~]# echo 'net.ipv4.ip_forward = 1' >>/etc/sysctl.conf [root@docker ~]# sysctl -p
-
安装docker
[root@docker ~]# dnf install -y docker-ce [root@docker ~]# systemctl enable --now docker # 查看服务器与客户端版本 [root@docker ~]# docker version
-
配置镜像仓库
[root@docker ~]# vim /etc/docker/daemon.json { "registry-mirrors":["https://08fd160814000f2c0f84c01dab5db9e0.mirror.swr.myhuaweicloud.com"], "insecure-registries":[] } [root@docker ~]# systemctl restart docker # 查看 docker 服务配置信息 [root@docker ~]# docker info ... ... Insecure Registries: 127.0.0.0/8 Registry Mirrors: https://https://08fd160814000f2c0f84c01dab5db9e0.mirror.swr.myhuaweicloud.com/ Live Restore Enabled: false
提示:registry-mirrors里面是镜像仓库加速器地址,本次实验使用的是华为云 广州地区的镜像加速地址
2.3 镜像管理
2.3.1 镜像概述
-镜像是创建容器的核心
-镜像使用COW技术
-镜像采用分层设计
-镜像始终都是只读的
2.3.2 创建容器
-首先使用 COW为镜像创建一个读写层,容器在读写层运行
-这种方式可以让一个镜像创建无数个容器
2.3.3 获取镜像
镜像可以从官方镜像仓库下载,也可以自己制作
官方镜像仓库:https://hub.docker.com
从官方下载较慢,可以使用国内的镜像站加速
添加配置文件:/etc/docker/daemon.json
{
"registry-mirrors": ["这里配置镜像仓库加速器地址"],
"insecure-registries":[]
}
2.4 容器管理命令
2.4.1 镜像管理命令
命令 说明
docker images 查看本机镜像
docker pull 镜像名称:标签 下载镜像
docker save 镜像名称:标签 -o 文件名 备份镜像为tar包
docker load -i 备份文件名称 导入备份的镜像文件
docker history 镜像名称:标签 查看镜像的制作历史
2.4.2 容器管理命令
命令 说明
docker run -it(d) 镜像名称:标签 创建容器
docker ps 查看容器的信息
docker inspect 镜像名称|容器名称 查询(容器/镜像)的详细信息
docker [start|stop|restart] 容器id 启动、停止、重启容器
docker exec -it 容器ID 启动命令 在容器内执行命令
docker logs 容器ID 查看容器日志
docker cp 路径1 路径2 拷贝文件:路径格式(本机路径、容器ID/路径)
docker rm 容器ID 删除容器
docker tag ID:标签 镜像名称:新的标签 创建新的镜像名称和标签
docker rmi 镜像名称:标签 删除镜像(必须先删除该镜像启动的所有容器)
1. run
常用参数
-i 交互式
-t 分配终端
-d 后台运行
--name 指定容器名字
--rm 容器结束后自动删除,在内存中建立临时容器
转入后台快捷键(ctrl-p + ctrl-q)
# 创建一个容器 [root@docker-0001 ~]# docker run -it myos:8.5 [root@3e0f2a086afb /]# hostname 3e0f2a086afb [root@3e0f2a086afb /]# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 15:13 pts/0 00:00:00 /bin/bash root 22 1 0 15:13 pts/0 00:00:00 ps -ef [root@3e0f2a086afb /]# ifconfig eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255 ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet) RX packets 16 bytes 1392 (1.3 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 loop txqueuelen 1000 (Local Loopback) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 [root@3e0f2a086afb /]# exit # 创建后台容器 [root@docker-0001 ~]# docker run -itd myos:httpd 893a7051e5f2dccbfd31fa4d27aecfde1935ac95215e09ea7901cfaeab207aeb # 创建名为web1的后台容器 [root@docker-0001 ~]# docker run -itd --name web1 myos:nginx 14b669a75a95e4b95e4c2f581b331ef4e24d74a622d218e5bfdce01f18f47165
2. ps
[root@docker-0001 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 14b669a75a95 myos:nginx "nginx -g 'daemon of…" 14 minutes ago Up 14 minutes 80/tcp web1 893a7051e5f2 myos:httpd "httpd -DFOREGROUND" 14 minutes ago Up 14 minutes 80/tcp modest_allen # 字段解析 镜像 上帝进程 什么时间创建 容器状态 端口 名称 [root@docker-0001 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 14b669a75a95 myos:nginx "nginx -g 'daemon of…" 14 minutes ago Up 14 minutes 80/tcp web1 893a7051e5f2 myos:httpd "httpd -DFOREGROUND" 14 minutes ago Up 14 minutes 80/tcp modest_allen 3e0f2a086afb myos:8.5 "/bin/bash" 19 minutes ago Exited (0) 15 minutes ago fervent_euclid [root@docker-0001 ~]# docker ps -aq # 只显示ID 14b669a75a95 893a7051e5f2 3e0f2a086afb
3. start、stop、restart
[root@docker-0001 ~]# docker ps -a CONTAINER ID IMAGE ... ... STATUS PORTS NAMES 14b669a75a95 myos:nginx ... ... Up 25 minutes 80/tcp web1 893a7051e5f2 myos:httpd ... ... Up 25 minutes 80/tcp hawking 3e0f2a086afb myos:8.5 ... ... Exited (0) yonath # 启动容器 [root@docker-0001 ~]# docker start web1 3e0f2a086afb web1 3e0f2a086afb [root@docker-0001 ~]# docker ps -a CONTAINER ID IMAGE ... ... STATUS PORTS NAMES 14b669a75a95 myos:nginx ... ... Up 25 minutes 80/tcp web1 893a7051e5f2 myos:httpd ... ... Up 25 minutes 80/tcp hawking 3e0f2a086afb myos:8.5 ... ... Up 2 seconds yonath # 停止容器 [root@docker-0001 ~]# docker stop web1 web1 # 命令替换,停止所有容器 [root@docker-0001 ~]# docker stop $(docker ps -aq) 14b669a75a95 893a7051e5f2 3e0f2a086afb [root@docker-0001 ~]# docker ps -a CONTAINER ID IMAGE ... ... STATUS PORTS NAMES 14b669a75a95 myos:nginx ... ... Exited (0) web1 893a7051e5f2 myos:httpd ... ... Exited (0) hawking 3e0f2a086afb myos:8.5 ... ... Exited (0) yonath # 重启容器 [root@docker-0001 ~]# docker restart web1 web1
4. inspect
# 查询镜像的详细信息 [root@docker-0001 ~]# docker inspect myos:httpd { ...... "Cmd": [ "httpd", "-DFOREGROUND" ], ...... } # 查询容器的详细信息 [root@docker-0001 ~]# docker inspect web1 893a7051e5f2 [ { ... ... "Gateway": "172.17.0.1", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "IPAddress": "172.17.0.2", "IPPrefixLen": 16, ... ... "Gateway": "", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "IPAddress": "", "IPPrefixLen": 0, ... ... } ]
5. exec、cp、logs
# 在容器内执行非交互命令 [root@docker ~]# docker exec -it web1 ls 50x.html index.html # 在容器内执行交互命令 [root@docker ~]# docker exec -it web1 bash [root@14b669a75a95 html]# ifconfig eth0 eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255 ... ... [root@14b669a75a95 html]# vim /usr/local/nginx/conf/nginx.conf 32: listen 80 [root@14b669a75a95 html]# exit # 从容器内拷贝文件出来 [root@docker ~]# docker cp web1:/usr/local/nginx/conf ./ Successfully copied 45.6kB to /root/./ # 重启容器 [root@docker ~]# docker restart web1 web1 [root@docker ~]# docker ps -a 14b669a75a95 myos:nginx ... ... Exited (1) web1 # 查看日志拍错 [root@docker ~]# docker logs web1 nginx: [emerg] invalid parameter "server_name" in /usr/local/nginx/conf/nginx.conf:33 # 修复配置文件错误 [root@docker ~]# vim conf/nginx.conf 32: listen 80; [root@docker ~]# docker cp conf/nginx.conf web1:/usr/local/nginx/conf/nginx.conf Successfully copied 4.61kB to web1:/usr/local/nginx/conf/nginx.conf [root@docker ~]# docker restart web1 web1 [root@docker ~]# docker ps CONTAINER ID IMAGE ... ... STATUS PORTS NAMES 14b669a75a95 myos:nginx ... ... Up 2 seconds 80/tcp web1
6. rm、rmi、tag
# 删除容器 [root@docker ~]# docker rm 47ded92f442f # 强制删除容器 [root@docker ~]# docker rm -f web1 # 删除所有容器 [root@docker ~]# docker rm -f $(docker ps -aq) 6d6884244a99 # 删除一个镜像 [root@docker ~]# docker rmi -f busybox:latest Untagged: busybox:latest # 已经创建了容器的镜像无法删除 [root@docker-0001 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE ... ... myos latest 1de38c85c2d1 13 months ago 4.67MB <none> <none> a9d583973f65 2 years ago 1.23MB # 给镜像设置一个新的名称标签 [root@docker ~]# docker tag a9d583973f65 busybox:latest [root@docker ~]# docker images [root@docker-0001 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE ...... myos latest 1de38c85c2d1 13 months ago 4.67MB busybox latest a9d583973f65 2 years ago 1.23MB
2.5 简单镜像制作
# 使用基础镜像创建一个容器 [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
2.6 容器部署应用
-
部署 apache 服务
# 删除所有容器 [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 文件支持
# 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 ... ... # 去掉注释 23: # LoadModule mpm_event_module ... ... # 注释配置 [root@a7f9d0c3e3e2 /]# /usr/sbin/httpd -DFOREGROUND # 服务不要关闭,在其他终端完成测试
-
验证配置
# 在另一个终端拷贝 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
标签:容器,...,记录,web1,镜像,docker,root From: https://www.cnblogs.com/pengcan2845732281/p/18395393