一、Docker简介

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

Docker组成 Docker Client 和 Docker Server
Docker组件 镜像(Image) 容器(Container) 仓库(Repository)

二、Docker应用场景

1. 简化配置
2. 代码流水线(Code Pipeline)管理
3. 提高开发效率
4. 隔离应用
5. 整合服务器
6. 调试能力Docker
7. 多租户环境
8. 快速部署

三、Docker安装
请更新自已的yum源,避免安装超时

http://mirrors.aliyun.com/help/centos
http://mirrors.163.com/.help/centos.html
> yum install docker-engine

或者如下(老式写法)

> yum install docker-io
> yum install docker.io

添加开机启动

> chkconfig docker on
> chkconfig --list docker

启动docker

> systemctl start docker.service

停止docker

> systemctl stop docker.service

四、Docker镜像
查看版本号

> docker version

查看docker层面信息,images,containers数等

> docker info

搜索centos镜像

> docker search centos

下载镜像

> docker pull centos

如果下载时出现超时,请换如下,详细请看http://get.daocloud.io/

> docker pull daocloud.io/library/centos:latest

查看镜像

> docker images
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
daocloud.io/library/centos latest 67591570dd29 4 weeks ago 191.8 MB

删除镜像

> docker rmi 镜像ID

五、Docker容器
创建一个容器,并运行/bin/echo程序

> docker run daocloud.io/library/centos /bin/echo "hello world"

查看所有容器

> docker ps -a

--name给容器起个名称
-i开启输入终端,-t表示使用终端
该命令通过centos镜像来创建一个mydocker容器,然后运行指定的一个程序,程序退出那容器也退出。

> docker run --name mydocker -it daocloud.io/library/centos /bin/bash

退出容器

> exit

重新启动原有容器,98c6f96292c1表示容器ID

> docker restart 98c6f96292c1

让容器在后台运行,如果镜像没有下载,会自动帮我们下载nginx镜像

> docker run -d --name mynginx daocloud.io/library/nginx:1.7.1 nginx

删除容器

> docker rm 容器ID

停止容器

> docker stop 容器ID

进入容器(不建议)

> docker attach 容器ID

获取容器的PID

> docker inspect --format "{{.State.Pid}}" 容器名称

通过容器PID进入容器

> nsenter --target 容器PID --mount --uts --ipc --net --pid

如果nsenter没有需要安装

> yum install -y util-linux

六、Docker网络
查看主机网桥信息

> brctl show

如果提示没有此命令请安装

> yum install bridge-utils

在容器中查看路由表

> ip ro li

随机映射(把容器中的端口随机映射到主机端口)

> docker run -d -P --name mynginx2 daocloud.io/library/nginx:1.7.1 nginx

把容器80端口映射到主机88端口

> docker run -d -p 88:80 --name mynginx2 daocloud.io/library/nginx:1.7.1 nginx

映射端口的方式:

-p 主机端口:容器端口
-p ip:主机端口:容器端口
-p ip::容器端口
-p 主机端口:容器端口 -p 主机端口:容器端口

七、Docker数据管理
1、数据卷
主机创建数据卷并挂载到容器/data下

> docker run -it --name 111 -v /data daocloud.io/library/centos

把主机的/data挂载到容器的/data2下

> docker run -it --name 222 -v /data:/data2 daocloud.io/library/centos

如果发现容器中/data2无法写入文件,请关闭selinux。

只读

> docker run -it --name 333 -v /data:/data2:ro daocloud.io/library/centos

查看数据卷创建在哪了

> docker inspect -f {{.Mounts}} 容器名
> docker inspect -f {{.Config.Volumes}} 容器名

以下写法是老式写法

> docker inspect -f {{.Volumes}} 容器名

2、数据卷容器
把一个容器当作数据容器来挂载

> docker run -it --name 444 --volumes-from 容器名 daocloud.io/library/centos

八、手动构建Docker镜像
我们如何自已创建一个nginx镜像?

首先创建一个centos空容器

> docker run -it --name mynginx daocloud.io/library/centos

安装一些必要的库

> yum install wget gcc gcc-c++ make openssl-devel

下载pcre和nginx源码

> wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.39.tar.gz
> wget http://mirrors.sohu.com/nginx/nginx-1.10.3.tar.gz

把源码移动到/usr/local/src下并解压

> mv *.gz /usr/local/src
> tar xf pcre-8.39.tar.gz
> tar xf nginx-1.10.3.tar.gz

创建用户

> useradd -s /sbin/nologin -M nginx

进入nginx目录

> ./configure --prefix=/usr/local/nginx \
--with-pcre=/usr/local/src/pcre-8.39 \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_stub_status_module
> make && make install

让nginx在前台运行(不能让nginx在后台运行)

> vi /usr/local/nginx/conf/nginx.conf
daemon off;

提交我们自已创建的镜像

> docker commit -m "my nginx" 容器ID lackone/mynginx:1

我们来使用我们创建的镜像

> docker run -d -p 99:80 --name 666 lackone/mynginx:1 /usr/local/nginx/sbin/nginx

然后我们通过主机IP:99就可以访问容器内的nginx服务器了。

九、Docker的Dockerfile

1.基础镜像信息
2.维护者信息
3.镜像操作指令
4.容器启动时执行指令

创建一个目录

> mkdir /data/dockerfile
> cd /data/dockerfile

创建一个Dockerfile文件,首字母大写

> vi Dockerfile
#This is Dockerfile
#Version 1.0
#Author: lackone #基础镜像
FROM daocloud.io/library/centos #维护者信息
MAINTAINER lackone #COPY文件,如果是压缩包会自动解压
#注意压缩包必须与Dockerfile同目录
ADD pcre-8.39.tar.gz /usr/local/src
ADD nginx-1.10.3.tar.gz /usr/local/src #执行命令
RUN yum install wget gcc gcc-c++ make openssl-devel
RUN useradd -s /sbin/nologin -M nginx #当前工作目录
WORKDIR /usr/local/src/nginx-1.10.3 #执行命令
RUN ./configure --prefix=/usr/local/nginx \
--with-pcre=/usr/local/src/pcre-8.39 \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_stub_status_module
RUN make && make install
RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf #目录挂载
#VOLUME #端口
EXPOSE 80 #声明环境变量
ENV PATH /usr/local/nginx/sbin:$PATH
#运行nginx,进程要一直运行下去
CMD ["nginx"]

构建镜像

> docker build -t 名称:标识 /data/dockerfile/

十、Docker资源隔离和限制(cgroup)

首先我们创建一个压力测试镜像

> mkdir /data/stress
> wget http://mirrors.aliyun.com/repo/Centos-7.repo
> wget http://people.seas.harvard.edu/~apw/stress/stress-1.0.4.tar.gz
> vi Dockerfile
FROM daocloud.io/library/centos
ADD Centos-7.repo /etc/yum.repos.d/CentOS-Base.repo
ADD stress-1.0.4.tar.gz /usr/local/src
RUN yum makecache
RUN yum install -y make automake autoconf gcc gcc-c++
WORKDIR /usr/local/src/stress-1.0.4
RUN ./configure --prefix=/usr/local/stress
RUN make && make install
ENV PATH /usr/local/stress/bin:$PATH
#CMD与ENTRYPOINT的区别在于执行docker run时参数传递的方式不同
ENTRYPOINT ["stress"]

#构建stress镜像

> docker build -t stress:1 .

创建容器并测试
--rm表示容器退出自动删除

> docker run -it --rm --name test stress:1 --cpu 1

-c是docker限制的cpu使用份额
--cpu是传递给stress的参数

> docker run -it --rm -c 512 --name test stress:1 --cpu 1

--cpuset-cpus=0表示第一颗CPU

> docker run -it --rm --cpuset-cpus=0 --name test stress:1 --cpu 1

-m 128m表示docker限制的内存大小
--vm-bytes表示stress测试使用的内存大小

> docker run -it --rm -m 128m --name test stress:1 --vm-bytes 128m --vm-hang 0

十一、Docker网络
1、桥接模式
默认docker网络使用的是桥接模式
当docker启动时会创建一个docker0的虚拟网桥,创建容器时会创建一个网桥接口,通过网桥转发。

> brctl show
bridge name    bridge id        STP enabled    interfaces
docker0 8000.0242c41e7d80 no vethaa35584
vethbd1676b

2、host模式
容器与主机共用一个Network Namespace,共享主机网络信息。
3、container复用方式
与另一个容器共用一个Network Namespace,而不是和宿主机共享。
4、none方式
容器拥有自已的Network Namespace,但不进行任何网络配置,没有网卡,IP,路由信息。

十二、Docker的Registry

把Registry下载下来

> docker pull daocloud.io/library/registry:0.5.9

创建容器并运行,启动了一个私有的仓库,主机监听6666端口

> docker run -d -p 6666:5000 daocloud.io/library/registry:0.5.9

首先创建一个tag,指定仓库的IP、端口、目录和容器名

> docker tag 镜像ID 192.168.1.233:6666/test/mynginx:1

查看镜像

> docker images

push镜像到本地仓库

> docker push 192.168.1.233:6666/test/mynginx:1

如果无法push成功请修改下面配置,因为要走https

> vi /etc/sysconfig/docker

去掉下面的#号,并修改如下,改成自已的IP和端口

INSECURE_REGISTRY='--insecure-registry 192.168.1.233:6666'

然后重启服务

> systemctl restart docker.service

现在我们就可以把我们push的镜像下载下来了

> docker pull 192.168.1.233:6666/test/mynginx:1

十三、Docker的WEB管理工具

Shipyard

> curl -s https://shipyard-project.com/deploy | bash -s

Shipyard默认访问端口是8080,默认用户名和密码是admin和shipyard

centos7下docker1.12.5学习笔记的更多相关文章

  1. CS229 - MachineLearning - 12 强化学习笔记

    Ng的机器学习课,课程资源:cs229-课件    网易公开课-视频 问题数学模型: 马尔科夫过程五元组{S.a.Psa.γ.R},分别对应 {状态.行为.状态s下做出a行为的概率.常数.回报}. 一 ...

  2. MFC下的aero效果学习笔记

    最近想在MFC中用下aero 首先参考了 http://blog.csdn.net/polytechnic/article/details/5696797 中的一系列的步骤,进行了初步学习 但是对于其 ...

  3. 用mescroll实现无限上拉增加数据,下拉刷新数据 (学习笔记)

    最近自己做一个web app需要用到上拉查询下页数据,网上看了很多很多帖子,发现并不能快速的套用,总是会出现各种问题无法使用,于是无奈自己跑去看了官方api文档,终于做了出来,至此做个笔记,以后用到可 ...

  4. 20135202闫佳歆--week3 课本1-2章学习笔记

    第一章 Linux内核简介 一.Unix Unix是一个强大.健壮和稳定的操作系统. 简洁 绝大部分东西都被当做文件对待.这种抽象使对数据和对设备的操作都是通过一套相同的系统调用借口来进行的:open ...

  5. linux环境下的GUN make学习笔记(一)

    第一章:概述 1.1:make概述 在linux环境下使用make工具能够比较容易的构建一个属于自己的工程,整个工程的编译只需要一个命令就可以完成编译.连接以至于最后的执行.不过我们需要投入一些时间去 ...

  6. linux下的IO模型---学习笔记

    1.linux文件系统和缓存 文件系统接口 文件系统-一种把数据组织成文件和目录的存储方式,提供了基于文件的存取接口,并通过文件权限控制访问. 存储层次 文件系统缓存 主存(通常时DRAM)的一块区域 ...

  7. Mac下Shell脚本使用学习笔记(二)

    参考文献 Shell 教程 MAC常用终端命令行 Mac下Shell脚本使用 (7)Shell echo命令: 命令格式:echo string ①显示普通字符串:echo "It is a ...

  8. 4月12日学习笔记——jQuery操作属性和样式

    区分 DOM 属性和元素属性 <img src="images/image.1.jpg" id="hibiscus" alt="Hibiscus ...

  9. 1-2 maven学习笔记(7-8章)

    一,生命周期和插件 1.除了坐标.依赖和仓库之外,maven的另外两个核心概念就是声明周期和插件. 生命周期和插件协同工作,密不可分. 清理 初始化 编译 测试 打包 集成测试 验证 部署 站点生成 ...

随机推荐

  1. qurtz.net(转载)

    Quartz+TopShelf实现Windows服务作业调度   Quartz:首先我贴出来了两段代码(下方),可以看出,首先会根据配置文件(quartz.config),包装出一个Quartz.Co ...

  2. JS 实现分页打印

    在调用window.print()时,可以实现打印效果,但内容太多时要进行分页打印. 在样式中有规定几个打印的样式 page-break-before和page-break-after CSS属性并不 ...

  3. Bug : Cannot evaluate ...toString()

  4. django使用restframework实现安全的api

    参考地址:https://github.com/tomchristie/django-rest-framework/ 一般如果在批量修改多的时候,不建议使用,一般在get请求,或者修改单条数据的时候使 ...

  5. UNION 与 UNION ALL的区别

    UNION 操作符用于合并两个或多个 SELECT 语句的结果集. 请注意,列的数量.数据类型.顺序要保持一致!!! 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名. 例子: ...

  6. css3文本和颜色

    1.文本阴影text-shadow 语法 text-shadow:X-Offset Y-Offset blur color; X-Offset:表示阴影的水平偏移距离,其值为正值时阴影向右偏移,反之向 ...

  7. /src/struts.xml

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC         ...

  8. WEB常用前端开发调试工具介绍

    只要是设计开发,就需要进行调试,尽管相对来说,前端的调试要简单一些,但使用一些调试工具或插件还是能提高你的工作效率.下面是一些主要用于IE浏览器环境和Firefox浏览器环境等的调试工具简介. 一.I ...

  9. centos 升级sqlite3

    1.yum remove sqlite3 2. 下载: wget -O sqlite-autoconf-.tar.gz https://www.sqlite.org/2019/sqlite-autoc ...

  10. 03_java基础(三)之第一个程序与开发工具的安装

    1.第一个Java程序 ① 找一个特定的放代码的地方    ② 新建一个文本文档 --> 改名 Hello.java        注意 : 必须先把文件的后缀名都显示出来     不同的操作系 ...