Docker介绍
讲个故事
为了更好的理解 Docker 是什么,我们先来讲个故事:
我需要盖一个房子,于是我搬石头、砍木头、画图纸、盖房子。一顿操作,终于把这个房子盖好了。
结果,住了一段时间,心血来潮想搬到海边去。这时候按以往的办法,我只能去海边,再次搬石头、砍木头、画图纸、盖房子。
烦恼之际,跑来一个魔法师教会我一种魔法。这种魔法可以把我盖好的房子复制一份,做成「镜像」,放在我的背包里。 等我到了海边,就用这个「镜像」,复制一套房子,拎包入住。
是不是很神奇?对应到我们的项目中来,房子就是项目本身,镜像就是项目的复制,背包就是镜像仓库。
如果要动态扩容,从仓库中取出项目镜像,随便复制就可以了。Build once,Run anywhere!
不用再关注版本、兼容、部署等问题,彻底解决了「上线即崩,无休止构建」的尴尬。
相关地址
- 官网:https://www.docker.com/
- 官网文档:https://docs.docker.com/
- 中文文档:https://dockerdocs.cn/
- 镜像仓库:https://hub.docker.com/
什么是Docker
- Docker 是一个开源的应用容器引擎,基于go 语言开发并遵循了apache2.0 协议开源
- Docker 是在Linux 容器里运行应用的开源工具,是一种轻量级的“虚拟机”
- Docker 的容器技术可以在一台主机上轻松为任何应用创建一个轻量级的,可移植的,自给自足的容器
应用场景
- Web 应用的自动化打包和发布。
- 自动化测试和持续集成、发布。
- 在服务型环境中部署和调整数据库或其他的后台应用。
- Docker 是一个用于开发,交付和运行应用程序的开放平台。
Docker优点
灵活
:即使是最复杂的应用也可以集装箱化。轻量级
:容器利用并共享主机内核。可互换
:可以即时部署更新和升级。便携式
:可以在本地构建,部署到云,并在任何地方运行。可扩展
:可以增加并白动分发容器副本。可堆叠
:可以垂直和即时堆叠服务。
Docker三大核心
镜像
Docker的镜像是创建容器的基础,类似虚拟机的快照,可以理解为一个面向Docker容器引擎的只读模板。
容器
Docker的容器是从镜像创建的运行实例,它可以被启动、停止和删除。所创建的每一个容器都是相互隔离、互不可见,以保证平台的安全性。可以把容器看做是一个简易版的linux环境(包括root用户权限、镜像空间、用户空间和网络空间等)和运行在其中的应用程序。
仓库
仓库注册服务器上往往存放着多个仓库,每个仓库中包含了多个镜像,每个镜像有不同标签(tag)。
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
最大的公开仓库是 Docker Hub: https://hub.docker.com,存放了数量庞大的镜像供用户下载。
网络模式
网络模式 | 配置 | 说明 |
---|---|---|
host | --network host | 容器和宿主机共享 Network namespace |
container | --network container:NAME_OR_ID | 容器和另外一个容器共享 Network namespace |
none | --network none | 容器有独立的 Network namespace,但并没有对其进行任何网络设置,如分配 veth pair 和网桥连接,配置 IP 等 |
bridge | --network | bridge 默认模式 |
Docker的数据卷
数据卷是一个供容器使用的特殊目录,位于容器中。可将宿主机的目录挂载到数据卷上,对数据卷的修改操作立刻可见,并且更新数据不会影响镜像,从而实现数据在宿主机与容器之间的迁移。
Docker容器
## docker images --镜像
docker run -d --name centos7.8 -h centos7.8 \
-p 220:22 -p 3387:3389 \
--privileged=true \
centos:7.8.2003 /usr/sbin/init
## 我想拥有一个 linux 8.2 的环境
docker run -d --name centos8.2 -h centos8.2 \
-p 230:22 -p 3386:3389 \
--privileged=true \
daocloud.io/library/centos:8.2.2004 init
## 进入容器
docker exec -it centos7.8 bash
docker exec -it centos8.2 bash
## --查看系统版本
cat /etc/redhat-release
docker 基本命令
docker search tomcat # 搜索tomcat镜像
docker pull centos:7 # 拉取centos镜像
docker inspect 容器名称或者容器ID # 查看容器详情
docker ps # 查看正在运行的容器
docker ps -aq # 列出所有容器ID
docker ps -a # 查看所有运行或者不运行容器
docker ps -l # 查看最近运行过的容器
docker stop $(docker ps -a -q) # 停止所有的container(容器),这样才能够删除其中的images:
docker stop $(docker ps -aq)
docker rm $(docker ps -a -q) # 删除所有container(容器)的话再加一个指令
docker rm $(docker ps -aq)
docker images # 查看当前有些什么images
docker rmi <image id> # 删除images(镜像),通过image的id来指定删除谁
# 删除untagged images,也就是那些id为的image的话可以用
docker rmi $(docker images | grep "^<none>" | awk "{print $3}")
docker rmi $(docker images -q) # 删除所有镜像
docker rmi -f $(docker images -q) # 强制删除全部image
## 开机自启动
docker update --restart=always <docker-name>
## 从容器到宿主机复制
docker cp tomcat:/webapps/js/text.js /home/admin
docker cp 容器名: 容器路径 宿主机路径
## 从宿主机到容器复制
docker cp /home/admin/text.js tomcat:/webapps/js
docker cp 宿主路径中文件 容器名 容器路径
docker container prune #删除所有停止的容器
docker image prune --force --all #删除所有不使用的镜像
docker image prune -f -a
docker stop Name或者ID #停止一个容器
docker start Name或者ID #启动一个容器
docker kill Name或者ID #杀死一个容器
docker restart name或者ID #重启一个容器
# 以交互方式运行容器:
docker run -i -t --name 容器名称 repository:tag /bin/bash
docker run -it --name 容器名称 imageID /bin/bash
# 以守护进程方式运行容器:
docker run -di --name 容器名称 repository:tag
docker run -di --name 容器名称 imageID
# 注意:通过 run 创建并进入容器之后,如果使用 exit 命令退出容器,则容器停止。再次进入该容器,先使用 start 启动容器,再使用 exec/attach 命令进入容器
docker exec -it 容器名称或者容器ID /bin/bash # 进入容器
docker attach 容器名称或者容器ID
# 两者之间的区别:
# attach 进入容器之后,如果使用 exit 退出容器,则容器停止。
# exec 进入容器之后,使用 exit 退出容器,容器依然处于运行状态。