Docker 是一个开源的应用容器引擎,Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口,更重要的是容器性能开销极低。
容器是一个标准的软件单元,它打包代码及其所有依赖项,以便应用程序从一个计算环境快速可靠地运行到另一个计算环境。Docker 容器镜像是一个轻量级的、独立的、可执行的软件包,包括运行应用程序所需的一切:代码、运行时、系统工具、系统库和设置。
docker容器可以理解为在沙盒中运行的进程。这个沙盒包含了该进程运行所必须的资源,包括文件系统、系统类库、shell 环境等等。但这个沙盒默认是不会运行任何程序的。你需要在沙盒中运行一个进程来启动某一个容器。这个进程是该容器的唯一进程,所以当该进程结束的时候,容器也会完全的停止。
Web 应用的自动化打包和发布。
自动化测试和持续集成、发布。
在服务型环境中部署和调整数据库或其他的后台应用。
不同的软件使用者如,开发人员,运维人员利用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是否安装成功。Docekr使用
镜像使用
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的镜像。
在列出信息中,可以看到几个字段信息
- 来自于哪个仓库,比如 ubuntu
- 镜像的标记,比如 14.04
- 它的 ID 号(唯一)
- 创建时间
- 镜像大小
在本地构建的Docker容器如何与他人共享。Docker提供了Dockerfile。用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。构建这可以将构建的文本文件共享给其他人。作用和Maven类似。
Docker除了使用命令行操作外也可以使用DockerFile来批量操作Docker。
新建一个Dockerfile文件
vim Dockerfile
编写Docker文件
FROM ubuntu:12.04
# MAINTAINER Docker Newbee # 用户在Docker Hub上注册,协同开发需要
RUN apt-get update
RUN apt-get install ping
Dockerfile 基本的语法是:
- 使用#来注释
- FROM 指令告诉 Docker 使用哪个镜像作为基础,格式为
FROM
或FROM
。: - 接着是维护者的信息
- 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
。 指定一个环境变量,会被后续 RUN 指令使用,并在容器运行时保持。
ADD
格式为 ADD
。复制指定的 到容器中的 。 其中 可以是Dockerfile所在目录的一个相对路径;也可以是一个 URL;还可以是一个 tar 文件(自动解压为目录)。
COPY
复制本地主机的
(为 Dockerfile 所在目录的相对路径)到容器中的
。
VOLUME
格式为 VOLUME [“/data”]。创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。
使用 docker build [选项] 路径
来生成镜像:
sudo docker build -t="ouruser/sinatra:v2" .
-t
标记来添加 tag,指定新的镜像的信息。 “.”
是 Dockerfile 所在的路径(当前目录),也可以替换为一个具体的 Dockerfile 的路径。
build 进程在执行操作后,它要做的第一件事情就是上传这个 Dockerfile 内容,因为所有的操作都要依据 Dockerfile 来进行。 然后,Dockfile 中的指令被一条一条的执行。每一步都创建了一个新的容器,在容器中执行指令并提交修改(就跟之前介绍过的 docker commit 一样)。当所有的指令都执行完毕之后,返回了最终的镜像 id。所有的中间步骤所产生的容器都被删除和清理了。
更多命令
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 信号给容器。
容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -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
映射容器端口到宿主主机的实现
容器可以主动访问到外部网络的连接,但是外部网络无法访问到容器。
容器所有到外部网络的连接,源地址都会被NAT成本地系统的IP地址。这是使用 iptables 的源地址伪装操作实现的。和虚拟机时一样的由dhcp服务器自动分配动态ip。希望永久绑定到某个固定的 IP 地址,可以在 Docker 配置文件 /etc/default/docker 中指定DOCKER_OPTS=“–ip=IP_ADDRESS”,之后重启 Docker 服务即可生效。
在Unbuntu容器中使用ip addr
源地址在 172.17.0.0/16 网段,目标地址为其他网段(外部网络)的流量动态伪装为从系统网卡发出。
容器允许外部访问,可以在 docker run 时候通过 -p 或 -P 参数来启用。不管用那种办法,其实也是在本地的 iptable 的 NAT 表中添加相应的规则。
用户可以通过-p IP:host_port:container_port
或 -p IP::port
来指定允许访问容器的主机上的 IP、接口等,以制定更严格的规则。
Docker数据共享
Docker端口设置
仓库(Repository)是集中存放镜像的地方。
可以从仓库获取已有的镜像,也可以将自定义配置的容器上传为镜像。
注册:在 https://hub.docker.com 免费注册一个 Docker 账号。
登录:docker login
退出:docker logout
搜索镜像: docker search
下载镜像:docker pull
上传镜像:docker push [options]
Docker安装Ubuntu