Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
二、Docker组件
1)Docker 客户端和服务器
Docker 是一个客户端-服务器(C/S)架构程序。Docker 客户端只需要向 Docker 服务器 或者守护进程发出请求,服务器或者守护进程将完成所有工作并返回结果。Docker 提供了 一个命令行工具 Docker 以及一整套 RESTful API。你可以在同一台宿主机上运行 Docker 守护 进程和客户端,也可以从本地的 Docker 客户端连接到运行在另一台宿主机上的远程 Docker 守护进程。
2)Docker镜像
镜像是构建 Docker 的基石。用户基于镜像来运行自己的容器。镜像也是 Docker 生命周 期中的“构建”部分。镜像是基于联合文件系统的一种层式结构,由一系列指令一步一步构 建出来。例如:
添加一个文件;
执行一个命令;
打开一个窗口。
也可以将镜像当作容器的“源代码”。镜像体积很小,非常“便携”,易于分享、存储和更 新。
3)Registry(注册中心)
Docker 用 Registry 来保存用户构建的镜像。Registry 分为公共和私有两种。Docker 公司 运营公共的 Registry 叫做 Docker Hub。用户可以在 Docker Hub 注册账号,分享并保存自己的 镜像(说明:在 Docker Hub 下载镜像巨慢,可以自己构建私有的 Registry)。
4)Docker容器
Docker 可以帮助你构建和部署容器,你只需要把自己的应用程序或者服务打包放进容 器即可。容器是基于镜像启动起来的,容器中可以运行一个或多个进程。我们可以认为,镜 像是Docker生命周期中的构建或者打包阶段,而容器则是启动或者执行阶段。 容器基于 镜像启动,一旦容器启动完成后,我们就可以登录到容器中安装自己需要的软件或者服务。
三、Docker应用场景
容器提供了隔离性,结论是,容器可以为各种测试提供很好的沙盒环境。并且,容器本
身就具有“标准性”的特征,非常适合为服务创建构建块。Docker 的一些应用场景如下:
- 加速本地开发和构建流程,使其更加高效、更加轻量化。本地开发人员可以构建、 运行并分享 Docker 容器。容器可以在开发环境中构建,然后轻松的提交到测试环境中,并 最终进入生产环境。
- 能够让独立的服务或应用程序在不同的环境中,得到相同的运行结果。这一点在 面向服务的架构和重度依赖微型服务的部署由其实用。
- 用 Docker 创建隔离的环境来进行测试。例如,用 Jenkins CI 这样的持续集成工具 启动一个用于测试的容器。
- Docker 可以让开发者先在本机上构建一个复杂的程序或架构来进行测试,而不是 一开始就在生产环境部署、测试。
四、在Ubuntu中安装Docker
1、更新ubuntu的apt源索引
sudo apt-get update
2、安装包允许apt通过HTTPS使用仓库
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
software-properties-common
3、添加Docker官方GPG key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
4、设置Docker稳定版仓库
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
5、添加仓库后,更新apt源索引
sudo apt-get update
6、安装最新版Docker CE(社区版)
sudo apt-get install docker-ce
7、检查Docker CE是否安装正确
sudo docker run hello-world
8、为了避免每次命令都输入sudo,可以设置用户权限,注意执行后须注销重新登录
sudo usermod -a -G docker $USER
9、修改docker镜像源
# Docker 官方中国区:https://registry.docker-cn.com
# 网易:http://hub-mirror.c.163.com
# 中国科技大学:https://docker.mirrors.ustc.edu.cn
# 阿里云:https://y0qd3iq.mirror.aliyuncs.com
# 增加Docker的镜像源配置文件 /etc/docker/daemon.json,如果没有配置过镜像该文件默认是不存的,在其中增加如下内容:
{
"registry-mirrors": ["https://y0qd3iq.mirror.aliyuncs.com"]
}
# 然后重启Docker服务:
service docker restart
然后通过以下命令查看配置是否生效:
docker info|grep Mirrors -A 1
五、 启动与停止
# 启动docker
sudo service docker start
# 停止docker
sudo service docker stop
# 重启docker
sudo service docker restart
六、 docker基本操作
1、Docker镜像操作
1.1 什么是镜像
Docker 镜像是由文件系统叠加而成(是一种文件的存储形式)。最底端是一个文件引 导系统,即 bootfs,这很像典型的 Linux/Unix 的引导文件系统。Docker 用户几乎永远不会和 引导系统有什么交互。实际上,当一个容器启动后,它将会被移动到内存中,而引导文件系 统则会被卸载,以留出更多的内存供磁盘镜像使用。Docker 容器启动是需要一些文件的, 而这些文件就可以称为 Docker 镜像。
Docker 把应用程序及其依赖,打包在 image 文件里面。只有通过这个文件,才能生成 Docker 容器。image 文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。同一个 image 文件,可以生成多个同时运行的容器实例。
image 是二进制文件。实际开发中,一个 image 文件往往通过继承另一个 image 文件,加上一些个性化设置而生成。举例来说,你可以在 Ubuntu 的 image 基础上,往里面加入 Apache 服务器,形成你的 image。
image 文件是通用的,一台机器的 image 文件拷贝到另一台机器,照样可以使用。一般来说,为了节省时间,我们应该尽量使用别人制作好的 image 文件,而不是自己制作。即使要定制,也应该基于别人的 image 文件进行加工,而不是从零开始制作。
为了方便共享,image 文件制作完成后,可以上传到网上的仓库。Docker 的官方仓库 Docker Hub 是最重要、最常用的 image 仓库。此外,出售自己制作的 image 文件也是可以的。
1.2 镜像操作
(1) 镜像搜索
# 语法
docker search 镜像关键字
# 例如,搜索nginx镜像
docker search nginx
(2) 镜像拉取
# 语法
docker pull 镜像名称:tag # tag表示标签,多为软件版本,可以不写,默认为latest
# 例如拉取镜像nginx
docker pull nginx # 默认为最新版本
(3)获取当前环境所有镜像列表
# 语法
docker images
docker image ls
- REPOSITORY:镜像所在的仓库名称
- TAG:镜像标签
- IMAGEID:镜像ID
- CREATED:镜像的创建日期(不是获取该镜像的日期)
- SIZE:镜像大小
(4)删除镜像
# 语法
docker rmi 镜像id
docker image rm 镜像名或镜像id
# 例如 删除nginx镜像
docker rmi 8559a31e96f4
docker image rm 8559a31e96f4
2. Docker 容器操作
2.1 创建容器
docker run [option] 镜像名 [向启动容器中传入的命令]
常用可选参数说明:
- -i 表示以“交互模式”运行容器
- -t 表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即 分配一个伪终端。
- --name 为创建的容器命名
- -v 表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录,即 宿主机目录:容器中目录),可以使 用多个-v 做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后 共享到容器上。
- -d 在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不 会自动登录容器,如果只加-i -t 两个参数,创建后就会自动进去容器)。
- -p 表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p 做多个端口映射
- -e 为容器设置环境变量
- --network=host 表示将主机的网络环境映射到容器中,容器的网络与主机相同
2.2 创建交互式容器
例如,创建一个交互式容器,并命名为myubuntu
docker run -it --name=myubuntu ubuntu /bin/bash
在容器中可以随意执行linux命令,就是一个ubuntu的环境,当执行exit命令退出时,该容器也随之停止。
2.3 创建守护式容器
创建一个守护式容器:如果对于一个需要长期运行的容器来说,我们可以创建一个守护式容器。在容器内部exit退出时,容器也不会停止。
docker run -dit --name=myubuntu2 ubuntu
创建一个守护式容器: 指定目录映射,指定端口映射
# 语法
docker run -i -t -d -v pathHost:pathContain -p portHost:portContainer imageName:imageTag /bin/bash
# 例如
docker run -i -t -d -v /export/home:/opt/installpath -p 8080:8080 ubutun:latest /bin/bash
2.4 进入已运行的容器
# 语法
docker exec -it 容器名或容器id 进入后执行的第一个命令
# 例如
docker exec -it myubuntu2 /bin/bash
2.5 查看容器
# 列出本机正在运行的容器
docker container ls
docker container ps
# 列出本机所有容器,包括已经终止运行的
docker container ls --all
docker container ps -a
2.6 停止与启动容器
# 停止一个已经在运行的容器
docker container stop 容器名或容器id
# 启动一个已经停止的容器
docker container start 容器名或容器id
# kill掉一个已经在运行的容器
docker container kill 容器名或容器id
2.7 删除容器
docker container rm 容器名或容器id
2.8. 将容器保存为镜像
# 命令格式:
docker logs [OPTIONS] CONTAINER
# Options:
# --details 显示更多的信息
# -f, --follow 跟踪实时日志
# --since string 显示自某个timestamp之后的日志,或相对时间,如42m(即42分钟)
# --tail string 从日志末尾显示多少行日志, 默认是all
# -t, --timestamps 显示时间戳
# --until string 显示自某个timestamp之前的日志,或相对时间,如42m(即42分钟)
# 例子:
# 查看指定时间后的日志,只显示最后100行:
docker logs -f -t --since="2018-02-08" --tail=100 CONTAINER_ID
# 查看最近30分钟的日志:
docker logs --since 30m CONTAINER_ID
# 查看某时间之后的日志:
docker logs -t --since="2018-02-08T13:23:37" CONTAINER_ID
# 查看某时间段日志:
docker logs -t --since="2018-02-08T13:23:37" --until "2018-02-09T12:23:37" CONTAINER_ID
2.9. 将容器保存为镜像
# 我们可以通过如下命令将容器保存为镜像
docker commit 容器名 镜像名
3.0 镜像备份与迁移
# 通过save命令将镜像打包成文件,拷贝给别人使用
docker save -o 保存的文件名 镜像名
# 例如:
docker save -o ./ubuntu.tar ubuntu
# 在拿到镜像文件后,可以通过load方法,将镜像加载到本地
docker load -i ./ubuntu.tar