Docker 学习笔记

字数 2006阅读 212

PS:实际是一年前写的。。。

Docker 基本介绍

Docker 是一个开源的应用容器引擎,基于Go 语言并遵从 Apache2.0 协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口,更重要的是容器性能开销极低。

Docker 的应用场景:

  • Web 应用的自动化打包和发布。
  • 自动化测试和持续集成、发布。
  • 在服务型环境中部署和调整数据库或其他的后台应用。
  • 从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。

Docker 的优点:

  • 简化程序:
    Docker 让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,便可以实现虚拟化。Docker 改变了虚拟化的方式,使开发者可以直接将自己的成果放入 Docker 中进行管理。
  • 避免选择恐惧症:
    Docker 镜像中包含了运行环境和配置,所以 Docker 可以简化部署多种应用实例工作。比如 Web 应用、后台应用、数据库应用、大数据应用比如 Hadoop 集群、消息队列等等都可以打包成一个镜像部署。
  • 节省开支

Docker 架构

Docker 使用客户端-服务器 (C/S) 架构模式,使用远程 API 来管理和创建 Docker 容器。
Docker 容器通过 Docker 镜像来创建。


Docker 架构
  • Docker 镜像 (Images):Docker 镜像是用于创建 Docker 容器的模板。
  • Docker 容器 (Container):容器是独立运行的一个或一组应用。
  • Docker 客户端 (Client):Docker 客户端通过命令行或者其他工具使用 Docker API 与 Docker 的守护进程通信。
  • Docker 主机 (Host):一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。
  • Docker 仓库 (Registry):Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。
  • Docker Machine:Docker Machine 是一个简化 Docker 安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装 Docker,比如 VirtualBox、 Digital Ocean、Microsoft Azure。

Docker 容器与 VM 虚拟机的区别

虚拟机具有自己的客户操作系统,运行在单个物理机或宿主操作系统中。我们因此能够运行多个应用程序,而无需安装大量物理机。宿主操作系统可以确保在不同虚拟机之间进行系统性的资源分配和负载均衡。

VM架构

每个虚拟机都有自己独立的操作系统,而不同的容器可以共享同一个操作系统。虚拟机面向操作系统,而 Docker 是面向应用的。
虚拟机可以运行多个进程,而容器作为单个进程运行。容器化与虚拟化之间并不是竞争关系,而是一种互补,用以进一步优化 IT 软件基础设施。

容器架构

Docker 安装

Ubuntu Docker 安装
CentOS Docker 安装
Windows Docker 安装
MacOS Docker 安装

Docker Hello World

Docker 允许你在容器内运行应用程序, 使用 docker run 命令来在容器内运行一个应用程序。
docker run ubuntu:15.10 /bin/echo "Hello world" 输出 Hello world

各个参数解析:

  • docker:Docker 的二进制执行文件。
  • run:与前面的 docker 组合来运行一个容器。
  • ubuntu:15.10:指定要运行的镜像,Docker 首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。
  • /bin/echo "Hello world":在启动的容器里执行的命令

以上命令完整的意思可以解释为:Docker 以 ubuntu15.10 镜像创建一个新容器,然后在容器里执行 bin/echo "Hello world",然后输出结果。

运行交互式的容器

我们通过 Docker 的两个参数 -i -t,让 Docker 运行的容器实现"对话"的能力
docker run -i -t ubuntu:15.10 /bin/bash
各个参数解析:

  • -t:在新容器内指定一个伪终端或终端。
  • -i:允许你对容器内的标准输入 (STDIN) 进行交互。

此时我们已进入一个 ubuntu15.10 系统的容器
我们尝试在容器中运行命令 cat /proc/versionls 分别查看当前系统的版本信息和当前目录下的文件列表。

查看所有容器

docker ps

Docker 容器使用

我们尝试使用 Docker 构建一个 Web 应用程序。
我们将在 Docker 容器中运行一个 Python Flask 应用来运行一个 Web 应用。

docker pull training/webapp  # 载入镜像
docker run -d -P training/webapp python app.py

参数说明:

  • -d:让容器在后台运行。
  • -P:将容器内部使用的网络端口映射到我们使用的主机上。

使用 docker ps 来查看我们正在运行的容器。

  • 查看 Web 应用程序日志,docker logs [ID或者名字]
  • 查看 Web 应用程序容器的进程,docker top [ID或者名字]
  • 检查 Web 应用程序,docker inspect [ID或者名字]
  • 重启 Web 应用容器,docker start [ID或者名字]
  • 停止 Web 应用容器,docker stop [ID或者名字]
  • 移除 Web 应用容器,docker rm [ID或者名字]

Docker 镜像使用

当运行容器时,使用的镜像如果在本地中不存在,Docker 就会自动从 Docker 镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载。

我们可以使用 docker images 来列出本地主机上的镜像。

列出本地主机上的镜像

同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本,如 ubuntu 仓库源里,有 15.1014.04 等多个不同的版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。

所以,我们如果要使用版本为 15.10 的 ubuntu 系统镜像来运行容器时,命令如下:
docker run -t -i ubuntu:15.10 /bin/bash

如果要使用版本为 14.04 的 ubuntu 系统镜像来运行容器时,命令如下:
docker run -t -i ubuntu:14.04 /bin/bash
如果你不指定一个镜像的版本标签,例如你只使用 ubuntu,Docker 将默认使用 ubuntu:latest 镜像。

当我们在本地主机上使用一个不存在的镜像时 Docker 就会自动下载这个镜像。如果我们想预先下载这个镜像,我们可以使用 docker pull 命令来下载它。

我们也可以使用 docker search 命令来搜索镜像。比如我们需要一个httpd的镜像来作为我们的 Web 服务。我们可以通过 docker search httpd

Docker 实例

Docker 安装 Apache

docker pull httpd

docker run -p 80:80 
  -v $PWD/www/:/usr/local/apache2/htdocs/ 
  -v $PWD/conf/httpd.conf:/usr/local/apache2/conf/httpd.conf 
  -v $PWD/logs/:/usr/local/apache2/logs/
  -d httpd

Docker 安装 MySQL

docker pull mysql:5.6

docker run -p 3306:3306 
  --name mymysql 
  -v $PWD/conf/my.cnf:/etc/mysql/my.cnf 
  -v $PWD/logs:/logs 
  -v $PWD/data:/mysql_data 
  -e MYSQL_ROOT_PASSWORD=123456 
  -d mysql:5.6
21cb89213c93d805c5bacf1028a0da7b5c5852761ba81327e6b99bb3ea89930e

Docker 安装 PHP

docker pull php:5.6-fpm

docker run -p 9000:9000 
  --name  myphp-fpm 
  -v ~/nginx/www:/www 
  -v $PWD/conf:/usr/local/etc/php 
  -v $PWD/logs:/phplogs 
  -d php:5.6-fpm
00c5aa4c2f93ec3486936f45b5f2b450187a9d09acb18f5ac9aa7a5f405dbedf

创建镜像

我们使用命令 docker build , 从零开始来创建一个新的镜像。为此,我们需要创建一个 Dockerfile 文件,其中包含一组指令来告诉 Docker 如何构建我们的镜像。

runoob@runoob:~$ cat Dockerfile 
FROM    centos:6.7
MAINTAINER      Fisher "fisher@sudops.com"

RUN     /bin/echo 'root:123456' |chpasswd
RUN     useradd runoob
RUN     /bin/echo 'runoob:123456' |chpasswd
RUN     /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE  22
EXPOSE  80
CMD     /usr/sbin/sshd -D

每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。
第一条 FROM,指定使用哪个镜像源
RUN 指令告诉 Docker 在镜像内执行命令,安装了什么

然后,我们使用 Dockerfile 文件,通过 docker build 命令来构建一个镜像。

runoob@runoob:~$ docker build -t runoob/centos:6.7 .
Sending build context to Docker daemon 17.92 kB
Step 1 : FROM centos:6.7
 ---> d95b5ca17cc3
Step 2 : MAINTAINER Fisher "fisher@sudops.com"
 ---> Using cache
 ---> 0c92299c6f03
Step 3 : RUN /bin/echo 'root:123456' |chpasswd
 ---> Using cache
 ---> 0397ce2fbd0a
Step 4 : RUN useradd runoob
......

引用:
Docker 教程

推荐阅读更多精彩内容