余子越的博客
Toggle navigation
余子越的博客
主页
计算机网络
大数据分析
系统与工具
编程之路
容器引擎
作者
归档
标签
Docker 常用命令及解释
Docker
2018-09-02 13:35:34
141
0
0
yuziyue
Docker
[TOC] # 一、连接docker容器 ``` docker exec -it c0afa96d49df /bin/bash ``` # 二、查看 Docker 信息 - `docker version` 查看docker的版本号,包括客户端、服务端 - `docker info` 查看系统(docker)层面信息,包括管理的images, containers数据 # 三、搜索镜像 从Docker Hub查找镜像 ``` docker search ubuntu12.10 --automated: 只列出 automated build类型的镜像 --no-trunc: 显示完整的镜像描述 --filter stars=30: 列出收藏数不小于指定值的镜像 ``` # 四、下载镜像 下载镜像的格式为 ``` docker pull [选项] [Docker Registry地址]<仓库名>:<标签> ``` - Docker Registry地址: 地址的格式一般是 <域名/IP>[:端口号]。默认地址是 Docker Hub。 - 仓库名: 仓库名是两段式名称,既 <用户名>/<软件名>。对于 Docker Hub, 如果不给出用户名,则默认为 library,也就是官方镜像,比如:library/debian。 - 标签: 比如latest、testing、buntu:14.04等指定具体的版本号。一个镜像可以对应多个标签。 <br> - 镜像是由多层存储所构成。下载也是一层层的去下载,并非单一文件。下载过程中给出了每一层的 ID 的前 12 位。并且下载结束后,给出该镜像完整的 sha256 的摘要,以确保下载一致性。 - 下载国内镜像,可直接指定原始路径来 pull ,国内可以下载的镜像可以在 [hub.daocloud.io](http://hub.daocloud.io/) 这个网站上获取,比如下面。 ``` docker pull daocloud.io/library/nginx:1.13.0-alpine ``` - CentOS7及以上版本,修改配置下载镜像地址为国内地址:先修改registry-mirrors的地址,然后重启即可。 ``` # cat /etc/docker/daemon.json { "registry-mirrors": ["https://registry.docker-cn.com"] } # systemctl daemon-reload # systemctl restart docker ``` # 五、镜像和容器的存放路径 镜像和容器的存放路径在`/var/lib/docker`内,可以查看具体情况。 # 六、镜像管理 - 查看已下载镜像 ``` docker images -a 列出所有的images,这里显示的是顶层镜像,默认是隐藏了中间层的镜像了的。这样会看到很多无标签的镜像,与之前的虚悬镜像不同,这些无标签的镜像很多都是中间层镜像,是其它镜像所依赖的镜像。这些无标签镜像不应该删除,否则会导致上层镜像因为依赖丢失而出错。实际上,这些镜像也没必要删除,因为之前说过,相同的层只会存一遍,而这些镜像是别的镜像的依赖,因此并不会因为它们被列出来而多存了一份,无论如何你也会需要它们。只要删除那些依赖它们的镜像后,这些依赖的中间层镜像也会被连带删除。 docker images --quiet 只显示镜像的ID,或者-q也行 docker images ubuntu docker images ubuntu:14.04 查看指定的镜像。还支持强大的过滤器参数 --filter,或者简写 -f 。 docker images -f since=mongo:3.2 查看在 mongo:3.2 之后建立的镜像 docker images -f before=mongo:3.2 查看在 mongo:3.2 之前建立的镜像 docker images -f label=com.example.version=0.1 如果镜像构建时,定义了 LABEL,还可以通过 LABEL 来过滤。 以指定的格式显示镜像,只包含镜像ID和仓库名 docker images --format "{{.ID}}: {{.Repository}}" 以表格等距显示,并且有标题行,和默认一样,不过自己定义列。如果没有table关键字,则没有标题行 docker images --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}" docker history ubuntu:14.04 查看镜像的层组成情况 docker rmi <image ID> 删除一个或多个image ``` - Docker Hub 中显示的体积是压缩后的体积。在镜像下载和上传过程中镜像是保持着压缩状态的,而 `docker images` 显示的是镜像下载到本地,解压缩后的大小,准确说,是展开后的各层所占空间的总和。 <br> - docker images 列表中的镜像体积总和并非是所有镜像实际硬盘消耗。由于 Docker 镜像是多层存储结构,并且可以继承、复用,因此不同镜像可能会因为使用相同的基础镜像,从而拥有共同的层。由于 Docker 使用 Union FS,相同的层只需要保存一份即可,因此实际镜像硬盘占用空间很可能要比这个列表镜像大小的总和要小的多。 <br> - 列出的镜像中可能会出现镜像既没有仓库名,也没有标签,均为 <none>,出现这种情况有两种原因: 1、这个镜像原本是有镜像名和标签的,原来为 mongo:3.2,随着官方镜像维护,发布了新版本后,重新 `docker pull mongo:3.2` 时,mongo:3.2 这个镜像名被转移到了新下载的镜像身上,而旧的镜像上的这个名称则被取消,从而成为了 <none>。 <br> 2、docker build 也同样会导致这种现象。由于新旧镜像同名,旧镜像名称被取消,从而出现仓库名、标签均为 <none> 的镜像。这类无标签镜像也被称为 虚悬镜像(dangling image) ,可以用下面的命令专门显示这类镜像:`docker images -f dangling=true`, 一般来说,虚悬镜像已经失去了存在的价值,是可以随意删除的,可以用下面的命令删除。 `docker rmi $(docker images -q -f dangling=true)` # 七、运行容器的参数 启动一个容器需要指定的常用参数 ``` -i 交互运行 -t tty终端 -d 后台运行 --name 该容器的名称 -h 容器启动后的hostname --net 容器使用的网络类型 -v /data:/rdata 将宿主机的目录挂载到容器 -D 长时间运行该容器 -p <host_port:contain_port> 映射HOST端口到容器,方便外部访问容器内服务,host_port 可以省略,省略表示把 container_port 映射到一个动态端口,每次启动这个容器时的端口都不一样,是动态产生的。 --dns 指定容器使用的DNS服务器,默认和宿主一致,一旦指定,原本和宿主机相同的DNS则被覆盖 --rm 该容器只运行一次,exit退出该容器是立刻被删除 docker run -itd --name test04 -h "server2" --dns 8.8.4.4 --net=none -v /data/data1:/rdata/rdata1 ubuntu /etc/init.d/ssh start -D docker run -itd --net=none -h "server1" --name test01 muccg/ubuntu14.04-base /etc/init.d/ssh start -D ``` # 八、容器管理 交互式运行容器,退出时用快捷键Ctrl+P+Q,如果退出时使用exit,则当前容器会立即退出(因为当前bash退出了) ``` docker run -it chug/ubuntu12.10x64 /bin/bash ``` 运行容器时应该使用 -d 参数,使其后台运行。 正确进入容器的姿势是下面这样的,webserver是容器名,容器和容器id等价。这样进入容器,退出时就可以放心大胆的用exit了。 ``` docker exec -it webserver bash ``` ``` docker diff webserver 查看容器变化的文件有哪些 docker ps 列出当前所有正在运行的container docker ps -l 列出最近一次启动的container docker ps -a 列出所有的container(包含历史,即运行过的container) docker ps -q 列出最近一次运行的container ID docker commit(慎用) 保存容器为镜像,这里commit时不必stop掉容器也可以commit docker commit [选项] <容器ID或容器名> [<仓库名>[:<标签>]] 比如 docker commit \ --author "yuchaoshui <y@gmail.com>" \ --message "修改了默认网页" \ webserver \ nginx:v2 docker commit慎用的原因 如果不小心清理无用的文件安装,将会导致镜像极为臃肿。 docker commit 命令除了学习之外,还有一些特殊的应用场合,比如被入侵后保存现场等。但是,不要使用 docker commit 定制镜像,定制行为应该使用 Dockerfile 来完成。 docker commit <container> [repo:tag] 然后查看提交的镜像,必须指定标签才能看到commit的信息 docker history nginx:v2 再次启动容器 docker start/stop/restart <container> :开启/停止/重启container docker start [container_id] 再次运行某个container (包括历史container) docker attach [container_id](不推荐) 连接一个正在运行的container实例(可以多个窗口同时attach 一个container实例),只有当该容器运行时使用了bash时,用这种方式才能进入容器,否则是不能进入容器的。并且退出时必须要使用快捷键Ctrl+P+Q退出。 docker start -i <container> 启动一个container并进入交互模式(相当于先start,再attach) 注:使用start是启动已经创建过得container,使用run则通过image开启一个新的container。 docker rm <container...> 删除一个或多个container docker rm `docker ps -a -q` 删除所有的container docker ps -a -q | xargs docker rm 同上, 删除所有的container ``` # 九、持久化容器 export命令用于持久化容器 ``` # docker export <CONTAINER ID> > /tmp/export.tar ``` # 十、持久化镜像 Save命令用于持久化镜像 ``` # docker save 镜像ID > /tmp/save.tar ``` # 十一、导入持久化容器 先删除掉container 2161509ff65e,然后倒入刚才生成的容器,导入export.tar文件 ``` # cat /tmp/export.tar | docker import - export:latest # docker images ``` # 十二、导入持久化镜像 先删除image daa11948e23d, 导入save.tar文件,对image打tag ``` # docker load < /tmp/save.tar # docker tag daa11948e23d load:tag ``` # 十三、export-import与save-load的区别 导出后再导入(export-import)的镜像会丢失所有的历史,而保存后再加载(save-load)的镜像没有丢失历史和层(layer)。这意味着使用导出后再导入的方式,你将无法回滚到之前的层(layer),同时,使用保存后再加载的方式持久化整个镜像,就可以做到层回滚。(可以执行docker tag <LAYER ID> <IMAGE NAME>来回滚之前的层)。 # 十四、其它命令 ``` docker logs $CONTAINER_ID 查看docker实例运行日志,确保正常运行 docker inspect $CONTAINER_ID docker inspect <image|container> 查看image或container的底层信息 docker build <path> 寻找path路径下名为的Dockerfile的配置文件,使用此配置生成新的image docker build -t repo[:tag] 同上,可以指定repo和可选的tag docker build - < <dockerfile> 使用指定的dockerfile配置文件,docker以stdin方式获取内容,使用此配置生成新的image docker port <container> <container port> 查看本地哪个端口映射到container的指定端口,其实用docker ps 也可以看到 ``` # 十五、利用 Dockerfile 来创建镜像 执行命令的两种格式 - shell格式:RUN <命令>,就像直接在命令行中输入的命令一样。刚才写的 Dockrfile 中的 RUN 指令就是这种格式。 - exec 格式:RUN ["可执行文件", "参数1", "参数2"],这更像是函数调用中的格式。 <br> Dockerfile文件的格式类似如下 ``` FROM debian:jessie RUN buildDeps='gcc libc6-dev make' \ && apt-get update \ && apt-get install -y $buildDeps \ && wget -O redis.tar.gz "http://download.redis.io/releases/redis-3.2.5.tar.gz" \ && mkdir -p /usr/src/redis \ && tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 \ && make -C /usr/src/redis \ && make -C /usr/src/redis install \ && rm -rf /var/lib/apt/lists/* \ && rm redis.tar.gz \ && rm -r /usr/src/redis \ && apt-get purge -y --auto-remove $buildDeps ``` 构建命令 ``` docker build [选项] <上下文路径> ``` 注意:上下文路径并不是指Dockerfile文件的路径,只是如果不指定Dockerfile的文件路径时,默认去上下文路径去找名为Dockerfile的文件做,可以用-f 参数指定Dockerfile的路径,但是通常都不这样做,默认都将Dockerfile放在上下文路径里面了。 <br><br><br>
上一篇:
CentOS 7 修改镜像下载地址
下一篇:
Docker 运行容器
0
赞
141 人读过
新浪微博
微信
腾讯微博
QQ空间
人人网
文档导航