四、(2)docker镜像管理_容器


1、获取镜像

#需要从镜像仓库获取,默认的镜像仓库是DockerHub
#docker search 镜像名:tag  (centos:latest)
docker search centos
docker images / docker image ls

#语法:docker pull [OPTIONS] NAME[:TAG|@DIGEST]
docker pull centos:latest

#查看docker具体信息
docker info
#存放docker镜像具体目录
[root@localhost home]# ls /var/lib/docker/image/overlay2/imagedb/content/sha256/ -l
总用量 36
-rw-------. 1 root root 2142 10月 22 12:13 5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6
-rw-------. 1 root root 7656 10月 22 12:12 605c77e624ddb75e6110f997c58876baa13f8754486b461117934b24a9dc3a85
-rw-------. 1 root root 7700 10月 22 12:42 7614ae9453d1d87e740a2056257a6de7135c84037c367e1fffa92ae922784631
-rw-------. 1 root root 2794 10月 22 12:56 afb6fca791e071c66276202f8efca5ce3d3dc4fb218bcddff1bc565d981ddd1e
-rw-------. 1 root root 1462 10月 22 12:56 ba6acccedd2923aee4c2acc6a23780b14ed4b8a5fa4e14e252a23b846df9b6c1
-rw-------. 1 root root 6891 10月 22 18:06 d2e15674b2b7c5d1d6cea4a4518899932e472767012908b635e0e4fae7db6c63
[root@localhost home]# docker images
REPOSITORY   TAG        IMAGE ID       CREATED          SIZE
my_nginx     latest     d2e15674b2b7   29 minutes ago   141MB
nginx        latest     605c77e624dd   22 months ago    141MB
redis        latest     7614ae9453d1   22 months ago    113MB
ubuntu       latest     ba6acccedd29   2 years ago      72.8MB
centos       latest     5d0da3dc9764   2 years ago      231MB
centos       7.8.2003   afb6fca791e0   3 years ago      203MB

#记录镜像和容器的配置关系 以JASN文件心事存在
 cat /var/lib/docker/image/overlay2/imagedb/content/sha256/5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6 
{"architecture":"amd64","config":{"Hostname":"","Domainname":"","User":"","AttachStdin":false,"AttachStdout":false,"AttachStderr":false,"Tty":false,"OpenStdin":false,"StdinOnce":false,"Env":["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],"Cmd":["/bin/bash"],"Image":"sha256:f5b050f177fd426be8fe998a8ecf3fb1858d7e26dff4080b29a327d1bd5ba422","Volumes":null,"WorkingDir":"","Entrypoint":null,"OnBuild":null,"Labels":{"org.label-schema.build-date":"20210915","org.label-schema.license":"GPLv2","org.label-schema.name":"CentOS Base Image","org.label-schema.schema-version":"1.0","org.label-schema.vendor":"CentOS"}},"container":"9bf8a9e2ddff4c0d76a587c40239679f29c863a967f23abf7a5babb6c2121bf1","container_config":{"Hostname":"9bf8a9e2ddff","Domainname":"","User":"","AttachStdin":false,"AttachStdout":false,"AttachStderr":false,"Tty":false,"OpenStdin":false,"StdinOnce":false,"Env":["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],"Cmd":["/bin/sh","-c","#(nop) ","CMD [\"/bin/bash\"]"],"Image":"sh

#运行之后的容器使用exec进入容器内部
docker exec -it fa782e998ecc bash

#使用不同的镜像,生成容器 it开启一个交互式的终端, --=rm 容器退出时删除该容器
docker run -it --rm centos bash

2、查看镜像

```powershell
docker images

1、#查看具体镜像
docker images nginx
docker images centos:latest
docker images -q
#-q --quit 只列出镜像id


2、#使用格式化语言美化输出

```powershell
[root@localhost ~]# docker images --format "{{.Repository}}--{{.ID}}"
my_nginx--d2e15674b2b7
nginx--605c77e624dd
redis--7614ae9453d1
ubuntu--ba6acccedd29
centos--5d0da3dc9764
centos--afb6fca791e0


3、#使用表格语言美化输出


[root@localhost ~]# docker images --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}"
IMAGE ID       REPOSITORY   TAG
d2e15674b2b7   my_nginx     latest
605c77e624dd   nginx        latest
7614ae9453d1   redis        latest
ba6acccedd29   ubuntu       latest
5d0da3dc9764   centos       latest
afb6fca791e0   centos       7.8.2003


4、#查看镜像详细信息
docker image inspect 镜像id
[root@localhost ~]# docker image inspect d2e15674b2b7
[
    {
        "Id": "sha256:d2e15674b2b7c5d1d6cea4a4518899932e472767012908b635e0e4fae7db6c63",
        "RepoTags": [
            "my_nginx:latest"
        ],
        "RepoDigests": [],
        "Parent": "",
        "Comment": "buildkit.dockerfile.v0",
        "Created": "2023-10-22T18:06:05.839559125+08:00",
        "Container": "",
        "ContainerConfig": {
            "Hostname": "",

3、删除镜像(有时候镜像执行一次退出,有容器运行记录去删除镜像失败,需要删除容器镜像)

#删除容器记录
docker ps 
docker ps  -a 
docker rm 205745e494e1  /  docker rm hello-world

docker pull hello-world
docker images 
[root@localhost ~]# docker rmi hello-world 
Untagged: hello-world:latest
Untagged: hello-world@sha256:2498fce14358aa50ead0cc6c19990fc6ff866ce72aeb5546e1d59caac3d0d60f
Deleted: sha256:feb5d9fea6a5e9606aa995e879d862b825965ba48de054caab5ef356dc6b3412
Deleted: sha256:e07ee1baac5fae6a26f30cabfe54a36d3402f96afda318fe0a96cec4ca393359

#批量删除镜像
#显示全部镜像id
docker images -aq
docker rmi `docker images -aq`

4、导入导出镜像

#导出间镜像
docker image save centos:7.8.2003 > /opt/centos:7.8.2003.tgz
docker ps -a
docker rm centos:7.8.2003

docker rmi centos:7.8.2003
docker images

[root@localhost ~]# ll  /opt/centos:7.8.2003.tgz 
-rw-r--r--. 1 root root 211077120 10月 22 19:50 /opt/centos:7.8.2003.tgz
#-h显示文件的大小
#导入镜像
docker image load -i /opt/centos:7.8.2003.tgz 
docker images

5、docker镜像原理

[root@localhost ~]# docker pull  redis
Using default tag: latest
latest: Pulling from library/redis
a2abf6c4d29d: Already exists 
c7a4e4382001: Pull complete 
4044b9ba67c9: Pull complete 
c8388a79482f: Pull complete 
413c8bb60be2: Pull complete 
1abfd3011519: Pull complete 
Digest: sha256:db485f2e245b5b3329fdc7eff4eb00f913e09d8feb9ca720788059fdc2ed8339
Status: Downloaded newer image for redis:latest
docker.io/library/redis:latest

我们在获取镜像的时候,发现下载了很多行信息,最终得到一个完整的镜像文件,为什么?
6、centos7系统的组成
使用vmware的虚拟机安装的系统,是一个完整的系统的文件包括两部分:linux+centos7发行版

linux内核:提供操作系统基本的功能,用于和硬件交互,读取存储磁盘,管理网络等
centos7发行版:用于提供软件功能,如wget下载、yum安装包管理等

基于以上思路,基于容器的原理是否可以基于宿主机的linux内核加上不同的发行版使用不同的系统
docker可以实现这个功能。

[root@localhost ~]# cat /etc/redhat-release 
CentOS Linux release 7.9.2009 (Core)
[root@localhost ~]# uname -r
3.10.0-1160.el7.x86_64

快速实现,使用docker切换不同的发行版,内核使用的都是宿主机的内核

#利用docker获取不同的发行版
docker pull centos:7.8.2003
docker pull ubuntu
#确认当前宿主机的版本信息
cat /etc/redhat-release 
uname -r

#进入centos:7.8.2003容器
[root@localhost ~]# docker run -it centos:7.8.2003 bash
[root@475f1ea36cc6 /]# cat /etc/redhat-release 
CentOS Linux release 7.8.2003 (Core)
[root@475f1ea36cc6 /]# uname -r
3.10.0-1160.el7.x86_64

#进入Ubuntu容器中查看
docker run ubuntu -it bash
root@b78f0f9b7bde:/# cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04.3 LTS"

#进入Debian
cat /etc/os-release 
PRETTY_NAME="Debian GNU/Linux 11 (bullseye)"
NAME="Debian GNU/Linux"
VERSION_ID="11"
VERSION="11 (bullseye)"
VERSION_CODENAME=bullseye
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/
[root@475f1ea36cc6 /]# uname -r
3.10.0-1160.el7.x86_64

7、docker解决了什么问题

#一个开发者需要安装各种环境运行项目

mysql etcd redis elb等等

#问题点 需要运行在linux下,需要安装虚拟机或者后买一台云服务器 本机资源不足不足以支持多台虚机 删除资源不会卸载

docker可以解决这些问题

四、(2)docker镜像管理_centos_02

  • 解决了环境的兼容性问题,在容器中运行linux的发行版,以及各种软件【windows+虚机+docker+容器1(mysql)+容器2(etcd)+容器3(tomcat)】
  • 环境很干净,安装的所有应用和数据都在容器里面,可以一次性删除,不影响宿主机
  • 可以执行强:如果想要把mysql容器里面的数据、配置、全部迁移至服务器,只需要提交容器,生成镜像,镜像放到容器可以任意一只使用,一次构建到处运行。
    8、配置私有仓库
#1、拉取并运行私有镜像仓库
docker run -d -p5000:5000 registory

#2、更改符合私有仓库的tag名称
docker tag httpd-centos localhost:5000/http:v1
#格式:本机:端口/tag名称:版本号

#3、上传至私有镜像仓库
docker push localhost:5000/http:v1

#4、查看私有镜像仓库中的信息
#列出所有的本地registory仓库镜像
curl -X GET http://localhost:5000/v2/_catalog #固定格式
curl -X GET http://localhost:5000/v2/http/tags/list
docker rmi httpd-centos
docker pull localhost:5000/http:v1

9、