Docker学习笔记

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在运行应用上跟传统的虚拟机方式相比具有显著优势:

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

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

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

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

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

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

安装

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

[root@bogon ~]# uname -r3.10.0-327.22.2.el7.x86_64

Docker支持以下的CentOS版本:

  1. CentOS 7 (64-bit)

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

Docker 支持以下的 Ubuntu 版本:

  1. Ubuntu Precise 12.04 (LTS)

  2. Ubuntu Trusty 14.04 (LTS)

  3. Ubuntu Wily 15.10

  4. 其他更新的版本……

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 updateyum install docker

查看文档:

  1. https://docs.docker.com/engine/installation/linux/centos

  2. http://docs.daocloud.io/faq/install-docker-daocloud

查看版本:

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通信。

支持三种连接方式:

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

  2. tcp://host:port

  3. 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

启动配置文件

  1. Ubuntu: /etc/default/docker

  2. 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服务端。

  1. 第一台IP:192.168.12.3

  2. 第二台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服务:

  1. 通过http连接Server:

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

  1. 通过docker客户端访问Server:

docker -H tcp://192.168.12.4:2375 info

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

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

  1. -H unix:///path/to/sock

  2. tcp://host:port

  3. 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

  1. -i 交互式界面,默认是false

  2. -t 伪终端,默认false

  3. --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服务等。

什么是守护式容器?

  1. 能够长期运行

  2. 没有交互式会话

  3. 适合运行应用程序和服务

启动守护式容器:

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应用程序日志
  1. -f --follow=true|false,默认false,一直跟随log变化

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

  3. --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/bashdocker run -d -p 0.0.0.0:8080:80 -i -t ubuntu /bin/bash
  1. -P --publish-all=true|false,默认false

  2. -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# 安装nginxapt-get install nginx# 安装vimapt-get install vimwhereis nginxnginx: /usr/sbin/nginx /etc/nginx /usr/share/nginxvim /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

内容随便写。

# 启动nginxnginx

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

[root@localhost ~]# docker port web80/tcp -> 0.0.0.0:32769[root@localhost ~]# docker top webUID                 PID                 PPID                C                   STIME               TTY                 TIME                CMDroot                12123               12113               0                   07:14               pts/2               00:00:00            /bin/bashroot                12159               12123               0                   07:14               ?                   00:00:00            nginx: master process nginx33                  12160               12159               0                   07:14               ?                   00:00:00            nginx: worker process[root@localhost ~]# curl http://127.0.0.1:32769

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

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

docker start webdocker 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
选项:

  1. -f, --force 强制删除镜像

  2. --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
选项:

  1. -o, --output 写入到文件

导入镜像

docker load --input ubuntu_latest.tar

或者

docker load
选项:

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

上传镜像

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

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

Docker仓库

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

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

  1. DaoCloud https://www.daocloud.io/

  2. 阿里云 https://dev.aliyun.com/search.html?spm=5176.775974865.0.0.Iot0iJ

  3. 网易蜂巢 https://c.163.com/

示例:

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)是一个可供容器使用的特殊目录,它提供了很多有用的特性:

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

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

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

数据卷类似于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

关键字:docker

版权声明

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处。如若内容有涉嫌抄袭侵权/违法违规/事实不符,请点击 举报 进行投诉反馈!

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部