一、docker的概念及优点
二、docker基于不同系统的安装
三、使用docker镜像
四、操作docker容器
一、docker的概念及优点
概念
-
Docker是基于Go语言实现的开源项目,Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
基于Linux平台上的多项开源技术,Docker提供了高效、敏捷和轻量级的容器方案,并支持部署到本地环境和多种主流平台。可以说Docker首次为应用的开发、运行和部署提供了‘一站式’的实用解决方案。 -
让容器的支持不在局限于Linux操作系统,而是更安全、更高效、更具有拓展性。
可以简单地讲Docker容器理解为一种轻量级的沙箱。可以简单地讲Docker容器理解为一种轻量级的沙箱。
每个容器内运行着一个应用,不同的容器相互隔离,容器之间也可以通过网络通信,容器的创建和停止都十分快速,几乎跟创建和终止原声应用一致;另外容器自身对系统资源的额外需求也十分有限,远远低于传统虚拟机。 -
首先介绍三大核心概念(镜像,容器,仓库)
- 镜像(image)
Docker镜像类似于虚拟机镜像,可以将它理解为一个只读的模板。镜像是创建Docker容器的基础。例如:一个镜像可以包含一个基本的操作环境,里面进安装了Apache应用程序,可以把它成为Apache镜像。
通过版本管理和增量的文件系统,Docker一同了一套十分简单的机制来创建和更新现有的镜像,用户可以从网上下载一个已经做好的镜像,并直接使用。 - 容器(Container)
Docker容器类似于一个轻量级沙箱,Docker利用容器来运行和隔离应用。
容器是从镜像创建的应用运行实例。它可以启动、开始、停止、删除,而这些容器都是彼此相互隔离的、互不可见的。 - 仓库(Repository)
Docker仓库类似于代码仓库,是Docker集中存放的镜像文件的场所。
仓库注册服务器是存放仓库的地方,其上往往存放着多个仓库,每个仓库存放着某一类的镜像,往往包括多个镜像文件,通过不同的(tag)来进行区分,
例如存放着Ubuntu操作系统的镜像仓库,被简称为Ubuntu仓库,其中可能包括16.04,18.04等不同版本镜像。
目前最大的公开仓库是官方提供的Docker Hub.
Docker的优点
通过容器打包应用、解耦应用和运行平台。只需要在新服务器上启动需要的容器就可以了,无论新旧服务器是否在同一类型的平台
传统模式中服务器迁移,往往需要对每个应用都进行重新部署和调试。繁琐又影响工作效率。(无法保证同一份应用在不同环境中进行)
1)运维方面
- 更快速的交付和部署
使用镜像来构建一套标准的开发环境。直接部署代码,可以快速创建和删除容器,实现快速迭代,节约开发测试,部署的大量时间,使团队更容易理解应用和创建工作过程。 - 更高效的资源利用
- 更轻松的迁移和拓展(在任意平台上运行)
- 更简单的更新管理(使用Dockerfile,简单配置修改即可以替代大量更细工作。)
2)docker与虚拟机比较
特性 | 容器 | 虚拟机 |
---|---|---|
启动速度 | 秒级 | 分钟级别 |
性能 | 接近原生 | 较弱 |
内存代价 | 很小 | 较多 |
磁盘使用 | 一般为MB | 一般为GB |
运行密度 | 单机支持上千个容器 | 一般为几十个 |
隔离性 | 安全隔离 | 完全隔离 |
迁移性 | 优秀 | 一般 |
3)Docker与虚拟化
二、docker基于不同系统的安装
本文基于centos7进行安装及进行调试。请按照下面网址进行安装即可。http://www.runoob.com/docker/centos-docker-install.html
三、使用docker镜像
Docker 运行容器前需要本地存在对应的镜像, 如果镜像不存在, Docker 会尝试先从默 认镜像仓库下载(默认使用 Docker Hub 公共注册服务器中的仓库), 用户也可以通过配置, 使用自定义的镜像仓库。 本章将围绕镜像这 一 核心概念介绍具体操作, 包括如何使用 pull 命令从 Docker Hub 仓库中下载镜像到本地;如何查看本地已有的镜像信息和管理镜像标签;如何在远端仓库使 用 search 命令进行搜索和过滤;如何删除镜像标签和镜像文件;如何创建用户定制的镜像并 且保存为外部文件。 最后, 还将介绍如何往 Docker Hub 仓库中推送自己的镜像。1. 获取镜像 (docker pull )
可以使用 docker [image] pull 命令直接从 Docker Hub 镜像源来下载镜像。 该命
令的格式为 docker [image] pull NAME [ :TAG] 。
其中, NAME 是镜像仓库名称(用来区分镜像), TAG 是镜像的标签(往往用来表示版本
信息)。 通常情况下, 描述 一 个镜像需要包括
“ 名称+标签 “
信息。
例如, 获取一个 Ubuntu 18.04 系统的基础镜像可以使用如下的命令:
$ docker pull ubuntu:18. 04
下面的命令实际上下载的就是 nginx:latest的镜像。
$ docker pull nginx
pull 子命令支持的 选项主要包括:
-a, --all -tags=true | false: 是否获取仓库中的所有镜像,默认为否;
–disable-content-trust:取消镜像的内容校验,默认为真。
下载镜像到本地后, 即可随时使用该镜像了, 例如利用该镜像创建一个容器,在其中运
行bash应用, 执行打印 "Hello World"命令:
$ docker run -it ubuntu:18.04 bash
root@65663247040f:/# echo "Hello World"
Hello World
root@65663247040f:/# exit
2. 查看镜像信息 (ls tag inspect)
使用docker images或docker image ls 命令可以列出本地主机上已有镜像的基
本信息。
docker images
[root@localhost dockerTest]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test 0.1 31b42392b565 30 minutes ago 109MB
nginx Dockerfile a6c379e97814 5 hours ago 109MB
nginx latest f09fe80eb0e7 12 days ago 109MB
reoisitory:来自哪个仓库
tag:标签只是标记版本信息,不能表示版本内容
image id:镜像的ID,如果两个镜像ID相同,说明它们实际上指向了同一个镜像,只是据有不同的标签名而已。
created:创建时间。镜像的最后更新时间。
size:镜像大小,优秀的镜像往往提及都较小,镜像大小信息只是表示了该镜像的逻辑体积大小, 实际上由于相同的镜像层本地只会存储一份, 物理上占用的存储空间会小于各镜像逻辑体积之和。
images子命令主要支持如下选项, 用户可以自行进行尝试:
-a, --all=true I false: 列出所有(包括临时文件)镜像文件,默认为否;
–digests=true | false: 列出镜像的数字摘要值,默认为否;
-f, --filter=[] : 过滤列出的镜像, 如dangling=true 只显示没有被使用的
镜像;也可指定带有特定标注的镜像等;
–format=“TEMPLATE” : 控制输出格式,如. ID代表ID信息,.Repository
代表仓库信息等;
–no-trune=true I false: 对输出结果中太长的部分是否进行截断,如镜像的 ID
信息,默认为是;
-q, --quiet式rue I false: 仅输出ID信息, 默认为否。
其中, 还支持对输出结果进行控制的选项,如 -f. --filter=[]、–no-trune=true I false等
-q,–quiet=true I false等。
更多子命令选项还可以通过man docker-images来查看。
tag
使用tag命令添加镜像标签
为了方便在后续工作中使用特定镜像,还可以使用docker tag命令来为本地镜像任
意添加新的标签。 例如,添加一个新的myubuntu: latest镜像标签:
$ docker tag ubuntu:latest myubuntu:latest
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 18.04 452a96d8lc30 2 weeks ago 79.6MB
ubuntu latest 452a96d8lc30 2 weeks ago 79.6MB
myubuntu latest 452a96d8lc30 2 weeks ago 79.6MB
细心的读者可能注意到, 这些myubuntu:latest镜像的ID跟ubuntu: latest是
完全 一 致的,它们实际上指向了同一个镜像文件,只是别名不同而巳。docker tag命令添加的标签实际上起到了类似链接的作用。
inspect
使用inspect查询详细信息 docker [image] inspect
$ docker inspect ubuntu
3. 搜索镜像
docker search [option]
[root@localhost dockerTest]# docker search nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 10926 [OK]
jwilder/nginx-proxy Automated Nginx reverse proxy for docker con… 1535 [OK]
richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable of… 683 [OK]
jrcs/letsencrypt-nginx-proxy-companion LetsEncrypt container to use with nginx as p… 482 [OK]
webdevops/php-nginx Nginx with PHP-FPM 124 [OK]
kitematic/hello-world-nginx A light-weight nginx container that demonstr… 121
zabbix/zabbix-web-nginx-mysql Zabbix frontend based on Nginx web-server wi… 91 [OK]
bitnami/nginx Bitnami nginx Docker Image 60 [OK]
linuxserver/nginx An Nginx container, brought to you by LinuxS… 54
1and1internet/ubuntu-16-nginx-php-phpmyadmin-mysql-5 ubuntu-16-nginx-php-phpmyadmin-mysql-5 49 [OK]
tobi312/rpi-nginx NGINX on Raspberry Pi / armhf 24 [OK]
nginx/nginx-ingress NGINX Ingress Controller for Kubernetes 17
blacklabelops/nginx Dockerized Nginx Reverse Proxy Server. 12 [OK]
wodby/drupal-nginx Nginx for Drupal container image 12 [OK]
schmunk42/nginx-redirect A very simple container to redirect HTTP tra… 11 [OK]
nginxdemos/hello NGINX webserver that serves a simple page co… 11 [OK]
centos/nginx-18-centos7 Platform for running nginx 1.8 or building n… 10
centos/nginx-112-centos7 Platform for running nginx 1.12 or building … 7
1science/nginx Nginx Docker images that include Consul Temp… 4 [OK]
mailu/nginx Mailu nginx frontend 3 [OK]
pebbletech/nginx-proxy nginx-proxy sets up a container running ngin… 2 [OK]
travix/nginx NGinx reverse proxy 2 [OK]
toccoag/openshift-nginx Nginx reverse proxy for Nice running on same… 1 [OK]
ansibleplaybookbundle/nginx-apb An APB to deploy NGINX 0 [OK]
wodby/nginx Generic nginx 0 [OK]
可以看到返回了很多包含关键字的镜像, 其中包括镜像名字、 描述、 收藏数(表示该镜像
的受欢迎程度)、 是否官方创建、 是否自动创建等。默认的输出结果将按照星级评价进行排序。
更多命令查看docker search --help
如果需要拉取指定的内容直接 docker pull 上述的NAME
4. 删除和清理镜像
使用标签删除镜像
使用 docker rmi 或 docker image rm 命令可以删除镜像, 命令格式为 docker rmi IMAGE [IMAGE … ], 其中 IMAGE 可以为标签或 ID。
-f, -force: 强制删除镜像, 即使有容器依赖它;
-no-prune: 不要清理未带标签的父镜像。
$ docker rmi myubuntu:latest
如果镜像存在多个相同的ID删除不会影响此镜像,如果只剩一个,那么再次删除就是完全彻底删除镜像了。
使用docker ps -a命令可以看到本机上存在的所有容器
注意, 当有该镜像创建的容器存在时, 镜像文件默认是无法被删除的,需要先删除容器
$ docker rmi ubuntu:18.04
Error response from daemon: conflict: unable to remove repository reference
"ubuntu:18.04" (must force) - con七ainer a2lc0840213e is using i七s referenced
image 8flbd2lbd25c
$ docker rm 8flbd2lbd25c
$ docker rmi ubuntu:18.04
查看当前本机上存在的所有容器
[root@localhost dockerTest]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ce8a985d2d82 nginx "/bin/bash" 14 hours ago Exited (0) 14 hours ago agitated_kapitsa
7c429fcd10c3 nginx:Dockerfile "nginx -g 'daemon of…" 18 hours ago Exited (137) 14 hours ago optimistic_antonelli
ec4cf7d4dc31 nginx "nginx -g 'daemon of…" 21 hours ago Exited (0) 20 hours ago vigilant_grothendieck
清理镜像
使用Docker 一 段时间后, 系统中可能会遗留一些临时的镜像文件, 以及 一 些没有被使
用的镜像, 可以通过docker image prune命令来进行清理。
支待选项包括:
D -a, -all: 删除所有无用镜像, 不光是临时镜像;
D -fil 七 er fil 七 er: 只清理符合给定过滤器的镜像;
D -f, -force: 强制删除镜像, 而不进行提示确认。
第3章 使用Docker镜像 •!• 35
例如, 如下命令会自动清理临时的遗留镜像文件层, 最后会提示释放的存储空间:
$ docker image prune -f
. . .
Total reclaimed space: 1.4 GB
5. 创建镜像
创建镜像的方法主要有三种: 基于已有镜像的容器创建、 基千本地模板导入、 基于
Dockerfile 创建。
Docker 的 commit、build 子命令。(import略过)
commit方式
首先创建容器,指定一个镜像,根据镜像创建容器在提交一个新的镜像。
$ docker run -it ubuntu:18.04 /bin/bash
root@a925cb40b3f0:/# touch test
root@a925cb40b3f0:/# exit
记住容器的 ID 为 a925cb40b3f0。
$ docker commit -m "Added a new file" -a "Docker Newbee" a925cb40b3f0 test:0.1
查看镜像信息
$ docker images
build方式
创建Dockerfile,Dockerfile就是一个文本文件,只要遵守Dockerfile规范编写执行命令就可以生成一个新的镜像。
docker build[OPTIONS]上下文路径|URL
创建一个Dockerfile文本
FROM nginx
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
vi Dockerfile
[root@localhost dockerTest]# ll
总用量 110296
-rw-r--r--. 1 root root 0 2月 19 12:52 Dockerfile
$ docker pull nginx
$ docker build -t Dockerfile.
或者
$ docker build -t test:0.3 -f /path/to/a/Dockerfile .
(
或$ docker build -t Dockerfile:v0.1 .
或$ docker build -f /path/to/a/Dockerfile .
)
使用-t指定了镜像名为Dockerfile,由于没有使用-f指令,所以默认使用上下文路径下名为Dockerfile的文件认为是构建镜像的"Dockerfile"。最后指定上下文路径,在这条命令中,上下文路径是.
可参考其资料如和书写自己的Dockerfile及详细语法
https://www.cnblogs.com/ityouknow/p/8588725.html
6. 存出和载入镜像
生成镜像分享
$ docker save -o ubuntu_18.04.tar ubuntu:18 .0 4
载入镜像
$ docker load -i ubuntu_18.04.tar