docker 概念与使用

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。

  • Docker的组成

一个完整的Docker有以下几个部分组成:

docker Client客户端
Docker Daemon守护进程
Docker Image镜像
Docker Container容器

我们通过客户端写命令,然后客户端将命令发送给守护进程,守护进程再将命令执行的结果返回给客户端,这就使我们能通过命令查看执行结果,镜像就是容器的源代码,容器通过镜像启动,使用仓库来保存用户构建的镜像,仓库分为共有和私有。

Docker 使用的是客户端-服务器 (C/S) 架构模式,用远程API来管理和创建Docker容器。Docker 容器通过 Docker 镜像来创建。容器与镜像的关系类似于面向对象编程中的对象与类。

  • 主要特性:

使应用的打包与部署自动化
创建轻量、私密的PAAS环境
使连续的集成/部署、测试自动化
部署、衡量网页app、数据库和后台服务
由于Docker是基于LXC的轻量级虚拟化的特点,相比KVM之类最明显的特点就是启动快,资源占用小。因此对于构建隔离的标准化的运行环境,轻量级的PaaS(如dokku), 构建自动化测试和持续集成环境,以及一切可以横向扩展的应用(尤其是需要快速启停来应对峰谷的web应用)。

  • 容器和 VM(虚拟机)的主要区别

容器提供了基于进程的隔离,而虚拟机提供了资源的完全隔离。虚拟机可能需要一分钟来启动,而容器只需要一秒钟或更短。容器使用宿主操作系统的内核,而虚拟机使用独立的内核

这里写图片描述

Ubuntu Docker 安装

Docker 支持以下的 Ubuntu 版本:

Ubuntu Precise 12.04 (LTS)
Ubuntu Trusty 14.04 (LTS)
Ubuntu Wily 15.10
其他更新的版本……

前提条件
Docker 要求 Ubuntu 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的 Ubuntu 版本是否支持 Docker。
通过 uname -r 命令查看你当前的内核版本
w3cschool@w3cschool:~$ uname -r

root@lingjie:~# uname -r
4.4.0-111-generic

使用脚本安装 Docker
1、获取最新版本的 Docker 安装包
sudo apt-get update

root@lingjie:~# sudo apt-get update
Ign http://us.archive.ubuntu.com trusty InRelease
Ign http://shadowsocks.org squeeze InRelease
Get:1 http://us.archive.ubuntu.com trusty-updates InRelease [65.9 kB]
Ign http://shadowsocks.org squeeze Release.gpg
Get:2 http://security.ubuntu.com trusty-security InRelease [65.9 kB]
Ign http://shadowsocks.org squeeze Release
。。。

sudo apt-get install -y docker.io
root@lingjie:~# sudo apt-get install -y docker.io
Reading package lists… Done
Building dependency tree
Reading state information… Done
The following packages were automatically installed and are no longer required:
linux-headers-4.4.0-101 linux-headers-4.4.0-101-generic
linux-headers-4.4.0-103 linux-headers-4.4.0-103-generic
linux-headers-4.4.0-104 linux-headers-4.4.0-104-generic
。。。
2、启动docker 后台服务
sudo service docker start

Docker Hello World
root@lingjie:~# docker run ubuntu:14.04 /bin/echo “Hello world”
Unable to find image ‘ubuntu:14.04’ locally
14.04: Pulling from ubuntu
8ed980fc53b0: Pull complete
5e83b144a918: Pull complete
fdc9107a8d78: Pull complete
d379e4d1ecf9: Pull complete
8aba6ade50c7: Pull complete
016f143f4997: Pull complete
Digest: sha256:7207427eb6f0d132922aaf1f207af2ab19b8d47ade1195b80303d7ee84022668
Status: Downloaded newer image for ubuntu:14.04
Hello world
root@lingjie:~# docker run ubuntu:14.04 /bin/echo “Hello world”
Hello world

各个参数解析:
docker: Docker 的二进制执行文件。
run:与前面的 docker 组合来运行一个容器。
ubuntu:14.04指定要运行的镜像,Docker首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。
/bin/echo “Hello world”: 在启动的容器里执行的命令
以上命令完整的意思可以解释为:Docker 以 ubuntu:14.04 镜像创建一个新容器,然后在容器里执行 bin/echo “Hello world”,然后输出结果。

运行交互式的容器
我们通过docker的两个参数 -i -t,让docker运行的容器实现”对话”的能力
w3cschool@w3cschool:~$ docker run -i -t ubuntu:14.04 /bin/bash
root@dc0050c79503:/#
各个参数解析:
-t:在新容器内指定一个伪终端或终端。
-i:允许你对容器内的标准输入 (STDIN) 进行交互。
此时我们已进入一个 ubuntu:14.04系统的容器
我们尝试在容器中运行命令 cat /proc/version和ls分别查看当前系统的版本信息和当前目录下的文件列表

我们可以通过运行exit命令或者使用CTRL+D来退出容器。

启动容器(后台模式)
使用以下命令创建一个以进程方式运行的容器
w3cschool@w3cschool:~$ docker run -d ubuntu:14.04 /bin/sh -c “while true; do echo hello world; sleep 1; done”
2b1b7a428627c51ab8810d541d759f072b4fc75487eed05812646b8534a2fe63

在输出中,我们没有看到期望的”hello world”,而是一串长字符
2b1b7a428627c51ab8810d541d759f072b4fc75487eed05812646b8534a2fe63
这个长字符串叫做容器ID,对每个容器来说都是唯一的,我们可以通过容器ID来查看对应的容器发生了什么。
首先,我们需要确认容器有在运行,可以通过 docker ps 来查看
w3cschool@w3cschool:~$ docker ps

CONTAINER ID:容器ID
NAMES:自动分配的容器名称
在容器内使用docker logs命令,查看容器内的标准输出
root@lingjie:~# docker logs 73e851665985
hello world
hello world
hello world
hello world

w3cschool@w3cschool:~$ docker logs amazing_cori

root@lingjie:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
73e851665985 ubuntu:14.04 “/bin/sh -c ‘while t 11 seconds ago Up 10 seconds stoic_almeida

停止容器
我们使用 docker stop 命令来停止容器:

通过docker ps查看,容器已经停止工作:
root@lingjie:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
73e851665985 ubuntu:14.04 “/bin/sh -c ‘while t 5 minutes ago Up 5 minutes stoic_almeida
root@lingjie:~# docker stop 73e851665985
73e851665985
root@lingjie:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

也可以用下面的命令来停止:
root@lingjie:~# docker stop amazing_cori

Docker 容器使用

Docker 客户端
docker 客户端非常简单 ,我们可以直接输入 docker 命令来查看到 Docker 客户端的所有命令选项。
w3cschool@w3cschool:~# docker
可以通过命令 docker command –help 更深入的了解指定的 Docker 命令使用方法。
例如我们要查看 docker stats 指令的具体使用方法:
w3cschool@w3cschool:~# docker stats –help

运行一个web应用
前面我们运行的容器并没有一些什么特别的用处。
接下来让我们尝试使用 docker 构建一个 web 应用程序。
我们将在docker容器中运行一个 Python Flask 应用来运行一个web应用。
root@lingjie:~# docker run -d -P training/webapp python app.py
Unable to find image ‘training/webapp:latest’ locally
latest: Pulling from training/webapp
e9e06b06e14c: Pull complete
。。。
b37deb56df95: Pull complete
02a8815912ca: Already exists
Digest: sha256:06e9c1983bd6d5db5fba376ccd63bfa529e8d02f23d5079b8f74a616308fb11d
Status: Downloaded newer image for training/webapp:latest
fec1552b36b104e6af94120016d4fbe2cfdb9fa087f77f1d4d4ee5535d678b6e

  • 查看 WEB 应用容器

使用 docker ps 来查看我们正在运行的容器
root@lingjie:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fec1552b36b1 training/webapp:latest “python app.py” 23 seconds ago Up 23 seconds 0.0.0.0:32768->5000/tcp elegant_bartik
root@lingjie:~# docker logs elegant_bartik
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)

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

这里多了端口信息。
PORTS
0.0.0.0:32768->5000/tcp
Docker 开放了 5000 端口(默认 Python Flask 端口)映射到主机端口 32768上。

这时我们可以通过浏览器访问WEB应用
http://67.216.xx.xx:32768/

Hello world!

我们也可以指定 -p 标识来绑定指定端口。
root@lingjie:~# docker run -d -p 5000:5000 training/webapp python app.py
abc15b7fd87ae33354d973ed931e1173bbfaeb152e0d423a5babd25db2c5e023
root@lingjie:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
abc15b7fd87a training/webapp:latest “python app.py” 8 seconds ago Up 7 seconds 0.0.0.0:5000->5000/tcp determined_lalande
docker ps查看正在运行的容器
容器内部的 5000 端口映射到我们本地主机的 5000 端口上。

  • 网络端口的快捷方式

通过docker ps 命令可以查看到容器的端口映射,docker还提供了另一个快捷方式:docker port,使用 docker port 可以查看指定 (ID或者名字)容器的某个确定端口映射到宿主机的端口号。
上面我们创建的web应用容器ID为:7a38a1ad55c6 名字为:determined_swanson
我可以使用docker port 7a38a1ad55c6 或docker port determined_swanson来查看容器端口的映射情况
w3cschool@w3cschool:~ dockerport7a38a1ad55c65000/tcp>0.0.0.0:5000w3cschool@w3cschool:  d o c k e r p o r t 7 a 38 a 1 a d 55 c 6 5000 / t c p − > 0.0.0.0 : 5000 w 3 c s c h o o l @ w 3 c s c h o o l :   docker port determined_swanson
5000/tcp -> 0.0.0.0:5000

  • 查看WEB应用程序日志

docker logs [ID或者名字] 可以查看容器内部的标准输出。
root@lingjie:~# docker logs -f abc15b7fd87a
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
116.236.162.42 - - [13/Feb/2018 06:53:48] “GET / HTTP/1.1” 200 -
-f:让 dokcer logs 像使用 tail -f 一样来输出容器内部的标准输出。
从上面,我们可以看到应用程序使用的是 5000 端口并且能够查看到应用程序的访问日志。

  • 查看WEB应用程序容器的进程

我们还可以使用 docker top 来查看容器内部运行的进程
root@lingjie:~# docker top abc15b7fd87a
UID PID PPID C STIME TTY TIME CMD
root 24890 17499 0 01:47 ? 00:00:00 python app.py

  • 检查WEB应用程序

使用 docker inspect 来查看Docker的底层信息。它会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息。
w3cschool@w3cschool:~$ docker inspect determined_swanson
[
{
“Id”: “7a38a1ad55c6914b360b565819604733db751d86afd2575236a70a2519527361”,
“Created”: “2016-05-09T16:20:45.427996598Z”,
“Path”: “python”,
“Args”: [
“app.py”
],
“State”: {
“Status”: “running”,
……

  • 停止WEB应用容器

w3cschool@w3cschool:~$ docker stop determined_swanson
determined_swanson

  • 重启WEB应用容器

已经停止的容器,我们可以使用命令 docker start 来启动。
w3cschool@w3cschool:~$ docker start determined_swanson
determined_swanson
docker ps -l 来查看正在运行的容器

正在运行的容器,我们可以使用 docker restart 命令来重启

  • 移除WEB应用容器

我们可以使用 docker rm 命令来删除不需要的容器
w3cschool@w3cschool:~ dockerrmdeterminedswansondeterminedswansonw3cschool@w3cschool:  d o c k e r r m d e t e r m i n e d s w a n s o n d e t e r m i n e d s w a n s o n 删 除 容 器 时 , 容 器 必 须 是 停 止 状 态 , 否 则 会 报 如 下 错 误 w 3 c s c h o o l @ w 3 c s c h o o l :   docker rm determined_swanson
Error response from daemon: You cannot remove a running container 7a38a1ad55c6914b360b565819604733db751d86afd2575236a70a2519527361. Stop the container before attempting removal or use -f

  • Docker 镜像使用

当运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从 docker 镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载。
下面我们来学习:
1、管理和使用本地 Docker 主机镜像
2、创建镜像

root@lingjie:~# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu 14.04 016f143f4997 2 weeks ago 222 MB
ubuntu 15.10 bfaaabeea063 19 months ago 137.2 MB
training/webapp latest 02a8815912ca 2.752306 years ago 348.8 MB

各个选项说明:
REPOSTITORY:表示镜像的仓库源
TAG:镜像的标签
IMAGE ID:镜像ID
CREATED:镜像创建时间
SIZE:镜像大小
同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本,如ubuntu仓库源里,有15.10、14.04等多个不同的版本,我们使用 REPOSTITORY:TAG 来定义不同的镜像。
所以,我们如果要使用版本为15.10的ubuntu系统镜像来运行容器时,命令如下:
w3cschool@w3cschool:~$ docker run -t -i ubuntu:15.10 /bin/bash

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

获取一个新的镜像
当我们在本地主机上使用一个不存在的镜像时 Docker 就会自动下载这个镜像。如果我们想预先下载这个镜像,我们可以使用 docker pull 命令来下载它。
Cw3cschool@w3cschool:~$ docker pull ubuntu:13.10
13.10: Pulling from library/ubuntu
6599cadaf950: Pull complete
23eda618d451: Pull complete
f0be3084efe9: Pull complete
52de432f084b: Pull complete
a3ed95caeb02: Pull complete
Digest: sha256:15b79a6654811c8d992ebacdfbd5152fcf3d165e374e264076aa435214a947a3
Status: Downloaded newer image for ubuntu:13.10
下载完成后,我们可以直接使用这个镜像来运行容器。

查找镜像
我们可以从 Docker Hub 网站来搜索镜像,Docker Hub 网址为:https://hub.docker.com/
我们也可以使用 docker search 命令来搜索镜像。比如我们需要一个httpd的镜像来作为我们的web服务。我们可以通过 docker search 命令搜索 httpd 来寻找适合我们的镜像。
w3cschool@w3cschool:~$ docker search httpd

root@lingjie:~# docker search httpd
NAME                                DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
httpd                               The Apache HTTP Server Project                  1504      [OK]       
hypriot/rpi-busybox-httpd           Raspberry Pi compatible Docker Image with ...   40                   
centos/httpd                                                                        15                   [OK]
centos/httpd-24-centos7             Platform for running Apache httpd 2.4 or b...   9                    
armhf/httpd                         The Apache HTTP Server Project                  8                    
macadmins/netboot-httpd             use in combination with bruienne/bsdpy          4                    [OK]
salim1983hoop/httpd24               Dockerfile running apache config                2                    [OK]
lolhens/httpd                       Apache httpd 2 Server                           2                    [OK]
fboaventura/dckr-httpd              Small footprint http server to use with ot...   1                    [OK]
rgielen/httpd-image-simple          Docker image for simple Apache httpd based...   1                    [OK]

NAME:镜像仓库源的名称
DESCRIPTION:镜像的描述
OFFICIAL:是否docker官方发布

  • 拖取镜像

我们决定使用上图中的httpd 官方版本的镜像,使用命令 docker pull 来下载镜像。
w3cschool@w3cschool:~$ docker pull httpd
Using default tag: latest
latest: Pulling from library/httpd
8b87079b7a06: Pulling fs layer
a3ed95caeb02: Download complete
0d62ec9c6a76: Download complete
a329d50397b9: Download complete
ea7c1f032b5c: Waiting
be44112b72c7: Waiting
下载完成后,我们就可以使用这个镜像了。

w3cschool@w3cschool:~$ docker run httpd

创建镜像
当我们从docker镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改。
1.从已经创建的容器中更新镜像,并且提交这个镜像
2.使用 Dockerfile 指令来创建一个新的镜像

更新镜像

更新镜像之前,我们需要使用镜像来创建一个容器。

w3cschool@w3cschool:~$ docker run -t -i ubuntu:15.10 /bin/bash
root@e218edb10161:/#
在运行的容器内使用 apt-get update 命令进行更新。
在完成操作之后,输入 exit命令来退出这个容器。
此时ID为e218edb10161的容器,是按我们的需求更改的容器。我们可以通过命令 docker commit来提交容器副本。

w3cschool@w3cschool:~$ docker commit -m=”has update” -a=”youj” e218edb10161 w3cschool/ubuntu:v2
sha256:70bf1840fd7c0d2d8ef0a42a817eb29f854c1af8f7c59fc03ac7bdee9545aff8
各个参数说明:
-m:提交的描述信息
-a:指定镜像作者
e218edb10161:容器ID
w3cschool/ubuntu:v2:指定要创建的目标镜像名

我们可以使用 docker images 命令来查看我们的新镜像 w3cschool/ubuntu:v2:
w3cschool@w3cschool:~$ docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
w3cschool/ubuntu       v2                  70bf1840fd7c        15 seconds ago      158.5 MB
ubuntu              14.04               90d5884b1ee0        5 days ago          188 MB
php                 5.6                 f40e9e0f10c8        9 days ago          444.8 MB
nginx               latest              6f8d099c3adc        12 days ago         182.7 MB
mysql               5.6                 f2e8d6c772c0        3 weeks ago         324.6 MB
httpd               latest              02ef73cf1bc0        3 weeks ago         194.4 MB
ubuntu              15.10               4e3b13c8a266        4 weeks ago         136.3 MB
hello-world         latest              690ed74de00f        6 months ago        960 B
training/webapp     latest              6fae60ef3446        12 months ago       348.8 MB

使用我们的新镜像 w3cschool/ubuntu 来启动一个容器
w3cschool@w3cschool:~$ docker run -t -i w3cschool/ubuntu:v2 /bin/bash
root@1a9fbdeb5da3:/#

  • 构建镜像

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

FROM    centos:6.7
MAINTAINER      Fisher "fisher@sudops.com"

RUN     /bin/echo 'root:123456' |chpasswd
RUN     useradd youj
RUN     /bin/echo 'youj: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 命令来构建一个镜像。
w3cschool@w3cschool:~$ docker build -t youj/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 youj
......

参数说明:
-t :指定要创建的目标镜像名
. :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径
使用docker images 查看创建的镜像已经在列表中存在,镜像ID为860c279d2fec
w3cschool@w3cschool:~$ docker images

REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
youj/centos       6.7                 860c279d2fec        About a minute ago   190.6 MB
w3cschool/ubuntu       v2                  70bf1840fd7c        17 hours ago         158.5 MB
ubuntu              14.04               90d5884b1ee0        6 days ago           188 MB
php                 5.6                 f40e9e0f10c8        10 days ago          444.8 MB
nginx               latest              6f8d099c3adc        12 days ago          182.7 MB
mysql               5.6                 f2e8d6c772c0        3 weeks ago          324.6 MB
httpd               latest              02ef73cf1bc0        3 weeks ago          194.4 MB
ubuntu              15.10               4e3b13c8a266        5 weeks ago          136.3 MB
hello-world         latest              690ed74de00f        6 months ago         960 B
centos              6.7                 d95b5ca17cc3        6 months ago         190.6 MB
training/webapp     latest              6fae60ef3446        12 months ago        348.8 MB

我们可以使用新的镜像来创建容器
w3cschool@w3cschool:~$ docker run -t -i youj/centos:6.7 /bin/bash
[root@41c28d18b5fb /]# id youj
uid=500(youj) gid=500(youj) groups=500(youj)
从上面看到新镜像已经包含我们创建的用户youj

设置镜像标签
我们可以使用 docker tag 命令,为镜像添加一个新的标签。
w3cschool@w3cschool:~$ docker tag 860c279d2fec youj/centos:dev
docker tag 镜像ID,这里是 860c279d2fec ,用户名称、镜像源名(repository name)和新的标签名(tag)。
使用 docker images 命令可以看到,ID为860c279d2fec的镜像多一个标签。

w3cschool@w3cschool:~$ docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
youj/centos       6.7                 860c279d2fec        5 hours ago         190.6 MB
youj/centos       dev                 860c279d2fec        5 hours ago         190.6 MB
w3cschool/ubuntu       v2                  70bf1840fd7c        22 hours ago        158.5 MB
ubuntu              14.04               90d5884b1ee0        6 days ago          188 MB
php                 5.6                 f40e9e0f10c8        10 days ago         444.8 MB
nginx               latest              6f8d099c3adc        13 days ago         182.7 MB
mysql               5.6                 f2e8d6c772c0        3 weeks ago         324.6 MB
httpd               latest              02ef73cf1bc0        3 weeks ago         194.4 MB
ubuntu              15.10               4e3b13c8a266        5 weeks ago         136.3 MB
hello-world         latest              690ed74de00f        6 months ago        960 B
centos              6.7                 d95b5ca17cc3        6 months ago        190.6 MB
training/webapp     latest              6fae60ef3446        12 months ago       348.8 MB


//参考:
1) https://www.w3cschool.cn/docker/docker-tutorial.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值