Linux

Linux - docker基础

docker的概念

容器三大基本概念:

  • 镜像 image
  • 容器 container
  • 仓库 repository

docker整个生命周期就是这三个概念。

docker镜像

Docker镜像就是一个只读的模板。

例如:一个镜像可以包含一个完整的CentOS操作系统环境,里面仅安装了Apache或用户需要的其他应用程序。

镜像可以用来创建Docker容器。

Docker提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。

docker容器

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

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

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

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

docker仓库

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

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

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

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

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

docker安装流程

1.安装docker,由于网速问题,选择阿里云的yum源下载

yum install docker -y 

2.启动docker

systemctl start docker

systemctl status docker   查看runing已经开启

3。docker加速器,加速下载

curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io

会生成一个docker配置文件,路径是/etc/docker/daemon.json

4.配置了加速器,需要重启docker

systemctl restart docker 

docker基本命令学习

#下载docker镜像
docker pull hello-world
#运行docker镜像,产生容器实例

#运行docker镜像,ubuntu系统
docker run ubuntu  

#交互式的运行ubuntu 容器,进入容器空间内

docker run -it  ubuntu  /bin/bash 
    #参数解释
    -i 交互式的命令操作
    -t 开启一个终端提供访问
    /bin/bash   指定shell解释器
    
#打包构建一个携带vim的centos镜像文件
    1.先运行一个centos基础镜像
    docker run -it centos /bin/bash 
    2.在容器空间内,安装vim
    yum install vim -y 
    3.退出容器空间,提交这个容器,为新的镜像
    docker commit   1d5698b91178    yuchao163/s17centos-vim


​    
#导出本地的镜像文件
docker save  0fc9d49cb739   > /opt/s17centos.tar.gz
    
#导入镜像文件,    
docker load  <  /opt/s17centos.tar.gz

#删除容器记录

docker rm  容器id 

#批量删除容器记录
docker  rm `docker ps -aq`

#强制删除所有容器记录

docker rm -f  `docker ps -aq`

#删除镜像记录

docker rmi  镜像id 

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

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

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

#差看docker镜像的命令

docker  image ls  
docker  images   #等同于上述命令,查看镜像 


#查看正在运行的容器进程,
docker container ls  
docker ps 

#docker ps只能查看正在运行的容器
docker ps -a  查看所有的容器记录 

#docker容器,必须有后台程序在运行,否则容器就退出

#查询docker镜像记录 

docker search centos 

docker 的 hello docker

hello world是程序员启蒙语言,我们通过最简单的image文件“hello-world”,来感受一下docker。

#获取镜像 hello-world
docker pull hello-world
#检查镜像
docker images
#运行image文件,可以用容器id
docker run hello-world
#检查docker容器进程
docker ps
#检查所有运行过的容器
docker ps -a

运行成功后,可以看到结果:

运行一个ubuntu容器

docker search ubuntu #可以看到用户上传的 ubuntu容器

  1. 下载ubuntu容器

     [root@oldboy_python ~ 11:52:22]#docker pull ubuntu:14.04
     #如图,乌班图的镜像下载,是下载每一层的文件
     Trying to pull repository docker.io/library/ubuntu ... 
     14.04: Pulling from docker.io/library/ubuntu
     8284e13a281d: Pull complete 
     26e1916a9297: Pull complete 
     4102fc66d4ab: Pull complete 
     1cf2b01777b2: Pull complete 
     7f7a2d5e04ed: Pull complete 
     Digest: sha256:4851d1986c90c60f3b19009824c417c4a0426e9cf38ecfeb28598457cefe3f56
     Status: Downloaded newer image for docker.io/ubuntu:14.04
    
     下载过程可以看出镜像是由多层存储构成的。下载也是一层一层,并非单一的文件。
    
     下载过程中给出每一层的前12位ID。下载结束后会给出sha246的文件一致性校验值。
    
  2. 运行这个乌班图容器

     [root@oldboy_python ~ 12:18:53]#docker run -it --rm ubuntu:14.04 bash
     #此时会进入交互式的shell界面,即可以使用乌班图操作系统
     root@3efbb2749d7c:/# cat /etc/os-release  
     NAME="Ubuntu"
     VERSION="14.04.5 LTS, Trusty Tahr"
     ID=ubuntu
     ID_LIKE=debian
     PRETTY_NAME="Ubuntu 14.04.5 LTS"
     VERSION_ID="14.04"
     HOME_URL="http://www.ubuntu.com/"
     SUPPORT_URL="http://help.ubuntu.com/"
     BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
     #使用exit退出容器
     exit
    

docker run -it --rm ubuntu:14.04 bash

docker run就是运行容器的命令。
参数
 -it : -i 是交互式操作,-t是终端
 -rm  :   容器退出后将其删除。也可以不指定参数,手动docker rm,使用-rm可以避免浪费空间。
 ubuntu:14.04   这指的是镜像文件
 bash   :  指定用交互式的shell,因此需要bash命令

Docker与CentOS

docker允许在容器内运行应用程序,使用docker run命令来在容器内运行应用程序。

下载运行CentOS容器

加速docker镜像下载

curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://95822026.m.daocloud.io

下载centos镜像

[root@oldboy_python ~ 15:14:31]#docker pull docker.io/centos
Using default tag: latest
Trying to pull repository docker.io/library/centos ...
latest: Pulling from docker.io/library/centos
256b176beaff: Pull complete
Digest: sha256:fc2476ccae2a5186313f2d1dadb4a969d6d2d4c6b23fa98b6c7b0a1faad67685
Status: Downloaded newer image for docker.io/centos:latest

运行一个交互式的容器

[root@oldboy_python ~ 15:15:07]#docker run -it centos /bin/bash
#此时进入docker容器
[root@c72e9c40cfe2 /]# cat /etc/redhat-release

此时就进入了centos系统

可以查看系统相关信息,内核版本信息
cat /proc/version
ls /

此时想要退出容器,使用exit命令

提交修改自定义的镜像(docker container commit)

1.我们进入交互式的centos容器中,发现没有vim命令
docker run -it centos
2.在当前容器中,安装一个vim
yum install -y vim
3.安装好vim之后,exit退出容器
exit
4.查看刚才安装好vim的容器记录
docker container ls -a
5.提交这个容器,创建新的image
docker commit 059fdea031ba chaoyu/centos-vim
6.查看镜像文件
[root@master /home]docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
chaoyu/centos-vim   latest              fd2685ae25fe        5 minutes ago       348MB

外部访问容器

容器中可以运行网络应用,但是要让外部也可以访问这些应用,可以通过-p或-P参数指定端口映射。

1. 宿主机会有一个端口状态

	192.168.11.250:8000 

 容器空间也会有一个端口 
运行一个flask程序,开启8000端口 

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

3. 下载一个python 网络程序镜像,运行它,生成一个容器进程


docker run -d training/webapp   -P  
    # -d 后台运行容器
    # -P 随机映射一个宿主机端口,到容器空间内,暴露的端口 
    # -p  指定端口映射 
    
docker run -d   -p 4567:5000      training/webapp    #指定宿主机的4567端口,映射到容器的5000端口

#进入到这个容器空间
docker exec -it 616  /bin/bash 

利用dockerfile定制

镜像是容器的基础,每次执行docker run的时候都会指定哪个镜像作为容器运行的基础。我们之前的例子都是使用来自docker hub的镜像,直接使用这些镜像只能满足一定的需求,当镜像无法满足我们的需求时,就得自定制这些镜像。

镜像的定制就是定制每一层所添加的配置、文件。如果可以吧每一层修改、安装、构建、操作的命令都写入到一个脚本,用脚本来构建、定制镜像,这个脚本就是dockerfile。
Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令 构建一层,因此每一条指令的内容,就是描述该层应当如何构建。

  1. 制定一个基础基础镜像

    FROM scratch #制作base image 基础镜像,尽量使用官方的image作为base image
    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命令,避免无用的分层,多条命令用反斜线换行,合成一条命令!

    RUN yum update && yum install -y vim
    RUN /bin/bash -c "source $HOME/.bashrc;echo $HOME”

    Python-dev #反斜线换行

  4. WORKDIR

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

     ADD and COPY 
     ADD hello /  #把本地文件添加到镜像中,吧本地的hello可执行文件拷贝到镜像的/目录
     ADD test.tar.gz   /tmp    #添加到根目录并解压
    
     优先使用COPY命令
     ADD除了COPY功能还有解压功能
     添加远程文件/目录使用curl或wgetse
    
  6. ENV设置环境变量

     ENV MYSQL_VERSION 5.6 #设置一个mysql常量
     下面引用的时候 都是 MYSQL_VERSION 5.6
    
     ENV MYSQL_VERSION 6.7
     RUN yum install -y mysql-server=“${MYSQL_VERSION}” 
     RUN yum install -y mysql-server=“${MYSQL_VERSION}” 
     RUN yum install -y mysql-server=“${MYSQL_VERSION}” 
     RUN yum install -y mysql-server=“${MYSQL_VERSION}” 
     RUN yum install -y mysql-server=“${MYSQL_VERSION}”
    

打包flask程序与dockerfile

确保app.py和dockerfile在同一个目录!

1.准备好app.py的flask程序

[root@master home]# cat app.py
#coding:utf8
from flask import Flask
app=Flask(__name__)
@app.route('/')
def hello():
    return "hello docker"
if __name__=="__main__":
    app.run(host='0.0.0.0',port=8080)
[root@master home]# ls
app.py  Dockerfile

2.编写dockerfile

FROM centos
COPY CentOS-Base.repo /etc/yum.repos.d/
COPY epel.repo /etc/yum.repos.d/ 
RUN yum clean all 
RUN yum install python-setuptools -y
RUN easy_install flask
COPY s16-flask.py /opt/
WORKDIR /opt
EXPOSE 8080
CMD ["python","s16-flask.py"]

3.构建镜像image

docker build -t yuchao163/flask-hello-docker .

4.查看创建好的images

docker image ls

5.启动此flask-hello-docker容器,映射一个端口供外部访问

docker run -d -p 8080:8080 yuchao163/flask-hello-docker

6.检查运行的容器

docker container ls

发布 docker image 到仓库

发布到公有镜像

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
4.在dockerhub中检查镜像
https://hub.docker.com/
5.删除本地镜像,测试下载pull 镜像文件
docker pull yuchao163/centos-entrypoint-exec

私有仓库

但是这种镜像仓库是公开的,其他人也是可以下载,并不安全,因此还可以使用docker registry官方提供的私有仓库

1.官方提供的私有仓库docker registry用法
https://yeasy.gitbooks.io/docker_practice/repository/registry.html
2.一条命令下载registry镜像并且启动私有仓库容器
私有仓库会被创建在容器的/var/lib/registry下,因此通过-v参数将镜像文件存储到本地的/opt/data/registry下
端口映射容器中的5000端口到宿主机的5000端口
docker run -d 
    -p 5000:5000 
    -v /opt/data/registry:/var/lib/registry 
    registry
3.检查启动的registry容器
docker ps
4.测试连接容器
telnet 192.168.119.10 5000
5.修改镜像tag,以docker registry的地址端口开头
docker tag hello-world:latest 192.168.119.10:5000/hello-world:latest
6.查看docker镜像,找到registry的镜像
docker images
7.Docker 默认不允许非 HTTPS 方式推送镜像。我们可以通过 Docker 的配置选项来取消这个限制,这里必须写正确json数据
[root@master /]# cat /etc/docker/daemon.json
{"registry-mirrors": ["http://95822026.m.daocloud.io"],
"insecure-registries":["192.168.119.10:5000"]
}

写入到docker服务中,写入到[Service]配置块中,加载此配置文件
[root@master home]# grep 'EnvironmentFile=/etc/docker/daemon.json' /lib/systemd/system/docker.service
EnvironmentFile=-/etc/docker/daemon.json
8.修改了docker配置文件,重新加载docker
systemctl daemon-reload
9.重启docker
systemctl restart docker
10.重启了docker,刚才的registry容器进程挂掉了,因此重新启动它
docker run --privileged=true -d -p 5000:5000 -v /opt/data/registry:/var/lib/registry registry
--privileged=true  docker容器的安全机制:设置特权级运行的容器
11.推送本地镜像
docker push 192.168.119.10:5000/hello-world

12.由于docker registry没有web节目,但是提供了API数据
官网教程:https://docs.docker.com/registry/spec/api/#listing-repositories

curl http://192.168.119.10:5000/v2/_catalog

或者浏览器访问http://192.168.119.10:5000/v2/_catalog
13.删除本地镜像,从私有仓库中下载
docker pull 192.168.119.10:5000/hello-world
原文地址:https://www.cnblogs.com/konghui/p/10533702.html