Docker
1. 什么是Docker
简单地讲,可以将Docker容器理解为一种轻量级的沙盒,每个容器内运行一个一个用,不同的容器相互隔离,容器之间也可以通过网络互相通信,容器的创建和停止十分快速,几乎跟创建和终止原生应用一致;另外容器自身对系统资源的额外需求也十分有限,远远低于传统虚拟机。很多时候,甚至直接把容器当作应用本身也没有问题
2、为什么使用Docker
一旦需要服务器迁移,往往需要对每个应用都进行重新部署和调试,这些琐碎而无趣的体力活,极大的降低了工作效率。究其根源,是这些应用直接运行在底层操作系统上,无法保证同一份应用在不同的环境中行为的一致。
而Docker提供了一种更为聪明的方式,通过容器来打包应用,解耦应用和运行平台。意味着迁移的时候,只需要在新的服务器上启动需要的容器就可以了,无论新旧服务器是否式同一类型的平台。这无疑将节约大量的宝贵事件,并且降低了部署过程出现的问题的风险。
3.核心概念与安装配置:
1.docker的镜像:
Docker的镜像类似于虚拟机的镜像,可以将它理解为一个只读的模版。
镜像是创建Docker容器的基础。
2.Docker容器
容器是从镜像创建的应用运行实例。
3.Docker仓库。
Docker仓库类似于代码仓库。它是Docker集中存放镜像文件的场所。
仓库注册服务器是存放仓库的地方,其上往往存放着很多的仓库,每个仓库集中存放某一类镜像,往往包括多个镜像文件,通过不同的标签tag来进行区分
4.Docker的镜像
Docker运行容器前需要本地存在对应的镜像,如果镜像没有保存在本地中,Dokcer会常识先从默认镜像仓库下载(默认使用Docker Hub公共注册服务器中的仓库)
1. 获取镜像
docker pull name:[tag]
docker pull ubuntu:14.04
docker pull ubuntu
2. 查看镜像信息
docker images
3、使用tag命令添加镜像标签
docker tag ubuntu:latest myubuntu:lastest
docker images
4.使用inspect 命令查询详细信息
docker inspect ubuntu:14.04
5.使用history命令查看镜像历史
docker history ubuntu:14.04
列出了ubuntu的各层创建信息
6.搜索镜像
docker search –automated –s 3 nginx
7.删除镜像
docker rmi ubuntu:latest
当镜像创建容器存在时,镜像文件默认是无法被删除的
docker rmi –f ubuntu:latest
强行删除
8.查看本机上所存在的容器
docker ps -a
9.创建镜像
1.基于已有镜像的容器创建
Docker run –it ubuntu:14.04 /bin/bash
Touch test
Exit
Docker commit –m “addded new file ” –a “Docker newbe” a925cb40b3f0 test:01
Docker commit
2基于本地模版导入
下载ubuntu-14.04的模版压缩包,之后使用一下命令导入
Cat ubuntu-14.04-x86_64-minimal.tar.gz | docker import – ubuntu:14.04
10.存入镜像
docker save -o ubuntu_14.04.tar ubuntu:14.04
导出本地镜像为文件ubuntu_14.04.tar
11.载入镜像
docker load –input ubuntu_14.04.tar
或者docker load < ubuntu_14.04.tar
12.上传镜像
默认式上传到Docker hub仓库,
用户在网站上注册后可以上传自制的镜像
Docker push name:[tag]
Docker tag test:latest user/test:lastest
Docker push user/test:latest
5.Docker容器
1.创建容器
1.新建容器
Docker create –it ubuntu:latest
Docker create命令创建的容器处于停止状态,可以使用docker start命令启动容器
2、启动容器
Docker start af af-为容器ID最后两位
3.创建并启动容器
Docker run ubuntu /bin/echo ‘Hello world’
Docker run –it ubuntu:14.04 /bin/bash
Exit退出容器
4后台运行
-d参数来实现
Docker run –d ubuntu /bin/sh –c “while true; do echo hello world; sleep 1; done”
Ce5………………….
Docker logs ce5
查看输出信息
2终止容器
Docker stop ce5 来停止一个运行中的容器
3. 进入容器
对容器的操作
Docker attach 容器名称
Docker attach nostaligic_hypatia
Docker exec 容器id
Docker exec 203df30030
4.删除容器
Docker rm 容器id
但容器必须处于停止状态
必须由docker stop停止容器
如果删除正在运行的容器会报错
5.导出容器
某些时候将容器从一个系统迁移到另一个系统,可以使用Docker的导入和导出功能
Docker export –o test_for_run.tar ce5
Docker export e81 > test_for_stop.tar
-o 表示指定导出的tar文件名
6.导入容器
Docker import test_for_run.tar – test/ubuntu:v1.0
6.Docker仓库
1.Docker Hub公共镜像市场
2.时速云镜像市场
3.下载镜像
index.tenxcloud.com/namespace/repository
docker pull index.tenxcloud.com/tenxcloud/tomcat
搭建本地私有仓库
Docker run –d –p 5000:5000 registry
默认情况下官方提供的registry镜像
会将仓库创建在容器的/tmp/registry目录下
可以通过-v 参数将镜像文件存在本地的指定路径
Docker run –d –p 5000:5000 -v /opt/data/registry:/tmp/registry registry
7.Docker数据管理
生产环境中使用Docker的过程中,往往需要对数据进行持久化,或者需要多个容器之间进行数据共享,这必然涉及容器的数据管理操作
容器中管理数据主要的两种方式:
数据卷:容器内数据直接映射到本地主机观景
数据卷容器:使用特定容器维护数据卷
1.数据卷:
1、在容器内创建一个数据卷
Docker run –d –P –name web –v /webapp training/webapp python app.py
-v标记创建数据卷
创建一个数据卷挂载到容器/webapp目录
2、挂载一个主机目录作为数据卷
Docker run –d –P –name web –v /src/webapp:/opt/webapp training/webapp python app.py
主机的/src/webapp目录到容器的/opt/webapp下
2.数据卷容器(专门提供数据卷供其他容器挂载)
1.创建数据卷容器
Docker run –it –v /dbdata –name dbdata ubuntu
2.进入容器
Docker attach dbdata
列表
Ls
通过—volumes-from挂载dbdata容器的数据卷
Docker run –it –volumes-from dbdata –name db1 ubuntu
修改dbdata的数据
Cd /dbdata
Touch test
Ls
Exit
进入db1 查看文件
Docker attach db1
Ls dbdata
3.利用数据卷容器来迁移数据
1.备份
1.备份
使用下面的命令来备份dbdata数据卷容器内的数据卷:
$ docker run --volumes-from dbdata -v $(pwd):/backup --name worker ubuntu tar cvf /backup/backup.tar /dbdata
首先利用ubuntu镜像创建了一个容器worker。使用--volumes-from dbdata参数来让worker容器挂载dbdata容器的数据卷(即dbdata数据卷),使用-v $(pwd):/backup参数来挂载本地的当前目录到worker容器的/backup目录。worker容器启动后,使用了tar cvf /backup/backup.tar /dbdata命令来将/dbdata下内容备份为容器内的/backup/backup.tar,即宿主主机当前目录下的backup.tar。
2.恢复
如果要将数据恢复到一个容器,可以按照下面的步骤操作。
首先创建一个带有数据卷的容器dbdata2:
$ docker run -v /dbdata --name dbdata2 ubuntu /bin/bash
然后创建另一个新的容器,挂载dbdata2的容器,并使用untar解压备份文件到所挂载的容器卷中:
$ docker run --volumes-from dbdata2 -v $(pwd):/backup --name worker ubuntu bash
cd /dbdata
tar xvf /backup/backup.tar
8、端口映射与容器关联
1.端口映射实现外部访问
1.从外部访问容器应用
在容器启动的时候,如果不指定对应的参数,在容器外部是无法通过网络来访问容器内的网络应用和服务的
docker run –d –P training/webapp python app.py
通过-P指定端口映射
Docker会随机映射一个49000~49900的端口到内部容器开放的网络端口
docker ps –l
访问主机随机映射端口即可访问容器内部也能够用提供的界面
2. 映射所有接口地址
Docker run –d –P 5000:5000 training/webapp python app.py
绑定多个接口-p
docker run –d –p 5000:5000 –p 3000:80 training./webapp python app.py
3.映射到指定地址的指定端口
docker run –d –p 127.0.0.1:5000:5000 training/webapp python app.py
4.映射到指定地址的任意端口
docker run –d –p 127.0.0.1::5000 training/webapp python app.py
使用udp标记来指定udp端口
docker run –d –p 127.0.0.1:5000:5000/udp training/webapp python app.py
5.查看映射端口配置
docker port nostalgic_morse 5000
2.互联网机制实现便捷互访
1.自定义容器命名
docker run –d –P –name web training/webapp python app.py
2容器互联
使用link参数可以让容器之间安全地进行交互
创建容器
docker run –d –name db training/postgres
删除之前的web
docker rm –f web
创建一个新的web容器,并将容器建立互联关系:
docker run –d –P –name web –link db:db training/webapp python app.py
--link 格式 –link name:alias
Name连接容器的名字
Aliad别名
docker ps查看那容器连接
db容器的names列有db也有web/db
表示web容器连接到db容器,这允许web容器访问db容器的信息
Docker相当于两个互联的容器之间创建了一个虚拟通道,而且不用映射她们呢的端口到宿主主机上
Docker通过两种方式为容器公开信息
使用env命令来查看web容器的环境变量:
docker run –rm –name web2 –link db:db training/webapp env
Docker还添加host信息到父容器的/etc/hosts文件下面是父容器web的hosts文件
Docker run –t –i –rm –link db:db training/webapp /bin/bash
Cat /etc/hosts
9.使用Dockerfile创建镜像
1. 基本结构
Dockerfile由一行行命令语句组成,并且支持#开头注释行
一般而言,Dockerfile分为四个部门:基础镜像部分,维护者信息,镜像操作指令和容器启动时执行指令。
Node.js dockerfile
FROM ubuntu:trusty-20160819
MAINTAINER sameer@damagehead.com
RUN echo 'APT::Install-Recommends 0;' >> /etc/apt/apt.conf.d/01norecommends \
&& echo 'APT::Install-Suggests 0;' >> /etc/apt/apt.conf.d/01norecommends \
&& apt-get update \
&& DEBIAN_FRONTEND=noninteractive apt-get install -y vim.tiny wget sudo net-tools ca-certificates unzip \
&& rm -rf /var/lib/apt/lists/*
RUN \
cd /opt && \
wget http://nodejs.org/dist/v6.5.0/node-v6.5.0-linux-x64.tar.gz && \
tar -xzf node-v6.5.0-linux-x64.tar.gz && \
mv node-v6.5.0-linux-x64 node && \
cd /usr/local/bin && \
ln -s /opt/node/bin/* . && \
DEBIAN_FRONTEND=noninteractive npm install -g nodemon --no-optional && \
sudo ln -s /opt/node/lib/node_modules/nodemon/bin/nodemon.js /usr/bin/nodemon && \
rm -f /opt/node-v6.5.0-linux-x64.tar.gz
WORKDIR /src
CMD ["/bin/bash"]
2. 指令说明:
From:
指定所创建镜像的基础镜像,如果本地不存在,则默认回去Docker Hub下载指定镜像
格式 form <image>
Form <image>:<tag>
Form<image>@<digest>
Maintainer
指定维护者信息,格式为maintainer <name>
MAINTAINER image_creator@docker.com
Run
运行指定命令
格式:
Run <command>或者Run<”executable”,”param1”,”param2”>
每条Run指令将在当前镜像的基础上执行命令,并提交为新镜像。当命令较长的时,可以使用\换行
Run apt-get update \
&& apt-get install –y libsnappy-dev zlib1g-dev libbz2-dev \
&& rm –rf /var/cache/apt
CMD:
CMD指令用来指定启动容器时默认执行命令
CMD[“executable”,”param1”,”param2”]使用exec执行
LABEL:
用来指定生成镜像的元数据标签信息
LAEBL VERSION=”1.0”
EXPOSE:
声明镜像内服务所监听的端口
格式:
Expose <port>[port….]
Expose 22 80 8443
该指令只是起声明作用,并不会自动完成端口映射
ENV
指定环境变量,在镜像生成过程中会被后续Run指令使用,在镜像启动的容器中也会存在
格式ENV<key><value>或ENV<key>=<value>
ENV PG_MAJOR 9.3
ENV PG_VERSION 9.3.4
RUN curl –SL http://example.com/postgres-$PG_VERSION.tar.xz | tar –xJC /usr/src/postgress && …..
ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH
ADD:
该命令将复制指定的<src>路径下的内容到容器中<dest>路径下
格式:
ADD<src><dest>
其中src可以式Dockerfile所在目录的一个相对路径,也可以是一个URL,还可以是一个tar文件
Copy
格式copy<src><dest>
ENTRYPOINT
指定镜像的默认入口命令,该入口命令会在启动容器的时候作为根命令执行,所有传入值作为命令的参数
每个Dockerfile只有一个ENTRYPOINT
ENTRYPOINT [“executable”,”param1”,”param2”]
ENTRYPOINT comand param1 param2
VOLUME:
创建一个数据挂载点 VOLUME[“/data”]
USER:
指定运行容器时用户名和UID,后续RUN等命令也会使用指定用户身份
USER daemon
WORKDIR
为后续RUN,CMD和ENTRYPOINT指令配置工作目录
格式
WORKDIR /path/to/workdir
ARG:
指定一些镜像内使用的参数,这些参数在执行docker build命令时才—build-arg<name>=<value>格式传入
Docker build –-build-arg<name>=<value>
.
ONBUILD
配置当所创建的镜像作为为其他镜像的基础镜像时,所需要执行的创建操作指令
..
ONBUILD ADD. /APP/SRC
ONBUILD RUN /usr/local/bin/python-build –dir /app/src
等价于
FROM image-A
ADD ./APP/SRC
RUN /usr/local/bin/python-build –dir /app/src
STOPSIGNAL
指定所创建镜像启动的容器接受退出的信号值。
STOPSIGNAL signal
HEALTHCHECK
配置所启动容器如何进行健康检查
HEALTHCHECK [options] CMD command:根据所执行命令返回值是否为0来判断
HEALTHCHECK NONE;禁止基础镜像中的健康检查
SHELL
指定其他命令使用shell时的默认shell类型
SHELL[“executable”,”parameters”]
3.创建镜像:
编写完成后Dockerfile之后,可以通过docker build命令来创建镜像
例如:
指定dockerfile所在路径为/tmp/docker_builder/ ,并且希望生成镜像标签为build_repo/first_image可以使用下面的命令
Docker build –t build_repo/first_image /tmp/docker_builder
4.使用.dockerignore文件
可以通过.dockerignore文件(每一行添加一条一条匹配模式)来让Docker忽略匹配模式路径下的目录和文件,例如:
#comment
*/temp*
*/*/temp*
Tmp?
~*