3、Docker镜像管理基础

时间:2023-03-09 06:52:19
3、Docker镜像管理基础

Docker image

3、Docker镜像管理基础   3、Docker镜像管理基础

# docker image ls

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
redis -alpine 23d561d12e92 days ago .5MB
nginx 1.14-alpine 66952fd0a8ef weeks ago 16MB
busybox latest 3a093384ac30 weeks ago .2MB

# docker exec -it kvstor1 /bin/sh
/data # ls /
bin data dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var   //完整意义上的根文件系统,是底层--> Base Image

Docker Image Layer

位于下层的镜像成为父镜像(parent image),最底层的成为基础镜像(base image)

最上层为"可读写"层,其下的均为"只读"层。

分层构建是在纯净的Debian镜像之上添加一个emacs,然后在emacs之上再添加apache。每添加一个软件都是一个独立的层次,bootfs/Kernel层在容器启动时,rootfs一旦被引导完成,会被从内存中移除。

真正的用户空间运行的只有Debian、emacs、apache这三层,同时这三层是有层级关系的。最底层的是base image,是供给一个系统的基本构成(比如bin、sbin等),但是它是最小化的,没有依赖的应用程序。

如果需要用到某些额外的应用程序的话,需要在其上面进行安装操作。比如最小化安装了centos,然后在centos上安装vim。注意对于镜像来讲,是只读的,需要创建的centos镜像是最小化,是不会动的,安装vim时会在这个镜像上生成一个新的层次,这个层次只包含vim程序。如果安装httpd的话,需要在vim层安装一个新的层次。如果要启动nginx的,就要把centos、vim和nginx这三层都启动起来。

容器启动起来之后,如果需要创建临时文件,一般是放在/tmp目录下的,但是在docker中/tmp是位于底层基础镜像中是不允许编辑的,所以就要在最上层添加可读写层。

注意:如果删除了容器,最上层的"可读写"层也会被删除。

3、Docker镜像管理基础

Aufs 

镜像的分层构建和联合挂载依赖于中游文件系统的支撑才能实现,在早期用到的专有文件系统叫aufs

3、Docker镜像管理基础

# docker info

Storage Driver: overlay2   //前端
Backing Filesystem: xfs    //后端

Docker Registry

启动容器时,docker daemon会试图从本地获取相关的镜像;

本地镜像不存在时,其将从Registry中下载该镜像并保存到本地;

如果没有特别指定registry,那么通常就是docker hub;

如果要指向别的registry,必须在镜像的访问路径当中指明服务器地址;

如果没有服务器地址,只给了仓库名/tags,那么这个镜像一定是指docker hub。

3、Docker镜像管理基础

Docker Registry 分类

3、Docker镜像管理基础

Registry 组成

3、Docker镜像管理基础

3、Docker镜像管理基础

3、Docker镜像管理基础

Docker Hub支持的功能:   https://www.kancloud.cn/thinkphp/docker-guide/39734

3、Docker镜像管理基础

非常著名的镜像服务器:https://quay.io/

如果要使用,需要下载到本地并安装  https://quay.io/repository/coreos/flannel   -->  docker pull quay.io/coreos/flannel

3、Docker镜像管理基础

从镜像仓库服务器中下载镜像

docker pull <registry>[:<port>]/[<namespace>/]<name>:<tag>   如果是docker hub,那么<registry>[:<port>]是可以省略的

<registry>:仓库服务器

<port>:端口,默认是443即https协议,可省略,

<namespace>:名称空间,指哪个用户的仓库,如果是顶层,可省略

<name>:<tag> :仓库名 + 标签名

# docker pull quay.io/coreos/flannel:v0.10.0-amd64   //这里没有指定端口表示是默认端口443,因为是通过https来获取的

quay.io 表示 <registry>

coreos 表示 <namespace>

flannel 表示 <name>

v0.10.0-amd64 表示 <tag>

Namespace的用法

3、Docker镜像管理基础

镜像的相关操作

镜像的生成途径

3、Docker镜像管理基础

如何基于容器创建镜像:

某个容器已经启动并处于运行中,那么使用docker commit把此运行的容器最上面的可写层单独创建一个镜像。

比如启动一个容器后,做好想要的修改,比如启动纯净的centos,在centos镜像上安装nginx --> #yum install nginx,然后把安装、生成nginx文件的可写层单独做成镜像。

3、Docker镜像管理基础

示例:在busybox的基础上,加上data/html目录,并创建index.html网页,把此结果做成镜像

# docker commit -h

Usage:    docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
//表示基于哪个容器(CONTAINER)做镜像,并指明属于哪个仓库(REPOSITORY)和拥有什么标签(TAG)
//[REPOSITORY[:TAG]]是可以省略的,省略后表示所作的镜像就是本地的裸镜像,不属于任何仓库,也没有任何标签
Create a new image from a container's changes
Options:
-a, --author string Author (e.g., "John Hannibal Smith <hannibal@a-team.com>")
-c, --change list Apply Dockerfile instruction to the created image
-m, --message string Commit message
-p, --pause Pause container during commit (default true)
//在制作镜像时,如果容器中的程序仍在运行,可能会生成新的文件,那么可能会导致制作的镜像中的新生成的文件是不完整的,所以在制作镜像时尽量使用-p选项,让容器中的程序暂停运行
[root@node1 ~]# docker run --name b1 -it busybox
/ # ls /
bin dev etc home proc root sys tmp usr var
/ # mkdir -p /data/html
/ # vi /data/html/index.html
<h1>Busybox server<h1>
以上修改在如果没有制做成镜像之前关闭容器b1的话,那么这些修改将不会保存。
在容器不关闭的情况下,把对此容器的修改进行保存。
[root@node1 ~]# docker commit -p b1
sha256:439595aa4b0f893362aa08a43ce7936d1cda2fa10d7b1e8d03b4a18bfcf1c0be
[root@node1 ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 439595aa4b0f 10 seconds ago 1.2MB //制作的新镜像
redis -alpine 23d561d12e92 days ago .5MB
nginx 1.14-alpine 66952fd0a8ef weeks ago 16MB
busybox latest 3a093384ac30 weeks ago .2MB
quay.io/coreos/flannel v0.10.0-amd64 f0fad859c909 months ago .6MB
[root@node1 ~]# docker tag -h
Flag shorthand -h has been deprecated, please use --help
为镜像打标签
Usage: docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
//SOURCE_IMAGE[:TAG]-->源镜像:源标签。镜像支持多个标签,如果原来有标签,这里表示源标签,如果之前没有标签那么则用IMAGE ID代替
Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
[root@node1 ~]# docker tag 439595aa4b0f beisen/httpd:v0.1-1
[root@node1 ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
beisen/httpd v0.- 439595aa4b0f minutes ago .2MB
redis -alpine 23d561d12e92 days ago .5MB
nginx 1.14-alpine 66952fd0a8ef weeks ago 16MB
busybox latest 3a093384ac30 weeks ago .2MB
quay.io/coreos/flannel v0.10.0-amd64 f0fad859c909 months ago .6MB
为一个镜像打多个标签
[root@node1 ~]# docker tag beisen/httpd:v0.- beisen/httpd:latest
[root@node1 ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
beisen/httpd latest 439595aa4b0f minutes ago .2MB
beisen/httpd v0.- 439595aa4b0f minutes ago .2MB
redis -alpine 23d561d12e92 days ago .5MB
nginx 1.14-alpine 66952fd0a8ef weeks ago 16MB
busybox latest 3a093384ac30 weeks ago .2MB
quay.io/coreos/flannel v0.10.0-amd64 f0fad859c909 months ago .6MB
删除一个标签,如果还有其他标签的话就不会把容器删除
[root@node1 ~]# docker image rm beisen/httpd:latest
Untagged: beisen/httpd:latest
[root@node1 ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
beisen/httpd v0.- 439595aa4b0f minutes ago .2MB
redis -alpine 23d561d12e92 days ago .5MB
nginx 1.14-alpine 66952fd0a8ef weeks ago 16MB
busybox latest 3a093384ac30 weeks ago .2MB
quay.io/coreos/flannel v0.10.0-amd64 f0fad859c909 months ago .6MB
基于容器b1做的镜像再次创建一个容器t1
[root@node1 ~]# docker run --name t1 -it beisen/httpd:v0.-
/ # ls /
bin data dev etc home proc root sys tmp usr var
/ # ls /data/html/
index.html
/ # cat /data/html/index.html
<h1>Busybox server<h1>

 / # which httpd
 /bin/httpd     //httpd的路径

/ # httpd -h
httpd: option requires an argument -- h
BusyBox v1.30.0 (-- :: UTC) multi-call binary. Usage: httpd [-ifv[v]] [-c CONFFILE] [-p [IP:]PORT] [-u USER[:GRP]] [-r REALM] [-h HOME]
or httpd -d/-e/-m STRING Listen for incoming HTTP requests -i Inetd mode
-f Don't daemonize
-v[v] Verbose
-p [IP:]PORT Bind to IP:PORT (default *:)
-u USER[:GRP] Set uid/gid after binding to port
-r REALM Authentication Realm for Basic Authentication
-h HOME Home directory (default .) //指定家目录
-c FILE Configuration file (default {/etc,HOME}/httpd.conf)
-m STRING MD5 crypt STRING
-e STRING HTML encode STRING
-d STRING URL decode STRING

镜像定义了基于此镜象启动容器时默认运行的程序,这里修改默认运行的程序

# docker inspect beisen/httpd:v0.1-1   //首先查看容器b1运行的默认程序

"Cmd": [
    "sh"    //这里默认运行的程序是sh
],

修改新创建的容器t1不再运行sh,而是运行httpd

# docker commit -h
Flag shorthand -h has been deprecated, please use --help
Usage: docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
Create a new image from a container's changes
Options:
-a, --author string Author (e.g., "John Hannibal Smith <hannibal@a-team.com>")
-c, --change list Apply Dockerfile instruction to the created image
-m, --message string Commit message
-p, --pause Pause container during commit (default true)

# docker commit -a "beisen" -c 'CMD ["/bin/httpd","-f","-h","/data/html"]' -p b1 beisen/httpd:v0.2

-a:指定作者

-c:修改默认运行的程序 --> /bin/httpd

-f:运行在前台

-h:指定家目录,可以和/data/html写在一起,但是-h和/data/html之间是有空格的,所以这里分开写,但是要注意两者的次序。

-p:让容器的程序处于暂停状态

b1:这里基于容器b1创建镜像,同时修改这个新镜像的默认启动程序

beisen/httpd:v0.2:新镜像的仓库名和tag

# docker run --name t2 beisen/httpd:v0.2    //基于新创建的镜像运行一个容器t2,这里没有使用-it,因为httpd不是交互式接口

# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c7ba9dc66b18 beisen/httpd:v0. "/bin/httpd -f -h /d?? About a minute ago Up About a minute t2 //容器t2已经启动了
465aab04ace8 beisen/httpd:v0.- "sh" minutes ago Up minutes t1
fb13aceb4369 busybox "sh" hours ago Up hours b1
da481ee71e45 redis:-alpine "docker-entrypoint.s?? 9 hours ago Up 9 hours 6379/tcp kvstor1
3ecb4f5d9a10 nginx:1.14-alpine "nginx -g 'daemon of?? 9 hours ago Up 9 hours 80/tcp web1

# docker inspect t2

"Cmd": [
    "/bin/httpd",
    "-f",
    "-h",
    "/data/html"
],

"IPAddress": "172.17.0.6",

# curl 172.17.0.6   //可以直接进行请求
  <h1>Busybox server<h1>

实现push镜像

在https://hub.docker.com注册账号

账号:studycolumn

3、Docker镜像管理基础

创建仓库,注意本地的标签一定要和远程仓库保持一致

这里将之前创建的仓库名加以修改

# docker tag beisen/httpd:v0.2 studycolumn/httpd:v0.2

[root@node1 ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
beisen/httpd v0.2 24577eceda35 About an hour ago 1.2MB
studycolumn/httpd v0.2 24577eceda35 About an hour ago 1.2MB

# docker image rm beisen/httpd:v0.2

3、Docker镜像管理基础

3、Docker镜像管理基础

将创建的镜像push到新建的仓库中

# docker push -h
Flag shorthand -h has been deprecated, please use --help
Usage: docker push [OPTIONS] NAME[:TAG]
Push an image or a repository to a registry
Options:
--disable-content-trust Skip image signing (default true)

在push之前,先登录到服务器上

[root@node1 ~]# docker login -h
Flag shorthand -h has been deprecated, please use --help
Usage: docker login [OPTIONS] [SERVER] //如果是docker hub的话,server不用指,如果是其他服务器必须指明
Log in to a Docker registry
Options:
-p, --password string Password
--password-stdin Take the password from stdin
-u, --username string Username

登陆仓库服务器

# docker login -u studycolumn
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded

将创建好的镜像上传到仓库服务器

# docker push studycolumn/httpd
The push refers to repository [docker.io/studycolumn/httpd]
8f6d148780a1: Pushed
683f499823be: Mounted from library/busybox
v0.: digest: sha256:92c7b7e535cca5208cb0c63ad92c2fd52d172bdd67aa56529824dcf968dd3089 size:

3、Docker镜像管理基础

3、Docker镜像管理基础

使用阿里云的仓库push和pull镜像

阿里云  https://promotion.aliyun.com/ntms/act/kubernetes.html    账号studycolumn

镜像加速地址 https://cr.console.aliyun.com/cn-hangzhou/mirrors

3、Docker镜像管理基础

# vim /etc/docker/daemon.json   //添加加速地址

1 {
2 "registry-mirrors": ["https://registry.docker-cn.com","https://7g3yx938.mirror.aliyuncs.com"]
3 }

也可以在阿里云创建镜像仓库

3、Docker镜像管理基础

镜像的导入或导出

node2想要使用node1创作的镜像,不是通过push仓库再从仓库中pull下来,而是现在node1上把镜像(docker save)打包,然后在node2上把解压(docker load)镜像。

# docker save --help
Usage: docker save [OPTIONS] IMAGE [IMAGE...]
Save one or more images to a tar archive (streamed to STDOUT by default)
Options:
-o, --output string Write to a file, instead of STDOUT

# docker save -o myimages.gz studycolumn/httpd:v0.2 beisen/httpd:v0.1-1

# scp myimages.gz node2:/root

下面在node2上安装docker,这里scp node1上已有得文件

# scp /etc/yum.repos.d/docker-ce.repo node2:/etc/yum.repos.d/    //复制node1上得docker yum源到node2上

# yum install docker-ce  //在node2上安装docker社区版

# mkdir -p /etc/docker   //在node2上创建目录

# scp /etc/docker/daemon.json node2:/etc/docker/     //在node1复制文件,此文件包括加速地址

# systemctl start docker   //在node2上启动docker

node2 ~]# docker info

......

Registry Mirrors:   //加速服务器
https://registry.docker-cn.com/    
https://7g3yx938.mirror.aliyuncs.com/

......

node2 ~]# docker load --help
Usage: docker load [OPTIONS]
Load an image from a tar archive or STDIN
Options:
-i, --input string Read from tar archive file, instead of STDIN
-q, --quiet Suppress the load output

node2 ~]# docker load -i myimages.gz

683f499823be: Loading layer  .416MB/.416MB
8f6d148780a1: Loading layer .12kB/.12kB
Loaded image: studycolumn/httpd:v0.
f51e2aa679fa: Loading layer .12kB/.12kB
Loaded image: beisen/httpd:v0.-