笔记参考来自以下优秀的文章:
30 分钟快速入门 Docker 教程
写给前端的Docker实战教程

一、欢迎来到docker的世界

1.docker的理念

Securely build, share and run modern applications anywhere

一次封装,到处运行

2. Docker 与虚拟化

在没有Docker的时代,我们会使用硬件虚拟化(虚拟机)以提供隔离。这里,虚拟机通过在操作系统上建立了一个中间虚拟软件层 Hypervisor ,并利用物理机器的资源虚拟出多个虚拟硬件环境来共享宿主机的资源,其中的应用运行在虚拟机内核上。但是,虚拟机对硬件的利用率存在瓶颈,因为虚拟机很难根据当前业务量动态调整其占用的硬件资源,因此容器化技术得以流行。
其中,Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的linux机器上。

图片.png

Docker 容器不使用硬件虚拟化,它的守护进程是宿主机上的一个进程,换句话说,应用直接运行在宿主机内核上。因为容器的运行的程序和计算机的操作系统之间没有额外的中间层,没有资源被冗余软件的运行或虚拟硬件的模拟而浪费掉。

Docker 的优势不仅如此,我们来比较一番。

特性 Docker 虚拟机
启动速度 秒级 分钟级
交付/部署 开发、测试、生产环境一致 无成熟体系
性能 近似物理机 性能损耗大
体量 极小(MB) 较大(GB)
迁移/扩展 跨平台,可复制 较为复杂

3. 镜像、容器和仓库

Docker 由镜像(Image)、容器(Container)、仓库(Repository) 三部分组成。

Docker 的镜像可以简单的类比为电脑装系统用的系统盘,包括操作系统,以及必要的软件。例如,一个镜像可以包含一个完整的 centos 操作系统环境,并安装了 Nginx 和 Tomcat 服务器。注意的是,镜像是只读的。这一点也很好理解,就像我们刻录的系统盘其实也是可读的。我们可以使用 docker images 来查看本地镜像列表。

Docker 的容器可以简单理解为提供了系统硬件环境,它是真正跑项目程序、消耗机器资源、提供服务的东西。例如,我们可以暂时把容器看作一个 Linux 的电脑,它可以直接运行。那么,容器是基于镜像启动的,并且每个容器都是相互隔离的。注意的是,容器在启动的时候基于镜像创建一层可写层作为最上层。我们可以使用 docker ps -a 查看本地运行过的容器。

Docker 的仓库用于存放镜像。这一点,和 Git 非常类似。我们可以从中心仓库下载镜像,也可以从自建仓库下载。同时,我们可以把制作好的镜像 commit 到本地,然后 push 到远程仓库。仓库分为公开仓库和私有仓库,最大的公开仓库是官方仓库 Dock Hub,国内的公开仓库也有很多选择,例如阿里云等。

图片.png

4.Docker促使开发流程变更

笔者认为,Docker对开发流程的影响在于使环境标准化。例如,原来我们存在三个环境:开发(日常)环境、测试环境、生产环境。这里,我们对于每个环境都需要部署相同的软件、脚本和运行程序,如图所示。事实上,对于启动脚本内容都是一致的,但是没有统一维护,经常会出问题。此外,对于运行程序而言,如果所依赖的底层运行环境不一致,也会造成困扰和异常。

图片.png

现在,我们通过引入 Docker 之后,我们只需要维护一个 Docker 镜像。换句话说,多套环境,一个镜像,实现系统级别的一次构建到处运行。此时,我们把运行脚本标准化了,把底层软件镜像化了,然后对于相同的将要部署的程序实行标准化部署。因此,Docker 为我们提供了一个标准化的运维模式,并固化运维步骤和流程

图片.png

通过这个流程的改进,我们更容易实现 DevOps 的目标,因为我们的镜像生成后可以跑在任何系统,并快速部署。此外,使用 Docker 的很大动力是基于 Docker 实现弹性调度,以更充分地利用机器资源,节省成本
哈哈,笔者在使用 Docker 过程中,还发现了一些很棒的收益点,例如我们发布回滚的时候只需要切换 TAG 并重启即可。还比如,我们对环境升级,也只需要升级基础镜像,那么新构建的应用镜像,自动会引用新的版本。(欢迎补充~~~)

二、从搭建 Web 服务器开始说起doker

1.安装Docker

官方下载地址:(Mac):download.docker.com/mac/stable/… 阿里云下载地址(Mac):mirrors.aliyun.com/docker-tool… 阿里云下载地址(Windows): mirrors.aliyun.com/docker-tool…

  • 安装指南 这里,双击刚刚下载的 Doker.dmg 安装包进行安装。

Docker 入门 笔记 - 图5
安装完成后启动, Mac 顶部导航栏出现了一个图标,通过菜单可以进行 docker 配置和退出等操作。

Docker 入门 笔记 - 图6

官方指南:docs.docker.com/install/ 阿里云指南(Linux):yq.aliyun.com/articles/11…

  • 设置加速服务

市面上有很多加速服务的提供商,如:DaoCloud,阿里云等。这里,笔者使用的是阿里云。(注意的是,笔者操作系统是 Mac,其他操作系列参见阿里云操作文档)

Docker 入门 笔记 - 图7

右键点击桌面顶栏的 docker 图标,选择 Preferences ,在 Daemon 标签(Docker 17.03 之前版本为 Advanced 标签)下的 Registry mirrors 列表中将
https://xxx.mirror.aliyuncs.com 加到”registry-mirrors”的数组里,点击 Apply & Restart 按钮,等待 Docker 重启并应用配置的镜像加速器。

图片.png

阿里云操作文档:cr.console.aliyun.com/cn-hangzhou… unbuntu 安装 docker docker pull下载镜像时的报错及其解决方法

至此,我们已经安装完成了。这里,我们来查看版本。

  1. docker version

查看结果,如下所示。

图片.png

2. 实干派,从搭建 Web 服务器开始

我们作为实干派,那么先来搭建一个 Web 服务器吧。然后,笔者带你慢慢理解这个过程中,做了什么事情。首先,我们需要拉取 centos 镜像。

  1. docker run -p 80 --name web -i -t centos /bin/bash

紧接着,我们安装 nginx 服务器,执行以下命令:

  1. rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

安装完 Nginx 源后,就可以正式安装 Nginx 了。

  1. yum install -y nginx

至此,我们再输入 where is nginx 命令就可以看到安装的路径了。最后,我们还需要将 Nginx 跑起来。

  1. nginx

现在,我们执行 ctrl + P + Q 切换到后台。然后,通过 docker ps -a 来查看随机分配的端口。

图片.png

这里,笔者分配的端口是 32768 ,那么通过浏览器访问 http://127.0.0.1:32768 即可。

图片.png

大功告成,哈哈哈~

3. 复盘理解全过程

现在,我们来理解下这个流程。
首先,我们输入 docker run -p 80 —name web -i -t centos /bin/bash 命令会运行交互式容器,其中 -i 选项告诉Docker容器保持标椎输入流对容器开放,即使容器没有终端连接,-t 选项告诉 Docker 为容器分配一个虚拟终端,以便于我们接下来安装 Nginx 服务器。(笔者备注:Docker 还支持输入 -d 选项告诉 Docker 在后台运行容器的守护进程)

Docker 会为我们创建的每一个容器自动生成一个随机的名称。事实上,这种方式虽然便捷,但是可读性很差,并且对我们后期维护的理解成本会比较大。因此,我们通过 --name web 选项告诉 Docker 创建一个名称是 web 的容器。此外,我们通过 -p 80 告诉 Docker 开放 80 端口,那么, Nginx 才可以对外通过访问和服务。但是,我们的宿主机器会自动做端口映射,比如上面分配的端口是 32769 ,注意的是,如果关闭或者重启,这个端口就变了,那么怎么解决固定端口的问题,笔者会在后面详细剖析和带你实战。

这里,还有一个非常重要的知识点 docker run 。Docker 通过 run 命令来启动一个新容器。Docker 首先在本机中寻找该镜像,如果没有安装,Docker 在 Docker Hub 上查找该镜像并下载安装到本机,最后 Docker 创建一个新的容器并启动该程序。

Docker 入门 笔记 - 图12

但是,当第二次执行 docker run 时,因为 Docker 在本机中已经安装该镜像,所以 Docker 会直接创建一个新的容器并启动该程序。

Docker 入门 笔记 - 图13

注意的是,docker run 每次使用都会创建一个新的容器,因此,我们以后再次启动这个容器时,只需要使用命令 docker start 即可。这里, docker start 的作用在用重新启动已存在的镜像,而docker run 包含将镜像放入容器中 docker create ,然后将容器启动 docker start ,如图所示。

Docker 入门 笔记 - 图14

现在,我们可以在上面的案例的基础上,通过 exit 命令关闭 Docker 容器。当然,如果我们运行的是后台的守护进程,我们也可以通过 docker stop web 来停止。注意的是,docker stopdocker kill 略有不同,docker stop 发送 SIGTERM 信号,而 docker kill 发送SIGKILL 信号。然后,我们使用 docker start 重启它。

  1. docker start web

Docker 容器重启后会沿用 docker run 命令指定的参数来运行,但是,此时它还是后台运行的。我们必须通过 docker attach 命令切换到运行交互式容器。

  1. docker attach web

现在,我们可以通过 docker images 命令查看本地的镜像。

  1. docker images

查询结果,如图所示。

Docker 入门 笔记 - 图15

这里,对几个名词解释一下含义。

  • REPOSITORY:仓库名称。
  • TAG: 镜像标签,其中 lastest 表示最新版本。注意的是,一个镜像可以有多个标签,那么我们就可以通过标签来管理有用的版本和功能标签。
  • IMAGE ID :镜像唯一ID。
  • CREATED :创建时间。
  • SIZE :镜像大小。

那么,如果第一次我们通过 docker pull centos:latest 拉取镜像,那么当我们执行 docker run -p 80 --name web -i -t centos /bin/bash 时,它就不会再去远程获取了,因为本机中已经安装该镜像,所以 Docker 会直接创建一个新的容器并启动该程序。

事实上,官方已经提供了安装好 Nginx 的镜像,我们可以直接使用。现在,我们通过拉取镜像的方式重新构建一个 Web 服务器。首先,我们通过 docker search 来查找镜像。我们获取到 Nginx 的镜像清单。

  1. docker search nginx

补充一下,我们也可以通过访问 Docker Hub (hub.docker.com/)搜索仓库,那么 star 数越多,说明它越靠谱,可以放心使用。

Docker 入门 笔记 - 图16

现在,我们通过 docker pull nginx 拉取最新的 Nginx 的镜像。当然,我们也可以通过 docker pull nginx:latest 来操作。

  1. docker pull nginx

然后,我们创建并运行一个容器。与前面不同的是,我们通过 -d 选项告诉 Docker 在后台运行容器的守护进程。并且,通过 8080:80 告诉 Docker 8080 端口是对外开放的端口,80 端口对外开放的端口映射到容器里的端口号。

  1. docker run -p 8080:80 -d --name nginx nginx

我们再通过 docker ps -a 来查看,发现容器已经后台运行了,并且后台执行了 nginx 命令,并对外开放 8080 端口。

图片.png

因此,通过浏览器访问 http://127.0.0.1:8080 即可。图片.png

三、仓库与软件安装的简化

还记得笔者在文章开头介绍的「镜像、容器和仓库」吗?Docker 的仓库用于存放镜像。我们可以从中心仓库下载镜像,也可以从自建仓库下载。同时,我们可以把制作好的镜像从本地推送到远程仓库。

首先,笔者先引入一个知识点:Docker 的镜像就是它的文件系统,一个镜像可以放在另外一个镜像的上层,那么位于下层的就是它的父镜像。所以,Docker 会存在很多镜像层,每个镜像层都是只读的,并且不会改变。当我们创建一个新的容器时,Docker 会构建出一个镜像栈,并在栈的最顶层添加一个读写层,如图所示。

Docker 入门 笔记 - 图19

想要了解更多镜像原理的信息,详见此视频,讲的很通透 视频地址

四、docker命令

docker指令命令

Docker 提供了非常丰富的命令。所谓一图胜千言,我们可以从下面的图片了解到很多信息和它们之前的用途。(可以直接跳过阅读,建议收藏,便于扩展阅读)

Docker 入门 笔记 - 图20

如果希望获取更多信息,可以阅读官方使用文档。

镜像的简单命令

  • 查找镜像在dockerhub

docker search 镜像名称

  • 拉取镜像

docker pull 镜像名称

  • 列出镜像

docker images

  • 删除镜像

docker rim 镜像id或镜像名称

容器的简单命令

  • 新建并启动容器

docker run [options] images[COMMAND][ARG…]

图片.png

  • 启动守护式容器

图片.png

  • 列出当前正在启动的容器

docker ps [options]

图片.png

  • 退出容器

退出的两种方式:

exit 容器停止退出
ctrl+P+Q 容器不停止退出

  • 启动容器

docker start 容器Id 或 容器名称

  • 停止容器

docker stop 容器Id 或 容器名称

  • 强制停止容器

docker kill 容器Id 或 容器名称

  • 删除已停止的容器

docker rm 容器Id 或 容器名称

  • 删除正在运行的容器

docker rm -f 容器Id 或 容器名称

  • 查看容器日志

docker logs -f -t —tail 容器Id
-t 加入时间戳
-f 跟随最新的日志打印
—tail 显示最后多少条

  • 查看容器内的进程

docker top 容器id

图片.png

  • 查看容器内部的细节

docker inspect 容器id
图片.png

  • 进入正在运行的容器 并以命令行交互

1、docker attach 容器id
直接进入容器启动命令的终端,不会启动新的进程

图片.png

2、docker exec -t 容器id 容器内的命令
在容器中打开新的新的终端 并且启动新的进程

图片.png

  • 从容器内拷贝文件到主机上

docker cp 容器id:容器内路径 目的主机路径

Command Description
docker version docker 的版本信息
docker info docker 详细信息
docker attach ```

介入到一个正在运行的容器

  1. |
  2. | [docker build](https://docs.docker.com/engine/reference/commandline/build/) |

根据 Dockerfile 构建一个镜像

  1. |
  2. | [docker builder](https://docs.docker.com/engine/reference/commandline/builder/) | Manage builds |
  3. | [docker checkpoint](https://docs.docker.com/engine/reference/commandline/checkpoint/) | Manage checkpoints |
  4. | [docker commit](https://docs.docker.com/engine/reference/commandline/commit/) |

根据容器的更改创建一个新的镜像

  1. |
  2. | [docker config](https://docs.docker.com/engine/reference/commandline/config/) | Manage Docker configs |
  3. | [docker container](https://docs.docker.com/engine/reference/commandline/container/) | Manage containers |
  4. | [docker cp](https://docs.docker.com/engine/reference/commandline/cp/) |

在本地文件系统与容器中复制 文件/文件夹

  1. |
  2. | [docker create](https://docs.docker.com/engine/reference/commandline/create/) |

创建一个新容器

  1. |
  2. | [docker deploy](https://docs.docker.com/engine/reference/commandline/deploy/) | Deploy a new stack or update an existing stack |
  3. | [docker diff](https://docs.docker.com/engine/reference/commandline/diff/) | Inspect changes to files or directories on a container’s filesystem |
  4. | [docker engine](https://docs.docker.com/engine/reference/commandline/engine/) | Manage the docker engine |
  5. | [docker events](https://docs.docker.com/engine/reference/commandline/events/) | Get real time events from the server |
  6. | [docker exec](https://docs.docker.com/engine/reference/commandline/exec/) |

在容器中执行一条命令

  1. |
  2. | [docker export](https://docs.docker.com/engine/reference/commandline/export/) | Export a container’s filesystem as a tar archive |
  3. | [docker history](https://docs.docker.com/engine/reference/commandline/history/) | Show the history of an image |
  4. | [docker image](https://docs.docker.com/engine/reference/commandline/image/) | Manage images |
  5. | [docker images](https://docs.docker.com/engine/reference/commandline/images/) |

列出镜像
options:
-a 列出所有的镜像(含中间映射层)
-q 表示查看镜像id
—digests:显示镜像的摘要信息
—no-trunc:显示完整的镜像信息

  1. |
  2. | [docker import](https://docs.docker.com/engine/reference/commandline/import/) | Import the contents from a tarball to create a filesystem image |
  3. | [docker info](https://docs.docker.com/engine/reference/commandline/info/) | Display system-wide information |
  4. | [docker inspect](https://docs.docker.com/engine/reference/commandline/inspect/) | Return low-level information on Docker objects |
  5. | [docker kill](https://docs.docker.com/engine/reference/commandline/kill/) |

杀死一个或多个正在运行的容器

  1. |
  2. | [docker load](https://docs.docker.com/engine/reference/commandline/load/) | Load an image from a tar archive or STDIN |
  3. | [docker login](https://docs.docker.com/engine/reference/commandline/login/) | Log in to a Docker registry |
  4. | [docker logout](https://docs.docker.com/engine/reference/commandline/logout/) | Log out from a Docker registry |
  5. | [docker logs](https://docs.docker.com/engine/reference/commandline/logs/) |

取得容器的日志

  1. |
  2. | [docker manifest](https://docs.docker.com/engine/reference/commandline/manifest/) | Manage Docker image manifests and manifest lists |
  3. | [docker network](https://docs.docker.com/engine/reference/commandline/network/) | Manage networks |
  4. | [docker node](https://docs.docker.com/engine/reference/commandline/node/) | Manage Swarm nodes |
  5. | [docker pause](https://docs.docker.com/engine/reference/commandline/pause/) |

暂停一个或多个容器的所有进程

  1. |
  2. | [docker plugin](https://docs.docker.com/engine/reference/commandline/plugin/) | Manage plugins |
  3. | [docker port](https://docs.docker.com/engine/reference/commandline/port/) | List port mappings or a specific mapping for the container |
  4. | [docker ps](https://docs.docker.com/engine/reference/commandline/ps/) |

列出所有容器

  1. |
  2. | [docker pull](https://docs.docker.com/engine/reference/commandline/pull/) |

拉取一个镜像或仓库到 registry

  1. |
  2. | [docker push](https://docs.docker.com/engine/reference/commandline/push/) |

推送一个镜像或仓库到 registry

  1. |
  2. | [docker rename](https://docs.docker.com/engine/reference/commandline/rename/) |

重命名一个容器

  1. |
  2. | [docker restart](https://docs.docker.com/engine/reference/commandline/restart/) |

重新启动一个或多个容器

  1. |
  2. | [docker rm](https://docs.docker.com/engine/reference/commandline/rm/) |

删除一个或多个容器

  1. |
  2. | [docker rmi](https://docs.docker.com/engine/reference/commandline/rmi/) |

删除一个或多个镜像
-f 强制删除
例如:docker rmi -f $(docker images -qa) # 删除全部

  1. |
  2. | [docker run](https://docs.docker.com/engine/reference/commandline/run/) |

在一个新的容器中执行一条命令

  1. |
  2. | [docker save](https://docs.docker.com/engine/reference/commandline/save/) | Save one or more images to a tar archive (streamed to STDOUT by default) |
  3. | [docker search](https://docs.docker.com/engine/reference/commandline/search/) |

在 Docker Hub 中搜索镜像
-s 收藏数不小于指定值的镜像

  1. |
  2. | [docker secret](https://docs.docker.com/engine/reference/commandline/secret/) | Manage Docker secrets |
  3. | [docker service](https://docs.docker.com/engine/reference/commandline/service/) | Manage services |
  4. | [docker stack](https://docs.docker.com/engine/reference/commandline/stack/) | Manage Docker stacks |
  5. | [docker start](https://docs.docker.com/engine/reference/commandline/start/) |

启动一个或多个已经停止运行的容器

  1. |
  2. | [docker stats](https://docs.docker.com/engine/reference/commandline/stats/) |

显示一个容器的实时资源占用

  1. |
  2. | [docker stop](https://docs.docker.com/engine/reference/commandline/stop/) |

停止一个或多个正在运行的容器

  1. |
  2. | [docker swarm](https://docs.docker.com/engine/reference/commandline/swarm/) | Manage Swarm |
  3. | [docker system](https://docs.docker.com/engine/reference/commandline/system/) | Manage Docker |
  4. | [docker tag](https://docs.docker.com/engine/reference/commandline/tag/) |

为镜像创建一个新的标签

  1. |
  2. | [docker top](https://docs.docker.com/engine/reference/commandline/top/) |

显示一个容器内的所有进程

  1. |
  2. | [docker trust](https://docs.docker.com/engine/reference/commandline/trust/) | Manage trust on Docker images |
  3. | [docker unpause](https://docs.docker.com/engine/reference/commandline/unpause/) |

恢复一个或多个容器内所有被暂停的进程

  1. |
  2. | [docker update](https://docs.docker.com/engine/reference/commandline/update/) | Update configuration of one or more containers |
  3. | [docker version](https://docs.docker.com/engine/reference/commandline/version/) | Show the Docker version information |
  4. | [docker volume](https://docs.docker.com/engine/reference/commandline/volume/) | Manage volumes |
  5. | [docker wait](https://docs.docker.com/engine/reference/commandline/wait/) | Block until one or more containers stop, then print their exit codes |
  6. >
  7. > 官方阅读链接:[docs.docker.com/engine/refe…](https://docs.docker.com/engine/reference/commandline/docker/)
  8. <a name="dJWCg"></a>
  9. ## 五、`Dockerfile`
  10. 通过上面的学习,对 Docker 使用有了一个大致的了解,就好比我们通过 VMware 安装了一个系统,并让它跑了起来,那么我们就可以在这个 Linux 系统(CentOS 或者 Ubuntu 上面工作我们想要的任何事情。事实上,我们还会经常把我们安装好的 VMware 系统进行快照备份并实现克隆来满足我们下次快速的复制。这里,Docker 也可以构建定制内容的 Docker 镜像,例如上面我们使用官方提供的安装好 Nginx Docker 镜像。注意的是,我们通过基于已有的基础镜像,在上面添加镜像层的方式构建新镜像而已。
  11. Docker提供自定义镜像的能力,它可以让我们保存对基础镜像的修改,并再次使用。那么,我们可以在把操作系统、运行环境、脚本和程序打包在一起,并在宿主主机上对外提供服务。
  12. Docker 构建镜像有两种方式,一种方式是使用 docker commit 命令,另一种方式使用docker build 命令和Dockerfile文件。其中,不推荐使用docker commit 命令进行构建,因为它没有使流程标准化。因此,在企业的中更加推荐使用 `docker build` 命令和 `Dockerfile` 文件来构建我们的镜像。我们使用`Dockerfile` 文件可以让构建镜像更具备可重复性,同时保证启动脚本和运行程序的标准化。
  13. <a name="qF6nx"></a>
  14. ### 1、搭建托管的Nginx服务器
  15. 容器运行程序,而容器从哪里来?容器是镜像创建出来的。那镜像又是从哪里来?<br />镜像是通过一个Dockerfile打包出来的,所以创建关系为
  16. dockerfile ----build----> image ----start----> container
  17. <a name="ctjeP"></a>
  18. #### 1.1 创建文件
  19. 我们创建一个目录`hello-docker`,在目录中创建一个`index.html`文件,内容为:
  20. ```html
  21. <h1>Hello docker</h1>

然后再在目录中创建一个Dockerfile文件,内容为:

  1. FROM nginx
  2. COPY ./index.html /usr/share/nginx/html/index.html
  3. EXPOSE 80

此时,你的文件结构应该是:

  1. hello-docker
  2. |____index.html
  3. |____Dockerfile

1.2 打包镜像

文件创建好了,我们可以根据Dockerfile创建镜像了

在命令行中键入:

  1. cd hello-docker/ # 进入刚刚的目录
  2. docker image build ./ -t hello-docker:1.0.0 # 打包镜像

docker image build ./ -t hello-docker:1.0.0 的意思是:基于路径./(当前路径)打包一个镜像,镜像的名字是hello-docker,版本号是1.0.0。指定 - t 告诉 Docker 镜像的名称和版本,该命令会自动寻找Dockerfile来打包出一个镜像。

不出意外,你应该能得到如下输出:

  1. Sending build context to Docker daemon 3.072kB
  2. Step 1/3 : FROM nginx
  3. ---> 5a3221f0137b
  4. Step 2/3 : COPY ./index.html /usr/share/nginx/html/index.html
  5. ---> 1c433edd5891
  6. Step 3/3 : EXPOSE 80
  7. ---> Running in c2ff9ec2e945
  8. Removing intermediate container c2ff9ec2e945
  9. ---> f6a472c1b0a0
  10. Successfully built f6a472c1b0a0
  11. Successfully tagged hello-docker:1.0.0

可以看到其运行了 Dockerfile 中的内容,现在我们简单拆解下:

  • FROM nginx:基于哪个镜像
  • COPY ./index.html /usr/share/nginx/html/index.html:将宿主机中的./index.html文件复制进容器里的/usr/share/nginx/html/index.html
  • EXPOSE 80:容器对外暴露80端口

1.3 运行容器
我们刚刚使用了Dockerfile创建了一个镜像。现在有镜像了,接下来要根据镜像创建容器:

  1. docker container create --name hello-docker -p 2333:80 hello-docker:1.0.0
  2. docker container start hello-docker # hello-docker 为docker的名字

然后在浏览器打开127.0.0.1:2333,你应该能看到刚刚自己写的index.html内容

在上边第一个命令中,我们使用docker container create来创建基于hello-docker:1.0.0镜像的一个容器,使用—name 声明容器的名字为hello-docker,使用-p来指定端口绑定——将容器中的80端口绑定在宿主机的2333端口。执行完该命令,会返回一个容器的名字 hello-docker

而第二个命令,则是启动这个容器
启动后,就能通过访问本机的2333端口来达到访问容器内80端口的效果了

Tips: 你可以使用docker containers ls来查看当前运行的容器

1.3 运行容器

当容器运行后,可以通过如下命令进入容器内部:

  1. docker container exec -it xxx /bin/bash # xxx 为容器ID 或 容器name

图片.png

原理实际上是启动了容器内的/bin/bash,此时你就可以通过bash shell与容器内交互了。就像远程连接了SSH一样

Tips: 你可以使用docker containers ls来查看当前运行的容器

1.4 发生了什么

我们总结下都发生了什么:

  1. 写一个 Dockerfile
  2. 使用docker image build来将Dockerfile打包成镜像
  3. 使用docker container create来根据镜像创建一个容器
  4. 使用docker container start来启动一个创建好的容器

图片.png

2、Dockerfile 指令详解

Dockerfile 提供了非常多的指令,大神总结出的清单,建议收藏查看

16a02cdc42dd43f0.png

官方地址:docs.docker.com/engine/refe…

3. 将镜像推送到远程仓库

镜像构建完毕之后,我们可以将它上传到 Docker Hub 上面。首先,我们需要通过 docker login 保证我们已经登录了。紧接着,我们使用 docker push 命令进行推送。

  1. docker push lianggzone/nginx_demo:v1

这里,我们了解下它的使用,格式是 docker push [OPTIONS] NAME[:TAG] ,其中,笔者设置 NAME 是 lianggzone/nginx_demo,TAG 是 v1。 (笔者注:推送 Docker Hub 速度很慢,耐心等待) 最后,上传完成后访问:hub.docker.com/u/lianggzon…/,如图所示。

图片.png

六、docker-compose

docker-compose 是 Docker 官方提供的一个 Docker 管理工具。若你是通过桌面端的 Docker 安装包安装的 Docker,它是会默认为你安装 docker-compose 的。可以试试如下命令:

  1. docker-compose --help

如果是在 Linux,可以通过如下命令安装 docker-compose:

  1. sudo apt install docker-compose

docker-compose 和 Docker 差不多,也是只要一份文件就能跑起来。docker-compose 主要的作用就是能够让你不必手敲那么多 Docker 命令
**

建立一个目录,然后在目录中建立docker-compose.yml,内容如下:

  1. version: '3.7' # 这个是配置文件的版本,不同的版本号声明方式会有细微的不同
  2. services:
  3. info:
  4. container_name: compose-test
  5. image: maybush/hello-docker:1.1.0
  6. ports:
  7. - '8880:80'
  8. restart: on-failure

然后在目录中键入如下命令就能将服务跑起来:

  1. docker-compose up -d info

docker-compose 会帮我们自动去拉镜像,创建容器,将容器中的80端口映射为宿主机的8082端口。restart字段还要求 docker-compose 当发现容器意外挂掉时重新启动容器,类似于 pm2,所以你不必再在容器内使用 pm2

如果想要更新一个镜像创建新容器,只需要:

  1. docker-compose pull info
  2. docker-compose stop info
  3. docker-compose rm info
  4. docker-compose up -d info # -d 代表后台运行

七、进阶

前端项目加上docker部署,react+github+travis+docker
阮一峰 持续集成服务 Travis CI 教程