Docker 运行容器前需要本地存在对应的镜像,如果镜像没保存在本地,Docker 会尝试先从默认镜像仓库下载 https://hub.docker.com/,用户也可以通过配置,使用自定义的镜像仓库。
1. 获取镜像
docker pull NAME[:TAG]
其中,NAME 是镜像仓库的名称(用来区分镜像),TAG 是镜像的标签 ( 往往用来表示版本信息) 。如果不显式指定 TAG,则默认会选择 latest 标签,这会下载仓库中最新版本的镜像。
~/docker$ docker pull ubuntu:16.04
16.04: Pulling from library/ubuntu
7b8b6451c85f: Pull complete
ab4d1096d9ba: Pull complete
e6797d1788ac: Pull complete
e25c5c290bde: Pull complete
Digest: sha256:e547ecaba7d078800c358082088e6cc710c3affd1b975601792ec701c80cdd39
Status: Downloaded newer image for ubuntu:16.04
2. 查看镜像
docker images
列出本地主机上已有的镜像,各个字段信息分别为来自于哪个仓库(REPOSITORY)、镜像的标签信息(TAG )、镜像的唯一ID号(IMAGE ID)、创建时间(CREATED)、镜像大小(SIZE)。
~/docker$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 16.04 a51debf7e1eb 2 weeks ago 116MB
hello-world latest 4ab4c602aa5e 2 months ago 1.84kB
3. 修改本地镜像标签
docker tag
为本地镜像添加新的标签:
~/docker$ docker tag ubuntu:16.04 ubuntu:test
~/docker$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 16.04 a51debf7e1eb 2 weeks ago 116MB
ubuntu test a51debf7e1eb 2 weeks ago 116MB
hello-world latest 4ab4c602aa5e 2 months ago 1.84kB
不同标签的镜像 ID 完全一致,说明它们实际上指向了同一个镜像文件,只是别名不同而已。
4. 查看镜像详细信息
docker inspect
docker inspect 命令可以获取该镜像的详细信息,详情如下:
~/docker$ docker inspect ubuntu
[]
Error: No such object: ubuntu
~/docker$ docker inspect ubuntu:16.04
[
{
"Id": "sha256:a51debf7e1eb2018400cef1e4b01f2e9f591f6c739de7b5d6c142f954f3715a7",
"RepoTags": [
"ubuntu:16.04",
"ubuntu:test"
],
"RepoDigests": [
"ubuntu@sha256:e547ecaba7d078800c358082088e6cc710c3affd1b975601792ec701c80cdd39"
],
....
}
]
要查看具体某一项时可以使用 -f
来指定,格式必须按照JSON的层次结构来,例如
wohu@wohu-pc:~$ docker inspect --format='{{.NetworkSettings.Networks.carla_0911_default.IPAddress}}' 1112
172.19.0.2
wohu@wohu-pc:~$ docker inspect -f '{{.NetworkSettings.Networks.carla_0911_default.IPAddress}}' 1112
172.19.0.2
wohu@wohu-pc:~$ docker inspect -f {{".NetworkSettings.Networks.carla_0911_default.IPAddress"}} 1112
172.19.0.2
wohu@wohu-pc:~$
5. 查找镜像
docker search
docker search 命令可以搜索远端仓库中共享的镜像,默认搜索官方仓库中的镜像。用法为 docker search TERM,支持的参数主要包括:
-
–automated=true| false: 仅显示自动创建的镜像,默认为否;
-
–no-trunc=true| false: 输出信息不截断显示,默认为否;
-
-s,–stars=X: 指定仅显示评价为指定星级以上的镜像,默认为0,即输出所有镜像。
~/docker$ docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 7465 [OK]
mariadb MariaDB is a community-developed fork of MyS… 2407 [OK]
...
6. 删除镜像
docker rmi IMAGE[IMAGE...]
docker rmi 命令可以删除镜像,命令格式为 docker rmi IMAGE[IMAGE…],其中 IMAGE 可以为标签或ID。
~/docker$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 16.04 a51debf7e1eb 2 weeks ago 116MB
ubuntu test a51debf7e1eb 2 weeks ago 116MB
hello-world latest 4ab4c602aa5e 2 months ago 1.84kB
~/docker$ docker rmi ubuntu:test
Untagged: ubuntu:test
~/docker$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 16.04 a51debf7e1eb 2 weeks ago 116MB
hello-world latest 4ab4c602aa5e 2 months ago 1.84kB
当同一个镜像拥有多个标签的时候,docker rmi 命令只是删除该镜像多个标签中的指定标签而已,并不影响镜像文件。因此上述操作相当于只是删除了镜像 a51debf7e1eb 的标签而已。
当使用 docker rmi 命令,并且后面跟上镜像的 ID ( 也可以是能进行区分的部分 ID 串前缀 ) 时,会先尝试删除所有指向该镜像的标签,然后删除该镜像文件本身。
注意,当有该镜像创建的容器存在时,镜像文件默认是无法被删除的。
- 先创建一个容器:
~/docker$ docker run ubuntu:16.04 echo "Hello, world"
Hello, world
- 使用 docker ps -a 命令可以看到本机上存在的所有容器:
~/docker$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f632ff0305aa ubuntu:16.04 "echo 'Hello, world'" 46 seconds ago Exited (0) 45 seconds ago eloquent_swartz
33197473a278 hello-world "/hello" 3 days ago Exited (0) 3 days ago frosty_galileo
- 试图删除该镜像,Docker 会提示有容器正在运行,无法删除:
~/docker$ docker rmi ubuntu:16.04
Error response from daemon: conflict: unable to remove repository reference "ubuntu:16.04" (must force) - container f632ff0305aa is using its referenced image a51debf7e1eb
- 先删除依赖该镜像的所有容器,再使用ID 来删除镜像:
:~/docker$ docker rm f6
f6
:~/docker$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
33197473a278 hello-world "/hello" 3 days ago Exited (0) 3 days ago frosty_galileo
7. 创建镜像
创建镜像有三种方法:
- 基于已有镜像的容器创建
- 基于本地模板导入
- 基于 Dockerfile 创建
基于已有镜像的容器创建:
该方法主要是使用 docker commit 命令。命令格式为
docker commit [OPTIONS]CONTAINER[REPOSITORY[:TAG]]
主要选项包括:
- -a,–author=“”:作者信息
- c,–change=[]:提交的时候执行 Dockerfile指令,包括CMD|
ENTRYPOINT|ENV|EXPOSE|LABEL|ONBUILD|USER|VOLUME|WORKDIR等; - -m,–message=“”:提交消息
- p,–pause=true:提交时暂停容器运行
创建新镜像示例
先启动一个镜像,并在其中进行修改操作,例如创建一个 test 文件,之后退出。
~/docker$ docker run -ti ubuntu:16.04
root@c53b34da8804:/# touch test.sh
root@c53b34da8804:/# pwd
/
root@c53b34da8804:/# ls
bin dev home lib64 mnt proc run srv test.sh usr
boot etc lib media opt root sbin sys tmp var
root@c53b34da8804:/# exit
exit
~/docker$
容器 ID 为 c53b34da8804,该容器跟原来的 ubuntu 镜像相比已发生变化。使用 docker commit 命令提交为一个新的镜像,提交时使用 ID 或者名称来指定容器。
~/docker$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c53b34da8804 ubuntu:16.04 "/bin/bash" 16 minutes ago Exited (0) 16 minutes ago mystifying_sanderson
33197473a278 hello-world "/hello" 3 days ago Exited (0) 3 days ago frosty_galileo
~/docker$ docker commit -m "add new file" -a "wohu1104" c53b34da8804 test_image
sha256:1cd880207b3efc2ce140237803672344fe3ec7ed3970dffc63c113cac262ed50
~/docker$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test_image latest 1cd880207b3e 18 seconds ago 116MB
ubuntu 16.04 a51debf7e1eb 2 weeks ago 116MB
ubuntu latest 93fd78260bd1 2 weeks ago 86.2MB
hello-world latest 4ab4c602aa5e 2 months ago 1.84kB
8. 导出和导入镜像
- 使用 docker save 命令用来将镜像导出到本地文件
~/docker$ docker save -o ubuntu.tar ubuntu:16.04
~/docker$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test_image latest 1cd880207b3e 9 minutes ago 116MB
ubuntu 16.04 a51debf7e1eb 2 weeks ago 116MB
ubuntu latest 93fd78260bd1 2 weeks ago 86.2MB
hello-world latest 4ab4c602aa5e 2 months ago 1.84kB
~/docker$ ls
ubuntu.tar
其中 -o 和 > 表示输出到文件,ubuntu.tar 为目标文件,ubuntu:16.04 是源镜像名(name:tag)
- 使用 docker load 将导出本地文件再导入到本地镜像库
~/docker$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test_image latest 1cd880207b3e 14 minutes ago 116MB
hello-world latest 4ab4c602aa5e 2 months ago 1.84kB
~/docker$ docker load -i ubuntu.tar
Loaded image: ubuntu:16.04
~/docker$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test_image latest 1cd880207b3e 15 minutes ago 116MB
ubuntu 16.04 a51debf7e1eb 2 weeks ago 116MB
hello-world latest 4ab4c602aa5e 2 months ago 1.84kB
其中 -i 和 < 表示从文件输入。会成功导入镜像及相关元数据,包括tag信息
9. 上传镜像
使用 docker push 命令上传镜像到仓库,默认上传到 Docker Hub官方仓库 ( 需要登录 )。命令格式为:
docker push NAME[:TAG] |[REGISTRY_HOST[:REGISTRY_PORT]/]NAME[:TAG]
10. 清理镜像
使用 Docker 一段时间后,系统中可能会遗留一些临时的镜像文件,以及一些没有被使用的镜像,可以通过下面命令进行清理
docker image prune -f