Docker三大组件详解


Docker镜像

   Docker 运行容器前需要本地存在对应的镜像,如果镜像不存在本地,Docker 会从镜像仓库下载(默认是Docker Hub 公共注册服务器中的仓库)。

镜像操作:

   1. 搜索镜像

        docker search

       docker search nginx  #  从 Docker Hub 查找具有 nginx 关键字的镜像.

   2. 下载镜像

       docker pull 

      此命令用来从仓库获取需要的镜像

      docker pull nginx  # 从 docker hub 的nginx 仓库下载 nginx 镜像到本地.

[root@localhost ~]# docker images # 查看本地的 docker 镜像,TAG  信息用来标记来自同一个仓库的不同镜像。
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              568c4670fa80      2 weeks ago       109MB
仓库名               标签                  镜像ID             

   3. 修改镜像仓库名和Tag 名称

      docker tag IMAGEID(镜像id) REPOSITORY:TAG(仓库:标签)

[root@localhost ~]# docker tag 568c4670fa80 bushaoxun/nginx:latest
[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
bushaoxun/nginx     latest              568c4670fa80        2 weeks ago         109MB
nginx               latest              568c4670fa80        2 weeks ago         109MB

   4. 创建镜像

       通过容器创建镜像

       docker commit -m “指定提交的说明信息”  -a "指定更新的用户信息"   容器ID  镜像的仓库名:tag  # 创建成功后返回镜像 ID 信息.

[root@localhost ~]# docker commit -m "nginx-dev" -a "bushaoxun" b6c542a22efc  shaouxn/nginx-dev:v1
sha256:26546368ce8387ffef823e16b7712d4b29a9bd996f85966eaeca8c264a2650d9  #镜像ID
[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
shaouxn/nginx-dev   v1                  26546368ce83        13 seconds ago      109MB
bushaoxun/nginx     latest              568c4670fa80        2 weeks ago         109MB
nginx               latest              568c4670fa80        2 weeks ago         109MB

     利用Dockerfile来创建镜像

     1. 新建一个目录和一个 Dockerfile 文件

     2 . 进入目录并编写 Dockerfile 文件

# This is a comment
FROM bushaoxun/nginx  # 基于哪个镜像创建
MAINTAINER bushaoxun  # 维护者的信息
RUN mkdir -p /var/www/html  # 创建中在容器中执行的命令

    3. 创建镜像

# docker build 指定仓库名和标签名
[root@localhost newimage]# docker build -t="bushaoxun/nginx:v1" .
Sending build context to Docker daemon  2.048kB
Step 1/3 : FROM bushaoxun/nginx:latest
 ---> 568c4670fa80
Step 2/3 : MAINTAINER bushaoxun
 ---> Running in 6130257ff12b
Removing intermediate container 6130257ff12b
 ---> e480b4783294
Step 3/3 : RUN mkdir -p /var/www/html
 ---> Running in d46920df7e5d
Removing intermediate container d46920df7e5d
 ---> 593d8fbe1711
# 查看创建的镜像
[root@localhost newimage]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
bushaoxun/nginx     v1                  593d8fbe1711        9 seconds ago       109MB
nginx               latest              568c4670fa80        2 weeks ago         109MB
bushaoxun/nginx     latest              568c4670fa80        2 weeks ago         109MB

    4. 从本地文件系统导入镜像

     要从本地文件系统导入一个镜像,可以使用 openvz(容器虚拟化的先锋技术)的模板来创建: openvz 的模板下载地址为 templates 

#下载文件系统
wget https://download.openvz.org/template/precreated/centos-7-x86_64.tar.gz
#从下载的文件系统导入成为镜像
cat centos-7-x86_64.tar.gz | docker import - centos:v1
#查看导入的镜像
[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              v1                  0d3ef3a9e423        10 seconds ago      589MB

    5. 存出和载入镜像

    存出镜像:docker save -o centos.tar centos:v1  # 保存镜像到本地文件

    载入镜像: docker load --input centos.tar  # 从本地文件中再导入到本地镜像库,这将导入镜像以及其相关的元数据信息(包括标签等)。

容器操作

   容器是独立运行的一个或一组应用,以及它们的运行态环境。对应的,虚拟机可以理解为模拟运行的一整套操作系统(提供了运行态环境和其他系统环境)和跑在上面的应用。

   1. 新建容器

       容器是基于镜像创建的。

#启动一个Bash终端,允许用户进行交互创建容器.
# -t  选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上,  -i  则让容器的标
准输入保持打开。
docker run -it centos:v1 /bin/bash
#让 Docker容器在后台以守护态(Daemonized)形式运行
docker run -itd centos:v1 /bin/bash

   2. 启动停止容器

      docker start 容器名或者ID  #启动容器

      docker stop 容器名或者ID  #停止容器

   3. 进入容器

       仅介绍 .bash_docker 的方式

       编写 .bashrc_docker 文件,内容如下:

# Some useful commands to use docker.
# Author: yeasy@github
# Created:2014-09-25

alias docker-pid="sudo docker inspect --format '{{.State.Pid}}'"
alias docker-ip="sudo docker inspect --format '{{ .NetworkSettings.IPAddress }}'"

#the implementation refs from https://github.com/jpetazzo/nsenter/blob/master/docker-enter
function docker-enter() {
    #if [ -e $(dirname "$0")/nsenter ]; then
    #Change for centos bash running
    if [ -e $(dirname '$0')/nsenter ]; then
        # with boot2docker, nsenter is not in the PATH but it is in the same folder
        NSENTER=$(dirname "$0")/nsenter
    else
        # if nsenter has already been installed with path notified, here will be clarified
        NSENTER=$(which nsenter)
        #NSENTER=nsenter
    fi
    [ -z "$NSENTER" ] && echo "WARN Cannot find nsenter" && return

    if [ -z "$1" ]; then
        echo "Usage: `basename "$0"` CONTAINER [COMMAND [ARG]...]"
        echo ""
        echo "Enters the Docker CONTAINER and executes the specified COMMAND."
        echo "If COMMAND is not specified, runs an interactive shell in CONTAINER."
    else
        PID=$(sudo docker inspect --format "{{.State.Pid}}" "$1")
        if [ -z "$PID" ]; then
            echo "WARN Cannot find the given container"
            return
        fi
        shift

        OPTS="--target $PID --mount --uts --ipc --net --pid"

        if [ -z "$1" ]; then
            # No command given.
            # Use su to clear all host environment variables except for TERM,
            # initialize the environment variables HOME, SHELL, USER, LOGNAME, PATH,
            # and start a login shell.
            #sudo $NSENTER "$OPTS" su - root
            sudo $NSENTER --target $PID --mount --uts --ipc --net --pid su - root
        else
            # Use env to clear all host environment variables.
            sudo $NSENTER --target $PID --mount --uts --ipc --net --pid env -i $@
        fi
    fi
}

     把 .bashrc_docker 文件内容加载到系统变量

echo "[ -f ~/.bashrc_docker ] && . ~/.bashrc_docker" >> ~/.bashrc; source ~/.bashrc

     常用命令介绍

#显示容器的 pid
docker-pid 容器名或容器ID
#进入容器
docker-enter 容器名或容器ID

    4. 导出和导入容器

# 导出容器到本地文件
docker export  容器名或者容器ID  >  文件名
#从导出的容器快照文件导入成为镜像
cat 容器快照文件名 | docker import -  仓库名:tag
#:用户既可以使用  docker load  来导入镜像存储文件到本地镜像库,也可以使用  docker import  来导入一个容器快照到本地镜像库。这两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息
(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也要大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。

仓库

目前 Docker 官方维护了一个公共仓库 Docker Hub,大部分需求,都可以通过在 Docker Hub 中直接下载镜像来实现。
可以通过执行  docker login  命令来输入用户名、密码和邮箱来完成注册和登录。 注册成功后,本地用户目录的  .dockercfg  中将保存用户的认证信息。

   1. 自动创建镜像

       自动创建允许用户通过 Docker Hub 指定跟踪一个目标网站(目前支持 GitHub 或 BitBucket)上的项目,一旦项目发生新的提交,则自动执行创建。

       要配置自动创建,包括如下的步骤:
           创建并登录 Docker Hub,以及目标网站;
           在目标网站中连接帐户到 Docker Hub;
           在 Docker Hub 中 配置一个自动创建;
           选取一个目标网站中的项目(需要含 Dockerfile)和分支;
           指定 Dockerfile 的位置,并提交创建。
       之后,可以 在Docker Hub 的 自动创建页面 中跟踪每次创建的状态。

    2. 私有仓库

       docker-registry  是官方提供的工具,可以用于构建私有的镜像仓库。

#通过 docker 镜像的方式构建私有仓库。 -v  挂载本地卷到容器卷。  --restart=always, 随docker启动而启动.
docker run -d -v /var/lib/registry:/var/lib/registry -p 5000:5000 --restart=always --privileged=true --name registry registry:latest

     由于docker push 的时候,默认是 https 连接,实现方法有很多种,这里我们先暂时放行 http 连接。

# 编辑配置文件
vim /etc/docker/daemon.json
{
  "registry-mirrors": [ "https://registry.docker-cn.com"], #加速器,aliyun的https://zgmke8qe.mirror.aliyuncs.com
  "insecure-registries": [ "192.168.8.77:5000"] # 配置 http 连接访问
}

    上传镜像到私有仓库

#docker tag  改变镜像仓库名称
docker tag 镜像ID 192.168.8.77:5000/centos
#上传镜像到私有仓库
docker push 192.168.8.77:5000/centos
#查看仓库里面的镜像
[root@localhost docker]# curl http://192.168.8.77:5000/v2/_catalog
{"repositories":["centos","nginx"]}

   配置 web 界面查看仓库内的镜像

# 启动 web 界面docker 容器, 传入私有仓库的地址和端口号.
docker run -d -e ENV_DOCKER_REGISTRY_HOST=192.168.8.77 -e ENV_DOCKER_REGISTRY_PORT=5000  -p 8080:80 konradkleine/docker-registry-frontend:v2
# 访问 web 界面
http://192.168.8.77:8080/home

      

 

 

 

 

      

      

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM