docker基础 --- 镜像篇

96
梦想做小猿
2017.02.09 17:25* 字数 947

说明

镜像是Docker的三大组件之一,docker运行容器前需要本地存在对应镜像,如果本地没有镜像,docker会从镜像仓库下载(默认是Docker Hub公共服务器中的仓库)

基础操作

  • 获取镜像

    docker pull [选项] [docker registry地址]<仓库名>:<标签>
    
    • docker registry地址:一般为<域名/IP>[:端口号],默认地址为docker hub
    • 仓库名:仓库名分为两段,<用户名>/<软件名>。如果不给出用户名,则默认为library,也就是官方镜像

    例如:

    [root@localhost ~]# docker pull centos
    

    以上命令中没有给出docker registry地址,则默认是从docker hub中下载镜像。而镜像名是centos,因此会下载官方镜像library/centos仓库标签为最新的(latest)镜像

  • 配置国内镜像加速

    docker pull 默认使用docker hub下载镜像,速度非常慢,这里配置daocloud镜像加速

    1. https://dashboard.daocloud.io/注册
    2. 然后点击加速器,有自动配置docker加速器,复制到命令行运行即可,该命令会在/etc/docker下生成一个daemon.json文件
  • 运行镜像

    启动一个临时容器

    [root@localhost ~]# docker run -it -rm centos bash
    
    • docker run 运行一个新容器
    • -it是两个参数,-i:交互式操作,-t是给一个终端,因为这里需要进入到bash中输入命令,所以需要一个交互式终端
    • -rm,容器退出后自动删除该容器,为了排障需求,默认退出容器不会删除容器,需要手动docker rm。一般测试情况下添加rm参数可以节省空间
    • bash,我们希望有个交互式的shell,因此使用bash

    启动一个web容器

    [root@localhost ~]# docker run --name webserver -d -p 80:80 nginx
    

    用nginx镜像构建一个名为webserver的容器,并将容器的80端口映射到物理机的80端口

使用Dockerfile定制镜像

docker的镜像是以分层的形式工作的,定制镜像就是定制每一层所添加的配置、 文件。我们可以把每一层的修改、安装、构建、操作的命令都写入一个脚本,用这 个脚本来构建镜像,这个脚本就是Dockerfile

以nginx镜像为例,定制ngixn默认首页

[root@localhost ~]# mkdir mynginx && cd mynginx && touch Dockerfile
[root@localhost ~]# vim Dockerfile
FROM nginx
RUN echo '<h1>Hello Docker</h1>' > /usr/share/nginx/html/index.html

Dockerfile主要由FROM和RUN组成

  • FROM指定基础镜像,是Dockerfile中必备指令,且必须放在第一个,镜像可指定为scratch,表示不以任何镜像为基础
  • RUN 用来指定命令的指令,RUN有两种格式
    • shell格式:RUN <命令>,就像直接在命令行中输入一样,上例就是该格式
    • exec格式:RUN ["可执行文件","参数1","参数2"]

Dockerfile 中每一个指令都会建立一层,如果有多个RUN会建立多层,会产生非常臃肿、非常多层的镜像,容易出错,效率低,且docker对层有限制,Union FS限制不能超过127层。所以Dockerfile应将命令写成一行,使用一个RUN

[root@localhost ~]# mkdir mynginx && cd mynginx && touch Dockerfile
[root@localhost ~]# vim Dockerfile
FROM centos
RUN yum install epel-release \
    && yum install nginx \
    && echo '<h1>Hello Docker</h1>' > /usr/share/nginx/html/index.html
CMD ["nginx","-g","daemon off;"]
[root@localhost ~]# docker build -t nginx_v3 .

以上Dockerfile将多条命令写到一个RUN中,减少了创建层的个数。如果Dockerfile中有编译安装软件,最后要将下载的源码包删掉,以避免镜像太臃肿。CMD为启动该容器的时候自动运行的命令后续文章会仔细解释

使用git repo构建镜像

[root@localhost ~]# docker build https://github.com/xxxx/xxxx.git

使用tar包构建镜像

[root@localhost ~]# docker build http://server/xxxx.tar.gz

从标准输入构建

[root@localhost ~]# docker build - < Dockerfile
[root@localhost ~]# cat Dockerfile | docker build -

从标准输入读取压缩包构建

[root@localhost ~]# docker build - < xxx.tar.gz
Docker
Web note ad 1