docker教程
1. Docker简介
1.1. Docker改名字
- http://qbview.url.cn/getResourceInfo?appid=31&url=https%3A%2F%2Fjuejin.im%2Fentry%2F58fd44aada2f60005dc764f4%3Ffrom%3Dgroupmessage%26isappinstalled%3D1%26nsukey%3DDTbMCYAYx7KWTEJFceeNRaoz9GHcMQXYgPw01TJ95%252Bg6fMizRYxNZVQT5AX8h1QLh9J4pEJsda2awcM07Ba7ydCX1ATZA%252Bbqcv79Q0Qo1Jsi7PZzI73gmfNffMNDMewz0%252BT9Zc5Wz7%252Bk%252BB4d348%252FgoYMubEJxWIKXkA6EOrwcWBSCvol7YrFwFTuOFl0vKBW&version=10000&doview=1&ua=Mozilla%2F5.0+(Macintosh%3B+Intel+Mac+OS+X+10.11%3B+rv%3A52.0)+Gecko%2F20100101+Firefox%2F52.0&keeplink=0&reformat=0
- https://yq.aliyun.com/articles/74437?spm=5176.8246799.0.0.7Fp6s9
1.2. 文档
1.2.1. 必看文档
- 官网:https://www.docker.com/
- Docker学习路线图:⭐️⭐️⭐️https://yq.aliyun.com/articles/40494?spm=5176.100239.blogcont65145.24.Jded85⭐️⭐️⭐️
- Docker知识集锦:⭐️⭐️⭐️https://yq.aliyun.com/articles/65145?spm=5176.100240.searchblog.8.6GwPGf⭐️⭐️⭐️
- gitbook:⭐️⭐️⭐️⭐️⭐️https://yeasy.gitbooks.io/docker_practice/content/appendix/repo/nodejs.html⭐️⭐️⭐️⭐️⭐️
1.2.2. 社区技术类博客
- http://blog.csdn.net/liumiaocn/article/category/6328276
- http://www.cnblogs.com/li-peng/category/875759.html
1.2.3. 其他文档
- 中文社区:http://www.docker.org.cn/dockerppt/46.html
- gitbook:http://www.widuu.com/chinese_docker/installation/redhat.html
1.3. 基础概念
1.3.1. 名词那些
2. Docker基础知识点
- ⭐️⭐️⭐️⭐️⭐️http://www.he11oworld.com/system/390.html⭐️⭐️⭐️⭐️⭐️
2.1. Docker命令说明
- 分为客户端命令和服务端命令,还有各种参数,所以看着会比较乱,命令很多大家把常用的记住就可以了
- 比如docker run -t node 和 docker build -t web中的-t就不是一个意思,大家要有准备
- 不过看下面这两个文档基本都包含了
2.2. Docker信息查询
docker help
:查看帮助信息docker run —help
:可以查看某条命令的具体用法
docker info
:查看docker的安装信息- 有时候会有docker权限问题,我们要为docker增加管理组
- http://www.widuu.com/chinese_docker/articles/basics.html
which docker
:查看docker的执行路径
2.3. 镜像管理
docker pull <镜像名:tag>
:从官网拉取镜像docker search <镜像名>
:搜索在线可用镜像名docker images
:查询所有的镜像,默认是最近创建的排在最上docker rmi <镜像名:tag>
:删除镜像docker rmi $(docker images -q -f dangling=true)
:批量删除无用镜像大家可以通过df -hl命令查看磁盘占用率
效果
- 有很多没用的镜像
- 磁盘占用很高
- 清除之后的效果
2.4. 容器管理
docker ps
:查看所有运行中容器docker ps -a
:查看所有容器docker ps -l
: 查看最后启动的容器的信息- -l:最后的那个
docker top {容器ID|容器名称}
:显示容器内运行的进程docker run <镜像名1> <镜像名2> <镜像名3>
:同时运行几个docker run <镜像名> apt-get install -y ping
:在容器中安装新程序- 一定要加-y,为什么不太记得了
docker run -it ubuntu /bin/bash
:运行一个可交互的容器- -i:-i表示允许我们对容器内的 (STDIN) 进行交互
- -t:表示在新容器内指定一个伪终端或终端
- 我们在容器内还指定了一个新的命令:/bin/bash 。这将在容器内启动 bash shell
docker run -e <名称>=<参数> node
:设置容器环境docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done
:执行后台任务docker run --name web training/webapp
:为容器起名字docker run —rm <镜像名>
用完就删除,不能与-d一起使用docker exec -it sso-server-dev /bin/bash
:docker启动后执行一些命令操作docker run —restart always node
:挂了重启docker tag {容器ID|容器名称} <镜像名:tag>
:给镜像加tagdocker stop {容器ID|容器名称}
:停止容器docker start {容器ID|容器名称}
:启动容器docker cp 7bb0e258aefe:/etc/debian_version .
:从container中拷贝文件,当container已经关闭后,在里面的文件还可以拷贝出来。把容器中的/etc/debian_version拷贝到当前目录下。
2.5. 容器日志
docker inspect {容器ID|容器名称}
:docker容器的配置和状态信息docker inspect -f '{{ .NetworkSettings.IPAddress }}' {容器ID|容器名称}
:过滤信息docker logs {容器ID|容器名称}
:查询某个容器的所有操作记录,标准输出流docker logs -f {容器ID|容器名称}
: 实时查看容易的操作记录
2.6. 网络端口映射
docker run -P <镜像名>
- -P:它将会把容器内部的5000端口映射到本地Docker主机的高位端口上(这个端口的通常范围是 32768 至 61000)。
docker run -p <主机端口号>:<容器端口号> mongo
:- 1:1 映射方式能够保证映射到本地主机端口的唯一性
docker run -p 127.0.0.1:5001:5002 mongo
:指定绑定的网络地址docker run -p 80:5000 training/webapp python app.py
:指定主机和容器端口号docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
:绑定udp端口docker port mongo 5000
:查询容器内的端口号映射到哪个本地地址,127.0.0.1:49155docker port -p 1111:1111 -p 2222:2222 -p 3333:3333 mongo
: -p可以使用多次
2.7. 容器链接
docker run -d -P --name web --link <容器名称>:<别名> <镜像名>
- 之后你的项目中需要使用ip地址的地方都可以用别名代替了
// 实例 sudo docker run -d --name mongo mongo sudo docker run -d -P --name web --link mongo:db node
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 349169744e49 training/postgres:latest su postgres -c '/usr About a minute ago Up About a minute 5432/tcp db aed84ee21bde training/webapp:latest python app.py 16 hours ago Up 2 minutes 0.0.0.0:49154->5000/tcp db/web,web
我们连接容器做什么?我们发现连接的两个容器是父子关系。这里的父容器是db可以访问子容器web。为此docker在容器之间打开一个安全连接隧道不需要暴露任何端口在容器外部。 你会注意到当你启动db容器的时候我们没有使用-P或者-p标识。我们连接容器的时候我们不需要通过网络给PostgreSQL数据库开放端口。
Docker在父容器中开放子容器连接信息有两种方法
- 环境变量
- 更新/etc/hosts文件。
- 参考文章:http://www.widuu.com/chinese_docker/userguide/dockerlinks.html
2.8. 容器网络
- docker可以主动访问外网,但是外网不能主动访问docker内部,必须处理
- docker中有四种网络,主机和主机之间,外网访问docker内部都是问题
- 为了做到完全隔离,网络最好用自定义的,这样才是真正的隔离
2.9. 管理容器数据
整理的很好了:https://yq.aliyun.com/articles/138?spm=5176.100239.blogcont65145.33.iFVPLT
数据卷
- 数据卷在容器创建的时候进行初始化。如果容器的镜像在特定的Mount点下有数据,那么已有的数据将被拷贝到指定目录
docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py
docker run --name jupiter-install -v $(pwd):/home -w /home --rm node_tools npm install
- v是把当前文件夹的代码完全复制到容器中,-w的作用就是cd进我们想要进入的目录
数据卷容器
- 果你希望在容器间共享卷,那么就可以使用数据型容器
数据备份还原和迁移
2.10. 创建镜像
2.10.1. 官方拉取
docker pull node
:从官网下载node镜像
2.10.2. Dockfile使用
docker build -t node-pomelo ./
:通过Dockerfile创建镜像docker build -t node-pomelo -f Dockerfile.pomelo.env ./
:通过配置文件指定Dockerfile文件
2.10.3. 镜像增量
docker commit <容器id> <新镜像名称>
docker commit -m="注释信息" -a="user信息" node:v2
docker history node:v2
:查看镜像提交历史- 可以在一些容器里面动态的添加一些东西,然后打包成新的镜像,该镜像是原始镜像与容器的整合
- 无论容器里做什么操作,写文件,删文件。该容器的基本镜像都不会有任何改变。这是因为Docker从父镜像建立增量镜像,只存储每个容器的更改。因此,如果你有一个300MB的父镜像,如果你在容器中安装了50MB的额外应用或服务,你的容器只有50MB,父镜像还是300MB。但是可以使用Dockfile或commit命令来,把增量镜像和父镜像一起生成一个新的镜像。
2.10.4. 从零开始创建纯镜像
2.10.4.1. 简单介绍
2.10.4.1.1. 术语介绍
- 在 Docker 的术语里,一个只读层被称为镜像,一个镜像是永久不会变的。
- 由于 Docker 使用一个统一文件系统,Docker 进程认为整个文件系统是以读写方式挂载的。但是所有的变更都发生顶层的可写层,而下层的原始的只读镜像文件并未变化。由于镜像不可写,所以镜像是无状态的。
2.10.4.1.2. 父镜像
- 每一个镜像都可能依赖于由一个或多个下层的组成的另一个镜像。我们有时说,下层那个镜像是上层镜像的父镜像。
2.10.4.1.3. 基础镜像
- 一个没有任何父镜像的镜像,谓之基础镜像。
2.10.4.1.4. 镜像ID
- 所有镜像都是通过一个 64 位十六进制字符串 (内部是一个 256 bit 的值)来标识的。为简化使用,前 12 个字符可以组成一个短ID,可以在命令行中使用。短ID还是有一定的碰撞机率,所以服务器总是返回长ID。
2.10.4.2. 思路
- http://www.widuu.com/chinese_docker/articles/baseimages.html
- http://www.cnblogs.com/alexkn/p/3879540.html
- 大概的思路就是将整个系统打一个rar,然后用docker把这个压缩包导入,再创建一个image
- 不过不推荐这么用,应该是一层一层的加东西,如果打包一个纯原始的image,那么不仅很大,而且不符合分离的这种思想
- 网上的一些单独的node,mongodb,nginx都是非常小的,我们可以找官方推荐的那些比较纯净的,不要找那种集成的,然后把下载的东西记录一下
2.11. 容器迁器
docker save debian02 > /root/debian02.tar:debian02
:镜像打成压缩包docker load < debian02.tar
:在另外的机器上导入镜像docker images
:查看存在的镜像- docker容器迁移简单方便,可以任意的拷贝部署,以后再也不怕新部署环境了,一堆依赖装的想死有木有。
- save和export的对比参考地址:
2.12. 发布到镜像网站
2.12.1. Docker Hub
- 网址:https://hub.docker.com/ 上到到阿里docker镜像,中国的阿里dcloud https://dev.aliyun.com/search.html www.daocloud.io另一个
docker hub的自动化构建
2.12.2. 阿里Docker Hub
- 网址:https://dev.aliyun.com
- ``发布到dockerhub
- docker login
- 这个命令将提示你输入用户名和密码。你的用户信息将被纪录在~/.docker/config.json文件中。
- docker push yourname/newimage
- 发布镜像到dockerhub:docker push shiguoqing/imagename
- docker login
2.12.3. 镜像加速
2.12.4. 常用镜像介绍
- 同一技术有很多镜像,最好选官方认证的镜像
- 这些镜像的网址介绍了该镜像的构成和使用说明
- mongo
- node
- redis
2.13. Docker开机自启动
2.13.1. docker的自启动
- 首先需要了解你所使用的系统用的什么启动管理工具,在ubuntu 15.04及其以上版本使用的是systemd,在14.10及其以下使用的是upstart。在15.04及以上版本需要执行:
- 启动服务:
sudo service docker restart
- 停止服务:
sudo service docker stop
- 自启动:
systemctl enable docker
- 参考文档:https://yq.aliyun.com/articles/132?spm=5176.100239.blogcont65145.27.SRH5q8
2.13.2. docker中容器的自启动
docker run -i -t node /etc/rc.local
- 在容器中把所有需要开机自的启动命令放在/etc/rc.local中,就可以达到当docker启动的时候多容器自动启动
3. DockerFile文件
3.1. 为什么要用DockerFile
- 配置文件的优点:标准,可知,可复用
- 你用了配置文件别人才敢用你的镜像,否则别人不放心你的镜像中是否安装了一些不安全的东西
3.2. 文档
- 参考文档:
- https://yeasy.gitbooks.io/docker_practice/content/image/commit.html
- http://www.docker.org.cn/dockerppt/114.html
- https://yq.aliyun.com/articles/140?spm=5176.100239.blogcont65145.35.iFVPLT
- https://yq.aliyun.com/articles/69893?spm=5176.100239.blogcont140.20.qhk3vB
- 补充:http://www.docker.org.cn/dockerppt/114.html
- 这句话待考证:镜像不用删除,因为镜像的名称相同所以会覆盖之前的镜像,每次执行dockerfile会不会每次都是下载,会去请求一次,但是镜像会有一个sha值,他会判断有更新就更新,你可以用docker pull hello-world
4. Docker Compose实现自动化部署
sudo nohup docker-compose up
- https://yeasy.gitbooks.io/docker_practice/content/compose/intro.html
5. Swarm实现集群
6. Docker的监控
7. Docker部署
7.1. 蓝绿部署
7.2. 灰度发布
8. 特别感谢
9. 免责说明
- 本文档中的部分内容摘自网上的众多博客,仅作为自己知识的补充和整理,并分享给其他需要的coder,不会用于商用。
- 因为很多博客的地址看完没有及时做保存,所以很多不会在这里标明出处,非常感谢各位大牛的分享,也希望大家理解。
- 如果原文作者感觉不适,可以及时联系我shiguoqing999@163.com,我将及时删除争议部分内容
10. 追责声明
- 如有大段引用超过全文50%的内容,请在文档结尾标明原文出处:龙马行空-石国庆-https://my.oschina.net/u/1416844/blog,否则将视为抄袭,予以法律追究,请各位尊重个人知识产权。
个人公众号
- 大家可以关注我的公众号,我会举办线下代码操练活动
- 本人提供所有前端知识的付费咨询服务,本咨询可提升企业核心竞争力
- Html5和Css3系列
- Vue全家桶系列
- JS面向对象系列
- 微信开发系列(完善中)
- RN开发系列(完善中)
- DevOps系列
- 价格请邮箱联系:shiguoqing999@163.com,有愿意提供场地的公司也可以联系我,会有优惠