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安装
中文安装手册 菜鸟安装手册
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 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 的路径。
build 进程在执行操作后,它要做的第一件事情就是上传这个 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
映射容器端口到宿主主机的实现 容器可以主动访问到外部网络的连接,但是外部网络无法访问到容器。
容器所有到外部网络的连接,源地址都会被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端口设置
Docker仓库
仓库(Repository)是集中存放镜像的地方。
可以从仓库获取已有的镜像,也可以将自定义配置的容器上传为镜像。
注册:在 https://hub.docker.com 免费注册一个 Docker 账号。
登录:docker login
退出:docker logout
搜索镜像: docker search <name>
下载镜像:docker pull <name>
上传镜像:docker push [options]
Docker安装Ubuntu
|