Docker已经火了很长一段时间,最近打算在阿里云上好好熟悉一下Docker的相关应用,为今后的工作做准备。

基本概念

Docker是基于Go语言实现的云开源项目,诞生于2013年初,最初发起者是dotCloud公司,其目标是“Build, Ship and Run Any App, Anywhere”,主要概念包括镜像、容器、仓库。Docker引擎的技术是Linux容器(Linux Containers, LXC)技术。容器有效地将由单个操作系统的资源划分到孤立的组中,以便更好地在孤立的组之间平衡有冲突的资源使用需求。

  • 镜像Image:类似于虚拟机镜像,可以理解为面向Docker引擎的只读模板,包括文件系统。
    获取镜像:docker pull NAME[:TAG]
    查看镜像信息: 查看所有镜像docker images;查看某个镜像具体信息docker inspect
    添加标签: docker tag xxx ubuntu:first
    搜寻镜像: docker search xxx, -s=0指定星级
    删除镜像: docker rmi xxx,一般情况下会删除镜像的标签,而不是文件,当删除最后一个TAG时则会删除文件,需要注意。
    使用镜像ID删除镜像: -f删除可以强制删除镜像,推荐做法为先删除依赖该镜像的所有容器,之后删除镜像,Qdocker rm e81
    创建镜像: 创建镜像包括3种方式,基于已有镜像的容器创建,首先启动一个镜像docker run -ti ubuntu:14.04 /bin/bash,任意创建一个test文件,之后创建镜像docker commit -m "add file" -a "xionger" a9fdsfxx test;基于本地模板创建,推荐使用OpenVZ提供的模板来创建;基于Dockerfile创建。
    存出镜像和载入镜像(导出、导入): 导出到本地文件sudo docker save -o ubuntu_14.04.tar ubuntu:14.04,导入镜像docker load --input ubuntu_14.04.tar
    上传镜像: docker push NAME[:TAG],默认上传镜像到DockerHub官方仓库,需要登录。
  • 容器Container:类似一个轻量级的沙箱,可以利用容器来运行和隔离应用,容器从镜像启动时会在镜像的最上层创建一个可写层,镜像本身保持不变
    创建容器:docker create -it ubuntu:lastest,通过docker ps -a查看容器,通过docker start启动容器
    新建并启动容器:docker run ubuntu /bin/bash,-d参数守护态运行,通过Ctrl+d或者exit退出容器
    终止容器:docker stop xxx,首先会发送SIGTERM信号,一段时候后发送SIGKILL,可以通过docker kill强行中止,docker restart可以关闭并重启容器,docker ps -a -q可以查看处于终止态的容器信息。
    进入容器:docker attach xxx会被阻塞不推荐使用;docker exec -ti xxx /bin/bash可以直接在容器中运行命令;nsenter工具。
    删除容器:docker rm xxx,需要注意区分,rmi是删除镜像,rm是删除容器
    导入和导出容器:docker export xxx导出一个已经创建的容器到文件,不管是否在运行;docker import,需要理解的是export的是快照,信息少,而save的是镜像,信息多,包含元数据和历史信息。
  • 仓库Repository:类似于代码仓库,是Docker存放镜像的场所,而Registry注册服务器是存放仓库的地方,其上放着很多仓库,每个仓库集中存放某一类镜像的多个文件,可以通过tag标签来区分。目前最大的公有仓库是Docker Hub,而国内是Docker Pool。
    Docker Pub:本地用户目录.dockercfg中存储登录信息,在仓库中存在centos这类由Docker公司创建、验证、支持的根镜像,也有类似xionger/centos这类由个人提供的镜像,可以通过-s N来查看高星镜像。此外,Docker Hub还可以通过设置追踪类似GitHub的网站,然后根据其更行,自动执行创建。
    创建和使用私有仓库:可以通过官方提供的registry镜像来简单搭建一套本地私有仓库环境。
    docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry
    docker images
    docker tag ubuntu:14.04 139.196.96.27:5000/test
    docker push 139.196.xx.xx:5000/test
    curl http://139.196.xx.xx:5000/v1/search
    docker pull 139.196.xx.xx:5000/test

Tip:
CURL(CommandLine Uniform Resource Locator):curl是利用URL语法在命令行方式下工作的开源文件传输工具。
安装Docker(Ubuntu16.04),默认安装在/var/lib/docker

sudo apt-get install apt-transport-https
sudo apt-get update
sudo apt-get install -y docker.io

Tip:
在用putty连接阿里云时,经常会断开,如何解决?
解决方法:在Connection里面有个Seconds between keepaliaves。这里就是每间隔指定的秒数,就给服务器发送一个空的数据包,来保持连接。以免登录的主机那边在长时间没接到数据后,会自动断开SSH的连接,设置为10。
阿里云购买ECS, 操作系统版本Ubuntu 16.04(LTS)

进阶概念

数据管理:在使用docker过程中,会涉及查看容器内应用产生的数据,或者数据在多个容器间共享,此时需要管理数据的两种方式包括数据卷Data Volumes和数据卷容器Data Volume Containers.
数据卷:是一个可供容器使用的特殊目录,绕过文件系统,具有的特性包括数据卷可以在容器之间共享和重用、对数据卷的修改会马上生效、对数据卷的更新不会影响镜像、卷会一致存在,知道没有容器使用,类似Linux下对目录或文件进行mount操作。
在容器内创建一个数据卷:使用training/webapp镜像创建一个web容器,并创建一个数据卷挂在到容器的/webapp目录,docker run -d -P --name web -v /webapp python app.py
挂载一个主机目录作为数据卷:加载主机的/src/webapp目录到容器的/opt/webapp目录,docker run -d -P --name web - v /src/webapp:/opt/webapp training/webapp python app.py
Tip:编辑工具包括vi或者sed --in-place,推荐挂载目录而不是文件,因为inode变化会造成docker容器启动失败。
数据卷容器:其实就是一个普通的容器,其中会挂载数据卷用户共享,创建数据库容器dbdata,之后其他容器将挂载可以挂载该数据卷容器中的数据卷。

docker run -it -v /dbdata --name dbdata ubuntu
ls
docker run -it --volumes-from dbdata --name db1 ubuntu

利用数据卷容器迁移数据:可以通过数据卷容器对其中的数据卷进行备份、回复,以实现数据的迁移。接下来的示例利用ubuntu镜像创建一个容器worker,使用--volumes-from dbdata参数挂载dbdata容器的数据卷,
使用-v ${pwd}:/backup参数来挂载本地的当前目录到worker容器的/backup目录,
容器启动后,使用tar cvf /backup/backup.tar /dbdata来讲/dbdata下内容备份为容器内的/backup/backup.tar

docker run --volumes-from dbdata -v ${pwd}:/backup --name worker ubuntu tar cvf /backup/backup.tar /dbdata
//恢复,首先创建一个带有数据卷的容器dbdata2,之后 创建另一个新的容器,挂载dbdata2容器,并使用untar解压备份文件到所挂载的容器卷中即可
docker run -v /dbdata --name dbdata2 ubuntu /bin/bash
docker run --volumes-from dbdata2 -v ${pwd}:/backup busybox tar xvf /backup/backup.tar

在生产环境,推荐使用分布式文件系统Ceph、GPFS、HDFS定期对主机的本地数据进行备份。
网络基础配置:
端口映射实现访问容器:在启动容器时,如果不指定对应参数,在容器外部是无法通过网络来访问容器内的网络应用和服务的。可以使用-p ip:hostPort:containerPort映射端口,docker logs查看应用的信息,docker port查看端口配置。

docker run -d -p 5000:5000 -p 3000:80 training/webapp python app.py

容器互联实现容器间通信:容器见的连接系统是除了端口映射外另一种可以与容器中应用进行交互的方式,它会在源和接受容器间创建一个隧道,接受容器可以看到源容器制定的信息,比如--link连接应用容器和数据库容器,这样可以保证db的接口不暴露到公网。

docker run -d -P --name web training/webapp python app.py
docker ps -l
docker inspect -f xxx
//容器互联
docker run -d --name db training/postgres
docker rm -f web
docker run -d -P --name web --link db:db training/webapp python app.py
docker ps

Docker通过两种方式为容器公开连接信息,包括环境变量env和/etc/hosts文件,通过apt-get install -yqq inetutils-ping安装ping。
扩展知识:Docker已有的实现PaaS的项目有Deis、Flynn等,持续集成方面有Drone,管理工具有Citadel, Shipyard, DockerUI等。

使用Dockerfile创建镜像

基本结构:dockerfile由命令语句组成,支持#开头的注释,分为4个部分,包括基础镜像信息、维护者信息、镜像操作指令和容器启动执行指令,在docker hub上有很多dockerfile的demo,需要时可以直接使用。

#基础镜像
FROM ubuntu
#维护者信息
MAINTAINER xionger xiongere@email.com
#镜像的操作指令
RUN apt-get update && apt-get install -y nginx
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf
#容器启动时执行指令
CMD /usr/sbin/nginx

指令:一般格式为INSTRUCTION arguments,具体如下所示。
FROM <image>:<tag>默认的第一条指令
MAINTAINER <name>维护者信息
RUN <command>或者RUN ["executable", "param1", "param2"],前者将在shell终端中运行命令,即/bin/sh -c,后者则使用exec执行。
CMD ["executable", "param1", "param2"]使用exec执行,推荐方式。
EXPOSE <port> [<port>..]告诉Docker服务器容器暴露的端口号,供互联网系统使用。
ENV <key> <value>指定一个环境变量,会被后续的RUN指令使用
ADD <src> <dest>该命令将复制指定到容器中的
COPY <src> <dest>复制本地主机<src>到容器中<dest>,推荐使用
ENTRYPOINT ["executable", "param1", "param2"]配置容器启动后执行的命令,不能被docker run提供的参数覆盖
VOLUME ["/data"]创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据。
USER daemon指定运行容器时的UID,后续的RUN也会使用指定用户,如RUN group add -r postgres && useradd -r -g postgres postgres,要获取管理员权限时可以使用gosu而不是sudo
WORKDIR path/to/workdir为后续的指令配置工作目录
ONBUILD [INSTRUCTION]配置当所创建的镜像作为其他新创建镜像的基础镜像时,所执行的操作指令。

创建镜像:编写好dockerfile后,可以通过docker build命令来创建镜像,该命令将读取指定路径下(包括子目录)的dockerfile,并将该路径下所有内容发送给docker服务端,由服务端来创建镜像,此外可以通过.dockerignore文件来忽略目录或文件,还可以通过-t指定镜像的标签信息。示例docker build -t build_repo/first_image /tmp/docker_builder/

实践之道

操作系统:CentOS和Ubuntu都可以,个人喜好ubuntu(还可以选用debian:jessie, alpine),属于最基础的镜像。
tip: 当试图安装软件出现没有相关包信息时,需要apt-get update或编辑/etc/apt/sources.list文件(deb, deb-src,需要时在查询,比如163的镜像,阿里云的话无需设置),可以通过netstat -tunlp查看当前网络情况。
支持SSH:当需要直接进入容器进行管理时安装,不必须。
Web服务器与应用(Nginx,可以使用淘宝优化的Tengine代替Nginx,Tomcat):在/usr/docker下创建tomcat,nginx目录应用存放Dockerfile文件,最终还是选择通过pull拉去镜像的方式安装应用,dockerfile比较复杂。

docker pull nginx
docker ps -a
//-p 80:80:将容器的80端口映射到主机的80端口
//-name mynginx:将容器命名为mynginx
//-v $PWD/www:/www:将主机中当前目录下的www挂载到容器的/www
//-v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf:将主机中当前目录下的nginx.conf挂载到容器的/etc/nginx/nginx.conf
//-v $PWD/logs:/wwwlogs:将主机中当前目录下的logs挂载到容器的/wwwlogs
docker run --name nginx01 -p 80:80 -v $PWD/www:/www -v $PWD/conf:/etc/nginx -v $PWD/logs:/wwwlogs -d nginx

docker pull tomcat
docker run --name tomcat01 -p 8080:8080 -v $PWD/test:/usr/local/tomcat/webapps/test -d tomcat

tip:有时可能需要重启docker服务, service docker restart,可以选择[tomcat7.0:jdk1.8][nginx配置详解](http://blog.csdn.net/tjcyjd/article/details/50695922)
nginx官方文档
数据库应用MySQL, MongoDB, Redis

docker pull mysql
docker run -p 3306:3306 --name mysql01 -v $PWD/conf:/etc/mysql -v $PWD/logs:/logs -v $PWD/data:/mysql_data -e MYSQL_ROOT_PASSWORD=123456 -d mysql
//主从模式
docker run -p 3306:3306 --name mysql01 -v $PWD/conf01:/etc/mysql -v $PWD/logs01:/logs -v $PWD/data01:/mysql_data -e MYSQL_ROOT_PASSWORD=123456 -e REPLICATION_MASTER=true -d mysql
docker run -p 3307:3306 --name mysql02 -v $PWD/conf02:/etc/mysql -v $PWD/logs02:/logs -v $PWD/data02:/mysql_data -e MYSQL_ROOT_PASSWORD=123456 -e REPLICATION_SLAVE=true --link mysql01:mysql01 -d mysql
//mongodb,暂时单机,其默认提供集群的配置
docker pull mongo
docker run -p 27017:27017 -p 28017:28017 --name mongodb01 -v $PWD/db01:/data/db -e MONGODN_PASS="123456" -d mongo
//redis
docker pull  redis
docker run -p 6379:6379 --name redis01 -v $PWD/data01:/data  -d redis redis-server --appendonly yes

tip:可以进入db的容器进行操作docker exec -ti mysql /bin/bash
其他应用:maven, gitlab, jenkins, dubbo, cat,具体内容将在之后的文章中陆续介绍。
构建Docker容器集群:核心问题就是让不同主机中的Docker容器相互访问,简单的方式包括两种。使用自定义网桥连接跨主机容器,Docker默认的网桥是docker0,可以通过brctl show查看。使用Ambassador容器:当2个docker容器再同意主机时,可以通过--link相互访问,如果需要跨主机实现,则需要知道其他物理主机的IP地址。
Docker CI集成方案:在之后的Jenkins一文中将重点分析。

Tip:目前百度BAE已经在生产环境使用Docker,Airbnb,ebay已使用mesos集成docker部署应用,此外可以使用apparmor对容器的能力进行限制
个人目前实践计划
私有Docker仓库暂时不建立,先使用DockerHub;Git类似,先使用Github;Maven需要使用Nexus建立一个私有库;jenkins之间搭建就好。

参考资料

  1. 杨保华. Docker技术入门与实践[M]. 北京:机械工业出版社, 2016.
  2. Docker常见安装指南

Docker快速入门的更多相关文章

  1. Docker快速入门(二)

    上篇文章<Docker快速入门(一)>介绍了docker的基本概念和image的相关操作,本篇将进一步介绍image,容器和Dockerfile. 1 image文件 (1)Docker ...

  2. 【干货合集】Docker快速入门与进阶

    收录待用,修改转载已取得腾讯云授权 Docker 在众多技术中,绝对是当红炸子鸡.这年头,如果你不懂一点容器,不学一些Docker,还怎么出去跟人炫耀技术? Docker 也是云计算技术中较为热门的一 ...

  3. Docker 快速入门(一)- 情况介绍和安装

    欢迎您! 很高兴您想学习 Docker . 这个页面包含了如何开始使用 Docker 的循序渐进的说明. Docker 快速入门培训模块教你如何: 设置 Docker 环境(在本页) 构建并运行您的镜 ...

  4. Docker快速入门——Docker-Compose

    一.Docker-Compose简介 1.Docker-Compose简介 Docker-Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排.Docker-Com ...

  5. (二)、Docker 快速入门

    文档:https://docs.docker.com/install/linux/docker-ce/centos/ 中文文档:https://docs.docker-cn.com/engine/in ...

  6. 全面的Docker快速入门教程

    前言: 都2021年了,你还在为了安装一个开发或者部署环境.软件而花费半天的时间吗?你还在解决开发环境能够正常访问,而发布测试环境无法正常访问的问题吗?你还在为持续集成和持续交付(CI / CD)工作 ...

  7. MinIO Docker 快速入门

    官方文档地址:http://docs.minio.org.cn/docs/master/minio-docker-quickstart-guide 在Docker中运行MinIO单点模式 MinIO ...

  8. 进击的docker 二 : docker 快速入门

    1.安装docker 1.1.安装环境 [root@docker ~]# cat /etc/redhat-release CentOS Linux release (Core) [root@docke ...

  9. docker快速入门+搭建javaweb环境

    一.windows安装 不要安装旧的 boot2docker包,直接安装 DockerToolbox. 一路next,安装完成以后 试用 1.以管理员身份运行 docker quickstart te ...

随机推荐

  1. 【Spark2.0源码学习】-6.Client启动

    Client作为Endpoint的具体实例,下面我们介绍一下Client启动以及OnStart指令后的额外工作 一.脚本概览      下面是一个举例: /opt/jdk1..0_79/bin/jav ...

  2. mybaties 缓存

    http://www.cnblogs.com/zemliu/archive/2013/08/05/3239014.html http://www.cnblogs.com/xdp-gacl/p/4270 ...

  3. 如何打一个FatJar(uber-jar)

    如何打一个FatJar(uber-jar) FatJar也就叫做UberJar,是一种可执行的Jar包(Executable Jar).FatJar和普通的jar不同在于它包含了依赖的jar包. 1. ...

  4. Cohort Analysis and LifeCycle Grids mixed segmentation with R(转)

    This is the third post about LifeCycle Grids. You can find the first post about the sense of LifeCyc ...

  5. 使用sqlserver搭建高可用双机热备的Quartz集群部署【附源码】

    一般拿Timer和Quartz相比较的,简直就是对Quartz的侮辱,两者的功能根本就不在一个层级上,如本篇介绍的Quartz强大的序列化机制,可以序列到 sqlserver,mysql,当然还可以在 ...

  6. net.sf.json.JSONException: java.lang.reflect.InvocationTargetException Caused by: java.lang.IllegalArgumentException at java.sql.Date.getHours(Unknown Source)

    数据库字段类型为Date,转成JSON格式会有问题,解决方案如下: json-lib有一个配置类JsonConfig通过JsonConfig可以注册一个字段处理器实现JsonValueProcesso ...

  7. SonarQube Scanner的配置与使用简介

    一.下载 下载地址: https://sonarsource.bintray.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-3.0.3.77 ...

  8. Spring学习(14)--- 基于Java类的配置Bean 之 @ImportResource & @Value 注解

    学习如何使用@ImportResource 和 @Value 注解进行资源文件读取 例子: 先创建一个MyDriverManager类(模拟读取数据库配置信息) package com.beanann ...

  9. Chapter 5:Spectral-Subtractive Algorithms

    作者:桂. 时间:2017-05-24  10:06:39 主要是<Speech enhancement: theory and practice>的读书笔记,全部内容可以点击这里. 书中 ...

  10. Chapter 7:Statistical-Model-Based Methods

    作者:桂. 时间:2017-05-25  10:14:21 主要是<Speech enhancement: theory and practice>的读书笔记,全部内容可以点击这里. 书中 ...