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) //[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 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