概念
- docker镜像包含若干个层(layer),每个层都有其对应的唯一ID(由256比特,64个十六进制字符组成)。注意:当不同的镜像包含相同的层时,本地仅仅存储一份层的内容。
镜像操作
# 下载镜像
$ docker pull [name]
# 查看所有本地所有镜像的基本信息
$ docker images
# 参数
--no-trunc 列出完整长度的Image ID
# 查看所有本地所有镜像的基本信息
# SOURCE_IMAGE[:TAG] 原仓库名:原仓库的tag
# TARGET_IMAGE[:TAG] 目标仓库名:目标仓库的tag
# 执行完成后的两个image的ID实际上是相同的,并且也指向同一个image,只是别名不同
$ docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
# 用于获取镜像的详细信息
# 发现不能inspect通过docker tag 命令添加的image
$ doker inspect NAME|ID
# 搜索命令
# TERM 关键词
$ docker search [OPTIONS] TERM
# 移除镜像
# 当image拥有两个或以上tag的时候,通过该命令NMAE选项只会移除该image当前对应的tag,当使用ID时则会移除image
# 当有基于该image运行的容器时,则会无法删除,需要先删除容器(docker rm ID)
$ docker rmi NAME|ID
# 创建镜像
# 1. 基于已有容器创建
# 2. 基于DockerFile创建
# 导出镜像
$ docker save [OPTIONS] IMAGE [IMAGE...]
# 导入镜像
$ docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]
# 或者
$ docker load [OPTIONS]
容器操作
# 查看已经运行的容器
$ docker ps
# 创建容器
# 通过create创建的容器处于停止状态,可以通过start命令启动
$ docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
# 启动容器
$ docker start [OPTIONS] CONTAINER [CONTAINER...]
# 查看日志
$ docker logs -f [CONTAINER_NAME]
# 新建并启动容器
$ docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
# 停止容器
# 1. 暂停
$ docker pause [CONTAINER_NAME...]
# 2. 停止暂停
$ docker unpause [CONTAINER_NAME...]
# 3. 终止
# 执行命令后会默认等待十秒在真正发出停止命令
$ docker stop [CONTAINER_NAME...]
# 直接执行停止命令
$ docker kill [CONTAINER_NAME...]
# 进入容器
$ docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
# 例如:
# 进入容器并打开一个bash终端
$ docker exec -it 容器ID /bin/absh
# 删除容器
# 默认情况下只能删除终止或退出的容器,不能删除正在运行的容器,除非添加-f参数,Docker会先发出停止信号
$ docker rm [CONTAINER_ID...]
# 查看容器详情
$ docker container inspect [OPTIONS] [CONTAINER_NAME|CONTAINER_ID]
# 查看容器内进程
$ doker top [CONTAINER_NAME|CONTAINER_ID]
# 查看端口映射
$ doker container port [CONTAINER_NAME|CONTAINER_ID]
仓库
有时候容易把仓库与注册服务器( Regis盯)混淆。 实际上注册服务器是存放仓库的具 体服务器, 一个注册服务器上可以有多个仓库,而每个仓库下面可以有多个镜像。
数据管理
数据卷
容器内数据直接映射到本地主机环境;
# 创建数据卷
# 在本地/var/lib/docker/volumes路径下,会发现所创建的数据卷(test)位置
$ docker volume create -d local test
# 绑定数据卷
# 除了使用 volume 子命令来管理数据卷外,还可以在创建容器时将主机本地的任意路径 挂载到容器内作为数据卷,这种形式创建的数据卷称为绑定数据卷
# 使用--mount或者-v
$ pwd
数据卷容器
- 使用特定容器维护数据卷
- 如果用户需要在多个容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器,数据卷容器也是一个容器,但是它的目的是专门提供数据卷给其他容器挂载
# 创建一个数据卷容器 dbdata, 并在其中创建一个数据卷挂载到/ dbdata
$ docker run -it -v /dbdata --name dbdata ubuntu
# 其他容器中使用-- volumes-from来挂载 dbdata 容器中的数据卷
$ docker run -it --volumes-from dbdata --name dbl ubuntu
# 此时两个容器任何一方在此目录下写入数据,对方都可以看到
# 注意:使用--volumes-form参数所挂载数据卷的容器自身并不需要保持在运行状态
# 如果删除了挂载的容器(包括 dbdata、 db工和 db2 ),数据卷并不会被自动删除 。 如果 要删除一个数据卷,必须在删除最后一个还挂载着它的容器时显式使用 docker rm -v命 令来指定同时删除关联的容器
$ pwd
端口映射与容器互联
端口映射
在启动容器的时候, 如果不指定对应参数, 在容器外部是无法通过网络来访问容器内的 网络应用和服务的。
可以使用-P(大写)或者-p(小写)参数:
- -P(大写):会随机映射一个 49000-49900 的端口到内部容器开放的网络端口
- -p(小写):可以指定要映射的端口,并且在一个指定端口上只可以绑定一个容器,可以多次使用-p参数绑定端口,支持的格式有:
- IP:HostPort:ContainerPort
- IP::ContainerPort
- HostPart:ContainerPort
#
# 映射所有接口地址
# 本地的5000端口映射到容器的5000端口
$ docker run -d -p 5000:5000 training/webapp python app.py
# 映射到指定地址的指定端口
$ docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
# 映射到指定地址的任意端口
$ docker run -d -p 127.0.0.1::5000 training/webapp python app.py
# 查看端口配置情况
$ docker port [CONTAINER_ID] [PORT]
互联机制
可以让多个容器中的应用进行快速交互的方式。它会在源和接收容器之间创建连接关系,接收容器可以通过容器名快速访问到源容器,而不用指定具体的IP地址。
# 自定义容器名,使用--name参数
# 容器的名称是唯一的。如果巳经命名了一个叫web的容器,当你要再次使用web这个名称的时候,需要先用docker rm命令删除之前创建的同名容器。
$ docker run -d -p 5000:5000 --name web training/webapp python app.py
# 容器互联,使用--link
# --link参数的格式为--link name:alias, 其中name是要链接的容器的名称,alias是别名
$ docker run -d -P --name web --link db:db training/webapp python app.py
# 查看是否连接成功
# 进入容器
$ docker exec -it [CONTAINER_ID] /bin/bash
# 查看hosts文件中是否有db的连接
$ cat /etc/hosts
# ping
$ ping db
Dockerfile
首行可以通过注释来指定解析器命令, 后续通过注释说明镜像的相关信息。 主体部分首先使用 FROM 指令指明所基于的镜像名称, 接下来一般是使用 LABEL 指令说明维护者信息。 后面则是镜像操作指令,例如RUN指令将对镜像执行跟随的命令。每运行一条 RUN 指令,镜像添加新的一层,并提交。最后是 CMD 指令,来指定运行容器时的操作命令。