docker技术与入门实战
读书笔记
简介
docker引擎的基础是linux容器(Linux Containers,LXC)技术。具有很多优势。自行百度
docker核心概念:
镜像:docker镜像类似于虚拟机镜像,镜像是创建docker容器的基础
容器:类似于一个轻量级的沙箱,docker利用容器来运行隔离应用;容器是从镜像创建的应用实例,可以将其启动、开始、暂停、删除。可以将容器当成一个独立的系统。
仓库 :docker仓库类似于git仓库,是docker集中存放镜像文件的场所。
docker安装
官方教程安装docker
https://docs.docker.com/install/linux/docker-ce/centos/
# 配置文件 /etc/sysconfig/docker
chkconfig docker on # 加入开机启动
service docker start # 启动docker服务
由于docker镜像默认使用dockerhub,我们使用国内的配置加速镜像的下载
参考博客地址:
https://blog.csdn.net/lidai352710967/article/details/81118542
镜像
镜像是docker运行容器的前提
获取镜像
$ docker pull NAME[:TAG]
默认从dockerhub上获取镜像,如果不显示地指定TAG,则默认会选择latest标签,也就是下载仓库中最新的镜像
用户也可以从其他仓库下载镜像,例如从DockerPool社区的静香园下载最新的Ubuntu镜像。
$ docker pull dl.dockerpoll.com:5000/ubuntu
查看镜像信息
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
youkou1/fastdfs latest 8487e86fc6ee 9 months ago 464MB
delron/elasticsearch-ik 2.4.6-1.0 095b6487fb77 9 months ago 689MB
- 来自哪个仓库,比如 youkou1/fastdfs
- 镜像的标签信息,比如 latest
- 镜像的ID号(唯一)
- 创建时间
- 镜像大小
搜索镜像
使用docker search命令可以搜索远端仓库中共享的镜像,默认搜索dockerhub
docker search python or reids
删除镜像
docker rmi IMAGE[IMAGE...]
其中IMAGE也可为标签或者ID(也可以是ID能区分的部分前缀串),docker rmi 命令指示删除了该镜像多个标签中的指定的标签,当本地只有一个标签是,该命令会彻底删除该镜像。
docker rmi youkou1/fastdfs:latest
当适用docker rmi 命令后面跟上镜像的ID时,会先尝试删除所有指向该镜像的标签,然后删除该镜像文件本身。如果该镜像创建的容器存在是,镜像文件默认是无法被删除的。
我们要删除镜像,线删除该镜像依赖的所有容器,在删除镜像。
创建镜像
1、基于已有镜像容器创建
命令格式:docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
主要选项包括:
- -a, --author="" 作者信息。
- -m, --message="" 提交信息
- -p,–pause=true 提交是暂停容器运行
$ docker run -ti ubuntu:14.04 /bin/bash
root@a925cb40b3f0:/# touch test
root@a925cb40b3f0:/# exit
该容器和原来的镜像相比已经发生了改变,可以使用docker commit命令来提交为一个新的镜像。提交时可以使用ID或者名称来指定容器
$ docker commit -m "create new docker image" -a "masicro" bd3a2880e03f test
sha256:44305b8cbe66182aecd759f81f2d053f314ec59bb801319585c03d01cc076894
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test latest 44305b8cbe66 12 seconds ago 464MB
youkou1/fastdfs latest 8487e86fc6ee 9 months ago 464MB
delron/elasticsearch-ik 2.4.6-1.0 095b6487fb77 9 months ago 689MB
2、基于本地模版导入
首先下载一个镜像
$ cat ubuntu-14.04-x86_64-minimal.targz
$ docker import - ubuntu:14.04
$ docker images # 可以看到镜像
3、存出和载入镜像
可以使用docker save 和 docker load 命令来存出和载入镜像
存出镜像
将镜像保存到本地
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test latest 44305b8cbe66 2 hours ago 464MB
youkou1/fastdfs latest 8487e86fc6ee 9 months ago 464MB
delron/elasticsearch-ik 2.4.6-1.0 095b6487fb77 9 months ago 689MB
$ docker save -o test.tar test:latest
-o, --output string Write to a file, instead of STDOUT
可以使用docker load 从本地文件在导入到本地镜像库
$ docker load --input test.tar
$ docker load < test.tar
上传镜像
使用docker pull 命令上传镜像到仓库,默认上传到dockerhub官方仓库
命令格式: docker pull NAME[:TAG]
注意:第一次上传会提示输入登陆信息或注册
容器
新建容器
可以使用docker create命令创建一个容器
$ docker create -it test:latest
使用docker create 创建的容器处于停止状态,可以使用docker start命令来启动它。
新建并启动容器
容器启动有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将终止状态的容器重新启动。所需要的命令主要是docker run,等价于先执行docker create命令,在执行docker start命令。
当利用docker run 来创建并启动容器是,docker在后台运行的标准操作包括:
- 检查本地是否存在指定镜像,不存在就从公有仓库下载
- 利用镜像创建并启动一个容器
- 分配一个文件系统,并在只读的镜像层外挂载一层可读写层
- 从宿主主机配置的网桥接口中桥接一个虚拟接口道容器中
- 从地址次配置一个IP地址给容器
- 执行用户指定的应用程序
- 执行完毕后容器被终止
下面命令则启动一个bash终端,允许用户进行交互:
$ docker run -t -i test:latest /bin/bash
其中
- -t 选项让docker分配一个为终端(pseudo-tty)并绑定到容器的标准输入上,
- -i 选项则让容器的标准输入保持打开
- -d 选项,让容器以daement方式运行
终止容器
可以使用docker stop来终止一个运行中的容器
命令格式:docker stop [-t |–time[= 10]]。他会首先向容器发送SIGTERM信号,等待一段时间后(默认10s),在发送SIGKILL信号终止容器。
此外当docker容器中指定的应用终结是,容器也自动终止。
进入容器
在使用-d参数时,容器会进入后台,用户无法看到容器中的信息。某些时候如果需要进入容器进行操作,有很多方法,包括使用docker attach命令、docker exec命令,以及nsenter工具等
attach命令
docker attach是docker自带的命令
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bd3a2880e03f youkou1/fastdfs "/usr/bin/start1.sh …" 3 weeks ago Up 3 weeks storage
3e8893684da1 youkou1/fastdfs "/usr/bin/start1.sh …" 3 weeks ago Up 3 weeks tracker
a645ecf4e183 delron/elasticsearch-ik:2.4.6-1.0 "/docker-entrypoint.…" 7 weeks ago Up 5 weeks elasticsearch
$ docker attach elasticsearch
使用attach命令有时候并不方便。当多个窗口同时attach到同一个容器的时候们所有的窗口都会通不显示。当某个窗口因命令阻塞时,其他窗口也无法执行操作了。
exec命令
docker自1.3版本起,提供了更加方便的工具exec,可以直接在容器内运行命令
$ docker exec -ti a645ecf4e183 /bin/bash
nsenter工具(未完成)
删除容器
可以使用docker rm 命令删除处于终止状态的容器,命令格式为docker rm [OPTIONS] CONTAINER [CONTAINER…],其中支持的选项
- -f,–force=false 强行终止并删除一个运行中的容器
- -l,–link=false 删除容器的链接,但保留容器
- -v,–volumes=false删除容器挂载的数据卷
如下,查看处于终止状态的容器,并删除
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
29ba88dfc511 hello-world "/hello" 10 seconds ago Exited (0) 8 seconds ago relaxed_noether
bd3a2880e03f youkou1/fastdfs "/usr/bin/start1.sh …" 3 weeks ago Up 3 weeks storage
3e8893684da1 youkou1/fastdfs "/usr/bin/start1.sh …" 3 weeks ago Up 3 weeks tracker
a645ecf4e183 delron/elasticsearch-ik:2.4.6-1.0 "/docker-entrypoint.…" 7 weeks ago Up 5 weeks
$ docker rm 29b
29b
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bd3a2880e03f youkou1/fastdfs "/usr/bin/start1.sh …" 3 weeks ago Up 3 weeks storage
3e8893684da1 youkou1/fastdfs "/usr/bin/start1.sh …" 3 weeks ago Up 3 weeks tracker
a645ecf4e183 delron/elasticsearch-ik:2.4.6-1.0 "/docker-entrypoint.…" 7 weeks ago Up 5 weeks elasticsearch
要强制删除一个容器
$ docker rm -f CONTAINER_ID
导入和导出容器
导出容器是指导出一个已经创建的容器到一个文件,不管此时这个容器是否处于运行状态,可以使用docker export命令,命令格式:docker export CONTAINER
$ docker export a64 >test_elastic.tar
$ ls
test_elastic.tar
导入容器
导出的文件又可以使用docker import 命令导入,称为镜像
$ docker import test_elastic.tar test/elastic:v1.0
使用docker load导入镜像和使用docker import导入镜像的区别:
容器快照文件将丢弃所有的历史记录和元数据信息(仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也要大。此外从容器快照文件导入时,可以重新制定标签等元数据信息。
小结:
在生产环境中,由于容器自身轻量级特征,推荐使用时在容器前端引入HA(高可靠性)机制,例如使用HAProxy工具代理容器访问,这样容器出现故障时,可以快速切换到其他容器,还可以自动重启故障容器。
仓库
仓库是集中存放镜像的地方。仓库又分为公共仓库和私有仓库。
Docker Hub
Docker 官方维护的一个公共仓库,其中已经包括15000多个镜像。大部分的需求都可以通过Docker Hub中直接下载镜像来实现。
可以使用docker login 命令来输入用户名、绵绵和邮箱来完成登陆注册,注册成功后,本地用户目录的.dockercfg中将保存用户的认证信息
基本操作
使用docker search 命令无须登陆,来查询官方仓库中的镜像,并利用docker pull命令下载到本地
$ docker search redis -s 50
Flag --stars has been deprecated, use --filter=stars=3 instead
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
redis Redis is an open source key-value store that… 6663 [OK]
bitnami/redis Bitnami Redis Docker Image 106 [OK]
sameersbn/redis 76 [OK]
$ docker pull redis
自动创建
自动创建对于需要经常升级镜像内程序的来说非常方便。
配置自动创建,包含以下步骤:
- 创建并登陆dockerhub,以及目标网站;*在目标网站中连接账户到dockerhub
- 在dockerhub上配置一个自动创建
- 选取一个目标网站中的项目(需要含dockerfile)和分支
- 指定dockerfile的位置,并创建提交
- 之后,可以砸docker hub的“自定创建”页面中跟中每次创建的状态
创建和使用私有仓库(未完成)
使用regisry镜像创建私有仓库
$ docker run -d -p 5000:5000 registry
这讲自动下载并启动一个registry容器,创建本地私有仓库服务。
默认会将仓库创建在容器的/tmp/registry目录下。可以通过 -v 参数将镜像文件存放到指定路径
$ docker run -d -p 5000:5000 -v /home/docker_data/registry:/tmp/registry registry
此时,在本地将启动一个私有仓库服务,监听端口为5000
数据管理
用户在使用docker的过程中,往往需要能查看容器内应用产生的数据,或者需要把容器内的数据进行备份,甚至多个容器之间进行数据的共享。
容器管理数据主要有两种方式:
- 数据卷(Data Volumes)
- 数据卷容器(Data Volumes Dontainers)
数据卷
数据卷是一个可供容器使用的特殊目录,它绕过文件系统,可以提供很多有用的特性
- 数据卷可以在容器之间共享和重用
- 对数据卷的修改会立马生效
- 对数据卷的更新,不会影响到镜像
- 卷会一直存在,直到没有容器使用
数据卷的使用,类似于linux下对目录或文件进行mount操作
在容器中创建一个数据卷
使用docker run命令时,使用 -v 标记可以在容器内创建 一个数据卷,多次使用可以创建多个
使用training/webapp镜像创建一个web容器,并创建一个数据卷挂载到容器的/webapp目录
$ docker run -d -p --name web -v /webapp training/webapp python app.py
挂载一个本地主机目录作为数据卷
$ docker run -d -P --name web -v /str/webapp:/opt/webapp:ro training/webapp python app.py
上面语句表示,将本地/str/webapp目录到容器的/opt/webapp目录,其中ro表示容器只读。docker挂载数据卷默认权限是读写(rw)。用户可以放置一些程序或者数据到本地目录中,然后在容器内部运行和使用
挂载本地主机文件作为数据卷
-v 标记也可以从主机挂载单个文件到容器中我作为数据卷
docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash
这样就可以记录在容器输入过的命令历史了
注意:如果挂载文件到容器,使用文件编辑工具编辑该文件时,恳会造成inode的改变,这回导致报错
数据卷容器(未完结)
假如用户需要在容器之间共享一些持续更新的数据,最简单的方式就是使用数据卷容器,数据卷容器其实就是一个普通的容器,专门用它提供数据卷供其他容器挂载。
创建数据卷容器dbdata,从镜像Ubuntu中
$ docker run -it -v /dbdata --name dbdata CentOS
可以在其他容器中使用 --volumes-from 来挂载dbdata容器中的数据卷
# 创建db1,db2两个容器,并从dbdata容器中挂载数据卷
$ docker run -it --volumes-from dbdata --name db1 ubuntu
$ docker run -it --volumes-from dbdata --name db2 ubuntu
网络基础配置
docker目前提供了映射端口到宿主主机和容器互联来为容器提供网络
端口映射实现访问容器
从外部访问容器应用
在启动容器时,如果不指定对应参数,在容器外部是无法通过网络来访问容器内的网络应用和服务的。
当容器中运行一些网络用用,要让外部访问这些应用时,可以通过-P或-p参数;当适用-P 时,docker会随机映射一个49000~49900的端口值容器内部开放的网络端口:
-p则可以指定要映射的端口,并且,在一个指定端口上只可以绑定一个容器
映射所有接口地址
适用hostPort:containerPort 格式将本地5000端口映射到容器5000端口
$ docker run -d -p 5000:5000 redis
# 也可以绑定多个ip
$ docker run -d -p 5000:5000 -p 3000:80 redis
映射到指定地址的指定端口
可以使用ip:hostPort:containerPort 格式指定
$ docker run -d -p 127.0.0.1:5000:5000 redis
映射到指定地址的任意端口
使用ip::containerPort 绑定localhost的任意端口到容器的5000端口,本地主机自动分配一个端口
$ docker run -d -p 127.0.0.1::5000 redis
查看映射端口配置
使用docker port 来查看当前映射的端口配置,也可以查看到绑定的地址
$ docker port redis
注意:
容器有自己的内部网络和IP地址(使用docker inspect + 容器ID可以获取所有的变量值)
容器互联实现容器件通信
容器的连接(linking)系统是除了端口映射外另一种可以与容器中应用进行交互的方式。他会在源和接收容器之间创建一个隧道,接收容器可以看到元容器指定的信息。
自定义容器命名
连接系统依据容器名称来执行。因此需要自定义一个好记的容器名称
$ docker run -d -P --name web training/webapp python app.py
上面命令表示,创建了一个名叫web的容器,方便使用
在执行 docker run 时,如果添加 --rm 标记时,则容器终止后会立刻删除。–rm 和 --d不能同时使用
容器互联
使用 --link 参数可以让容器之间安全的进行交互。
首先创建一个新的容器web1
$ docker run -ti -d --name web1 centos
在创建一个web2容器,并将它连接到web1容器
$ docker run -it -d --name web2 --link web1:web1 centos