Docker是一个开源的容器引擎,它基于 LXC 容器技术,使用 Go 语言开发。源代码托管在 Github 上,并听从 Apache2.0 协议。 Docker采用 C/S 架构,其能够轻松的为任何应用建立一个轻量级的、可移植的、自给自足的容器。 简单来讲: Docker 就是一种快速解决生产问题的一种技术手段。nginx
docker 官网: www.docker.com/docker
优势 :json
缺点:ubuntu
根据不用的操做系统能够轻松在网上查找到不少安装教程,以前写过一个: blog.csdn.net/Enjolras_fu… 这里再也不赘述。vim
docker version
复制代码
在安装前,只有 ens33 和 lo 网卡 在安装后,docker 启动后,多出了 docker0 网卡,网卡地址是 172.17.0.1浏览器
这部分网上也有较多文章去具体讲解,这里就再也不赘述。 blog.csdn.net/Enjolras_fu…bash
docker 镜像至关于一个只读的文件,就相似于咱们安装操做系统的时候所须要的各类iso 光盘镜像,咱们经过运行这个镜像来完成各类应用的部署。网络
能够理解镜像就是一个能被 docker 运行起来的一个程序。架构
docker search ubuntu
复制代码
docker pull ubuntu
复制代码
获取的镜像存放在哪里? /var/lib/docker 目录下。curl
docker images [image_name]
复制代码
这里是 docker images ubuntu:latest
镜像的 ID 惟一标识了镜像,若是 ID 相同,就说明是同一镜像。TAG 信息来区分不一样的发行版本,若是不指定具体的标记,就默认使用 latest 来标记信息。
docker image ls (当前存在的镜像)
复制代码
或者 docker images -a (包含已经删除的镜像记录)
这两个命令列出的结果略有不一样。
docker history [image_name]
复制代码
咱们获取到一个镜像,想知道他默认启动了哪些命令或者封装了哪些系统层,就可使用 docker history 来获取。
docker tag [old_image]:[old_version] [new_image]:[new_version]
复制代码
演示: docker tag nginx:latest sswang-nginx:v1.0
docker rmi [image_id/image_name:image_version]
复制代码
注意 若是一个 image_id 对应多个名称,要使用 name:tag 的格式删除镜像。
docker image prune
复制代码
docker image prune -a
复制代码
docker image prune -a --filter "until=24h"
复制代码
咱们能够将已经下载好的镜像导出到本地,以备后用。
docker save -o [包文件][镜像]
docker save [镜像1] ... [镜像n] > [包文件]
复制代码
docker save 会保存镜像的所有历史记录和元数据信息。
举例: docker save -o nginx.tar sswang-nginx
docker load < [image.tar_name]
docker load --input [image.tar_name]
复制代码
举例: docker load < nginx.tar
容器是什么? 容器相似于咱们运行起来的一个操做系统,并且这个操做系统启动了某些服务。 这里的容器指的是一个运行起来的 docker 镜像。
docker ps
复制代码
docker ps -a
复制代码
docker start [container_id]
复制代码
在生产过程当中,经常会出现运行和不运行的容器,咱们使用 start 命令开起一个已经关闭的容器。
docker stop [container_id]
复制代码
在生产过程当中,咱们会由于临时状况, 要关闭某些容器,咱们使用 stop 命令来关闭容器。
docker rm [container_id]
docker container prune
复制代码
docker container prune --filter "until=24h"
复制代码
docker rm -f [container_id]
复制代码
docker rm -f $(docker ps -a -q)
复制代码
docker run --name [container_name] -it [docker_image] /bin/bash
复制代码
method1: exit
method2: Ctrl+D
复制代码
docker exec -it [container_id] /bin/bash
复制代码
docker commit -m '改动信息' -a '做者信息' [container_id] [new_image:tag]
复制代码
举例: 进入一个容器,建立文件以后退出。
$ docker exec -it 7f551fd3c017 /bin/bash
root@7f551fd3c017:/# mkdir /furuiyang
root@7f551fd3c017:/# exit
exit
复制代码
基于该容器建立一个镜像:
$ docker commit -m 'mkdir /furuiyang' -a 'furuiyang' 7f551fd3c017 ry-nginx:v0.0.1
sha256:e0aa3ce6ace3bc8e38de40ab31a88b3901ba09c366511a280ba75b0719963c98
复制代码
查看镜像:
$ docker image ls -a
REPOSITORY TAG IMAGE ID CREATED SIZE
ry-nginx v0.0.1 e0aa3ce6ace3 14 seconds ago 126MB
复制代码
基于新镜像启动一个容器:
$ docker run --name d3 -itd ry-nginx:v0.0.1 /bin/bash
6d2e0f2cf48569b44eed1af2ca9871bb56a58b561695266112f7650e84546ead
复制代码
进入容器进行查看:
$ docker exec -it 6d2e0f2cf48 /bin/bash
root@6d2e0f2cf485:/# ls
bin boot dev etc furuiyang home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
复制代码
docker logs [container_id]
复制代码
docker inspect [container_id]
复制代码
在详细信息中过滤出容器的网络信息:
docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' [container_id]
复制代码
仓库就相似于咱们在网上搜索操做系统光盘的一个镜像站。 这里的仓库指的是 Docker 镜像存储的地方。
部署流程:
实施方案: 下载 regisstry 镜像:
docker pull registry:latest
复制代码
启动仓库容器:
docker run -d -p 5000:5000 registry:latest
复制代码
检查容器效果:
curl 127.0.0.1:5000/v2/_catalog
复制代码
配置容器权限:
vim /etc/docker/daemin.json
{"registry-mirrors": ["http://74f21445.m.daocloud.io"], "insecure-registries": ["172.18.222.137:5000"]}
复制代码
注意私有仓库的 ip 地址是宿主机的 ip 地址,而且 ip 地址的两侧有引号。
重启 docker 服务:
systemctl restart docker
systemctl status docker
复制代码
效果查看: 启动仓库服务的容器: (在重启 docker 服务的过程当中关闭了运行中的所有容器)
docker start 6492f6a098c6
复制代码
标记要提交的镜像:
docker tag ry-nginx:v0.0.1 172.18.222.137:5000/ry-nginx:v0.0.1
复制代码
推送镜像:
docker push 172.18.222.137:5000/ry-nginx:v0.0.1
复制代码
拉取镜像:
docker pull 172.18.222.137:5000/ry-nginx:v0.0.1
复制代码
docker 的镜像是只读的,虽然能够根据镜像建立的容器能够进行操做,可是咱们不能将数据保存在容器里面,由于容器会随时关闭和开启,那么应该如何将 数据保存下来呢?
答案就是数据卷和数据卷容器。
就是讲宿主机的某个目录,映射到容器中,做为数据存储的目录,咱们就能够在宿主机对数据进行存储。
缺点: 太单一了。
咱们可以使用 docker run 来建立容器,在 docker run 命令时添加 -v 参数,就能够建立而且挂载一个到多个数据卷到当前运行的容器中。
-v 参数的做用是将宿主机的一个目录做为容器的数据卷挂载到docker容器中,使宿主机和容器之间能够共享一个 目录,若是本地路径不存在,Docker也会自动建立。 -v 宿主机文件:容器文件
关于数据卷的管理咱们从两个方面来讲: 一、目录 二、普通文件
命令格式:
docker run -itd --name [container_name] -v [宿主机目录]:[容器目录] [镜像名称] [命令[可选]]
复制代码
命令演示: 建立测试文件:
echo 'hello ruiyang' > /tmp/file1.txt
复制代码
启动一个容器,挂载数据卷
docker run -itd --name test1 -v /tmp:/test1 nginx
复制代码
进入容器查看:
docker exec -it 3733303ee /bin/bash
cat /test1/file1.txt
复制代码
命令格式:
docker run -itd --name [container_name] -v [宿主机文件]:[容器文件] [镜像名称][命令[可选]]
复制代码
命令演示: 建立测试文件:
echo 'file1' > /tmp/file1.txt
复制代码
启动一个容器,挂载数据卷
docker run -itd --name test2 -v /temp/file1.txt:/nihao/nihao.sh nginx
复制代码
这时候直接建立文件夹 nihao.sh ...
将宿主机的某个目录,使用容器的方式来表示,而后其余的应用容器将数据保存在这个容器里面,达到大批量应用数据同时存储的目的。
若是咱们使用数据卷容器,在多个容器之间共享数据,并永久保留这些数据,须要有一个规范的流程才能作获得。 一、 建立数据卷容器 二、 其余容器挂载数据卷容器 注意: 数据卷容器不启动
建立一个数据卷容器:
docker create -v [容器数据卷目录] --name [容器名字] [镜像名称]:[命令[可选]]
docker create -v /data --name v-test nginx
复制代码
建立两个容器同时挂载数据卷容器:
docker run --volumes-from e7dd7d04c9 -itd --name t1 nginx /bin/bash
docker run --volumes-from e7dd7d04c9 -itd --name t2 nginx /bin/bash
复制代码
进入 t1 操做数据卷容器:
docker exec -it 7dc224 /bin/bash
cd /data
touch reach.py
复制代码
进入 t2 确认数据卷是否有改动:
docker exec -it dc17055491 /bin/bash
cd /data
ls
复制代码
回到宿主机查看 /data 目录,不存在上述目录。
容器之间能够共享数据卷迷你容器,不过数据是保存在数据卷里面的,并无保存到宿主机的文件目录中。
docker 以上的内容都依赖于网络才能工做,咱们从两个方面来学习网络:
默认状况下,容器和宿主机之间网络是隔离的,咱们能够经过端口映射的方式,将容器中的端口,映射到宿主机的某个端口上。这样咱们就能够经过 宿主机的ip+port的方式来访问容器里的内容。
注意: 在生产场景通常不使用随机映射,可是随机映射的好处就是由docker分配,端口不会冲突, 无论哪一种映射都会影响性能,由于涉及到映射。
随机映射咱们从两个方面来学习:
docker run -d -P [镜像名称]
复制代码
启动一个 nginx 镜像:
查看效果:
咱们能够看到宿主机的 32768 端口被映射到容器里面的 80 端口。 -P 能够作到自动绑定全部对外提供服务的容器端口,映射的端口将会从没有使用过的端口池中自动随机选择,可是若是连续绑定多个容器的话,则下一个容器的端口默认是当前容器占用端口号+1.
这时候咱们在浏览器里面访问本地的 32768 端口,效果以下:
命令格式:
docker run -d -p [宿主机ip]::[容器端口] --name [容器名称] [镜像名称]
复制代码
好比:
查看效果:
命令格式:
docker run -d -p [宿主机ip]:[宿主机端口]:[容器端口] --name [容器名字] [镜像名字]
复制代码
注意:
命令实践: 如今咱们在启动容器的时候,给容器指定一个访问的端口是 1199:
docker run -d -p 172.18.222.137:1199:80 --name n3 nginx
复制代码
查看新容器的 ip:
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' c64c7cdc052cc57961
复制代码
查看容器的端口映射: (接着上次写的吗,因此截图时间是 42 小时以前)
查看宿主机开启的端口:
netstat -tnulp | grep docker-proxy
复制代码
咱们能够在浏览器访问指定的端口 http://172.18.222.137:32768 查看效果. 在这里,我直接使用 httpie 的命令去访问:
命令格式:
docker run -d -p [宿主机端口1]:[容器端口1] -p [宿主机端口2]:[容器端口2] --name [容器名称] [镜像名称]
复制代码
开启多端口映射实践:
docker run -d -p 520:443 -p 6666:80 --name n3 nginx
复制代码
查看容器进程:
docker network --help
docker 的默认模式,会在 docker 启动的时候,自动配置好本身的网络信息。同一个宿主机的全部容器都在一个网络下,彼此之间能够通讯,相似于 vmware 虚拟机的 nat 模式。 在这种模式下,利用宿主机的网卡进行通讯,由于涉及到网络转换,因此会形成资源浪费,网络效率会低。 示意图:
截取一段提问方便以后复盘:
简单来讲,就是鸠占鹊巢,用着宿主机的东西,干着本身的事情。容器使用宿主机的 ip 地址进行通讯。 特色: 容器和宿主机共享网络。 示意图:
开启小灰与大黄模式:
新建立的容器之间适应已经建立的容器网络,相似于一个局域网。 特色: 容器和容器之间共享网络。 示意图:
这种模式最为纯粹,不会帮你作任何的配置,能够最大限度的定制化。
容器之间不是在同一网络,可是能互相通行。
嗯,交学费了 ... 找了一篇参考: blog.csdn.net/sqzhao/arti… 有待继续深刻
其实在端口映射部分作的实践就是 bridge 的简单演示了,由于他们使用的是默认 bridge 模式,如今咱们来自定义桥接网络。 这一部分从三个方面来演示:
命令格式:
docker network create --driver [网络类型][网络名称]
复制代码
命令演示:
docker network create --driver bridge bridge-test
复制代码
查看主机网络类型:
docker network ls
复制代码
查看新建的网络的网络信息:
docker network inspect bridge-test
复制代码
查看宿主机的网卡: 能够看到宿主机多出一个网卡设备:
命令格式:
docker run --net=[网络名称] -itd --name=[容器名称] [镜像名称]
复制代码
使用效果:
docker run --net=bridge-test -itd --name=n_bri nginx
复制代码
查看该容器的 ip 信息:
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' n_bri
复制代码
注意:使用户默认的桥接模型的容器是能够直接联网的,可是使用自定义的桥接模型不能够直接联网,可是能够经过端口映射来实现联网。
命令格式:
docker network disconnect [网络名] [容器名]
复制代码
命令演示:
docker network disconnect bridge-test n_bri
复制代码
效果展现:
命令格式:
docker network connect [网络名] [容器名]
复制代码
命令演示:
docker network connect bridge-test n_bri
复制代码
效果展现:
咱们从命令讲解 以及 host 特色两个方面来学习。
在host模型下,容器使用宿主机的 ip 地址进行对外提供服务,自己没有 ip 地址。
命令格式:
docker run --net=host -itd --name [容器名称] [镜像名称]
复制代码
命令示例: 建立容器使用 host 模式:
docker run --net=host -itd --name nginx-1 nginx
复制代码
通常这时咱们 netstat -at 查看宿主机端口,就能够看到 80 被使用。
若是不能启动 ,说明本机的 80 已经被占用
host 的特色: host 模型比较适合于,一台宿主机跑一个固定的容器,比较稳定。或者是一个宿主机跑几个占用不一样端口容器的应用场景,他的网络性能是很高的。 host 模型启动的容器不会有任何地址,他实际上是使用了宿主机的全部信息。