0%

使用Docker搭建应用运行环境

什么是Docker?

Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口,更重要的是容器性能开销极低。

为什么使用Docker?

  1. 开发的程序最终的运行环境为Linux,开发环境不方便调试,并且避免了“代码在我电脑上没问题”的情况;
  2. MacOS上并没有好用的SSH管理工具,Windows上则有很多方便快捷的工具,直接使用ssh命令会出现掉线,文件传输不方便等情况,Docker则可以直接将主机目录挂载到;
  3. Docker是轻量级的容器,相比虚拟机而言,对电脑资源的要求更低,启动速度更快。

安装Docker

$ brew cask install docker

如果在使用过程中发现拉取 Docker 镜像十分缓慢,可以配置 Docker 国内镜像加速

获取一个镜像Image

Docker 官方维护了一个公共仓库 Docker Hub,我们可以直接从 Docker Hub 中获取我们想要的镜像。我们通过以下命令获取 Ubuntu 18.04 的最小镜像。

$ docker pull ubuntu:18.04

运行一个容器Container

运行交互式容器,这样你就进入了一个神奇的Ubuntu bash环境,但是这是一个最小镜像,缺少各种组件,这就需要自行配置安装了。

$ docker run -i -t ubuntu:18.04 /bin/bash

其中,
-t 选项让 Docker 分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上

-i 则让容器的标准输入保持打开

/bin/bash 放在镜像名后为命令,使用/bin/bash运行交互式Shell

可以使用 docker 命令,直接在容器内运行命令,以下命令和在本地执行/bin/echo "hello docker"效果相同。

$ docker run ubuntu:18.04 /bin/echo "hello docker"

一般在开发过程中,习惯在本地开发,然后在容器中运行代码,我们可以在启动容器时挂载本地目录到 Docker 容器中。

$ docker run -dit --name probeDNS -v 本地目的:容器目录 ubuntu:18.04

其中,
–name 用来指定容器名称,如省略则会 Docker 会自动分配一个名称
-d 选项表示在后台运行容器
-v 代表挂载目录,本地目的和容器目录使用:分隔,均是绝对路径,当容器目录不存在时会自动创建,如需挂载多个目录,可以使用多个-v来挂载多个目录

使用$ docker ps命令可以看到所有运行中的容器

图片无法显示

配置程序需要的环境

要想在容器中配置环境,需要先进入在后台运行的容器

$ docker exec -it probeDNS /bin/bash

然后再配置环境,我的程序需要使用的环境为 Python3,运行下面的命令在容器中安装 Python3 和 Pip3

1
2
3
# apt-get update
# apt-get install python3
# apt-get install python3-pip

查看一下安装的版本,之后就可以使用pip3apt-get来安装起来依赖的环境了

图片无法显示

编辑并运行代码

在挂载了本地目录后,我们可以直接在本机编辑代码,毕竟 Docker 安装的最小Ubuntu系统连vim都没有,如有需要,可使用apt-get install vim来安装;本地修改完代码并保存后,可以直接在容器中运行。

将配置好的容器打包为镜像

在打包前,如有需要,可以将写好的代码保存到容器中,这样有利于快速部署到其他机器。
Docker 容器向本机传送文件

$ docker cp container_name_or_id:容器目录 本地目录

本机向 Docker 容器传送文件

$ docker cp 本地目录 container_name_or_id:容器目录

将容器导出为镜像

$ docker commit container_name_or_id image_name:image_tag

导出完成后,可以使用$ docker image ls查看所有容器

图片无法显示

上图中第一个就是我导出的容器 Image 啦。

导出镜像

用户登录后,可以通过 docker push 命令将自己的镜像推送到 Docker Hub,Docker Hub 是一个由 Docker 公司运行和管理的基于云的存储库。它是一个在线存储库,Docker 镜像可以由其他用户发布和使用。有两种库:公共存储库和私有存储库。如果你是一家公司,你可以在你自己的组织内拥有一个私有存储库,而公共镜像可以被任何人使用。

$ docker push network:probeDNS

图片无法显示

然而,很不幸,失败了,提示 denied: requested access to the resource is denied,这是因为我们推送到自己的Hub中,镜像名称需要以name/开头,因此需要先修改镜像名称。

$ docker tag network:probeDNS cido321/network:probeDNS

修改成功后,再次push

$ docker push cido321/network:probeDNS

成功啦~当然默认是 Public 的,可以手动设置为 Private

图片无法显示

图片无法显示

当特殊情况下无法使用互联网,或网络较慢时,使用以下命令导出镜像为文件

$ docker save -o ubuntu_network.tar cido321/network

与之对应的导入镜像命令为:

$ docker load -i ubuntu_network.tar

以上就是我首次使用 Docker 的一些方法和心得啦~

参考:
Docker从入门到实践
Docker 官方文档