dreamhomes
读完需要
速读仅需 7 分钟
本文介绍下docker容器技术,学习docker的目的是可以将自己的开发环境部署到多台机器上,不需要重复造轮子了!
什么是 docker
docker是一个开源的应用容器引擎,基于go语言开发并遵循了apache2.0协议开源。
docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的linux服务器,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类iphone的app),并且容器开销极其低。
下面的图片比较了 Docker 和传统虚拟化方式的不同之处,可见容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统方式则是在硬件层面实现。

docker 优点
灵活:即使是最复杂的应用也可以集装箱化。 轻量级:容器利用并共享主机内核。 可互换:您可以即时部署更新和升级。 便携式:您可以在本地构建,部署到云,并在任何地方运行。 可扩展:您可以增加并自动分发容器副本。 可堆叠:您可以垂直和即时堆叠服务。
docker 应用场景
Web 应用的自动化打包和发布。 自动化测试和持续集成、发布。 在服务型环境中部署和调整数据库或其他的后台应用。 从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。
docker 架构
Docker 包括三个基本概念:
镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。 仓库(Repository):仓库可看着一个代码控制中心,用来保存镜像。
架构图如下所示:
| 概念 | 说明 |
|---|---|
| Images | Docker 镜像是用于创建 Docker 容器的模板,比如 Ubuntu 系统。 |
| Container | 容器是独立运行的一个或一组应用,是镜像运行时的实体。 |
| Client | Docker 客户端通过命令行或者其他工具使用 Docker SDK[1] 与 Docker 的守护进程通信。 |
| Host | 一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。 |
| Registry | Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。 |
| Machine | Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,例如VirtualBox。 |
PS:Docker Hub[2] 提供了庞大的镜像集合供使用。一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签>
的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest
作为默认标签
Ubuntu 18.04 安装 Docker-ce
推荐更换ubuntu国内软件源为中科大的源(视服务器而定): sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
sudo sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
sudo apt update安装需要的包: sudo apt install apt-transport-https ca-certificates software-properties-common curl添加 GPG 密钥,并添加 Docker-ce 软件源,以中国科技大学的 Docker-ce 源为例: curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu \
$(lsb_release -cs) stable"添加成功后更新软件包缓存: sudo apt update安装docker-ce: sudo apt install docker-ce设置开机自启动并启动 Docker-ce(安装成功后默认已设置并启动,可忽略): sudo systemctl enable docker
sudo systemctl start docker测试运行: sudo docker run hello-world
终端显示以下内容时说明安装成功:
PS:可以添加当前用户到 docker
用户组,可以不用 sudo
运行 docker(可选):
sudo groupadd docker
sudo usermod -aG docker $USER
镜像使用
管理和使用本地 Docker 主机镜像
docker images
:列出本地主机上的镜像。
参数说明:
REPOSITORY:表示镜像的仓库源 TAG:镜像的标签。同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本;使用REPOSITORY:TAG 来定义不同的镜像。 IMAGE ID:镜像ID CREATED:镜像创建时间 SIZE:镜像大小 docker search name
:在Docker Hub中查找镜像。
参数说明:
NAME: 镜像仓库源的名称 DESCRIPTION: 镜像的描述 STARS: 类似 Github 里面的 star,表示点赞、喜欢的意思。 OFFICIAL: 是否 docker 官方发布 AUTOMATED: 自动构建。 docker pull name
:从Docker Hub中下载镜像。
docker rmi name
:删除镜像。前提是基于该镜像的容器已不再处于使用状态。
创建镜像
从已经创建的容器中更新镜像,并且提交这个镜像。更新镜像之前需要使用镜像来创建一个容器:
例如用ubuntu镜像创建的容器中进行apt update
更改,然后exit
退出容器。此时容器ID为04f3b433a4a9
。可以通过命令 docker commit 来提交容器副本,提交后可以再次查看本地镜像文件:docker commit -m="update" -a="dreamhomes" 04f3b433a4a9 dreamhomes/ubuntu
docker tag IMAGE_ID dreamhomes/ubuntu:version
:设置镜像标签使用 Dockerfile 指令来创建一个新的镜像。对此方法无需求暂不介绍,可以参考: https://www.w3cschool.cn/reqsgr/awqcnozt.html[3] https://www.runoob.com/docker/docker-dockerfile.html[4]
容器使用
docker run -it --name ubuntu-test ubuntu bash
:创建容器;
参数说明:
-i: 交互式操作。 -t: 终端。 --name:容器名字。 ubuntu: ubuntu 镜像。 /bin/bash:在镜像名后的是命令,交互式 Shell为 bin/bash。要退出终端,直接输入 exit; docker ps -a
:查看所有容器(包括已停止的)docker start ID
:启动一个已停止的容器(加了 -d 参数默认不会进入容器,想要进入容器需要使用指令 docker exec)docker stop ID
:停止运行的容器;docker run -itd --name ubuntu-test ubuntu bin/bash
:容器后台运行;docker exec -it ID bin/bash
:进入运行的容器;docker attach ID
:进入容器后退出会导致容器停止!docker export ID > name.tar
:导出容器快照到本地文件;cat docker/ubuntu.tar | docker import - test/ubuntu:v1
:从本地快照文件导入为镜像;docker import http://example.com/exampleimage.tgz example/imagerepo
:从URL或目录导入镜像;docker rm -f ID
:删除运行的容器;docker container prune
:清理掉所有处于终止状态的容器;
容器连接
容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -P
或 -p
参数来指定端口映射。也可通过-v
参数将主机文件映射到容器中。
端口映射
docker run -d -P training/webapp python app.py-P
:是容器内部端口随机映射到主机的高端口。docker run -d -p 5000:5000 training/webapp python app.py-p
: 是容器内部端口绑定到指定的主机端口。docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py
指定容器绑定的网络地址。
数据卷
sudo docker run -d -P --name test -v home/dreamhomes:/home/dreamhomes:ro ubuntu bash
挂载一个主机目录作为数据卷,本地目录的路径必须是绝对路径,如果目录不存在 Docker 会自动为你创建它;:ro
表示文件只读。sudo docker run -it --rm -v home/v-smj19:/home/v-smj19 ubuntu bash--rm
参数表示在容器退出时自动清理容器内部的文件系统。等价于:docker rm -v
了解上述命令后即可满足基础的开发需求了,如果有更复杂的需求可以参考官网哦!https://docs.docker.com/engine/reference/run/[5]
参考资料
Docker SDK: https://docs.docker.com/develop/sdk/
[2]Docker Hub: https://hub.docker.com
[3]https://www.w3cschool.cn/reqsgr/awqcnozt.html: https://www.w3cschool.cn/reqsgr/awqcnozt.html
[4]https://www.runoob.com/docker/docker-dockerfile.html: https://www.runoob.com/docker/docker-dockerfile.html
[5]https://docs.docker.com/engine/reference/run/: https://docs.docker.com/engine/reference/run/
文章推荐
1.如何成为一个高效的算法工程师?算法攻城狮の自我修养
2.2020年如何选择国内外云服务器?全面盘点助您选择!
3.windows10中高效软件推荐!
4.服务器端脚本实现自动定时给女票发送暖心情话
dreamhomes
博客:dreamhomes.top
隐形字
公众号:DreamHub
长按识别二维码关注







