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

官网:https://www.docker.com

相关资料:

  1. Docker入门教程 http://dockone.io/article/111

  2. Docker_百度百科 http://baike.baidu.com/view/11854949.htm

  3. 史上最全Docker资料集粹 http://special.csdncms.csdn.net/BeDocker/

  4. Docker - 话题精华 - 知乎 http://www.zhihu.com/topic/19950993/top-answers

  5. docker 简明教程 | 简果网 http://www.simapple.com/docker-tutorial

Docker与虚拟机比较

作为一种轻量级的虚拟化方式,Docker在运行应用上跟传统的虚拟机方式相比具有显著优势:

  • Docker容器很快,启动和停止可以在秒级实现,这相比传统的虚拟机方式要快得多。

  • Docker容器对系统资源需求很少,一台主机上可以同时运行数千个Docker容器。

  • Docker通过类似Git的操作来方便用户获取、分发和更新应用镜像,指令简明,学习成本较低。

  • Docker通过Dockerfile配置文件来支持灵活的自动化创建和部署机制,提高工作效率。


(本段摘自《Docker技术入门与实战》)

虚拟机实现了硬件上的虚拟,而Docker则实现了操作系统级别的虚拟。

安装

Docker 要求 Ubuntu 系统的内核版本高于 3.10,通过 uname -r 命令查看你当前的内核版本:

[root@bogon ~]#  uname -r
3.10.0-327.22.2.el7.x86_64

Docker支持以下的CentOS版本:

  • CentOS 7 (64-bit)

  • CentOS 6.5 (64-bit) 或更高的版本

Docker 支持以下的 Ubuntu 版本:

  • Ubuntu Precise 12.04 (LTS)

  • Ubuntu Trusty 14.04 (LTS)

  • Ubuntu Wily 15.10

  • 其他更新的版本……

Linux安装

curl -fsSL https://get.docker.com/ | sh

# daocloud.io 国内镜像
curl -sSL https://get.daocloud.io/docker | sh

该安装包适用于 Ubuntu,Debian,Centos 等大部分主流 Linux 发行版。

CentOS7支持使用yum安装:

yum update
yum install docker

查看文档:

查看版本:

docker version

显示:

Client:
 Version:      1.11.2
 API version:  1.23
 Go version:   go1.5.4
 Git commit:   b9f10c9
 Built:        Wed Jun  1 21:23:11 2016
 OS/Arch:      linux/amd64

Server:
 Version:      1.11.2
 API version:  1.23
 Go version:   go1.5.4
 Git commit:   b9f10c9
 Built:        Wed Jun  1 21:23:11 2016
 OS/Arch:      linux/amd64

为了后面的需要,我们这里下载个ubuntu的镜像。

需要先启动docker服务:

service start docker

# 或者
systemctl start docker
docker search ubuntu
docker pull ubuntu

# 查看所有可用镜像
docker images -a

这就下载了最新的ubuntu系统镜像到本地,接下来我们可以从该镜像创建多个容器。具体命令含义下面会有说明。

Docker里比较重要的概念有注册服务器、仓库、镜像、容器。

仓库:注册服务器是存放仓库的地方,其上往往存放着多个仓库。每个仓库集中存放某一类镜像,往往包括多个镜像文件,通过不同的标签(tag)来进行区分。例如存放Ubuntu操作系统镜像的仓库,称为Ubuntu仓库,其中可能包括14.04、12.04等不同版本的镜像。

镜像:Docker镜像(Image)类似于虚拟机镜像,可以将它理解为一个面向Docker引擎的只读模板,包含了文件系统。例如:一个镜像可以只包含一个完整的Ubuntu操作系统环境,可以把它称为一个Ubuntu镜像。

容器:容器是从镜像创建的应用运行实例,可以将其启动、开始、停止、删除,而这些容器都是相互隔离、互不可见的。可以从一个镜像创建无数个容器。平时我们主要操作的就是容器。我们也可以把容器打包成镜像以方便再次使用。镜像自身是只读的。容器从镜像启动的时候,Docker会在镜像的最上层创建一个可写层,镜像本身将保持不变。

客户端和守护进程

这部分将介绍docker的结构以及docker服务的管理。

Docker 的 C/S 模式

Docker 是 C/S 架构,使用client与Server通信。

支持三种连接方式:

  • unix:///var/run/docker.sock

  • tcp://host:port

  • fd://socketfd

Docker 守护进程的配置和操作

使用ps -ef | grep docker查看docker进程。

管理docker服务:

service docker start
service docker stop
service docker restart

如使用service docker start实际上是执行了/bin/systemctl start docker.service命令。
建议重启使用:

systemctl daemon-reload
systemctl restart docker.service

docker守护进程的配置和操作模式:

docker -d [OPTIONS]

-d 以后台方式运行容器。

下面是容器创建时的一些配置,按需添加。初学者可以简单看看,以后需要再来查找。

运行相关:

 -D, --debug=false
 -e,--exec-driver="native"
 -p,--pidfile="/var/run/docker.pid"

服务器相关:

 -G,--group="docker"
 -H,--host=[]
 --tls=false

RemoteAPI相关:

    --api-enable-cors=false

存储相关:

 -S,--storage-driver=""
 --selinux-enabled=false
 --storage-opt=[]

网络设置相关:

 -b,--bridge="" 设置自定义网桥
 --bip=""
 --dns=[]
 --ip=0.0.0.0

启动配置文件

  • Ubuntu: /etc/default/docker

  • CentOS: /etc/sysconfig/docker

如果没有配置文件,可以直接编辑:

vim  /lib/systemd/system/docker.service

里面的ExecStart就是启动配置,默认是:

ExecStart=/usr/bin/docker -H fd://

我们可以加几个配置:

ExecStart=/usr/bin/docker -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock -H fd:// --label name=server_1

然后重启:

systemctl daemon-reload
systemctl restart docker.service

# 如果出问题了,可以使用下面命令查看:
systemctl status docker.service

通过ps -ef | grep docker可以查看刚才添加的信息:

[root@localhost ~]# ps -ef | grep docker
root      8262     1  0 23:50 ?        00:00:00 /usr/bin/docker daemon -H tcp://0.0.0.0:4243 -H unix:///var/run/docker.sock -H fd:// --label name=server_1

解决centos7和docker1.9没有配置文件问题 - 建站 - IT精英团 http://www.itnpc.com/news/web/145083113731628.html

Docker 的远程访问

我们可以从一台安装了docker的机器访问另一台安装了docker的机器。一般情况下我们使用当前机器的docker客户端访问当前机器的Server端。下面演示如何访问其他docker服务端。

  • 第一台IP:192.168.12.3

  • 第二台IP:192.168.12.4

使用第二台安装有docker的服务器做演示。为区分,设置label不同。

修改守护进程(Server)默认的启动配置:

默认是:-H fd://,可修改为:-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock -H fd:// --label name=server_1

可设置多个连接方式。

第一台访问第二台机器的docker服务:

  • 通过http连接Server:

    curl http://192.168.12.4:2375/info

    访问的是服务器192.168.12.4:2375的info接口,返回服务器相关信息。

  • 通过docker客户端访问Server:

    docker -H tcp://192.168.12.4:2375 info

如果是是第一台机器访问第一台机器Docker的服务端,则使用127.0.0.1:2375就行了。

和服务器端一样,客户端也支持三种连接方式,默认是 -H unix:///var/run/docker.sock

  • -H unix:///path/to/sock

  • tcp://host:port

  • fd://socketfd

docker客户端使用docker info默认访问的是本地Server。可以修改环境变量DOCKER_HOST改变默认连接。命令行直接输入:

export DOCKER_HOST="tcp://127.0.0.1:2375"

127.0.0.1:237 可以替换为实际的Server地址。

如果想恢复本地连接,将 DOCKER_HOST 置空即可:

export DOCKER_HOST=""

Docker容器

容器的基本操作

我们可以从镜像中创建容器。

Docker run IMAGE [COMMOND] [ARG...] 在新的容器中执行命令

该命令每运行一次,就创建了一个新的容器。下面演示从下载好的ubuntu镜像中创建并运行一个新的容器:

# 只运行一次命令
docker run ubuntu echo 'hello world' 运行一个新的容器,并执行命令echo

# 创建并运行容器,然后进入容器
docker run -i -t  --name test ubuntu /bin/bash            以交互式终端运行一个新的容器,镜像是ubuntu,使用bash,容器别名test
  • -i 交互式界面,默认是false

  • -t 伪终端,默认false

  • --name 容器别名,默认随机命名

exit 退出交互式界面,容器停止运行。Crtl+P 或者 Crtl+Q 退出交互式界面,容器在后台运行。(注意是大写P和Q)

查看容器:

docker ps            查看正在运行的容器
docker ps -a  查看所有容器
docker ps -l  查看最近一次运行的容器

示例:

[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS                     PORTS               NAMES
8c52c83c1903        redis                       "docker-entrypoint.sh"   2 hours ago         Exited (0) 2 hours ago                         myredis

容器操作:

docker create 容器名或者容器ID    创建容器
docker start [-i] 容器名        启动容器
docker run 容器名或者容器ID    运行容器,相当于docker create + docker start
docker attach 容器名或者容器ID    进入容器的命令行
docker stop 容器名                             停止容器
docker rm 容器名                               删除容器

docker top 容器名            查看WEB应用程序容器的进程
docker inspect 容器名 查看Docker的底层信息

删除容器时,容器必须是停止状态,否则会报错误。

守护式容器

我们可以使用守护式容器运行一个或者多个服务,例如运行lamp服务、redis服务、mysql服务等。

什么是守护式容器?

  • 能够长期运行

  • 没有交互式会话

  • 适合运行应用程序和服务

启动守护式容器:

docker run -d IMAGE [COMMOND] [ARG...]

-d 让容器在后台运行

后台运行任务:

docker run -d --name d1 ubuntu /bin/sh -c "while true;do echo hello world;sleep 1;done;"
b89b9ce64d34bd202a642c8190428f4776f15e882f138949259722f22120201a

返回了一个守护进程的唯一ID。

查看守护进程的运行情况:

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS              PORTS               NAMES
b89b9ce64d34        ubuntu                      "/bin/sh -c 'while tr"   3 minutes ago       Up 3 minutes                            d1

[root@localhost ~]# docker logs -f b89b9ce64d34
hello world
hello world
hello world
hello world
hello world

[root@localhost ~]# docker logs -f -t --tail 2 b89b9ce64d34
2016-06-26T10:13:19.786516589Z hello world
2016-06-26T10:13:20.788871572Z hello world
2016-06-26T10:13:21.791921389Z hello world

[root@localhost ~]# docker top b89b9ce64d34
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                4156                4148                0                   06:05               ?                   00:00:00            /bin/sh -c while true;do echo hello world;sleep 1;done;
root                4850                4156                0                   06:16               ?                   00:00:00            sleep 1
docker logs [-f] [-t] [--tail] 容器名或id        查看容器内WEB应用程序日志
  • -f --follow=true|false,默认false,一直跟随log变化

  • -t --timestamps=true|false,默认false,加上时间戳

  • --tail="all",返回最新多少条日志

在运行的容器中启动新的进程:

docker exec [-d] [-i] [-t] 容器名 [COMMOND] [ARG...]

停止守护式进程:

docker stop 容器名      发送停止信号,等待关闭
docker kill 容器名      直接关闭容器

在容器中部署静态网站

docker run -d -p 80 -i -t ubuntu /bin/bash   主机端口随机
docker run -d -p 8080:80 -i -t ubuntu /bin/bash  主机端口自定义
docker run -d -p 0.0.0.0:80 -i -t ubuntu /bin/bash
docker run -d -p 0.0.0.0:8080:80 -i -t ubuntu /bin/bash
  • -P --publish-all=true|false,默认false

  • -p --publish=[],自定义端口,将容器内部使用的网络端口映射到我们使用的主机上

docker run -d -P training/webapp python app.py 后台运行一个容器应用
docker run -d -p 5000:5000 training/webapp python app.py 容器内部的 5000 端口映射到我们本地主机的 5000 端口上
docker port 容器id            查看到容器的端口映射

Nginx部署示例:

# 创建映射端口为80的交互式界面:
docker run -p 80 --name web -i -t ubuntu /bin/bash

# 第一次使用更新源
apt-get update

# 安装nginx
apt-get install nginx

# 安装vim
apt-get install vim

whereis nginx
nginx: /usr/sbin/nginx /etc/nginx /usr/share/nginx

vim /etc/nginx/conf.d/localhost.conf

发现配置文件在/etc/nginx/conf.d下面:

conf.d/localhost.conf

server {
    listen       80;
    server_name  localhost;
    
    location / {
        root   /var/www/; 
        index  index.html index.htm;
    }   
    
}

新建个目录:

mkdir -p /var/www/

vim /var/www/index.html

内容随便写。

# 启动nginx
nginx

使用Crtl+P(即Crtl+shift+p)退出容器,并后台运行。查看:

[root@localhost ~]# docker port web
80/tcp -> 0.0.0.0:32769

[root@localhost ~]# docker top web
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                12123               12113               0                   07:14               pts/2               00:00:00            /bin/bash
root                12159               12123               0                   07:14               ?                   00:00:00            nginx: master process nginx
33                  12160               12159               0                   07:14               ?                   00:00:00            nginx: worker process

[root@localhost ~]# curl http://127.0.0.1:32769

正常的话会显示网页内容。

如果exit退出了容器,想开启nginx服务,还可以:

docker start web
docker exec web nginx

Docker镜像

搜索镜像

docker search [-s] IMAGE

下载镜像

docker pull [OPTIONS] NAME[:TAG|@DIGEST]

[root@bogon ~]# docker pull ubuntu:16.04
[root@bogon ~]# docker pull daocloud.io/library/ubuntu:16.04

下载镜像名称其实由三部分组成:daocloud.io/library/ubuntu:16.04

其中其中daocloud.io是注册服务器地址,默认是 registry.hub.docker.com;ubuntu是仓库名,16.04是标签名,默认是latest。

查看已下载镜像列表

docker images [-a]

[root@bogon ~]# docker images 
REPOSITORY                       TAG                 IMAGE ID            CREATED             SIZE
daocloud.io/library/ubuntu       16.04               12543ced0f6f        2 weeks ago         122.4 MB
ubutun                           latest              12543ced0f6f        2 weeks ago         122.4 MB
daocloud.io/daocloud/dao-2048    latest              6c1ff658e77e        3 months ago        7.598 MB
daocloud.io/daocloud/alpine      latest              e9f3e32a4303        3 months ago        11.52 MB
daocloud.io/library/centos       7.1.1503            fac97c5c4748        8 months ago        212.1 MB
daocloud.io/daocloud/dao-redis   master-init         173a30377d85        13 months ago       190.4 MB

给镜像添加标签

docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]

[root@bogon ~]# docker tag daocloud.io/library/ubuntu:16.04 ubuntu:latest

删除镜像

docker rmi [OPTIONS] IMAGE [IMAGE...]

# 按标签删除:多个标签,仅会删除当前标签,不会删除镜像
[root@bogon ~]# docker rmi ubuntu:latest
# 按ID删除:直接删除镜像
[root@bogon ~]# docker rmi 12543ced0f6f

选项:

  • -f, --force 强制删除镜像

  • --no-prune 不删除untagged parents

导出镜像

docker save [OPTIONS] IMAGE [IMAGE...]

[root@bogon ~]# docker save -o ubuntu_latest.tar ubuntu:latest
[root@bogon ~]# ls -l
-rw-r--r--. 1 root root 128086528 Jun 28 12:39 ubuntu_latest.tar

选项:

  • -o, --output 写入到文件

导入镜像

docker load --input ubuntu_latest.tar
# 或者
docker load < ubuntu_latest.tar

选项:

  • -i, --input 从压缩包载入镜像

上传镜像

docker pull [OPTIONS] NAME[:TAG|@DIGEST]

选项:

  • --disable-content-trust=true 跳过镜像签名

Docker仓库

仓库是集中存放镜像的地方。官方提供的公共仓库是https://hub.docker.com。不用注册即可使用里面的众多仓库资源,包含了常用的ubuntu、centos、php、nginx、mysql等仓库。

由于国外仓库访问比较慢,可以使用国内的仓库,一般需要注册,使用docker pull的时候需要指明注册服务器地址。

示例:

docker pull registry.aliyuncs.com/acs-sample/mysql

其中registry.aliyuncs.com是注册服务器地址,acs-sample/mysql是仓库名,所有者是acs-sample,没有指定镜像标签,则默认是latest

根据所存储的镜像公开分享与否,Docker仓库可以分为公开仓库(Public)和私有仓库(Private)两种形式。

搭建私有仓库

Docker数据卷及数据卷容器

在使用容器的过程中,我们可能需要共享数据:

  1. 共享本地主机数据到容器;

  2. 共享容器数据到另一个容器。

Docker里的数据卷及数据卷容器恰好满足了这个需求。

数据卷

数据卷(Data Volumes)是一个可供容器使用的特殊目录,它提供了很多有用的特性:

  • 对数据卷的修改会立马生效

  • 数据卷会一直存在,直到没有容器使用

  • 数据卷可以被多个容器使用

数据卷类似于Linux的mount。

创建或运行容器的时候,使用-v创建一个数据卷,多次使用-v可以创建多个数据卷。

docker run  -d -P --name test1 -v /data1  ubuntu

# 挂载本地已有目录到容器中
docker run  -d -P --name test2 -v /tmp/data2:/data2  ubuntu

# 挂载本地已有目录到容器中,指定只读
docker run  -d -P --name test3  -v /tmp/data3:/data3:ro ubuntu

挂载的数据卷默认权限是读写rw

数据卷容器

数据卷容器(Data Volume Dontainers)其实就是一个普通的容器,只是我们专门用它提供数据卷供其它容器挂载使用。

创建数据库容器很简单,创建一个普通容器就行了:

docker run --name db1  -v /data ubuntu

其他容器使用该数据卷容器:

docker run  -it --name test4  --volumes-from db1 ubuntu

使用--volumes-from指定数据卷容器。多个--volumes-from将挂载多个数据卷容器。

注意:使用--volumes-from参数所挂载的数据卷容器本身并不需要保持运行状态。如果删除了挂载的容器,数据卷并不会被自动删除,如果要删除一个数据卷,必需使用docker rm -v命令来指定同时删除管联的容器。

使用Dockerfile创建镜像

(未完待续)

原文发表在:Docker学习笔记 - 飞鸿影~ - 博客园
http://www.cnblogs.com/52fhy/p/5638571.html


飞鸿影
1.4k 声望442 粉丝

一个人至少拥有一个梦想,有一个理由去坚强。心若没有栖息的地方,到哪里都是在流浪。