3、Docker镜像管理基础

 ̄綄美尐妖づ 提交于 2019-11-29 10:59:59

Docker image

   

# docker image ls

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
redis               4-alpine            23d561d12e92        9 days ago          35.5MB
nginx               1.14-alpine         66952fd0a8ef        2 weeks ago         16MB
busybox             latest              3a093384ac30        6 weeks ago         1.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是位于底层基础镜像中是不允许编辑的,所以就要在最上层添加可读写层。

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

Aufs 

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

# docker info

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

Docker Registry

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

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

如果没有特别指定registry,那么通常就是docker hub,如果要指向别的registry,必须在镜像的访问路径当中指明服务器地址,如果没有服务器地址,只给了仓库名/tags,那么这个镜像一定是指docker hub。

Docker Registry 分类

Registry 组成

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

非常著名的镜像服务器:https://quay.io/,如果要使用,需要下载到本地并安装  https://quay.io/repository/coreos/flannel   -->  docker pull quay.io/coreos/flannel

 

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

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的用法

镜像的相关操作

镜像的生成途径

如何基于容器创建镜像:

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

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

 

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

# docker commit -h

Usage:    docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]   //表示基于哪个容器(CONTAINER)做镜像,并指明属于哪个仓库(REPOSITORY)和拥有什么标签(TAG)                               
Create a new image from a container's changes                    //[REPOSITORY[:TAG]]是可以省略的,省略后表示所作的镜像就是本地的裸镜像,不属于任何仓库,也没有任何标签             
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                    4-alpine            23d561d12e92        9 days ago          35.5MB
nginx                    1.14-alpine         66952fd0a8ef        2 weeks ago         16MB
busybox                  latest              3a093384ac30        6 weeks ago         1.2MB
quay.io/coreos/flannel   v0.10.0-amd64       f0fad859c909        12 months ago       44.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.1-1              439595aa4b0f        4 minutes ago       1.2MB
redis                    4-alpine            23d561d12e92        9 days ago          35.5MB
nginx                    1.14-alpine         66952fd0a8ef        2 weeks ago         16MB
busybox                  latest              3a093384ac30        6 weeks ago         1.2MB
quay.io/coreos/flannel   v0.10.0-amd64       f0fad859c909        12 months ago       44.6MB
为一个镜像打多个标签
[root@node1 ~]# docker tag beisen/httpd:v0.1-1 beisen/httpd:latest
[root@node1 ~]# docker image ls
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
beisen/httpd             latest              439595aa4b0f        10 minutes ago      1.2MB
beisen/httpd             v0.1-1              439595aa4b0f        10 minutes ago      1.2MB
redis                    4-alpine            23d561d12e92        9 days ago          35.5MB
nginx                    1.14-alpine         66952fd0a8ef        2 weeks ago         16MB
busybox                  latest              3a093384ac30        6 weeks ago         1.2MB
quay.io/coreos/flannel   v0.10.0-amd64       f0fad859c909        12 months ago       44.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.1-1              439595aa4b0f        11 minutes ago      1.2MB
redis                    4-alpine            23d561d12e92        9 days ago          35.5MB
nginx                    1.14-alpine         66952fd0a8ef        2 weeks ago         16MB
busybox                  latest              3a093384ac30        6 weeks ago         1.2MB
quay.io/coreos/flannel   v0.10.0-amd64       f0fad859c909        12 months ago       44.6MB
基于容器b1做的镜像再次创建一个容器t1[root@node1 ~]# docker run --name t1 -it beisen/httpd:v0.1-1
/ # 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 (2018-12-31 18:16:17 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 *:80)
    -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.2     "/bin/httpd -f -h /d??   About a minute ago   Up About a minute                       t2       //容器t2已经启动了
465aab04ace8        beisen/httpd:v0.1-1   "sh"                     35 minutes ago       Up 35 minutes                           t1
fb13aceb4369        busybox               "sh"                     4 hours ago          Up 4 hours                              b1
da481ee71e45        redis:4-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

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

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

# 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

将创建的镜像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.2: digest: sha256:92c7b7e535cca5208cb0c63ad92c2fd52d172bdd67aa56529824dcf968dd3089 size: 734

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

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

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

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

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

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

镜像的导入或导出

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  1.416MB/1.416MB
8f6d148780a1: Loading layer   5.12kB/5.12kB
Loaded image: studycolumn/httpd:v0.2
f51e2aa679fa: Loading layer   5.12kB/5.12kB
Loaded image: beisen/httpd:v0.1-1 

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!