什么是Docker?
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口,更重要的是容器性能开销极低。
为什么使用Docker?
- 开发的程序最终的运行环境为Linux,开发环境不方便调试,并且避免了“代码在我电脑上没问题”的情况;
- MacOS上并没有好用的SSH管理工具,Windows上则有很多方便快捷的工具,直接使用ssh命令会出现掉线,文件传输不方便等情况,Docker则可以直接将主机目录挂载到;
- 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 | apt-get update |
查看一下安装的版本,之后就可以使用pip3
和apt-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 的一些方法和心得啦~