Docker简介
Docker 是一个开源应用程序容器引擎。 Docker 允许开发人员将他们的应用程序和依赖包打包到一个轻量级、可移植的容器中,然后将其发布到任何流行的 Linux 机器上,这些机器也可以虚拟化。容器完全使用沙箱机制,相互之间没有任何接口。更重要的是,容器性能开销极低。
容器是一种标准软件单元,它打包代码及其所有依赖项,以便应用程序从一个计算环境快速可靠地运行到另一个计算环境。 Docker 容器映像是一个轻量级、独立的可执行软件包,其中包含运行应用程序所需的一切:代码、运行时、系统工具、系统库和设置。
Docker容器可以理解为运行在沙箱中的进程。这个沙箱包含了进程运行所必需的资源,包括文件系统、系统库、shell环境等。但是这个沙箱默认不会运行任何程序。您需要在沙箱中运行一个进程来启动容器。该进程是容器的唯一进程,因此当该进程结束时,容器将完全停止。
Docker应用场景
-
Web 应用程序的自动化打包和发布。
-
自动化测试和持续集成和发布。
-
在基于服务的环境中部署和调整数据库或其他后端应用程序。
Docker优势
-
不同的软件用户,比如开发人员、运维人员,都可以使用Docker“在我的机器上运行得更快、更方便”。
-
将软件打包成标准化单元以进行开发、交付和部署。
-
Docker 容器映像是一个轻量级、独立的可执行软件包,其中包含运行应用程序所需的一切:代码、运行时、系统工具、系统库和设置。
Docker的优点主要解决以下难点:
- 发布到任何流行的 Linux 计算机或通过 Windows Server 部署到 Windows
- 解决环境(切换/配置)问题和开发应用程序一般包括多个环境、开发、测试生产环境。不同的环境需要不同的运行环境,切换时需要修改和配置。 Docker可以将不同的环境打包成独立的容器。
- 应用需要隔离,多个应用部署在同一台服务器上。不同技术栈的应用程序的依赖软件都安装在同一台服务器上,这可能会导致各种冲突/不兼容。 Docker可以实现功能隔离,打包后的容器是一个独立的软件包。
- 解决环境(切换/配置)、快速部署。开发环境构建war包并部署到Linux上。需要先下载Linux上的Java、Tomcat、MySQL,配置相应的环境变量,并将war包复制到Tomcat的webapps文件夹下才能运行。 Docker容器包含了这些环境,部署包只需要拉取其他服务器上的Doker镜像即可。 Docker在底层利用Linux的cgroup和namespace技术来实现应用程序隔离。
综上所述:
Docker将一整套环境打包封装成镜像,无需重复配置环境,解决环境带来的种种问题。
Docker容器间是进程隔离的,比虚拟机更轻量级。
Docker安装
Docker使用
查看版本
docker version
查看docker版本,也用于产看docker是否安装成功。文档库使用
镜子的使用
Docker镜像就是一个可获取额具有基本配置的Docker容器。
docker pull
命令来从仓库获取所需要的镜像。
sudo docker pull registry.hub.docker.com/ubuntu:12.04 命令,即从注册服务器registry.hub.docker.com 中的 ubuntu 仓库来下载标记为 12.04 的镜像。有时候官方仓库注册服务器下载较慢,可以从其他仓库下载。 从其它仓库下载时需要指定完整的仓库注册服务器地址。
sudo docker pull dl.dockerpool.com:5000/ubuntu:12.04
容器配置
docker run
命令来在容器内运行一个应用程序。
如运行刚下载的ubuntu虚拟机容器:
通过 docker 的两个参数 -i -t,让 docker 运行的容器实现"对话"的能力:sudo docker run -i -t ubuntu:12.04 /bin/bash
交互容器。-t: 在新容器内指定一个伪终端或终端。-i: 允许你对容器内的标准输入 (STDIN) 进行交互。exit 命令或者使用 CTRL+D 来退出容器。
docker run ubuntu:12.04 /bin/echo "Hello world"
运行应用程序。
docker run命令有两个参数,一个是镜像名,一个是要在镜像中运行的命令。
交互式容器用于对应用所需环境的配置,例如安装的为ubuntu环境进入交互式命令后就跟操作ubuntu虚拟机时一样的。sudo apt install
安装等。主要用于对容器的环境配置,如应用下载,文件配置等。例如Java Web需要配置JRE、Tomcat等。
非交互式主要用于测试。
配置完成后,请务必将更改保存到容器中。
docker commit container[id] container[name]
使用 docker ps -l
命令获得安装完ping命令之后容器的id。
使用docker commit id name
命令将容器保存,id是前一个命令获取的,name要保存的容器名称。无需拷贝完整的id,通常来讲最开始的三至四个字母即可区分。
启动容器
通过-d
命令来创建一个进程式的容器。
docker run -d ubuntu:12.04 /bin/bash -c "while true; do echo hello world; sleep 1; done"
循环输出helloword的进程。启动进程后输出的是一个长字符串,是容器 ID,用来标识的容器进程。
docker start container[id]
启动一个已停止的容器。
查看进度
docker ps
查看正在运行的进程
输出详情介绍:
CONTAINER ID
: 容器 ID。
IMAGE
: 使用的镜像。
COMMAND
: 启动容器时运行的命令。
CREATED
: 容器的创建时间。
STATUS
: 容器状态。
状态有7种:
created(已创建)
restarting(重启中)
running 或 Up(运行中)
removing(迁移中)
paused(暂停)
exited(停止)
dead(死亡)
PORTS
: 容器的端口信息和使用的连接类型(tcp\udp)。
NAMES
: 自动分配的容器名称。
使用
docker ps
命令可以查看所有正在运行中的容器列表,使用docker inspect
命令我们可以查看更详细的关于某一个容器的信息。
docker logs container[id]
命令,查看容器内的标准输出。可以看到输出的helloword。id也不需要全盘赋值,只要前几位即可。使用容器分配的NAMES
属性也可以查看。
进入容器
在RUN使用 -d 参数时,容器启动后会进入后台。此时想要进入容器,可以通过以下指令进入:
-
docker attach id
exit从这个容器退出,会导致容器的停止。 -
docker exec id
:exit命令会退出容器终端,但不会导致容器的停止。
停止容器
docker stop container[id]
命令来停止容器。使用容器分配的NAMES
属性也可以。
重启容器
停止的容器可以通过docker restart
重启。
镜像搜索
docker search 镜像名字
来检索名字叫做tutorial的镜像。
docker images
显示本地已有的镜像。
在列出的信息中,可以看到几个字段信息
- 来自哪个仓库,比如ubuntu
- 图片标签,例如14.04
- 它的 ID 号(唯一)
- 创建时间
- 图片大小
Dockerfile
如何与其他人共享本地构建的 Docker 容器。 Docker 提供了 Dockerfile。用于构建图像的文本文件。文本内容包含构建镜像所需的说明和说明。构建 这使您可以与其他人共享构建的文本文件。功能与Maven类似。
除了命令行操作之外,Docker还可以使用DockerFile来批量操作Docker。
创建一个新的 Dockerfile
vim Dockerfile
编写 Docker 文件
FROM ubuntu:12.04
# MAINTAINER Docker Newbee <newbee@docker.com> # 用户在Docker Hub上注册,协同开发需要
RUN apt-get update
RUN apt-get install ping
Dockerfile 的基本语法是:
- 使用#来评论
- FROM 指令告诉 Docker 使用哪个镜像作为基础,格式为
FROM<image>
或FROM <image>:<tag>
。- 接下来是维护者的信息
- RUN开头的指令会在创建中运行,比如安装一个软件包,在这里使用 apt-get 来安装了一些软件。
&&
符号连接命令,来减少RUN指令。
运行该文件的意义是在构建的Ubuntu容器中运行RUN后面的指令。更多介绍:http://www.dockerinfo.net/dockerfile%e4%bb%8b%e7%bb%8d
常见语法:
FROM
MAINTAINER
指定维护者信息
RUN
在当前镜像基础上执行指定命令
EXPOSE
Docker 服务端容器暴露的端口号,供互联系统使用。在启动容器时需要通过 -P,Docker 主机会自动分配一个端口转发到指定的端口。
ENV
格式为 ENV <key> <value>
。 指定一个环境变量,会被后续 RUN 指令使用,并在容器运行时保持。
ADD
格式为 ADD <src> <dest>
。复制指定的 到容器中的 。 其中 可以是Dockerfile所在目录的一个相对路径;也可以是一个 URL;还可以是一个 tar 文件(自动解压为目录)。
COPY
复制本地主机的<src>
(为 Dockerfile 所在目录的相对路径)到容器中的 <dest>
。
VOLUME
格式为 VOLUME [“/data”]。创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。
使用 docker build [选项] 路径
来生成镜像:
sudo docker build -t="ouruser/sinatra:v2" .
-t
标记来添加 tag,指定新的镜像的信息。 “.”
是 Dockerfile 所在的路径(当前目录),也可以替换为一个具体的 Dockerfile 的路径。
构建过程执行操作后,首先要做的就是上传Dockerfile的内容,因为所有操作都必须基于Dockerfile进行。然后,Dockfile中的指令就会被一一执行。每一步都会创建一个新的容器,执行容器中的指令并提交更改(就像之前介绍的 docker commit 一样)。当所有指令执行完毕后,返回最终的图像ID。中间步骤创建的所有容器都将被删除并清理。
Dokcer构建
Docker容器共享,Dokerfile可以将文件发送给其他用户,来构建相同的Docker容器。如果要导出本地某个容器,可以使用 docker export
命令。
出口集装箱
docker export 1e560fca3906 > ubuntu.tar
将文件打包为一个tar压缩包。
进口集装箱
docker import
从容器快照文件中再导入为镜像
docker import - test/ubuntu:v1
可以使用 docker import 从容器快照文件中再导入为镜像。
删除容器
docker rm
来删除一个处于终止状态的容器。
如果要删除一个运行中的容器,可以添加 -f 参数。Docker 会发送 SIGKILL 信号给容器。
Docker端口设置
容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -P
或-p
参数来指定端口映射。
当使用 -P 标志时,Docker 会随机将 49000 到 49900 之间的端口映射到内部容器打开的网络端口。使用docker ps查看。
-p(小写的)则可以指定要映射的端口,并且,在一个指定端口上只可以绑定一个容器。支持的格式有ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort。
sudo docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
容器端口映射到宿主机host的实现
容器可以主动访问到外部网络的连接,但是外部网络无法访问到容器。
对于从容器到外部网络的所有连接,源地址将被 NAT 为本地系统的 IP 地址。这是使用 iptables 的源地址伪装操作来完成的。就像虚拟机一样,动态IP是由dhcp服务器自动分配的。如果想永久绑定固定IP地址,可以在Docker配置文件/etc/default/docker中指定DOCKER_OPTS="–ip=IP_ADDRESS",然后重启Docker服务即可生效。
在Unbuntu容器中使用ip addr
源地址在 172.17.0.0/16 网段,目标地址为其他网段(外部网络)的流量动态伪装为从系统网卡发出。
容器允许外部访问,可以在docker运行时通过-p或-P参数启用。无论使用哪种方法,实际上都是将相应的规则添加到本地iptable的NAT表中。
用户可以通过-p IP:host_port:container_port
或 -p IP::port
来指定允许访问容器的主机上的 IP、接口等,以制定更严格的规则。
Docker数据共享
Docker仓库
存储库是集中存储图像的地方。
您可以从仓库获取现有镜像,也可以将自定义配置的容器作为镜像上传。
注册:在 https://hub.docker.com 免费注册一个 Docker 账号。
登录:docker login
退出:docker logout
搜索镜像: docker search <name>
下载镜像:docker pull <name>
上传镜像:docker push [options]