@Chiang
2019-09-28T01:19:59.000000Z
字数 4512
阅读 863
Docker
docker --versiondocker-compose --versiondocker-machine --versiondocker info# 运行一个Nginx服务器docker run -d -p 80:80 --name webserver nginx# 停止 Nginx服务器 容器docker stop webserver# 删除 Nginx服务器 容器docker rm webserver

# 命令格式docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]# 查看具体的选项docker pull --help# 获取官方镜像 library/ubuntu 仓库中标签为 18.04 的镜像.docker pull ubuntu:18.04
# 列出所有顶层镜像docker image ls# 查看镜像、容器、数据卷所占用的空间docker system df# 显示虚悬镜像(dangling image)docker image ls -f dangling=true# 删除虚悬镜像docker image prune# 显示所有镜像(包含中间层镜像)docker image ls -a# 根据仓库名列出镜像docker image ls ubuntu# 列出特定的某个镜像,也就是说指定仓库名和标签docker image ls ubuntu:18.04# 过滤器参数 --filter,或者简写 -fdocker image ls --filter before=mongo:3.2# 查询在 mongo:3.2 之后建立的镜像docker image ls -f since=mongo:3.2# 显示ID列表docker image ls -q# 以特定格式显示docker image ls --format "{{.ID}}: {{.Repository}}"docker image ls --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}"
# 命令格式 其中,<镜像> 可以是 镜像短 ID、镜像长 ID、镜像名 或者 镜像摘要docker image rm [选项] <镜像1> [<镜像2> ...]# 镜像短 IDdocker image rm 501# 镜像名docker image rm centos# 镜像摘要digest (sha256:b4f0e0bdeb57804)docker image ls --digestsdocker image rm node@sha256:b4f0e0bdeb57804# 删除所有仓库名为 redis 的镜像docker image rm $(docker image ls -q redis)# 删除所有在 mongo:3.2 之前的镜像docker image rm $(docker image ls -q -f before=mongo:3.2)
- Docker 提供了一个 docker commit 命令,可以将容器的存储层保存下来成为镜像.换句话说,就是在原有镜像的基础上,再叠加上容器的存储层,并构成新的镜像
- 使用 docker commit 意味着所有对镜像的操作都是黑箱操作,生成的镜像也被称为 黑箱镜像
# 命令格式docker commit [选项] <容器ID或容器名> [<仓库名>[:<标签>]]# 保存容器为镜像docker commit \--author "fazhan <1550149004@qq.com>" \--message "保存容器为镜像" \webserver \nginx:v2
- --author 指定修改的作者
- --message 记录本次修改的内容
# 启动镜像docker run --name webserver -d -p 80:80 nginx# 进入容器 执行修改操作 退出docker exec -it websefrver bashecho '<h1>hello, docker!</h1>' > /usr/share/nginx/html/index.htmlexit# 查看具体改动docker diff webserver# 保存容器为镜像docker commit \--author "fazhan <1550149004@qq.com>" \--message "保存容器为镜像" \webserver \nginx:v2# 用 docker history 具体查看镜像内的历史记录docker history nginx:v2# 运行新镜像 docker80端口映射到本地81端口docker run --name web2 -d -p 81:80 nginx:v2
Dockerfile 是一个文本文件,其内包含了一条条的 指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
在一个空白目录中,建立一个文本文件,并命名为 Dockerfile:
mkdir mynginxcd mynginxtouch Dockerfile# 文件内容from nginxrun echo '<h1>Hello,Docker!</h1>' > /usr/share/nginx/html/index.html
在 Dockerfile 文件所在目录执行:
# 命令格式docker build [选项] <上下文路径/URL/->docker build -t nginx:v3 .# 直接用 Git repo 进行构建docker build https://github.com/twang2218/gitlab-ce-zh.git# 用给定的 tar 压缩包构建docker build http://server/context.tar.gz# 从标准输入中读取 Dockerfile 进行构建docker build - < Dockerfilecat Dockerfile | docker build -# 从标准输入中读取上下文压缩包进行构建docker build - < context.tar.gz
如果注意,会看到 docker build 命令最后有一个 .。. 表示当前目录,而 Dockerfile 就在当前目录,因此不少初学者以为这个路径是在指定 Dockerfile 所在路径,这么理解其实是不准确的。如果对应上面的命令格式,你可能会发现,这是在指定 上下文路径。那么什么是上下文呢?
首先我们要理解 docker build 的工作原理。Docker 在运行时分为 Docker 引擎(也就是服务端守护进程)和客户端工具。Docker 的引擎提供了一组 REST API,被称为 Docker Remote API,而如 docker 命令这样的客户端工具,则是通过这组 API 与 Docker 引擎交互,从而完成各种功能。因此,虽然表面上我们好像是在本机执行各种 docker 功能,但实际上,一切都是使用的远程调用形式在服务端(Docker 引擎)完成。也因为这种 C/S 设计,让我们操作远程服务器的 Docker 引擎变得轻而易举。
当我们进行镜像构建的时候,并非所有定制都会通过 RUN 指令完成,经常会需要将一些本地文件复制进镜像,比如通过 COPY 指令、ADD 指令等。而 docker build 命令构建镜像,其实并非在本地构建,而是在服务端,也就是 Docker 引擎中构建的。那么在这种客户端/服务端的架构中,如何才能让服务端获得本地文件呢?
这就引入了上下文的概念。当构建的时候,用户会指定构建镜像上下文的路径,docker build 命令得知这个路径后,会将路径下的所有内容打包,然后上传给 Docker 引擎。这样 Docker 引擎收到这个上下文包后,展开就会获得构建镜像所需的一切文件。
docker run -it --rm \ubuntu:18.04 \bash
-it: 是两个参数, 一个是-i:交互式操作, 一个是-t终端.--rm: 容器退出后随之将其删除.ubuntu:18.04: 这是指用Ubuntu:18.04镜像为基础来启动容器.bash: 放在镜像名后的是命令.这里我们希望有个交互式shell,因此用的是bash
# 输出一个 “Hello World”docker run ubuntu:18.04 /bin/echo 'Hello world'# -t 选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上, -i 则让容器的标准输入保持打开docker run -t -i ubuntu:18.04 /bin/bash
# 启动容器docker container start# 用 ps 或 top 来查看进程信息pstop# -d 后台运行docker run -d ubuntu:18.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"# 查看容器信息docker container ls -a# 获取容器输出信息docker container logs [container ID or NAMES]# 终止容器docker container stop# 重启容器docker container restart# 进入后台运行的容器# 如果从这个 stdin 中 exit,会导致容器的停止docker attach [container ID or NAMES]# 如果从这个 stdin 中 exit,不会导致容器的停止 推荐docker exec -it [container ID or NAMES] bash
# 导出容器docker export 7691a814370e > ubuntu.tar# 导入容器cat ubuntu.tar | docker import - test/ubuntu:v1.0# 通过指定 URL 或者某个目录来导入docker import http://example.com/exampleimage.tgz example/imagerepo
# 删除容器 删除一个运行中的容器,可以添加 -f 参数docker container rm -f trusting_newton# 清理所有处于终止状态的容器docker container prune
