说明
镜像是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镜像加速
- 在https://dashboard.daocloud.io/注册
- 然后点击加速器,有自动配置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