Docker 基础知识

docker 是比较流行的技术,主要用于环境部署。和虚拟机类似,但是又不相同,最大的不同是可以把软件进行单独管理,高度的自定义,按需启动。

热门起来的原因一是开源软件,二是可直接替代运维的工作。常规的流程中开发用到的依赖和正式环境有所不同就需要运维进行调整,但如果使用 Docker 开发只需把版本打包起来,在正式环境下切换就可以达成秒级切换及升级。这种又开发又运维的行为又称为 DevOps

Note:

实际上运维并不是只有部署环境那么简单,术业有专攻,还需有对软件性能优化的能力,以及常规的服务器安全、稳定、容灾等处理方法及经验。

优点:

  • 镜像由一个个提交组成,相同的内容不会重复拉取,浪费流量和磁盘空间
  • 容器相当于一个镜像的实例,实例里的操作不会改变镜像,而且实例时简单快速,不会占用镜像相同大小的磁盘空间

缺点:

  • 基于 Linux 里实现,所以像 windows 的应用还无法运行。

术语

  • 宿主机:运行 Docker 的电脑
  • Image(镜像): 相当于一个已经部署好的环境,可以从远程仓库中获取
  • Container(容器):基于镜像的实例
  • Volume(数据卷):容器中会有一些数据相关的内容,容器每次关闭都会丢弃这些数据,才会用数据卷的概念,把数据保存在本地,每次运行容器都读取这些数据文件以达到容器操作数据的变动
  • Repository(仓库):镜像存放的远端仓库,常见的是 hub.docker.com,但是阿里云也有提供远程仓库服务。

技巧

  • 使用 alpine 系统会更小,自身只有 5M。
  • 想以一个镜像为基础进一步加强,实例一个镜像,来执行相关的安装配置操作,操作成功再写入 Dockerfile 中
  • 已实例出来的容器可以通过 docker commit <容器名> 镜像[:标签] 来生成镜像,但是不推荐,因为镜像查不出操作命令

分享自定义的容器

需要注册 hub.docker.com 账号。

1
2
3
docker tag docker101tutorial {userName}/docker101tutorial

docker push {userName}/docker101tutorial

Docker 网络相关

网络模式

  • bridge 【常用】桥接模式 evth-pair
  • none 不配置网络
  • host 和宿主机共享网络

容器间互联

1
2
3
4
5
6
7
8
9
10
11
# 创建网络
docker network create 网络名
# 使用网络
docker run -td --name nginx --network 网络名 local/nginx /bin/sh
docker run -td --name php --network 网络名 local/php /bin/sh
docker run -td --name mysql --network 网络名 local/mysql /bin/sh

# 验证,进入其中一个容器中 ping 其他两个
ping php
ping mysql
ping nginx

Note:

1、宿主机访问容器,run 时使用 -p 参数来指定端口,通过端口访问

2、容器互联并不是容器直接访问另一个容器,而是把宿主机当路由,想访问其他容器:当前容器 -> 宿主机 -> 目标容器,响应也是如此。内网传输极快不用担心效率问题