文章目录
Docker镜像使用
列出镜像
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 14.04 90d5884b1ee0 5 days ago 188 MB
php 5.6 f40e9e0f10c8 9 days ago 444.8 MB
nginx latest 6f8d099c3adc 12 days ago 182.7 MB
mysql 5.6 f2e8d6c772c0 3 weeks ago 324.6 MB
httpd latest 02ef73cf1bc0 3 weeks ago 194.4 MB
ubuntu 15.10 4e3b13c8a266 4 weeks ago 136.3 MB
hello-world latest 690ed74de00f 6 months ago 960 B
training/webapp latest 6fae60ef3446 11 months ago 348.8 MB
TAG:镜像的标签,同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本
把所有的镜像的 ID 列出来
$ docker images -q
5f515359c7f8
05a60462f8ba
fe9198c04d62
00285df0df87
329ed837d508
329ed837d508
搜索镜像
docker search 镜像名称
拉取一个新的镜像
当我们在本地主机上使用一个不存在的镜像时 Docker 就会自动下载这个镜像。如果我们想预先下载这个镜像,我们可以使用 docker pull 命令来下载它。
$ docker pull ubuntu:13.10
删除镜像
$ docker image rmi [选项] <镜像1> [<镜像2> ...]
<镜像> 可以是 镜像短 ID、镜像长 ID、镜像名 或者 镜像摘要
镜像删除使用 docker rmi 命令,比如我们删除 hello-world 镜像:
$ docker rmi hello-world
可以使用 docker image ls -q 来配合使用 docker image rm,这样可以成批的删除希望删除的镜像。
$ docker rmi 'docker images -q'
创建镜像
当我们从 docker 镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改。
1、从已经创建的容器中更新镜像,并且提交这个镜像
在运行的容器内使用 apt-get update 命令进行更新。
在完成操作之后,输入 exit 命令来退出这个容器。
docker commit [选项] 容器ID或容器名 镜像名称:版本号
$ docker commit -m="has update" -a="coonote" e218edb10161 coonote/ubuntu:v2
各个参数说明:
- -m: 提交的描述信息
- -a: 指定镜像作者
- e218edb10161:容器 ID
- coonote/ubuntu:v2: 指定要创建的目标镜像名
镜像是不能传输的,需要压缩和解压缩:
docker save -o 压缩文件名称 镜像名称:版本号
docker load -i 压缩文件名称
2、使用 Dockerfile 构建一个新的镜像
使用命令 docker build , 从零开始来创建一个新的镜像。为此,我们需要创建一个 Dockerfile 文件,其中包含一组指令来告诉 Docker 如何构建我们的镜像。
这里放在后面详细讲,Dockerfile详解。
Docker操作容器
查看容器
查看正在运行的容器
docker ps
查看所有容器
docker ps -a
运行创建容器
$ docker run httpd
如果要使用版本为15.10的ubuntu系统镜像来运行容器时,命令如下:
docker run -t -i ubuntu:15.10 /bin/bash
docker run -d -i --name=c1 ubuntu:15.10 /bin/bash
参数说明:
- i: 交互式操作。保持容器运行
- t: 为容器分配一个伪输入终端,容器创建后自动进入容器,输入 exit 命令来退出这个容器。
- -d:后台运行创建容器,需要使用docker exec进入容器,退出后容器不关闭
- /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 shell,因此用的是 /bin/bash。
- –name: 指定容器的名字
维护式进入容器
在使用 -d 参数时,容器启动后会进入后台。此时想要进入容器,可以通过以下指令进入:
推荐大家使用 docker exec 命令,因为此退出容器终端,不会导致容器的停止。
docker exec 参数
docker exec -it 243c32535da7 /bin/bash
启动已经停止运行的容器
docker start 容器名
停止容器
docker stop 容器名
删除容器
docker rm 容器名
查看容器信息
docker inspect 容器名
Docker数据管理
数据卷
数据卷的特点
数据卷是宿主机中的一个文件或目录,
当容器和数据卷目录绑定后,对方的修改会立即同步
一个数据卷可以被多个容器同时挂载
一个容器也可以被挂载多个数据卷
数据卷作用
容器数据持久化
外部机器和容器间接通信
容器之间数据交换
创建一个数据卷
与绑定挂载不同,可以在任何容器范围之外创建和管理卷。
$ docker volume create my-vol
$ docker volume
DRIVER VOLUME NAME
local my-vol
在主机里使用以下命令可以查看指定 数据卷 的信息
$ docker volume inspect my-vol
[
{
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
"Name": "my-vol",
"Options": {},
"Scope": "local"
}
]
删除数据卷
Docker 不会在容器被删除后自动删除 数据卷,并且也不存在垃圾回收这样的机制来处理没有任何容器引用的 数据卷。如果需要在删除容器的同时移除数据卷。可以在删除容器的时候使用 docker rm -v 这个命令。
$ docker volume rm my-vol
清理无主的数据卷
$ docker volume prune
挂载主机目录
挂载主机目录有几种方式,其中volume 由容器创建和管理,创建在宿主机,所以删除容器不会丢失,官方推荐,更高效,Linux 文件系统,适合存储数据库数据。可挂到多个容器上
如果你用一个尚不存在的卷启动一个容器,Docker 会为你创建该卷。下面的示例将卷 my-vol2 挂载到容器中的 /app/。
下面的 -v 和 --mount 示例产生相同的结果。
–mount
docker run -d \
--name devtest \
--mount source=myvol2,target=/app \
nginx:latest
-v
docker run -d \
--name devtest \
-v myvol2:/app \
nginx:latest
注意:
- 目录必须是绝对路径
- 如果目录不存在,会自动创建
- 可以挂载多个数据卷
如:
docker run -d \
--name devtest \
-v :/data1:/root/data1 \
-v :/data2:/root/data2 \
nginx:latest
一般来说,–mount 更明确、更详细。最大的区别在于,-v 语法将所有选项合并在一个字段中,而 --mount 语法则将它们分开。下面是每种标记的语法比较。
如果需要指定卷驱动程序选项,必须使用 --mount。
- -v或–volume:
由三个字段组成,以冒号字符(:)分隔。这些字段的顺序必须正确,而且每个字段的含义并不是一目了然的。
- 对于已命名加密卷,第一个字段是加密卷的名称,在指定主机上是唯一的。对于匿名加密卷,第一个字段可以省略。
- 第二个字段是文件或目录挂载在容器中的路径。
- 第三个字段是可选的,是一个以逗号分隔的选项列表,如 ro。下面将讨论这些选项。
- -mount:
由多个键值对组成,以逗号分隔,每个键值对由 = 元组组成。–mount语法比-v或–volume更冗长,但键值的顺序
并不重要,标志的值也更容易理解。
- type,可以是绑定、卷或 tmpfs。本主题讨论的是卷,因此类型总是卷。
- source。对于已命名的加密卷,这是加密卷的名称。对于匿名卷,则省略此字段。可指定为源或 src。
- destination的值是文件或目录在容器中挂载的路径。可以指定为 destination、dst 或 target。
- 如果存在readonly选项,绑定挂载会以只读方式挂载到容器中。可以指定为 readonly 或 ro。