跳至主要內容

Docker介绍

知识库容器技术DockerDocker大约 6 分钟

讲个故事

为了更好的理解 Docker 是什么,我们先来讲个故事:

我需要盖一个房子,于是我搬石头、砍木头、画图纸、盖房子。一顿操作,终于把这个房子盖好了。

结果,住了一段时间,心血来潮想搬到海边去。这时候按以往的办法,我只能去海边,再次搬石头、砍木头、画图纸、盖房子。

烦恼之际,跑来一个魔法师教会我一种魔法。这种魔法可以把我盖好的房子复制一份,做成「镜像」,放在我的背包里。
等我到了海边,就用这个「镜像」,复制一套房子,拎包入住。

是不是很神奇?对应到我们的项目中来,房子就是项目本身,镜像就是项目的复制,背包就是镜像仓库。

如果要动态扩容,从仓库中取出项目镜像,随便复制就可以了。Build once,Run anywhere!

不用再关注版本、兼容、部署等问题,彻底解决了「上线即崩,无休止构建」的尴尬。

相关地址

什么是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.comopen in new window,存放了数量庞大的镜像供用户下载。

网络模式

网络模式配置说明
host--network host容器和宿主机共享 Network namespace
container--network container:NAME_OR_ID容器和另外一个容器共享 Network namespace
none--network none容器有独立的 Network namespace,但并没有对其进行任何网络设置,如分配 veth pair 和网桥连接,配置 IP 等
bridge--networkbridge 默认模式

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 退出容器,容器依然处于运行状态。