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
来源:https://www.cnblogs.com/hanshanxiaoheshang/p/10389153.html