docker基础篇

docker的知识背景

docker 是一个开放源代码软件项目, 让应用程序部署在软件容器下的工作可以自动化进行, 借此在linux操作系统上, 提供一个额外的软件抽象层, 以及操作系统层虚拟化的自动管理机制. docker利用linux核心资源分脱机制, 例如cgroups, 以及linux核心名字空间, 来创建独立的软件容器, 可以在单一的linux实体下运作, 避免启动一个虚拟机造成的额外的负担. linux核心对名字空间的支持完全隔离了工作环境中应用程序的视野, 包括进程树、网络、用户ID与挂载文件系统, 而核心的cgroup提供资源隔离, 包括CPU、存储器、block I\O与网络。

1. docker 是linux容器的一种封装,提供简单易用的容器接口, 轻松解决了linux容器问题. 
2. docker的接口相当简单, 可以方便创建与销毁容器.
3. docker将应用程序与程序的依赖, 打包在一个文件里.运行这个文件就会生成一个虚拟容器.
4. docker使程序运行在虚拟容器里, 如同在真实的物理机上运行一样, 不需要考虑环境问题.

应用场景

1. web应用的自动化打包和发布.
2. 自动化测试和持续集成、发布.
3. 在服务器环境部署和调整数据库或其他应用.

docker解决环境问题

Linux容器不是模拟一个完整的操作系统,而是对进程进行隔离。在正常进程的外面套了一个保护层,对于容器里面进程来说,它接触的资源都是虚拟的,从而实现和底层系统的隔离。

(1) 启动快
容器里面的应用,直接就是底层系统的一个进程,而不是虚拟机内部的进程。所以,启动容器相当于启动本机的一个进程,而不是启动一个操作系统,速度就快很多。

(2) 资源占用少
容器只占用需要的资源,不占用那些没有用到的资源;虚拟机由于是完整的操作系统,不可避免要占用所有资源。另外,多个容器可以共享资源,虚拟机都是独享资源。

(3) 体积小
容器只要包含用到的组件即可,而虚拟机是整个操作系统的打包,所以容器文件比虚拟机文件要小很多。

总之,容器有点像轻量级的虚拟机,能够提供虚拟化的环境,但是成本开销小得多。

docker容器的优势

1) 更高效的利用系统资源
由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统 资源的利用率更高。
无论是应用执行速度、内存损耗或者文件存储速度,都要比传 统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运 行更多数量的应用。

2) 更快速的启动时间
传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接 运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启 动时间。大大的节约了开发、测试、部署的时间。

3) 一致的运行环境
开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环 境不一致,导致有些 bug 并未在开发过程中被发现。
而 Docker 的镜像提供了除内 核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现 “这段代码 在我机器上没问题啊” 这类问题。

4) 持续交付和部署
使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员 可以通过 Dockerfile 来进行镜像构建,并结合 持续集成(Continuous Integration) 系 统进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合 持续部署(Continuous Delivery/Deployment) 系统进行自动部署。
而且使用 Dockerfile 使镜像构建透明化,不仅仅开发团队可以理解应用运行环 境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像。

5) 更轻松的迁移
由于 Docker 确保了执行环境的一致性,使得应用的迁移更加容易。Docker 可以在 很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运行结果是一致的。在应用的迁移的过程中, 不用担心运行环境的变化导致应用无法正常运行的情况。

docker三大概念

镜像 (image)

1. Docker镜像就是一个只读的模板.
2. 镜像可以用来创建Docker容器.
3. Docker提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。

image的分层系统
因为镜像包含完整的root文件系统, 体积是非常庞大的, 因此docker在设计是按照Union FS的技术, 将其设计为分层存储的架构.
镜像不是ISO那种完整的打包文件, 镜像只是一个虚拟的概念, 并不是一个完整的文件, 而是由一组文件组成, 或者多组文件系统联合组成.

容器 (container)

image和container的关系,就像面向对象程序设计中的 类和实例一样,镜像是静态的定义(class),容器是镜像运行时的实体(object)。
容器可以被创建、启动、停止、删除、暂停
Docker利用容器来运行应用。

容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的,保证安全的平台。

可以把容器看做是一个简易版的Linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。

注意:镜像是只读的,容器在启动的时候创建一层可写层作为最上层。

仓库 (repository)

仓库是集中存放镜像文件的场所。有时候把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。

仓库分为公开仓库(Public)和私有仓库(Private)两种形式。

最大的公开仓库是Docker Hub,存放了数量庞大的镜像供用户下载。国内的公开仓库包括Docker Pool等,可以提供大陆用户更稳定快读的访问。

当用户创建了自己的镜像之后就可以使用push命令将它上传到公有或者私有仓库,这样下载在另外一台机器上使用这个镜像时候,只需需要从仓库上pull下来就可以了。

注意:Docker仓库的概念跟Git类似,注册服务器可以理解为GitHub这样的托管服务。

docker Registry

Docker Registry 公开服务是开放给用户使用、允许用户管理镜像的 Registry 服 务。一般这类公开服务允许用户免费上传、下载公开的镜像,并可能提供收费服务 供用户管理私有镜像。

最常使用的 Registry 公开服务是官方的 Docker Hub,这也是默认的 Registry,并 拥有大量的高质量的官方镜像。

除此以外,还有 CoreOS 的 Quay.io,CoreOS 相 关的镜像存储在这里;Google 的 Google Container Registry,Kubernetes 的镜像 使用的就是这个服务。
由于某些原因,在国内访问这些服务可能会比较慢。
国内的一些云服务商提供了针 对 Docker Hub 的镜像服务(Registry Mirror),这些镜像服务被称为加速器。常见 的有 阿里云加速器、DaoCloud 加速器、灵雀云加速器等。

docker的安装

Centos安装docker

官网:https://docs.docker.com/install/linux/docker-ce/centos/#upgrade-docker-after-using-the-convenience-script

1.卸载旧版本
sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-selinux \
                  docker-engine-selinux \
                  docker-engine
                  
2.设置存储库
sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
  
sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
    
3.安装docker社区版
sudo yum install docker-ce

4.启动关闭docker
systemctl start docker

5.系统环境准备
docker最低支持centos7且在64位平台上,内核版本在3.10以上
# uname -r
3.10.0-693.el7.x86_64

# yum安装
yum install docker -y 

docker镜加速器

https://www.daocloud.io/mirror#accelerator-doc

# 一条命令加速
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://95822026.m.daocloud.io

docker命令

# 启动docker
systemctl start docker

# 重启docker
systemctl restart docker

# 启停docker容器
docker start 容器ID
docker stop 容器ID

基本命令

1. 下载docker镜像
docker pull 镜像名(ubuntu)   # 运行docker镜像, 产生容器实例  

2. 运行docker镜像
docker run ubuntu

3. 交互式运行ubuntu容器, 进入容器空间
docker run -it ubuntu /bin/bash
	-i         # 交互式的命令操作
	-t         # 开启一个终端提供访问
	/bin/bash  # 指定shell解释器
    
4. 打包构建一个携带vim的centos的镜像文件
1) 运行centos镜像
docker run -it centos /bin/bash
2) 容器空间安装vim
yum install vim -y
3) 退出空间容器, 提交容器为新的镜像
exit     # 退出容器
docker commit ID号(容器的)  ZZJ1996/centos-vim

5. 导出本地镜像文件
docker save 0fc9d49cb739 >  /opt/centos.tar.gz  # 自动压缩

6. 导入镜像文件
docker load <  /opt/centos.tar.gz

1. 删除容器记录
docker rm 容器ID

2. 批量删除容器记录
docker rm `docker ps -aq`   # 运行中的不能删除

3. 强制批量删除容器记录
docker rm -f `docker ps -aq`
	-f      # 强制删除
	-aq     # 查询所有ID
 
4. 删除容器记录
docker run -it  --rm 94e /bin/bash
	--rm    # 运行容器, 退出后删除容器记录
	
3. 删除镜像记录
docker rmi 镜像ID

4. 批量删除镜像文件
docker rmi `docker images -aq`  

1. 修改docker镜像名,tag标记名
docker tag  镜像id   新的标记名 

2. 给容器记录命名
docker run --name myredis 94e /bin/bash

运行过docker镜像后, 会产生容器记录.

1. 查看docker镜像命令
docker image ls
docker images

2. 查看正在运行的容器进程
docker container ls
docker ps

3. 查看所有的容器记录
docker ps -a     # docker容器中, 如果有后台程序运行, 就会退出

4. 查看docker镜像记录
docker search centos

5. 查看容器空间内的日志
docker logs 容器ID

6. 不间断打印容器内值日信息
docker logs -f 容器ID

7. 进入正在运行的容器空间
docker exec -it 容器ID /bin/bash

后台不间断的运行一个shell语句
docker run -d centos /bin/sh -c 'while True; do echo hello; sleep 1; done'
	-d       # 后台运行
	centos   # 指定镜像文件
	/bin/sh  # 指定shell解释器
	-c       # 指定shell语句
1. docker端口映射 (宿主机存在一个端口状态)
192.168.11.192:8000

2. 容器空间也会存在一个端口, 运行fluck程序, 开启8000端口

3. 容器内开启一个容器, 提供web程序

4. 下载一个python网络程序镜像, 运行生成一个容器进程
docker run -d tarining/webapp -P
	-d     # 后台运行容器
	-P     # 随机映射一个宿主机端口, 到容器空间内, 暴露的端口
	-p     # 指定映射端口
	
5. 指定宿主机的4567端口, 映射到容器的5000端口
docker run -d -p 4567:5000  training/webapp 

6. 进入到容器空间
docker exec -it 616 /bin/bash

dockerfile制定镜像

镜像的定制就是定制每一层所添加的配置、文件。如果可以吧每一层修改、安装、构建、操作的命令都写入到一个脚本,用脚本来构建、定制镜像,这个脚本就是dockerfile。
Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令 构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
1. 制作base image 基础镜像 (官方image作为首选base image)
FROM scratch
FROM centos         # 使用base image
FROM ubuntu:14.04   # 带有tag的base image

2. 指定一个基础镜像
LABEL version=“1.0” # 容器元信息,帮助信息,Metadata,类似于代码注释
LABEL maintainer=“yc_uuu@163.com"



3.对于复杂的RUN命令,避免无用的分层,多条命令用反斜线换行,合成一条命令!
RUN yum update && yum install -y vim \
    Python-dev      # 反斜线换行
RUN /bin/bash -c "source $HOME/.bashrc;echo $HOME”


WORKDIR /root   # 相当于linux的cd命令,改变目录,尽量使用绝对路径!!!不要用RUN cd
WORKDIR /test   # 如果没有就自动创建
WORKDIR demo    # 再进入demo文件夹

4. ADD是添加文件,从物理机本地,添加到容器空间内 (ADD指令还有解压缩的功能 )
ADD and COPY 
ADD hello /     # 把本地文件添加到镜像中,吧本地的hello可执行文件拷贝到镜像的/目录
ADD test.tar.gz /tmp    # 添加到根目录并解压



WORKDIR /root
ADD hello test/   # 进入/root/, 添加hello可执行命令到/root/test/hello绝对路径的目录下
COPY hello test/  # 等同于上述ADD效果

ADD与COPY
   - 优先使用COPY命令
   - ADD除了COPY功能还有解压功能
添加远程文件/目录使用curl或wget



5. 环境变量,ENV 尽可能使用ENV增加可维护性
ENV MYSQL_VERSION 5.6 #设置一个mysql常量


ENV MYSQL_VERSION 6.7
RUN yum install -y mysql-server=“${MYSQL_VERSION}”

打包flusk程序与dockerfile文件

1.准备flask代码文件
cat s17-flask.py 

如下:
#coding:utf8
from flask import Flask
app=Flask(__name__)
@app.route('/')
def hello():
    return " s17 宇宙无敌"
if __name__=="__main__":
    app.run(host='0.0.0.0',port=8080)

    
2.准备构建dockerfile,用于生成镜像

FROM centos                              # 指定一个基础镜像 
COPY CentOS-Base.repo /etc/yum.repos.d/  # 拷贝本地的yum仓库,到容器空间内               
COPY epel.repo /etc/yum.repos.d/ 
RUN yum clean all 
RUN yum install python-setuptools -y
RUN easy_install flask
COPY s17-flask.py /opt/
WORKDIR /opt       
EXPOSE 8080                              # 暴露容器的8080端口,供给物理机去映射访问
CMD ["python","s17-flask.py"]            # cmd代表执行命令  


3.准备 CentOS-Base.repo  epel.repo  

4.确保 dockerfiel,flask代码,yum仓库文件,在同一层目录

5.构建镜像
docker build .  

6.检查docker镜像文件,是否有自己创建的镜像

7.修改镜像的名字
docket tag 镜像名 新的镜像名

8.运行镜像,生成容器实例
docker run -p 8080:8080  -d  04b

9.检查docker端口映射状态
docker port 容器id

10.访问windows,找到容器内的应用

上传镜像到公有仓库

1.docker提供了一个类似于github的仓库dockerhub,
网址https://hub.docker.com/需要注册使用

2.注册docker id后,在linux中登录dockerhub
docker login

注意要保证image的tag是账户名,如果镜像名字不对,需要改一下tag
docker tag chaoyu/centos-vim yuchao163/centos-vim
语法是:  docker tag   仓库名   yuchao163/仓库名


3.推送docker image到dockerhub
docker push yuchao163/centps-cmd-exec:latest

上传镜像到私有仓库

1.创建私有仓库的容器实例
docker run -d \
    -p 5000:5000 \
    -v /opt/data/registry:/var/lib/registry \
    registry
    # -v参数,数据卷挂载 
    
2.访问私有仓库api,查看是否有结果
http://192.168.11.250:5000/v2/_catalog

3.修改docker配置文件,支持非https方式推送
cat /etc/docker/daemon.json
{"registry-mirrors": ["http://f1361db2.m.daocloud.io"],
"insecure-registries":["192.168.11.250:5000"]
}
~        
    
4.修改了docker配置文件,需要制定docker服务,去加载这些代码
编辑文件 /lib/systemd/system/docker.service, 写入新的配置

[Service]
EnvironmentFile=-/etc/docker/daemon.json

5.重新加载docker
systemctl daemon-reload

6.重启docker
systemctl restart docker


7.重新启动私有仓库的容器
docker run --privileged=true -d -p 5000:5000 -v /opt/data/registry:/var/lib/registry registry

8.修改本地镜像的名字,改成私有仓库的地址开头,推送私有镜像
docker tag  镜像名  私有仓库地址/镜像名 

9.推送本地镜像到私有仓库
docker push   镜像名
posted @ 2019-06-28 08:57  言值  阅读(195)  评论(0编辑  收藏  举报