- docker.io(官网)
- 轻量、高效的虚拟化
Docker 公司位于旧金山,原名dotCloud,底层利用了Linux容器技术(在操作系统中实现资源隔离与限制)。为了方便创建和管理这些容器,dotCloud 开发了一套内部工具,之后被命名为“Docker”。Docker就是这样诞生的。
什么是docker?
Docker是Docker.Inc公司开源的一个基于轻量级虚拟化急速的容器引擎项目,整个项目基于Go语言开发,遵从Apache 2.0协议。通过分出镜像标准化和内核虚拟化技术,Docker使得应用开发者和运维工程师可以以统一的方式跨平台发布应用,并且以几乎没有额外开销的情况下提供资源隔离的应用运行环境。
- 是一个开源工具,它可以让创建和管理Linux容器变得简单。容器就像是轻量级的虚拟机,并且可以以毫秒级的速度来启动或停止。可以打包成镜像任意移动
Hypervisor: 一种运行在基础物理服务器和操作系统之间的中间软件层,可允许多个操作系统和应用共享硬件 。常见的VMware的 Workstation 、ESXi、微软的Hyper-V或者思杰的XenServer。
Container Runtime:通过Linux内核虚拟化能力管理多个容器,多个容器共享一套操作系统内核。秒级启动;基于进程隔离(早期使用LXC,后期衍升libcontainer、OCI)
优点
- 1.标准化应用发布,docker容器包含了运行环境和可执行程序,可以跨平台和主机使用
- 2.节约时间,快速部署和启动,秒级
- 3.方便构建基于SOA架构或微服务架构的系统,通过服务编排,更好的松耦合
- 4.节约成本,以前一个虚拟机至少需要几个G的磁盘空间,docker容器可以减少到MB
- 5.方便持续集成,通过与代码进行关联使持续集成非常方便
- 6.可以作为集群系统的轻量级主机或节点,在Iaas平台上,已经出现了Caas,通过容器代替原理的主机
- 7.交付物标准化
- 8.一次构建,多次交付
Docker与虚拟机的区别
不同点 | container(容器) | VM(虚拟机) |
---|---|---|
启动速度 | 秒级(进程控制) | 分钟级(来宾操作系统管理) |
运行性能 | 接近原生(共享内核)(直接在内核中运行90% ) | 50%左右损失 |
磁盘占用 | MB | GB(操作系统镜像2G) |
数量 | 成百上千 | 一般几十台 |
隔离性 | 进程级别 | 系统级别(更彻底) |
操作系统 | 主要支持Linux系统 | 几乎所有 |
安全性 (因为隔离性) | 低(使用原系统内核) | 高 |
封装程度 | 只打包项目代码和依赖关系,共享宿主机内核 | 完整的操作系统,与宿主机隔离 |
版本管理
- Docker 引擎主要有两个版本:企业版(EE)和社区版(CE)
- 每个季度(1-3,4-6,7-9,10-12),企业版和社区版都会发布一个稳定版本(Stable)。社区版本会提供 4 个月的支持,而企业版本会提供 12 个月的支持
- 每个月社区版还会通过 Edge 方式发布月度版
- 从 2017 年第一季度开始,Docker 版本号遵循 YY.MM-xx 格式,类似于 Ubuntu 等项目。例如,2018 年 6 月第一次发布的社区版本为 18.06.0-ce
发展史
13年成立,15年开始,迎来了飞速发展。
Docker 1.8之前,使用LXC,Docker在上层做了封装, 把LXC复杂的容器创建与使用方式简化为自己的一套命令体系。
之后,为了实现跨平台等复杂的场景,Docker抽出了libcontainer项目,把对namespace、cgroup的操作封装在libcontainer项目里,支持不同的平台类型。
2015年6月,Docker牵头成立了 OCI(Open Container Initiative开放容器计划)组织,这个组织的目的是建立起一个围绕容器的通用标准 。 容器格式标准是一种不受上层结构绑定的协议,即不限于某种特定操作系统、硬件、CPU架构、公有云等 , 允许任何人在遵循该标准的情况下开发应用容器技术,这使得容器技术有了一个更广阔的发展空间。
OCI成立后,libcontainer 交给OCI组织来维护,但是libcontainer中只包含了与kernel交互的库,因此基于libcontainer项目,后面又加入了一个CLI工具,并且项目改名为runC (https://github.com/opencontainers/runc ), 目前runC已经成为一个功能强大的runtime工具。
Docker也做了架构调整。将容器运行时相关的程序从docker daemon剥离出来,形成了containerd。containerd向上为Docker Daemon提供了gRPC接口
,使得Docker Daemon屏蔽下面的结构变化,确保原有接口向下兼容。向下通过containerd-shim
结合runC
,使得引擎可以独立升级,避免之前Docker Daemon升级会导致所有容器不可用的问题。
也就是说
- runC(libcontainer)是符合OCI标准的一个实现,与底层系统交互
- containerd是实现了OCI之上的容器的高级功能,比如镜像管理、容器执行的调用等
- Dockerd目前是最上层与CLI交互的进程,接收cli的请求并与containerd协作
- docker-ce,每季度发布stable版本。18.06,18.09,19.03
- 发展至今,docker已经通过制定OCI标准对最初的项目做了拆分,其中runC和containerd是docker的核心项目,理解docker整个请求的流程,对我们深入理解docker有很大的帮助
Docker名称上的调整
- 最初维护两个版本:docker-ce(社区版)和docker-ee(企业版)
- 随后将docker-ce更名为moby,转由社区进行维护
Centos7安装Docker
配置宿主机网卡转发
# 配置网卡转发,看值是否为1
$ sysctl -a |grep -w net.ipv4.ip_forward
net.ipv4.ip_forward = 1
# 若未配置,需要执行如下
cat <<EOF > /etc/sysctl.d/docker.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward=1
EOF
sysctl -p /etc/sysctl.d/docker.conf
Yum安装配置docker
# 卸载旧版已存在的docker(未安装可忽略)
yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
## 下载阿里源repo文件、docker的repo文件
curl -o /etc/yum.repos.d/Centos-7.repo http://mirrors.aliyun.com/repo/Centos-7.repo
curl -o /etc/yum.repos.d/docker-ce.repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum clean all && yum makecache
## 查看源中可用版本
yum list docker-ce --showduplicates | sort -r
## yum安装
yum install -y docker-ce docker-ce-cli containerd.io
## 安装指定版本
## yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
## yum install -y docker-ce-18.09.9 docker-ce-cli-18.09.9 containerd.io
## 配置源加速
## https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
mkdir -p /etc/docker
vi /etc/docker/daemon.json
{
"registry-mirrors": [ # 镜像加速,后面有讲
"http://f1361db2.m.daocloud.io"
],
"insecure-registries": []
}
## 设置开机自启
systemctl enable docker
## 启动docker
systemctl start docker
## 查看docker信息
docker info
## 运行hello world镜像检验
$ docker run hello-world
打印了一堆信息其中有一条写着表明成功的话
Hello from Docker! This message shows that your installation appears to be working correctly.
## docker-client
which docker
## docker daemon
ps aux |grep docker
Docker加速器
Docker 加速器:国内的定义;官方没有
就是国内的docker源、aliyun 、 网易蜂巢、daocloud等
弊端是不能知道都有哪些版本,只能下载最新版,除非去国内源网站登陆去查看
国内镜像:使用官方源因为在国外速度特别慢,所以有了国内源,每个国内源都可以配置加速器,还可以监控
国内可以用阿里的加速源、daocloud、华为等等,这里以daocloud为例
$ vim /etc/docker/daemon.json
{
"registry-mirrors": [
"http://f1361db2xx.m.daocloud.io"
],
"insecure-registries": []
}
上述registry-mirrors地址在daocloud官网中,所有人的都不一致。
登录登出官网docker hub仓库
需要注册自己的用户名密码,拉取镜像不需要登录,上传需要
[root@docker ~]# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: wzp
Password:
[root@docker ~]# docker logout
Removing login credentials for https://index.docker.io/v1/
核心要素及常用操作详解
三大核心要素:镜像(Image)、容器(Container)、仓库(Registry)
镜像(Image)
是一个只读的文件和文件夹组合,是Docker容器运行时的只读模板,包含启动容器所需的所有文件系统结构和内容。即镜像不包含任何动态数据,镜像内容在构建后不会改变,是静态的文件,不能直接对外提供服务。
容器(Container)
镜像的运行时,可以对外提供服务。本质上讲是利用namespace和cgroup等技术在宿主机中创建的独立的虚拟空间。
仓库(Registry)
- 公有仓库,Docker Hub,阿里,网易...
- 私有仓库,企业内部搭建
- Docker Registry,Docker官方提供的镜像仓库存储服务
- Harbor, 是Docker Registry的更高级封装,它除了提供友好的Web UI界面,角色和用户权限管理,用户操作审计等功能
- 镜像访问地址形式 registry.harbor.com/demo/hello:latest,若没有前面的url地址,则默认寻找Docker Hub中的镜像,若没有tag标签,则使用latest作为标签
- 公有的仓库中,一般存在这么几类镜像
- 操作系统基础镜像(centos,ubuntu,suse,alpine)
- 中间件(nginx,redis,mysql,tomcat)
- 语言编译环境base镜像(python,java,golang)
- 业务镜像(django-demo...)
操作演示
docker本身的简单操作
# 查看docker版本
$ docker version
# 查看docker的详细信息
$ docker info
# 查看docker的运行事件
$ docker events
- 搜索镜像
#查询的内容只能查询官方库上的镜像
# - NAME:名称 - DESCRIPTION:描述 - STARS: star收藏数量 - OFFICIAL:是否是官方镜像 - AUTOMATED: 是否是自动构建的
[root@jgs-global-master2 nfs]# docker search centos
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
centos DEPRECATED; The official build of CentOS. 7528 [OK]
kasmweb/centos-7-desktop CentOS 7 desktop for Kasm Workspaces 33
couchbase/centos7-systemd centos7-systemd images with additional debug… 7 [OK]
dokken/centos-7 CentOS 7 image for kitchen-dokken 6
dokken/centos-8 CentOS 8 image for kitchen-dokken 3
eclipse/centos_jdk8 CentOS, JDK8, Maven 3, git, curl, nmap, mc, … 3 [OK]
- 增加参数
# 显示完整描述而不是省略
docker search busybox --no-trunc
# 搜索结果仅展示10个
docker search busybox --limit=10
# 搜索结果过滤star收藏数量大于等于3个
docker search busybox --filter stars=3
# 搜索结果只列出自动构建的镜像
docker search busybox --filter is-automated=true
# 搜索结果只列出官方镜像 并且star收藏数量大于等于3个
docker search busybox --filter is-official=true --filter stars=3
- 查看所有本地镜像
$ docker images
# 仅查看所有镜像的ID
$ docker images -q
- 拉取镜像
如何唯一确认一个镜像?
- image_id
- repository:tag
# 不写路径默认去官网(docker hub)拉取,不写Tag默认是latest
$ docker pull nginx:latest
- 删除本地镜像
- 注意:如果存在容器正在使用镜像时无法删除
# 通过路径方式删除(REPOSITORY:TAG)
docker rmi docker.io/ubuntu:latest
# 通过镜像ID删除(ID可以简写)
docker rmi 7753
# 删除所有本地镜像(shell方式)
docker rmi `docker images | awk 'NR!=1{print $3}'`
# 删除所有本地镜像(docker方式)
docker rmi `docker images -q`
- 启动一个docker容器
- 注意docker的特性,决定了每次使用同一个镜像运行的容器都是一个新的容器且互相不影响
# 1.启动一个容器并放入后台运行
docker run --name nginx -d nginx:latest
# 2.启动一个容器并放入后台运行,且保持状态一直运行(在docker是running时,会一直尝试容器处于运行状态)
docker run --name nginx --restart=always -d nginx:latest
# 3.启动一个容器并进入bash终端(退出容器时容器终止运行)
# -it 与/bin/sh 或 /bin/bash连用,表示分配一个tty终端执行bash
docker run --name nginx -it nginx:latest /bin/bash
# 4.映射容器80端口到宿主机8080端口
docker run --name nginx -p 8080:80 -d nginx:latest
# 5.启动一个容器并进入bash终端,在退出时自动删除容器(相当于临时容器)
docker run --name nginx --rm -it nginx:latest /bin/bash
# 6.创建一个容器但是不启动
docker create --name "wzp-nginx" -d nginx:latest
## ## 注意示例
# 这里跟了/bin/sh 表示将镜像中的启动命令替换成了/bin/sh
$ docker run --name nginx -ti nginx:latest /bin/sh
(注意:退出容器后,该容器会变成退出状态,因为容器内部的1号进程退出)
## 实际上,在运行容器的时候,镜像地址后面跟的命令等于是覆盖了原有的容器的CMD命令,因此,执行的这些命令在容器内部就是1号进程,若该进程不存在了,那么容器就会处于退出的状态,比如,宿主机中执行
1. echo 1,执行完后,该命令立马就结束了
2. ping www.baidu.com,执行完后,命令的进程会持续运行
$ docker run --name test_echo nginx:alpine echo 1,容器会立马退出
$ docker run --name test_ping nginx:alpine ping www.baidu.com,容器不会退出,但是因为没有加-d参数,因此一直在前台运行,若ctrl+C终止,则容器退出,因为1号进程被终止了
- 查看本地容器
# 查看运行中的容器
$ docker ps
# 查看所有容器(运行、退出状态)
$ docker ps -a
- 查看某一 容器/镜像/volume/network 详细信息
docker inspect 容器名称/容器ID(ID可以简写)
$ docker ps | grep nginx
a4d4fa71f329 nginx:latest "/docker-entrypoint.…" 6 minutes ago Up 6 minutes 80/tcp nginx
3d70d5257b75 192.168.183.144:11443/acp/alb-nginx
$ docker inspect a4d4f | head
[
{
"Id": "a4d4fa71f3293d00a1f83466c9758527139e5d60fd949e08eeb6efa2f08ccb35",
"Created": "2023-03-13T04:46:20.820415327Z",
"Path": "/docker-entrypoint.sh",
"Args": [
"nginx",
"-g",
"daemon off;"
],
# 通过format 获取指定字段
# inspect输出的内容为Json格式,可以通过.xxx.yyy 的层级关系来指定要查看的字段,多个字段逗号隔开
$ docker inspect --format='{{.NetworkSettings.IPAddress}}' a4d4f
172.17.0.2
# 抓取容器的Pid、名称、工作目录存在位置
docker inspect --format '{{.State.Pid}}, {{.Name}}, {{.GraphDriver.Data.WorkDir}}' a4d4f
- 管理已存在的容器的状态(启动/停止/重启/暂停...)
# 启动一个停止状态的容器
$ docker start <container_id_or_name>
# 停止一个运行中的容器
$ docker stop <container_id_or_name>
# 重启一个容器
$ docker restart <container_id_or_name>
# 强制关闭一个容器
$ docker kill <container_id_or_name>
# 暂停一个运行中容器的所有进程
$ docker pause <container_id_or_name>
# 恢复处于暂停中的容器的所有进程
$ docker unpause <container_id_or_name>
停止和暂停容器的区别?
- stop命令用于停止一个运行中的容器
- 使用stop命令容器内主进程会在指定时间内被杀死(杀死后进程就不存在了),默认为十秒
- pause命令用于暂停容器中的所有进程
- 使用pause命令会挂起指定容器中的所有进程(还可以被唤醒)
- 容器内进程状态变为D
- 删除容器
docker rm 容器名
# 删除一个停止状态的容器
$ docker rm a4d4f
# 删除一个运行中的容器
$ docker rm -f a4d4f
# 删除所有容器exited状态的容器
$ docker rm `docker ps -qf status=exited`
# 删除所有容器
docker rm `docker ps -a -q`
- 容器数据持久化
## 挂载主机目录
$ docker run --name nginx -d -v /opt:/opt -v /var/log:/var/log nginx:latest
$ docker run --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d -v /opt/mysql/:/var/lib/mysql mysql:5.7
## 使用volumes卷
$ docker volume ls
$ docker volume create test
$ docker run --name nginx -d -v test:/opt/test nginx:latest
$ docker exec -ti nginx touch /opt/test/a.txt
# volumes卷,默认存储在/var/lib/docker/volumes/卷名称/_data/
$ ls /var/lib/docker/volumes/test/_data/
a.txt
## 多容器共享同一个卷
$ docker run --name nginx2 -d -v test:/opt/test nginx:latest
$ docker exec -ti nginx2 ls /opt/test/
a.txt
- 运行中容器的使用状态
# cpu、内存、网络io使用情况,不写具体容器表示所有,
# 默认实时更新,--no-stream 表示仅打印一次后退出
$ docker stats [container_name]
# 查看容器中运行的进程信息,支持 ps 命令参数。
$ docker top CONTAINER [ps OPTIONS]
$ docker top registry
UID PID PPID C STIME TTY TIME CMD
root 3367 3348 0 06:55 ? 00:00:00 registry serve /etc/docker/registry/config.yml
- 连接运行中的容器
# exec交互型,即进入到容器中并停留在终端,可以在容器的环境中执行
$ docker exec -it <container_id_or_name> /bin/bash
# exec后台型,即进入容器中不停留,仅执行命令并返回结果
$ docker exec <container_id_or_name> ls
# attach 了解即可,不建议使用
# 使用attach会连接到容器的主经常上,不像exec会在容器中新开一个进程
# ** 这意味着attch连接到容器,一旦给了CTRL+C或停止信号后容器本身也会退出
# ** 虽然有参数可以避免此现象
$ docker attach <container_id_or_name>
# 不转发sig信号
$ docker attach --sig-proxy=false <container_id_or_name>
# 示例
# * exec交互型
[root@docker ~]# docker exec -it nginx bash
root@98a54056b185:/# ls
bin boot dev docker-entrypoint.d docker-entrypoint.sh etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@98a54056b185:/# pwd
/
root@98a54056b185:/# exit
exit
# * exec后台型
[root@docker ~]# docker exec nginx hostname
98a54056b185
# * attch ,这里连接nginx后,访问一下nginx看效果
[root@docker ~]# docker attch nginx
172.17.0.1 - - [13/Mar/2023:05:26:41 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.29.0" "-"
172.17.0.1 - - [13/Mar/2023:05:26:41 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.29.0" "-"
^C 2023/03/13 05:26:45 [notice] 1#1: signal 2 (SIGINT) received, exiting
2023/03/13 05:26:45 [notice] 1#1: exit
# 由于接收了^C ,所以容器也退出了
[root@docker ~]# docker ps -a | grep nginx
98a54056b185 nginx:latest "/docker-entrypoint.…" 17 minutes ago Exited (0) 50 seconds ago nginx
# * 启动容器后,设置不接收sig信号
[root@docker ~]# docker start nginx
nginx
[root@docker ~]# docker attach --sig-proxy=false nginx
172.17.0.1 - - [13/Mar/2023:05:28:52 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.29.0" "-"
172.17.0.1 - - [13/Mar/2023:05:28:52 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.29.0" "-"
^C
[root@docker ~]# docker ps -a| grep nginx
98a54056b185 nginx:latest "/docker-entrypoint.…" 18 minutes ago Up 31 seconds 80/tcp nginx
- 容器与宿主机之间数据拷贝
docker cp 源路径 目的路径
# 如果直接写路径表示宿主机路径,如果加上 容器名称:路径 或容器ID:路径 表示容器路径
# 示例,将etcd中/usr/bin/etcdctl 拷贝至宿主机的/usr/local/bin下
docker cp etcd:/usr/bin/etcdctl /usr/local/bin
- 查看日志
# 查看全部日志
$ docker logs nginx
# 实时查看最新日志
$ docker logs -f nginx
# 从最新的100条开始查看
$ docker logs -f --tail=100 nginx
- 查看镜像构建的历史
docker history image_name
$ docker history nginx:latest
IMAGE CREATED CREATED BY SIZE COMMENT
904b8cb13b93 11 days ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon… 0B
<missing> 11 days ago /bin/sh -c #(nop) STOPSIGNAL SIGQUIT 0B
<missing> 11 days ago /bin/sh -c #(nop) EXPOSE 80 0B
<missing> 11 days ago /bin/sh -c #(nop) ENTRYPOINT ["/docker-entr… 0B
<missing> 11 days ago /bin/sh -c #(nop) COPY file:e57eef017a414ca7… 4.62kB
<missing> 11 days ago /bin/sh -c #(nop) COPY file:abbcbf84dc17ee44… 1.27kB
<missing> 11 days ago /bin/sh -c #(nop) COPY file:5c18272734349488… 2.12kB
<missing> 11 days ago /bin/sh -c #(nop) COPY file:7b307b62e82255f0… 1.62kB
<missing> 11 days ago /bin/sh -c set -x && addgroup --system -… 61.3MB
<missing> 11 days ago /bin/sh -c #(nop) ENV PKG_RELEASE=1~bullseye 0B
<missing> 11 days ago /bin/sh -c #(nop) ENV NJS_VERSION=0.7.9 0B
<missing> 11 days ago /bin/sh -c #(nop) ENV NGINX_VERSION=1.23.3 0B
<missing> 11 days ago /bin/sh -c #(nop) LABEL maintainer=NGINX Do… 0B
<missing> 12 days ago /bin/sh -c #(nop) CMD ["bash"] 0B
<missing> 12 days ago /bin/sh -c #(nop) ADD file:493a5b0c8d2d63a13… 80.5MB
镜像的导入导出
- 将本地镜像打包成文件(推荐)
# 方式一
$ docker save <repository>:<tag> -o <repository>.tar
# 方式二
$ docker save <repository>:<tag> > <repository>.tar
# 注意 也可以使用 docker save image_id -o image.tar的方式打包
# 但是不要使用此方式去做,因为用image_id打包的文件导入时没有镜像名称和tag导致无法区分
- 将打包后的文件导入到本地
# 方式一
$ docker load < <repository>.tar
# 方式二
$ docker load -i <repository>.tar
- 将本地的容器打包成镜像文件的导入导出
- 不推荐的方式
- 此方式打包的镜像构建历史不明确,多人维护很麻烦
- 导入时没有提示repository和tag,只有sha256的id
- 制作新的镜像建议通过Dockerfile的方式
# 将本地容器打包成文件
docker export <container_name> -o <repository>.tar
docker export <container_name> > <repository>.tar
# 示例
$ docker export nginx -o nginx-`date +%Y%m%d`.tar
# 将打包后的文件导入到本地
docker import nginx-`date +%Y%m%d`.tar
镜像的推送和私有镜像仓库
部署一个私有仓库
https://docs.docker.com/registry/
私有仓库的作用就是在本地启动一个可以上传(push)和下载(pull)的存储仓库
## 使用docker镜像启动镜像仓库服务
$ mkdir /opt/registry
$ docker run -d -p 5000:5000 --restart always -v /opt/registry:/var/lib/registry --name registry registry:2
# 仓库运行在5000端口,通过宿主机IP:5000端口来上传下载
# 默认仓库不带认证,若需要认证,参考
https://docs.docker.com/registry/deploying/#restricting-access
由于默认部署的仓库不带认证,所以需要使用http协议传输
默认情况下,docker程序认为所有仓库都使用https协议,所有需要配置一下docker才能使用http协议的私有仓库
# #修改https请求方式为http;
$ vim /etc/docker/daemon.json
{
"registry-mirrors": [
"http://f1361db2xx.m.daocloud.io"
],
"insecure-registries": [
"192.168.200.50:5000"
]
}
$ systemctl restart docker
# 下在一个公网镜像验证 私有仓库的上传下载
$ docker pull busybox
# 上传前需要修改tag,通过repository:tag唯一确定一个镜像
# repository:表示仓库源,包含ip、端口、项目、镜像名
# tag:镜像具体版本的标识
$ docker tag busybox:latest 192.168.200.50:5000/library/busybox:latest
$ docker push 192.168.200.50:5000/library/busybox:latest
查看私有仓库内的镜像
# 查看仓库中有哪些镜像
$ curl 192.168.200.50:5000/v2/_catalog
{"repositories":["busybox"]}
# 查看某个镜像下有哪些tag
$ curl 192.168.200.50:5000/v2/busybox/tags/list
{"name":"busybox","tags":["latest"]}
部署一个ui用来管理docker hub
- 基本没人维护的镜像了,感兴趣可以自己开发一个难度不大
$ docker run -itd -p 8080:8080 --name registry-web \
-e REGISTRY_URL=http://192.168.200.50:5000/v2 \
-e REGISTRY_NAME=localhost:5000 hyper/docker-registry-web
# 访问地址: http://192.168.200.50:8080
部署一个ui用来管理docker
- 基本没人维护的镜像了,感兴趣可以自己开发一个难度不大
$ docker run -it -d --name docker-web -p 9000:9000 \
-v /var/run/docker.sock:/var/run/docker.sock uifd/ui-for-docker
# 访问地址: http://192.168.200.50:9000
Docker核心操作命令总结
- docker version
- docker info
容器生命周期管理
- docker run
- docker start/stop/restart
- docker kill
- docker rm
- docker pause
- docker unpause
- docker create
- docker exec
容器操作
- docker ps
- docker inspect
- docker top
- docker attach
- docker events
- docker logs
- docker wait
- docker export
- docker port
- docker stats
容器rootfs命令
- docker commit
- docker cp
- docker diff
镜像仓库相关
- docker login
- docker pull
- docker push
- docker search
- docker logout
本地镜像管理
- docker images
- docker tag
- docker build
- docker history
- docker rmi
- docker save
- docker load
- docker import