好用的容器 docker

docker是什么(将代码、配置环境全部打包在一个镜像文件中,镜像就是操作系统的压缩文件)

Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,
  于 2013 年 3 月以 Apache 2.0 授权协议开源,主要项目代码在 GitHub 上进行维护。
Docker 使用 Google 公司推出的 Go 语言 进行开发实现。
docker是linux容器的一种封装,提供简单易用的容器使用接口。它是最流行的Linux容器解决方案。
docker的接口相当简单,用户可以方便的创建、销毁容器。
docker将应用程序与程序的依赖,打包在一个文件里面。运行这个文件就会生成一个虚拟容器。
程序运行在虚拟容器里,如同在真实物理机上运行一样,有了docker,就不用担心环境问题了。

为什么要用docker

# 因为以前服务器部署应用的时候最开始用物理机,后来用虚拟机,
1.会很浪费时间
2.成本非常高
3.资源浪费
4.难于迁移和扩展,换机器需要把所有依赖关系都安装一遍
5.可能会别限定硬件厂商,比如在联想电脑上写的,在戴尔电脑就不能用
!!! docker的出现解决了这些问题,并且还解决了最让人头疼的环境配置问题,他可以把所有需要的环境,依赖包放到一个容器里,然后打包发给测试

物理机,虚拟机,docker的区别

物理机, 虚拟机, docker的关系就好比 物理机是一栋居民楼, 虚拟机是居民楼里的每个房子,docker就相当于房子里面的每个房间.

docker VS 传统虚拟机

docker的三大概念

# docker 三大基本概念
容器 container   相当于类实例化的对象  电脑城的光盘
镜像 image    相当于那个类 刻光盘的机器 仓库 repository 管理镜像的      电脑城
docker整个生命周期就是这三个概念。

镜像(操作系统的一个压缩文件)

Docker镜像就是一个只读的模板。
    例如:一个镜像可以包含一个完整的CentOS操作系统环境,里面仅安装了Apache或用户需要的其他应用程序。
镜像可以用来创建Docker容器。
Docker提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。

容器

image和container的关系,就像面向对象程序设计中的 类和实例一样,镜像是静态的定义(class),容器是镜像运行时的实体(object)。
容器可以被创建、启动、停止、删除、暂停
Docker利用容器来运行应用。
容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的,保证安全的平台。
可以把容器看做是一个简易版的Linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
!!! 注意:镜像是只读的,容器在启动的时候创建一层可写层作为最上层。

仓库

仓库是集中存放镜像文件的场所。有时候把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。
实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
最大的公开仓库是Docker Hub,存放了数量庞大的镜像供用户下载。国内的公开仓库包括Docker Pool等,可以提供大陆用户更稳定快读的访问。
当用户创建了自己的镜像之后就可以使用push命令将它上传到公有或者私有仓库,这样下载在另外一台机器上使用这个镜像时候,
  只需需要从仓库上pull下来就可以了。
!!! 注意:Docker仓库的概念跟Git类似,注册服务器可以理解为GitHub这样的托管服务。

centos安装docker

官方安装
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社区版
yum install docker-ce
4.启动关闭docker
systemctl start/status docker

配置docker容器加速器,加速镜像文件的下载

curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://95822026.m.daocloud.io
!!! 注意:一定要修改docker的配置文件才能生效,   vim  /etc/docker/daemon.json
{"registry-mirrors": ["http://95822026.m.daocloud.io"]}  #去掉结尾的逗号

 docker命令

docker启动停止容器

  #启停docker容器
  docker start 容器id
  docket stop 容器id

  #批量停止docker容器
  docker stop `docker ps -aq`

验证当前是那个系统 : cat /etc/os-release

docker stop 镜像id 关闭镜像
sudo systemctl stop docker 关闭整个docker程序

对docker容器,镜像的增删改查
#获取一个hello-world镜像,默认去docker Hub中搜索docker镜像
docker search hello-world #搜索镜像
docker pull hello-world #下载镜像,如同我去买光盘

#基于镜像运行一个容器实例
docker run hello-world #也可以docker run 镜像文件ID的前三位,同样可以执行

#交互式运行一个ubuntu系统,就是可以输入命令
docker run -it ubuntu /bin/bash
参数解释:
  -i 交互式运行
  -t 开启一个终端
  /bin/bash linux的shell解释器

提交记录,生成新的镜像文件
docker commit 镜像id 镜像名

#运行一个活着的容器,后台有进程的容器

 #运行一个后台有进程的容器,活着的容器
  docker run -d centos /bin/sh -c "while true;do echo 买了佛冷; sleep 1;done"
  #参数解释
    docker run 运行镜像
    -d daemonize 后台运行
    centos 镜像名
    /bin/sh 指定shell的sh解释器
    -c 指定一段shell代码
    "while true;do echo 买了佛冷; sleep 1;done" #死循环的每秒钟打印一个买了佛冷

  #运行一个自定义名字的容器记录
  docker run --name s18foleng -d centos /bin/sh -c "while true;do echo 买了佛冷; sleep 1;done"

  #导出docker镜像
  docker save 9ed836d5dd03 > /opt/mydocker.tar.gz

  #导入docker镜像
  docker load < /opt/mydocker.tar.gz

  #docker run 如果运行不存在的镜像,默认会去先docker pull

  #容器内指定端口映射,暴露宿主机的7000,指定映射到容器的5000,这个5000是在容器代码内控制的
  docker run -d -p 7000:5000 training/webapp python app.py

  参数解释:

    -d               后台运行容器

    -p               大P,随机端口映射,小p,指定端口映射

     training/webapp  镜像名字

     python app.py    容器要执行的命令

 0~65535 端口范围


#删除容器有关
docker rm "容器id" #删除容器记录,后面跟的是容器id的前三位
docker re ~docker ps -ap~ #一次性删除所有容器记录 # 反引号取得的是命令的结果
docker rm ~docker rmi -ap~ #一次性删除所有镜像 ,-f 强制删除,尽量少用
#删除镜像有关
docker rmi "镜像id" #删除镜像,


  #进入正在运行的容器空间内
  docker exec -it 容器id /bin/bash


  #修改docker镜像的名字


  docker tag 镜像id 新的镜像名
  docker tag 9ed836d5dd03 yuchao163/s18-aliyun-centos-vim


docker image ls #列出docker镜像文件
docker images #同上,

#运行镜像后,会产生一个容器记录,
docker ps #查看当前正在运行的容器记录,容器必须有存在的意义,否则会挂掉
docker ps -a #查看所有运行过的容器记录
docker ps -ap #查询出所有运行过容器记录的id
docker images -ap #查询出所有镜像id

#查看容器内日志信息
docker logs 容器id #一次性打印日志
docker logs -f 容器id #不间断打印日志

实例:构建自己的docker镜像,提交到本地镜像仓库

1.运行一个centos基础镜像,发现没有vim,在容器内部安装vim,且配置阿里源

docker run -it centos /bin/bash

2.安装wget,下载阿里云的yum源

yum install -y wget
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

3.基于阿里云的yum源下载vim 
yum install -y yum

4.退出centos容器环境
exit

5.提交这个容器记录,生成一个新的镜像文件
docker commit 镜像id 镜像名

导出这个镜像,成为一个压缩文件,就可以给大家发送下去


#登录dockerhub个人主站,托管docker镜像的网址


https://hub.docker.com/


1.下载dockerhub上的镜像
docker pull superme/s18-hello-docker-world



2.在linux登录docker hub,然后推送镜像到公网


docker login


3.修改本地镜像的名字,为docker hub的仓库id
docker tag 镜像id dockerhubID/镜像名


4.推送镜像到docker hub


docker push 镜像id

dockerfile的学习

什么是dockerfile?

dockerfile其实就是之前我们都是手动的执行命令,而dockerfile是在这个文件中制定了相对应的代码,自动的执行命令。
其实就是一个存储代码的地方,告诉系统我们要怎么样执行这段代码?

dockerfile中的指令

#项目依赖于什么操作系统
FROM scratch #制作base image 基础镜像,尽量使用官方的image作为base image
FROM centos #使用base image
FROM ubuntu:14.04 #带有tag的base image

#label标签,谁写的,以及帮助信息
LABEL version=“1.0” #容器元信息,帮助信息,Metadata,类似于代码注释
LABEL maintainer=“superme@163.com"

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

#workdir  相当于linux中的 cd,切换目录
WORKDIR  /etc
WORKDIR root

#add  把本地的代码添加到容器中,还可以用来解压缩文件

ADD shuai.txt  /opt   #把本地的shuai.txt添加到镜像中的/opt下
ADD shuai.tar.gz  /opt  #解压缩之后添加到镜像中的/opt下

#copy 将宿主机的文件,拷贝到容器中,不会解压缩文件
COPY hello test/  #等同于上述ADD效果

ADD与COPY
   - 优先使用COPY命令
    -ADD除了COPY功能还有解压功能
#ENV 相当于定义了一个变量,定义了之后,提高代码的可维护性
#比如,我写了很多个 d=1,有一天我要把这个d改为2的时候,我是不是要把每一个都给改了呀,使用了ENV就可以避免这个问题

ENV MYSQL_VERSION 1.6
RUN yum install -y mysql-server = "${MYSQL_VERSION}"

dockerfile实战,构建自己的flask镜像

准备工作:
  创建's18'目录,在目录中创建s18-flask.py 和Dockerfile文件(后者名称是固定不能改变的)

1.准备一个flask代码文件 cat s18-flask.py 2.编写dockerfile FROM centos                  #指定centos基础镜像 COPY CentOS-Base.repo /etc/yum.repos.d/ #拷贝宿主机的文件,到容器空间下 COPY epel.repo /etc/yum.repos.d/ #拷贝宿主机的文件,到容器空间下 RUN yum clean all #执行清空yum缓存的命令 RUN yum install python-setuptools -y #想安装python依赖工具 RUN easy_install flask #是想让docker自动的帮咱们安装python2的flask模块 COPY flask.py /opt/ #把本地的代码文件,拷贝到容器的/opt目录下 WORKDIR /opt #进入到/opt目录下 EXPOSE 8080 #暴露容器的8080端口,供给外部宿主机去访问 CMD ["python","flask.py"] #cmd代表你要执行的命令 3.构建build这个dockerfile 确保文件都准备好了,如下所示 [root@wangdachui s18dockerfile]# ls CentOS-Base.repo Dockerfile epel.repo s18-flask.py 4.构建dockerfile docker build . 5.通过自己构建的镜像,运行一个flask程序 docker run -d --name flask -p 5555:8080 s18-flask.py   参数:
    --name 表示这个程序执行的是什么
6.通过浏览器去访问linux宿主机的 5555端口,即可访问到flask程序

搭建docker私有仓库

1.下载docker私有镜像
docker pull registry

2.修改docker的配置文件 
#修改如下配置文件
vim /etc/docker/daemon.json


修改内容如下
{"registry-mirrors": ["http://95822026.m.daocloud.io"],
"insecure-registries":["192.168.226.128:5000"]
}

3.修改docker的service配置文件,让它加载/etc/docker/daemon.json
修改如下文件
vim /lib/systemd/system/docker.service

添加如下配置到 [service]代码块中
EnvironmentFile=-/etc/docker/daemon.json

4.重启docker的服务
systemctl daemon-reload
systemctl restart docker

5.重新启动一个私有镜像仓库的容器实例

docker run --privileged=true -d -p 5000:5000 -v /opt/data/registry:/var/lib/registry     registry

--privileged=true  docker容器的安全机制:设置特权级运行的容器


6.推送本地镜像,到私有仓库中
docker push 192.168.226.128:5000/s18-hello-world

7.检查docker私有仓库的api地址,检查json数据
http://192.168.226.128:5000/v2/_catalog

8.尝试下载私有仓库的镜像
docker pull 192.168.226.128:5000/s18-hello-world

  

原文地址:https://www.cnblogs.com/zty1304368100/p/11219098.html