容器技术概述,容器管理命令,镜像管理命令,定制简单镜像

今日目标

-理解linux下容器技术的概念

-使用docker管理镜像和容器

-学习简单镜像制作

容器概述

起源于1979年UNIX系统中提供的chroot命令,最初目的是为了隔离计算机中的各类资源,以便降低软件开发、测试阶段的风险。

容器诞生:当文件系统、访问、资源都可以被隔离后,容器已经有它降生所需要的全部条件,Linux内核开始提供Cgroups的同一时间,就马上发布了名为LXC的系统级虚拟化功能。

Docker:早期的容器技术是一种封装系统的轻量级虚拟化,Docker眼中”容器技术“是一种以应用为核心,对程序文件、运行时环境、软件依赖包都可以封装打包、部署的技术手段。docker容器中没有系统。

Docker:2014年,开源了自己Golang开发的libcontainer。2015年,多家公司联合制定了”开放容器交互标准(oci)“,这是一个关于容器格式和运行时的规范文件,其中包括运行时标准、容器镜像标准、镜像分发标准。

容器三大概念:(1)容器(类创建的一个对象实例):一个在隔离环境中的程序,

如何创建容器?首先使用Cow为镜像创建一个读写层,容器在读写层运行,这种方式可以让一个镜像创建无数个容器。

(2)镜像(类):镜像是只读的模板,包含了创建容器所需的所有文件和配置信息。

-是创建容器的核心

-使用Cow技术

-采用分层设计

-镜像始终都是只读的

获取镜像:镜像可以从官方镜像仓库下载http://hub.docker.com,也可以自己制作

(3)仓库(存放管理类):仓库是用来存储、分发、管理镜像的地方

docker 安装部署:

配置 Yum 仓库

把 docker 软件包添加到跳板机的自定义 yum 仓库中

 [root@ecs-proxy s4]# rsync -av docker/ /var/localrepo/docker/
 [root@ecs-proxy s4]# createrepo --update /var/localrepo
主机名IP地址最低配置
docker-0001192.168.1.312CPU,4G内存
docker-0002192.168.1.322CPU,4G内存

查询版本信息

命令说明
docker version查看服务器与客户端版本
docker info查看 docker 服务配置信息

安装部署

 [root@docker ~]# echo 'net.ipv4.ip_forward = 1' >>/etc/sysctl.conf #开启路由转发
 [root@docker ~]# sysctl -p
 [root@docker ~]# dnf install -y docker-ce
 [root@docker ~]# systemctl enable --now docker
 # 查看服务器与客户端版本
 [root@docker ~]# docker version
 Client: Docker Engine - Community
  Version:           20.10.10
  ... ...
 Server: Docker Engine - Community
  Engine:
   Version:          20.10.10

添加镜像加速

 [root@docker ~]# vim /etc/docker/daemon.json
 {
     "registry-mirrors": ["这里配置镜像仓库加速器地址"],
     "insecure-registries":[]
 }
 [root@docker ~]# systemctl restart docker
 # 查看 docker 服务配置信息
 [root@docker ~]# docker info
 ... ...
  Insecure Registries:
   127.0.0.0/8
  Registry Mirrors:
   https://镜像仓库加速器/
  Live Restore Enabled: false

配置镜像加速器梯子

镜像中心--镜像加速器--加速器地址,复制地址到"registry-mirrors": ["这里配置镜像仓库加速器地址"]中后,在执行重启服务systemctl restart docker

docker info显示服务配置信息可以看到镜像地址配置成功

镜像管理命令

镜像管理命令说明
docker images查看本机镜像
docker pull/push 镜像名称:标签下载/上传镜像
docker save 镜像名称:标签 -o 文件名备份/导出镜像为tar包
docker load -i 备份文件名称恢复/导入备份的镜像文件
docker history 镜像名称:标签查看镜像的制作历史

配置完成后可以使用docker pull busybox:latest 下载busybox:latest镜像

字段:名称,标签,身份证号,创建时间,大小

镜像的备份与恢复

指定镜像的方法

-每个镜像都对应唯一的镜像ID

-镜像名称+标签==唯一

-每一个镜像都有标签,默认标签latest

-我们在调用镜像的时候,如果没有指定标签也是latest

镜像管理案例

myos.tar.xz 在本阶段/public/ 目录下,拷贝镜像包到 docker 主机 [root@ecs-proxy s4]# rsync -av public/myos.tar.xz 192.168.1.31:./

[root@docker ~]docker load -i myos.tar.xz

[root@docker ~]docker images

pull、images、history
 # 下载 busybox:latest 镜像
 [root@docker ~]# docker pull busybox:latest
 # 查看本机镜像
 [root@docker ~]# docker images
 REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
 busybox      latest    66ba00ad3de8   5 weeks ago     4.87MB
 # 查看镜像的制作历史
 [root@docker ~]# docker history busybox:latest
 IMAGE          CREATED      CREATED BY                                 SIZE
 b539af69bc01   9 days ago   /bin/sh -c #(nop)  CMD ["sh"]              0B
 <missing>      9 days ago   /bin/sh -c #(nop) ADD file:069460fea045…   4.86MB
save、load
 # 备份 rockylinux:8.5 镜像为 tar 包
 [root@docker ~]# docker save busybox:latest -o busybox.tar
 # 使用备份文件恢复镜像
 [root@docker ~]# docker load -i myos.tar.xz
 Loaded image: rockylinux:8.5
 Loaded image: myos:8.5
 Loaded image: myos:php-fpm
 Loaded image: myos:nginx
 Loaded image: myos:httpd
 Loaded image: myos:latest
 # 查看本机镜像
 [root@docker ~]# docker images
 REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
 myos         php-fpm   7124977c0b21   12 days ago     275MB
 myos         latest    1de38c85c2d1   3 weeks ago     4.67MB
 myos         nginx     5e45400d8e76   3 weeks ago     274MB
 myos         httpd     9245e660f88f   3 weeks ago     299MB
 myos         8.5       621bfd7f9b46   3 weeks ago     249MB
 busybox      latest    66ba00ad3de8   5 weeks ago     4.87MB
 rockylinux   8.5       210996f98b85   14 months ago   205MB

案例(2)

-下载busybox:latest 镜像,在docker-0001上导入教学镜像

-下载备份rockylinux:8.5并在docker-0002上恢复备份,查看rockylinux:8.5的制作历史

 [root@docker-0001 ~]# docker load -i myos.tar.xz
 [root@docker-0001 ~]# docker save rockylinux:8.5 -o rockylinux.tar
 [root@docker-0001 ~]# scp rockylinux.tar 192.168.1.32:/root/
 #-------------------------------------------------------------------#
 [root@docker-0001 ~]# docker load -i rockylinux.tar
 [root@docker-0001 ~]# docker history rockylinux:8.5

容器管理命令

容器管理命令说明
docker run -it(d) 镜像名称:标签创建容器
docker ps查看容器的信息
docker inspect 镜像名称|容器名称查询(容器/镜像)的详细信息
docker [start|stop|restart] 容器id启动、停止、重启容器
docker exec -it 容器ID 启动命令在容器内执行命令
docker cp 路径1 路径2拷贝文件:路径格式(本机路径、容器ID/路径)

(1)创建容器 docker run -参数 镜像名称:镜像标签

参数-i 交互式、-t分配终端、-d后台运行、--name 容器名字、--rm容器结束后自动删除相当于临时容器

ctrl+p ctrl+q退出容器并保持容器状态,相当于放入后台

查看run的参数:docker help run/man docker-run

(2)命令替换 docker start $(docker ps -aq) 启动所有停止状态的Docker容器

容器管理案例

run
 # 创建一个容器
 [root@docker ~]# docker run -it myos:8.5
 [root@3aa1df05b795 /]# hostname
 3aa1df05b795
 [root@3aa1df05b795 /]# ps -ef
 UID          PID    PPID  C STIME TTY          TIME CMD
 root           1       0  0 15:13 pts/0    00:00:00 /bin/bash
 root          19       1  0 15:13 pts/0    00:00:00 ps -ef
 [root@3aa1df05b795 /]# 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
         ether 02:42:ac:11:00:02  txqueuelen 0  (Ethernet)
         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@3aa1df05b795 /]# exit
 # 创建后台容器
 [root@docker ~]# docker run -itd myos:httpd
 6d6884244a995791f8171efa3ce81be1e9e51bedf25c3a5a67bac8bb7bc019b0
 # 创建名为web1的后台容器
 [root@docker ~]# docker run -itd --name web1 myos:httpd
 14b669a75a95e9ba590c37137abc9d828d2c769d46f69c35fb0e8cc98cc544c4 
ps
 # 查询容器状态
 [root@docker ~]# docker ps
 CONTAINER ID   IMAGE        ... ...  STATUS          PORTS     NAMES
 14b669a75a95   myos:httpd   ... ...  Up 25 minutes   80/tcp    web1
 6d6884244a99   myos:httpd   ... ...  Up 25 minutes   80/tcp    hawking
 [root@docker ~]# docker ps -a#列出所有容器的状态
 CONTAINER ID   IMAGE        ... ...  STATUS          PORTS     NAMES
 14b669a75a95   myos:httpd   ... ...  Up 25 minutes   80/tcp    web1
 6d6884244a99   myos:httpd   ... ...  Up 25 minutes   80/tcp    hawking
 47ded92f442f   myos:8.5     ... ...  Exited (0)                yonath
 [root@docker ~]# docker ps -aq#列出所有容器(包括运行中和停止的)的ID,而且只输出容器ID
 14b669a75a95
 6d6884244a99
 47ded92f442f
start、stop、restart
 [root@docker ~]# docker ps -a
 CONTAINER ID   IMAGE        ... ...  STATUS          PORTS     NAMES
 14b669a75a95   myos:httpd   ... ...  Up 25 minutes   80/tcp    web1
 6d6884244a99   myos:httpd   ... ...  Up 25 minutes   80/tcp    hawking
 47ded92f442f   myos:8.5     ... ...  Exited (0)                yonath
 # 停止容器
 [root@docker ~]# docker stop web1 6d6884244a99
 web1
 6d6884244a99
 [root@docker ~]# docker ps -a
 CONTAINER ID   IMAGE        ... ...  STATUS          PORTS     NAMES
 14b669a75a95   myos:httpd   ... ...  Exited (0)                web1
 6d6884244a99   myos:httpd   ... ...  Exited (0)                hawking
 47ded92f442f   myos:8.5     ... ...  Exited (0)                yonath
 # 启动容器
 [root@docker ~]# docker start web1 
 web1
 [root@docker ~]# docker ps -a
 CONTAINER ID   IMAGE        ... ...  STATUS          PORTS     NAMES
 14b669a75a95   myos:httpd   ... ...  Up 6 seconds    80/tcp    web1
 6d6884244a99   myos:httpd   ... ...  Exited (0)                hawking
 47ded92f442f   myos:8.5     ... ...  Exited (0)                yonath
 # 重启容器
 [root@docker ~]# docker restart 6d6884244a99 
 6d6884244a99
 [root@docker ~]# docker ps -a
 CONTAINER ID   IMAGE        ... ...  STATUS          PORTS     NAMES
 14b669a75a95   myos:httpd   ... ...  Up 18 seconds   80/tcp    web1
 6d6884244a99   myos:httpd   ... ...  Up 3 seconds    80/tcp    hawking
 47ded92f442f   myos:8.5     ... ...  Exited (0)                yonath
inspect
 # 查询镜像的详细信息
 [root@docker ~]# docker inspect myos:httpd
 {   ......
     "Cmd": [
         "httpd",
         "-DFOREGROUND"#容器默认启动进程
     ],
     ......
 }
 # 查询容器的详细信息
 [root@docker ~]# docker inspect 6d6884244a99 web1
 [
     { ... ...
             "Gateway": "172.17.0.1",
             "GlobalIPv6Address": "",
             "GlobalIPv6PrefixLen": 0,
             "IPAddress": "172.17.0.3",
             "IPPrefixLen": 16,
      ... ...
exec:在容器内执行命令(容器在up状态)

拷贝文件cp:

上传:docker cp 本机文件路径 容器id:容器内路径

下载:docker cp 容器id:容器内路径 本机文件路径

 # 在容器内执行非交互命令
 [root@docker ~]# docker exec -it web1 /bin/ls
 index.html    info.php
 # 在容器内执行交互命令
 [root@docker ~]# docker exec -it web1 /bin/bash 
 [root@487e19bb4ca3 ~]# exit
 # 从容器内拷贝文件出来
 [root@docker ~]# docker cp web1:/etc/httpd/conf/httpd.conf ./
 [root@docker ~]# sed -ri "s,(Listen )80,\18080," httpd.conf
 # 把文件拷贝到容器内
 [root@docker ~]# docker cp httpd.conf web1:/etc/httpd/conf/
 # 重启容器
 [root@docker ~]# docker restart web1
 # 查询容器详细信息
 [root@docker ~]# docker inspect web1
 {   
    "Networks": {
        "bridge": {
            "IPAddress": "172.17.0.2",
     ......
 }
 [root@docker ~]# curl http://172.17.0.2:8080/
 Welcome to The Apache.

其他管理命令

管理命令说明
docker rm 容器ID删除容器
docker logs 容器ID查看容器日志
docker tag 镜像ID:标签 镜像名称:新的标签创建新的镜像名称和标签
docker rmi 镜像名称:标签删除镜像(必须先删除该镜像启动的所有容器)

管理命令案例

rm、logs
 # 删除容器(容器关闭状态下)
 [root@docker ~]# docker rm 47ded92f442f
 # 强制删除容器
 [root@docker ~]# docker rm -f web1
 # 删除所有容器
 [root@docker ~]# docker rm -f $(docker ps -aq)
 # 创建容器
 [root@docker ~]# docker run -itd --name web myos:nginx
 # 访问容器
 [root@docker ~]# docker inspect web |grep IPAddress
 [root@docker ~]# curl http://172.17.0.2/info.php
 # 查看容器日志
 [root@docker ~]# docker logs web
 2023/01/17 15:51:49 [error] 6#0: *1 open() "/usr/local/nginx/html/info.php" failed (2: No such file or directory), client: 172.17.0.1, server: localhost, request: "GET /info.php HTTP/1.1", host: "172.17.0.2"

logs命令

出错了如何恢复?运用cp命令拷贝修改重新上传到容器,重新启动容器即可恢复

rmi、tag
 # 删除一个镜像
 [root@docker ~]# docker rmi busybox:latest
 Untagged: busybox:latest
 # 已经创建容器的镜像无法删除
 [root@docker ~]# docker rmi -f myos:nginx
 Untagged: myos:nginx
 [root@docker ~]# docker images
 REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
 myos         php-fpm   7124977c0b21   12 days ago     275MB
 myos         latest    1de38c85c2d1   3 weeks ago     4.67MB
 <none>       <none>    5e45400d8e76   3 weeks ago     274MB
 myos         httpd     9245e660f88f   3 weeks ago     299MB
 myos         8.5       621bfd7f9b46   3 weeks ago     249MB
 rockylinux   8.5       210996f98b85   14 months ago   205MB
 # 给镜像设置一个新的名称标签
 [root@docker ~]# docker tag 5e45400d8e76 myos:nginx
 [root@docker ~]# docker images
 REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
 myos         php-fpm   7124977c0b21   12 days ago     275MB
 myos         latest    1de38c85c2d1   3 weeks ago     4.67MB
 myos         nginx     5e45400d8e76   3 weeks ago     274MB
 myos         httpd     9245e660f88f   3 weeks ago     299MB
 myos         8.5       621bfd7f9b46   3 weeks ago     249MB
 rockylinux   8.5       210996f98b85   14 months ago   205MB

简单镜像制作

 # 使用基础镜像创建一个容器
 [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
 ------------------------------------------------------------------
 # 把容器制作成镜像,commit 容器名字 镜像 (用于打包)
 [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 服务

 # 删除所有容器
 [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 ... ... # 去掉注释 
 17: # 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

容器服务原理

什么是上帝进程?系统创建之初产生的第一个进程

特点:没有父进程,PID==1,是所有程序的根进程,上帝进程死亡系统实例也关闭了

容器有没有进程?容器的启动进程就是上帝进程

前台服务VS后台服务?前台服务是占有控制终端的进程,可以在终端与用户交互式的访问与操作,一旦终端关闭,这个进程也随之消失。后台进程也叫守护进程,不受终端控制,它不需要交互;后台进程本质是向系统托管进程服务

  • 20
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值