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:~
dockerrmdeterminedswansondeterminedswanson删除容器时,容器必须是停止状态,否则会报如下错误w3cschool@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