docker知识整理(备份)
概念:
镜像:Docker 镜像类似于虚拟机镜像,可以将它理解为一个只读的模板 。镜像是创建 Docker 容器的基础。通过版本管理和增量的文件系统, Docker 提供了一套十分简单的机制来创建和更新现有的镜像。镜像文件 一 般由若干层(layer)组成。多个镜像共用一个层时,本地只会存储该层的一份内容,以解决空间。
容器: Docker 容器类似于一个轻量级的沙箱, Docker 利用容器来运行和隔离应用 。容器是从镜像创建的应用运行实例 。 它可以启动、开始、停止 、 删除,而这些容器都是彼此相互隔离、互不可见的 。可以把容器看作一个简易版的 Linux 系统环境(包括 root 用户权限、进程空间、用户空间和网 络空间等)以及运行在其中的应用程序打包而成的盒子 。
镜像和容器的关系:镜像自身是只读的 。 容器从镜像启动的时候,会在镜像的最上层创建一个可写层 。
仓库:Docker 仓库类似于代码仓库,是 Docker 集中存放镜像文件的场所。
仓库注册服务器是存放仓库的地方。每个仓库集中存放多个某一类镜像,这些镜像通过不同的标签( tag )来进行区分。例如仓库注册服务器存放了ubuntu和centos两个仓库,ubuntu仓库中又存放了16.04和18.04版的ubuntu镜像。
CentOS 7 安装docker :
#卸载旧版本 yum remove docker{,-{common,selinux,logrotate,client{,-latest},latest{,-logrotate},engine{,-selinux}}} #安装必要系统工具 yum install yum-utils device-mapper-persistent-data lvm2 #添加软件源信息 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #更新yum缓存 yum makecache fast #安装docker社区版 yum install docker-ce #启动docker服务 systemctl start docker
#测试hello world
docker run hello-world
Debian上安装Docker
下面命令全部以root用户执行: 更新可用软件包列表: # apt update 安装必备包 : # apt install curl apt-transport-https ca-certificates gnupg2 software-properties-common 添加docker的gpg秘钥: # curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add - 添加apt源: # add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable" 为刚添加的源更新可用包列表: # apt update 确认一下docker-ce的安装来源为docker官方的源,而非debian的源: apt-cache policy docker-ce 确认好来源后,执行apt install安装docker-ce apt install docker-ce 查看docker状态,服务处于running状态: systemctl status docker
镜像加速(例如使用163):
/etc/docker/daemon.json改成
{ "registry-mirrors": ["http://hub-mirror.c.163.com"] }
然后重启docker: systemctl daemon-reload; systemctl restart docker
docker命令 -- 镜像操作:
获取镜像(pull): docker pull [OPTIONS] NAME[:TAG|@DIGEST] //NAME是仓库名称/或镜像名。不指定镜像tag就会默认使用latest,latest会跟踪镜像的最新变化,往往是不稳定的。option部分参考docker <命令> --help,下同
例如 docker pull ubuntu:18.04 //等效于docker pull registry.hub.docker.com/ubuntu:18.04
查看镜像(images/image ls/inspect):
docker images 或 docker image ls
例如 docker images --filter=dangling=true //列出没有被使用的镜像
例如 docker images --format='{{.ID}} {{.Repository}}' //仅查看ID和仓库
查看镜像详情: docker inspect 仓库名:标签 docker inspect ubuntu:18.04 //help上的提示是Return low-level information on Docker objects
例如 docker inspect ubuntu:18.04
例如 docker inspect -f '{{.ID}}' centos:latest
打标签(tag): docker tag ubuntu:latest myubuntu:lates //类似软链接概念
镜像历史(history),列出各层创建信息: docker history ubuntu: 18. 04 //如果信息过长被阶段,可以添加参数 --no-trunc
搜索镜像(search): docker search --filter=is-official=true --limit=30 nginx //默认输出25个,所以这里使用--limit来限制
删除镜像(rmi/image rm): docker rmi -no-prune ubuntu:latest //-no-prune不要清理未带标签的父镜像。
清理镜像(image prune)清理临时和未用的镜像文件: docker image prune //-a, -all: 删除所有无用镜像, 不光是临时镜像; -filter filter: 只清理符合给定过滤器的镜像;
创建镜像:
基于已有容器创建,例如对容器的/tmp目录新增一个文件后(使用Dockerfile创建,另开一文):
执行:docker commit -m "ThisIsComment" -a "ThisIsAuthorName" ae012c07115e test1:latest
再执行:docker history test1:latest
//回显 IMAGE CREATED CREATED BY SIZE COMMENT 7e3d6c953ff8 49 seconds ago /bin/bash 467kB ThisIsComment 1e1148e4cc2c 2 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B <missing> 2 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B <missing> 2 months ago /bin/sh -c #(nop) ADD file:6f877549795f4798a… 202MB
导出镜像到tar(save): docker save -o ubuntu_18.04.tar ubuntu:18.04
从tar导入镜像(load):docker load -i ubuntu_18.04.tar 或 docker load < ubuntu_18.04.tar
上传镜像(push): docker push [OPTIONS] NAME[:TAG]
docker命令 -- 容器操作:
从镜像创建容器(create): docker create [OPTIONS] IMAGE [COMMAND] [ARG...] //option相当多
启动容器(start):docker start [OPTIONS] CONTAINER [CONTAINER...] //比较有用的选项: -a 连接stdout/stderr,转发信号 -i 连接stdin
新建并启动容器(run): docker run [OPTIONS] IMAGE [COMMAND] [ARG...] //option也相当多,更多选项参考man docker-run或docker run --help。
比较重要的选项有:
-d表示守护进程方式运行。
--net=<bridge、none、container、 host、network命令> #bridge是容器内网络接口桥接到宿主的docker0; none就是不配置容器的网络(隔离的网络栈); container:共享已存在容器的网络和端口资源,
两个容器可以使用lo网口通讯(--net=container:容器名或id); host是指使用宿主机的网络(比较危险);
该命令做了:如果镜像没有就从公有仓库下载,然后用镜像创建容器,分配文件系统,并在只读镜像外层挂上可读写层,从宿主的网桥接口中桥接一个虚拟接口到容器中,并分配ip地址,执行应用程序然后终止。
查看容器输出(logs): docker logs [OPTIONS] CONTAINER //即使容器已经运行完毕了,但还是可以通过该命令来查看输出。选项支持按照时间来查看输出
暂停、解除暂停容器(pause/unpause): docker pause CONTAINER [CONTAINER...] / docker unpause CONTAINER [CONTAINER...]
停止容器(stop):docker stop [OPTIONS] CONTAINER [CONTAINER...] //先发SIGTERM,默认10秒后发SIGKILL信号。
先停再启容器(restart):docker restart [OPTIONS] CONTAINER [CONTAINER...]
移除所有停止状态的容器(container prune): docker container prune [OPTIONS]
向容器发信号(kill): docker kill [OPTIONS] CONTAINER [CONTAINER...] //默认是SIGKILL信号
进入容器(attach): docker attach [OPTIONS] CONTAINER //--detach-keys[=[]]: 指定退出 attach 模式的快捷键序列, 默认是 CTRL-p CTRL-q; --no-stdin=trueifalse :是否关闭标准输入,默认是保持打开; --sig-proxy=truelfalse :是否代理收到的系统信号给应用进程,默认为 true
在运行的容器中执行命令(exec): docker exec [OPTIONS] CONTAINER COMMAND [ARG...] //可以指定环境变量,交互,tty、工作目录等
删除容器(rm):docker rm [OPTIONS] CONTAINER [CONTAINER...]
导出容器到stdout(export),不管它是否正在运行: docker export [OPTIONS] CONTAINER //重要选项 -o tar文件路径
复制文件或目录到(cp): docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|- 或 docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH //这里的-号表示stdin或stdout, 例如: tar -zcf - /tmp/a.txt |docker cp - ae012c07115e:/tmp
查看容器(container inspect/top/stats): 例如:docker container stats [OPTIONS] [CONTAINER...] //查看容器统计,如cpu、内存、存储、网络等
查看变更(diff): docker diff <容器名> //查看文件增删改
查看端口映射(port): docker port CONTAINER [PRIVATE_PORT[/PROTO]]
更新配置(update): docker update [OPTIONS] CONTAINER [CONTAINER...] //限制容器的cpu使用率,绑定cpu核,限制内存使用率等
其他命令,不详细描述了:
管理命令有:
builder Manage builds
config Manage Docker configs
container Manage containers
engine Manage the docker engine
image Manage images
network Manage networks
node Manage Swarm nodes
plugin Manage plugins
secret Manage Docker secrets
service Manage services
stack Manage Docker stacks
swarm Manage Swarm
system Manage Docker
trust Manage trust on Docker images
volume Manage volumes
# 例如上面很多命令其实是省略的写法,比如docker create其实对应的是docker container create
数据卷、数据卷容器:
数据卷: docker volume create -d local test //创建一个普通数据卷,创建完成后,就可以看到/var/lib/docker/volumes/下多了个test目录,volume子命令有很多其他的命令,使用docker volume --help 查看
数据卷容器:执行 docker run -it -v /TestVol --name cos1 centos:latest //创建了一个带数据卷的容器 cos1,里面执行df会发现有 /TestVol这个挂载点
docker run -it --volumes-from=cos1 --name cos2 centos:latest //指定分区来源为上面的容器
在任意一个容器执行: cd /tmp/TestVol; touch aaa 然后就可以在另一个容器中发现 ls -l /TestVol 会多出aaa这个文件
如果删除了挂载的容器(包括 dbdata 、 db 工和 db2 ),数据卷并不会被自动删除 。 如果要删除一个数据卷,必须在删除最后一个还挂载着它的容器时显式使用 docker rm -v 命令来指定同时删除关联的容器 。//这点有疑问
绑定数据卷: docker run -d -P --name web --mount type=bind,source=/webapp,destination=/opt/webapp training/webapp python app.py
上面命令注释: type有bind、volume、tmpfs三类。bind就是映射到宿主的某个绝对路径,volume就是上面通过docker volume create创建的普通数据卷,tmpfs就是临时的内存数据卷
上述命令等同于使用旧的 -v 标记可以在容器内创建一个数据卷 docker run - d -P --name web -v /webapp:/opt/webapp training/webapp python app.py
只读挂载: docker run -d -P --name web -v /webapp:/opt/webapp:ro training/webapp python app.py //同理rw就是读写挂载
端口映射:
-p 宿主机IP:宿主机端口:容器端口 //注意,宿主机IP和宿主机Port都可以省略。 例如 -p 80 是省略宿主机的IP和port,-p 192.168.1.1::80 省略了宿主机的port。默认协议是tcp,如果需要指定udp,要这样写: -p 33:22/udp
或者-P 自动映射随机端口
例如:run -d -p 8000:80 nginx:latest //其他机器访问http://宿主机IP地址:8000/ 即可看到nginx欢迎页
容器互联:
例子: docker run -d --name c1 -it centos:latest /bin/bash
docker run -d --name c2 --link c1 -it centos:latest /bin/bash //然后我们在c2里面的/etc/hosts就看到了 ip和c1的映射关系(c1中没有c2 IP和c2的映射)。如果不用--link 那么可以就通过容器内的ip来连通了
搭建私人仓库: 使用 registry 镜像创建私高仓库,具体自己百度