一、搜索镜像
docker search : 从Docker Hub查找镜像
语法
docker search [OPTIONS] TERM
OPTIONS
说明:
--automated
:只列出automated build
类型(自动构建)的镜像;--no-trunc
:显示完整的镜像描述(不要截断输出);- -f <过滤条件>:列出收藏数不小于指定值的镜像。
实例
从 Docker Hub
查找所有镜像名包含 java
,并且收藏数大于 10
的镜像
runoob@runoob:~$ docker search -f stars=10 java
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
java Java is a concurrent, class-based... 1037 [OK]
anapsix/alpine-java Oracle Java 8 (and 7) with GLIBC ... 115 [OK]
develar/java 46 [OK]
isuper/java-oracle This repository contains all java... 38 [OK]
lwieske/java-8 Oracle Java 8 Container - Full + ... 27 [OK]
nimmis/java-centos This is docker images of CentOS 7... 13 [OK]
参数说明:
NAME: 镜像仓库源的名称
DESCRIPTION: 镜像的描述
OFFICIAL: 是否 docker 官方发布
stars: 类似 Github
里面的 star
,表示点赞、喜欢的意思。
AUTOMATED: 自动构建的镜像。
二、获取镜像
首先说明一下如何从Docker hub
中获取高质量的镜像,从Docker
镜像库获取镜像的命令是docker pull
。其命令格式为:
docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
具体的选项可以通过docker pull --help
命令看到,下面我们说一下镜像名称的格式:
docker
镜像仓库地址:地址的格式一般是<域名/IP>[:端口号]
。默认地址是DockerHub
。- 仓库名:仓库名是两段式名称,即
<用户名>/<软件名>
。对于Docker Hub
,如果不给出用户名,则默认为library
,也就是官方镜像
比如:
sudo docker pull ubuntu:16.04
#输出一下信息
16.04: Pulling from library/ubuntu
50aff78429b1: Pull complete
f6d82e297bce: Pull complete
275abb2c8a6f: Pull complete
9f15a39356d6: Pull complete
fc0342a94c89: Pull complete
Digest: sha256:fbaf303d18563e57a3c1a0005356ad102509b60884f3aa89ef9a90c0ea5d1212
Status: Downloaded newer image for ubuntu:16.04
上述命令没有给出docker
镜像仓库地址,将会从docker hub
获取镜像。镜像名是ubuntu:16.04
,因此将会获取官方镜像 library/ubuntu
仓库中标签为 16.04
的镜像。
从下载过程中可以看到我们之前提及的分层存储的概念,镜像是由多层存储所构成。下载也
是一层层的去下载,并非单一文件。下载过程中给出了每一层的 ID 的前 12 位。并且下载结
束后,给出该镜像完整的 sha256
的摘要,以确保下载一致性。
有了docker镜像后,我们就可以以这个镜像为基础启动运行一个容器,以上面的镜像为例,我们想启动上面的bash并以交互的方式运行,可以使用一下命令:
sudo docker run -it --rm ubuntu:16.04 bash
docker run
是运行容器的命令,上面用到的参数意义如下:
-it
:这是两个参数,一个是-i交互式操作,一个是-t终端。我们这里打算进入bash
执行一些命令并查看返回结果,因此我们需要交互式终端--rm
:这个参数是说容器退出后随之将其删除ubuntu:16.04
:这是指用ubuntu:16.04
镜像为基础来启动容器bash
:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 bash
进入容易后,我们可以通过shell执行任何所需要的命令,最后我们通过exit退出这个容器。
三、列出镜像
使用sudo docker image ls
或则sudo docker images
可以列出本地已下载的镜像。
sudo docker image ls
#结果
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 16.04 00fd29ccc6f1 3 weeks ago 111MB
hello-world latest f2a91732366c 6 weeks ago 1.85kB
从上面可知,列表包含了仓库名,标签,镜像ID,创建时间,占用空间这些信息,镜像ID是镜像的唯一表示,一个镜像可以对应多个标签,相同镜像ID不同标签的镜像可以认为是同一个镜像
镜像体积
通过观察镜像的size
我们可以发现,镜像表示所占用的空间和docker hub
上看到的镜像的大小不一致。这是因为docker hub
显示的大小是压缩后的体积大小。镜像的下载和上传过程中是保持压缩状态的。因此docker hub
显示的大小是压缩后的体积大小。而docker image
看到的是下载到本地后展开后的大小,是展开后各层所占用的空间的总和。查看空间的时候更关心的是本地磁盘空间占用的大小。
另外一个需要注意的问题是, docker image ls
列表中的镜像体积总和并非是所有镜像实际硬
盘消耗。由于 Docker
镜像是多层存储结构,并且可以继承、复用,因此不同镜像可能会因为
使用相同的基础镜像,从而拥有共同的层。由于 Docker
使用 Union FS
,相同的层只需要保
存一份即可,因此实际镜像硬盘占用空间很可能要比这个列表镜像大小的总和要小的多。
可以通过以下命令来便捷的查看镜像、容器、数据卷所占用的空间:
docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 2 1 110.5MB 110.5MB (99%)
Containers 2 0 0B 0B
Local Volumes 0 0 0B 0B
Build Cache 0B 0B
悬挂镜像
悬挂镜像是一种特殊的镜像,这种镜像既没有仓库名也没有标签,他们的值都为,除了 docker pull 可能导致这种情况, docker build 也同样可以导致这种现象。由于新旧镜像同名,旧镜像名称被取消,从而出现仓库名、标签均为 的镜像。这类无标签镜像也被称为 虚悬镜像。可以使用下面的命令显示悬挂镜像
docker image ls -f dangling=true
一般来说,虚悬镜像已经失去了存在的价值,是可以随意删除的,可以用下面的命令删除:
docker image prune
中间层镜像
为了加速镜像构建、重复利用资源,Docker 会利用 中间层镜像。所以在使用一段时间后,可能会看到一些依赖的中间层镜像。默认的 docker image ls 列表中只会显示顶层镜像,如果
希望显示包括中间层镜像在内的所有镜像的话,需要加 -a 参数
docker image ls -a
列出部分镜像
不加任何参数的情况下, docker image ls 会列出所有顶级镜像,但是有时候我们只希望列出
部分镜像。 docker image ls 有好几个参数可以帮助做到这个事情。
- 根据仓库名列出镜像
docker image ls ubuntu
- 指定仓库名和标签列出特定的镜像
docker image ls ubuntu:16.04
- 使用过滤参数列出镜像
#如果镜像构建时,定义了 LABEL ,还可以通过 LABEL 来过滤
docker image ls -f label=com.example.version=0.1
以特定格式显示镜像
默认情况下, docker image ls 会输出一个完整的表格,但是我们并非所有时候都会需要这些
内容。比如,刚才删除虚悬镜像的时候,我们需要利用 docker image ls 把所有的虚悬镜像
的 ID 列出来,然后才可以交给 docker image rm 命令作为参数来删除指定的这些镜像,这个
时候就用到了 -q 参数
docker image ls -q
00fd29ccc6f1
f2a91732366c
另外一些时候,我们可能只是对表格的结构不满意,希望自己组织列;或者不希望有标题,
这样方便其它程序解析结果等,这就用到了 Go 的模板语法
比如,下面的命令会直接列出镜像结果,并且只包含镜像ID和仓库名:
docker image ls --format "{{.ID}}: {{.Repository}}"
或者打算以表格等距显示,并且有标题行,和默认一样,不过自己定义列:
docker image ls --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}"
IMAGE ID REPOSITORY TAG
00fd29ccc6f1 ubuntu 16.04
f2a91732366c hello-world latest
四、删除本地镜像
删除本地镜像可以使用docker image rm 命令格式如下:
docker image rm [选项] <镜像1> [<镜像2> ...]
其中, <镜像> 可以是 镜像短 ID 、 镜像长 ID 、 镜像名 或者 镜像摘要 。
如果我们需要删除所有仓库名为 redis
的镜像,可以使用下面的命令
docker image rm $(docker image ls -q redis)
Untagged 和 Deleted
删除行为分为两类,一类是Untagged
,另一类是Deleted
。我们使用上述命令删除的时候,实际上是在要求删除某个标签的镜像,这就是我们看到的Untagged
信息。因为一个镜像可以对应多个标签,因此当我们删除了所指定的标签后,可能还有别的标签指向了这个镜像。如果是这种情况,那么 Delete
行为就不会发生。所以并非所有的 docker rmi
都会产生删除镜像的行为,有可能仅仅是取消了某个标签而已。当该镜像所有的标签都被取消了,该镜像很可能会失去了存在的意义,因此会触发删除行为。镜像是多层存储结构,因此在删除的时候也是从上层向基础层方向依次进行判断删除。镜像的多层结构让镜像复用变动非常容易,因此很有可能某个其它镜像正依赖于当前镜像的某一层。这种情况,依旧不会触发删除该层的行为。直到没有任何层依赖当前层时,才会真实的删除当前层。除了镜像依赖以外,还需要注意的是容器对镜像的依赖。如果有用这个镜像启动的容器存在(即使容器没有运行),那么同样不可以删除这个镜像。
五、安装LNMP
环境
php
的运行环境主要有php
,mysql
,nginx
,redis
- 首先安装
nginx
,先查看本地是否安装了nginx
,运行命令:
docker images
查看已安装
发现没有nginx
,此时我们可以安装一个最新版本的nginx
:
docker pull nginx:latest
- 再次执行:
docker images
出现nginx
- 安装完成后可以使用以下命令来运行
nginx
容器(最基础的):
docker run --name nginx-test -p 8080:80 -d nginx
参数说明如下:
--name nginx-test
:容器名称。-p 8080:80
: 端口进行映射,将本地8080
端口映射到容器内部的80
端口。-d nginx
: 设置容器在在后台一直运行。
也可以像下面这样这样(参数一次性配置好,前提是已经安装了nginx
和php
):
docker run --name sui-nginx -p 9888:80 -d -v /data/soft/docker/www:/usr/share/nginx/html:ro -v /data/soft/docker/nginx/conf.d:/etc/nginx/conf.d:ro --link sui
-php:php nginx
-p 80:80
用于添加端口映射,把sui-nginx
中的80
端口暴露出来。/data/soft/docker/www
是本地html
文件的存储目录,/usr/share/nginx/html
是容器内html
文件的存储目录。可以自己选择目录/data/soft/docker/nginx/conf.d
是本地nginx
配置文件的存储目录,/etc/nginx/conf.d
是容器内nginx
配置文件的存储目录。--link sui-php:php 把 sui-php
的网络并入sui-nginx
,并通过修改sui-nginx
的/etc/hosts
,把域名php
映射成127.0.0.1
,让nginx
通过php:9000
访问php-fpm
。
4.安装成功,通过浏览器可以直接访问 9888
端口的 nginx
服务:http://你的域名:9888
5.安装php
docker pull php:7.2-fpm
docker run --name sui-php -d -v /data/soft/docker/www:/var/www/html:ro php:7.2-fpm
php:9000
表示php-fpm
服务的访问路径。/var/www/html
是sui-php
中php
文件的存储路径,经docker
映射,变成本地路径/data/soft/docker/www
这时候我们在本地的目录/data/soft/dacker/www
中创建一个index.php
文件并修改:<?php echo phpinfo();?>
然后访问http://你的ip:9888/index.php
,会发现phpinfo
信息出来了
6.安装mysql
docker pull mysql:latest
此处我先在本地把mysql
相关目录以及文件创建好:
sudo mkdir -p /data/soft/docker/mysql/data /data/soft/docker/mysql/logs /data/soft/docker/mysql/conf
data
目录将映射为mysql
容器配置的数据文件存放路径logs
目录将映射为mysql
容器的日志目录conf
目录里的配置文件将映射为mysql
容器的配置文件
运行mysql
容器:
docker run -p 3307:3306 --name sui-mysql -v /data/soft/docker/mysql/conf:/etc/mysql -v /data/soft/docker/mysql/logs:/logs -v /data/soft/docker/mysql/data:/mysql_data -e MYSQL_ROOT_PASSWORD=883721 -d --link sui-php mysql
- 注意:由于我本地
mysql
占用了3306
所以此处端口映射用3307
进入mysql
:
docker exec -it sui-mysql bash
可能发现报错如下(进入mysql
报错):
先卸载之前的mysql
容器,再重新运行mysql
容器:
docker run --name sui-mysql -p 3307:3306 -e MYSQL_ROOT_PASSWORD=580230a -d mysql
进入mysql
客户端:
docker run -it --link sui-mysql:mysql --rm mysql sh -c 'exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD"'
成功!!!
7.退出来装一下phpmyadmin
docker run --name sui-myadmin -d --link sui-mysql:db -p 8083:80 phpmyadmin/phpmyadmin
安装完成访问http://你的ip:8083
,出现登录说明安装成功
参考资料:
https://www.cnblogs.com/senlinyang/p/8241745.html
https://docs.docker.com/engine/reference/commandline/search/
https://www.runoob.com/docker/docker-search-command.html
https://juejin.cn/post/6999895727866380296
https://www.jianshu.com/p/419b9f371a12
https://www.runoob.com/docker/docker-install-nginx.html
https://www.runoob.com/docker/docker-install-php.html
https://blog.csdn.net/lhd_paul/article/details/78568691
版权属于:soarli
本文链接:https://blog.soarli.top/archives/630.html
转载时须注明出处及本声明。