docker 镜像,容器,仓库命令

docker 镜像,容器,仓库命令

docker 镜像使用

查询镜像

docker search 名字

NAME: 镜像仓库源的名称

DESCRIPTION: 镜像的描述

OFFICIAL: 是否 docker 官方发布

STARS: 类似 Github 里面的 star,表示点赞、喜欢的意思。

AUTOMATED: 自动构建。

这里search 查询的是镜像加速地址,建议使用官方的

下载镜像

docker pull 镜像名:版本号

从下载过程中可以看到我们之前提及的分层存储的概念,镜像是由多层存储所构成。下载也是一层层的去下载,并非单一文件。下载过程中给出了每一层的 ID 的前 12 位。并且下载结束后,给出该镜像完整的 sha256 的摘要,以确保下载一致性。

在使用上面命令的时候,你可能会发现,你所看到的层 ID 以及 sha256 的摘要和这里的不一样。这是因为官方镜像是一直在维护的,有任何新的 bug,或者版本更新,都会进行修复再以原来的标签发布,这样可以确保任何使用这个标签的用户可以获得更安全、更稳定的镜像。

列出镜像

列出镜像

docker image ls或docker images

列表包含了 仓库名、标签、镜像 ID、创建时间 以及 所占用的空间。

虚悬镜像

上面的镜像列表中,还可以看到一个特殊的镜像,这个镜像既没有仓库名,也没有标签,均为 <none>。:

<none> <none> 276f80942015 8 days ago 332MB

这个镜像原本是有镜像名和标签的,随着官方镜像维护,发布了新版本后,重新 docker pull时,这个镜像名被转移到了新下载的镜像身上,而旧的镜像上的这个名称则被取消,从而成为了 <none>。除了 docker pull 可能导致这种情况,docker build 也同样可以导致这种现象。由于新旧镜像同名,旧镜像名称被取消,从而出现仓库名、标签均为 <none> 的镜像。这类无标签镜像也被称为 虚悬镜像(dangling image) ,可以用下面的命令专门显示这类镜像:

docker image ls -f dangling=true

可以用docker image prune或docker image rm ID删除,建议使用docker image prune

中间层镜像

为了加速镜像构建、重复利用资源,Docker 会利用 中间层镜像。所以在使用一段时间后,可能会看到一些依赖的中间层镜像。默认的 docker image ls 列表中只会显示顶层镜像,如果希望显示包括中间层镜像在内的所有镜像的话,需要加 -a 参数。

docker image ls -a

这样会看到很多无标签的镜像,与之前的虚悬镜像不同,这些无标签的镜像很多都是中间层镜像,是其它镜像所依赖的镜像。这些无标签镜像不应该删除,否则会导致上层镜像因为依赖丢失而出错。实际上,这些镜像也没必要删除,因为之前说过,相同的层只会存一遍,而这些镜像是别的镜像的依赖,因此并不会因为它们被列出来而多存了一份,无论如何你也会需要它们。只要删除那些依赖它们的镜像后,这些依赖的中间层镜像也会被连带删除。

导出镜像,导入镜像,删除

导出镜像

docker image save 镜像:版本号 > 打包名字

导入镜像

docker image load -i 包名

删除

docker image rm 镜像:版本号 或 docker rmi 镜像:版本号

Docker 容器使用

停止,启动,重启,删除,重命名,查看

停止

docker stop ID\容器名字

启动

docker start ID\容器名字

重启

docker restart ID\容器名字

删除

docker rm -f ID\容器名字

重命名

docker rename 旧容器名 新容器名

创建容器

语法

docker run [OPTIONS] IMAGE [COMMAND] [ARG…]

OPTIONS说明:

-a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;

-d: 后台运行容器,并返回容器ID;

-i: 以交互模式运行容器,通常与 -t 同时使用;

-P: 随机端口映射,容器内部端口随机映射到主机的高端口

-p: 指定端口映射,格式为:主机(宿主)端口:容器端口

-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;

–name=”nginx-lb”: 为容器指定一个名称;

–dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;

–dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;

-h “mars”: 指定容器的hostname;

-e username=”ritchie”: 设置环境变量;

–env-file=[]: 从指定文件读入环境变量;

–cpuset=”0-2″ or –cpuset=”0,1,2″: 绑定容器到指定CPU运行;

-m :设置容器使用内存最大值;

–net=”bridge”: 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;

–link=[]: 添加链接到另一个容器;

–expose=[]: 开放一个端口或一组端口;

–volume , -v: 绑定一个卷

实例

1)使用docker镜像nginx:latest以后台模式启动一个容器,并将容器命名为mynginx。

docker run –name sun_nginx -d nginx:latest

2)使用镜像nginx:latest以后台模式启动一个容器,并将容器的80端口映射到主机随机端口。

docker run -P -d nginx:latest

3)使用镜像 nginx:latest,以后台模式启动一个容器,将容器的 80 端口映射到主机的 80 端口,主机的目录 /data 映射到容器的 /data。

docker run -p 80:80 -v /data:/data -d nginx:latest

注:-v可以挂载本地目录也可以挂载docker volume,volume ,目录为:

/var/lib/docker/volumes/HAHA/_data/

4)绑定容器的 8080 端口,并将其映射到本地主机 127.0.0.1 的 80 端口上。

docker run -d -p 127.0.0.1:80:8080/tcp nginx:latest

5)使用镜像nginx:latest以交互模式启动一个容器,在容器内执行/bin/bash命令。

docker run -it nginx:latest /bin/bash

注:这种方式进入容器,退出容器后,容器会停止,如果进入已运行的容器,同时也推荐docker exec 方式进入容器,例:

docker exec -it nginx:latest /bin/bash

Docker 仓库使用

私有仓库

  1. 安装运行 docker-registry

    1. 容器运行

你可以通过获取官方 registry 镜像来运行。

docker run -d -p 5000:5000 –restart=always –name registry registry

    1. 这将使用官方的 registry 镜像来启动私有仓库。默认情况下,仓库会被创建在容器的 /var/lib/registry 目录下。你可以通过 -v 参数来将镜像文件存放在本地的指定路径。例如下面的例子将上传的镜像放到本地的 /opt/myregistry 目录。

docker run -d -p 5000:5000 –restart=always -v /opt/myregistry:/var/lib/registry registry

    1. 需要对源容器的宿主机修改

vi /etc/docker/daemon.json

{

“registry-mirrors”: [“https://registry.docker-cn.com”],

“insecure-registries”: [“192.168.138.14:5000”]

}

systemctl restart docker

b) 给要上传的镜像打tag(必须要做)

docker image tag 镜像名 tag镜像名(格式:IP:端口号/名字)

例子:docker image tag httpd:latest 192.168.138.14:5000/http:latest

    1. 上传镜像

docker push tag名

例:docker push 192.168.138.14:5000/http:latest

使私有仓库带认证

  1. base认证密码文件准备

yum install httpd-tools -y

mkdir /opt/registry-var/auth/ -p

htpasswd -Bbn oldboy 123456 >> /opt/registry-var/auth/htpasswd

用户:oldboy

密码:123456

  1. 启动docker私有仓库

docker run -d -p 5000:5000 -v /opt/registry-var/auth/:/auth/ -v /opt/myregistry:/var/lib/registry -e “REGISTRY_AUTH=htpasswd” -e “REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm” -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd registry