一、查看删除镜像
Docker Image镜像
容器的基石
层叠的只读文件系统
联合加载
docker镜像存储地址:/var/lib/docker
docker info 查看docker信息,也可找到docker镜像存储目录
列出镜像
docker images [OPTIONS] [REPOSITORY]
-a, --all=false,显示所有镜像
-f,--filter=[],显示时的过滤条件
--no-trunc=false,指定不使用截断的形式显示数据,默认截断镜像唯一ID
-q,--quiet=false,只显示镜像的唯一ID
举例:docker images
docker images -a
docker images --no-trunc
docker images -q
docker images centos
镜像的仓库
REPOSITORY 仓库
REGISTRY
镜像标签
TAG
ubuntu:14.01
ubuntu:latest
查看镜像
docker inspect [OPTIONS] CONTAINER|IMAGE [CONTAINER|IMAGE…]
-f,--format=””
举例:docker inspect ubuntu:18.04
删除镜像
docker rmi [OPTIONS] IMAGE [IMAGE…]
-f,--force=false,强制删除镜像
--no-prune=false,保留删除镜像中被打标签的父镜像
举例:
docker rmi ubuntu:14.04,根据仓库名和标签删除
docker rmi 镜像ID,根据镜像ID删除
docker rmi ubuntu:12.04 ubuntu:prcise,删除多个镜像
docker rmi $(docker images -q ubuntu),删除所有镜像
二、获取和推送镜像
查找镜像
Docker Hub网站查找镜像
需要注册
https://registry.hub.docker.com
命令行查找镜像
docker search [OPTIONS] TERM
--automated=false,只显示自动化构建docker镜像
--no-trunc=false,指定不使用截断的形式显示数据
-s,--stars=0,限制显示结果的最低星级
最多返回25个结果
举例:docker search ubuntu
docker search -s 3 ubuntu
拉取镜像
docker pull [OPTIONS] NAME [:TAG]
-a,--all-tags=false,下载仓库所有标签镜像
举例:docker pull ubuntu:14.04
使用国内镜像下载
修改docker启动配置文件
sudo vim /etc/default/docker
添加:DOCKER_OPTS=" --registry-mirror=http://f1361db2.m.daocloud.io"
sudo service docker restart,重启docker
ps -ef | grep docker
ubuntu18.04配置方法
sudo vim /lib/systemd/system/docker.service
在[Service]下加入
EnvironmentFile=-/etc/default/docker
修改 ExecStart=/usr/bin/docker daemon -H fd://
改为 ExecStart=/usr/bin/docker daemon -H fd:// $DOCKER_OPTS
重载 sudo systemctl daemon-reload
重启 sudo service docker restart
ps -ef | grep docker
推送镜像
docker push NAME [:TAG]
构建镜像:shuoyu/commit_test1
docker push shuoyu/commit_test1
构建镜像
保存对容器的修改,并再次使用
自定义镜像的能力
以软件的形式打包并分发服务及其运行环境
通过docker commit构建镜像
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
-a,--author=””,镜像的作者和联系方式
-m,--message=“”,记录镜像构建信息
-p,--pause=true,指示commit可以不暂停正在执行的容器
举例:
docker run -it -p 80 --name commit_test ubuntu /bin/bash
apt-get update
apt-get install -y nginx
exit
docker ps -l
docker commit -a ‘shuoyu’ -m ‘nginx’ commit_test shuoyu/commit_test1
docker images
docker run -d --name nginx_web1 -p 80 shuoyu/commit_test1 nginx -g "daemon off;"
docker ps
crul http://127.0.0.1:port
通过Dockerfile文件构建镜像(docker build)
docker build [OPTIONS] PATH | URL | -
--force-rm=false
--no-cache=false
--pull=false
-q,--quiet=false
--rm=true
-t,--tag="",镜像名称
创建第一个Dockerfile
#First Dockerfile
FROM ubuntu:14.04
MAINTAINER shuoyu 0808litong@163.com
RUN apt-get update
RUN apt-get install -y nginx
EXPOSE 80
举例:
sudo mkdir dockerfile/df_test1
cd dockerfile/df_test1
vim Dockerfile,填入上面的dockerfile内容
docker build -t=' shuoyu /df_test1' .
docker images
docker run -d --name nginx_web3 -p 80 shuoyu/df_test1 nginx -g "deamon off;"
curl http://127.0.0.1:port
Dockerfile指令
注释(#开始)和指令(大写指令名开始)
FROM指令
FROM <image>
FROM <image>:<tag>
说明:已经存在的镜像,基础镜像,必须是第一条非注释指令
MAINTAINER指令
MAINTAINER <name>
指定镜像的作者信息,包含镜像的所有者和联系信息
RUN指令
指定当前镜像中运行的命令
RUN <command>(shell模式)
/bin/sh -c command
RUN [ "executable" , "params1" , "params2"](exec模式)
RUN ["/bin/sh", "-c", "echo hello"]
EXPOSE指令
EXPOSE <port> [<port>…]
指定运行该镜像的容器使用的端口
运行容器是还需指定端口
docker run =p 80 -d shuoyu/df_test1 nginx -g "deamon off;"
举例:
#First Dockerfile
FROM ubuntu:14.04
MAINTAINER shuoyu 0808litong@163.com
RUN apt-get update && apt-get install -y nginx
EXPOSE 80
CMD指令
提供容器运行的默认命令,RUN指令是在容器构建过程中运行,CMD指令是在容器运行时运行,使用docker run启动一个容器运行时,如果指定了容器运行时的命令,CMD指令命令会被覆盖不会执行。
CMD [ "executable" , "param1" , "param2"](exec模式)
CMD command param1 param2(shell模式)
CMD [ "param1" , "param2"](作为ENTRYPOINT指令的默认参数)
举例:
#First Dockerfile
FROM ubuntu:14.04
MAINTAINER shuoyu 0808litong@163.com
RUN apt-get update
RUN apt-get install -y nginx
EXPOSE 80
CMD ["/usr/sbin/nginx", "-g", "deamon off;"]
构建镜像
docker build -t="shuoyu/df_test3" .
运行容器
docker run -p 80 --name cmd_test1 -d shuoyu/df_test3
查看
docker ps
docker top cmd_test1
运行容器
docker run -p 80 --name cmd_test2 -d shuoyu/df_test3 /bin/bash
查看(CMD命令被覆盖)
docker ps
ENTRYPOINT指令
与CMD比较类似,但不会被docker run命令覆盖,如果要覆盖,须在docker run --entrypoint指定。
ENTRYPOINT [ "executable" , "param1" , "param2"](exec模式)
ENTRYPOINT command param1 param2(shell模式)
举例
#First Dockerfile
FROM ubuntu:14.04
MAINTAINER shuoyu 0808litong@163.com
RUN apt-get update
RUN apt-get install -y nginx
EXPOSE 80
ENTRYPOINT ["/usr/sbin/nginx", "-g", "deamon off;"]
与CMD组合使用
#First Dockerfile
FROM ubuntu:14.04
MAINTAINER shuoyu 0808litong@163.com
RUN apt-get update
RUN apt-get install -y nginx
EXPOSE 80
ENTRYPOINT ["/usr/sbin/nginx"]
CMD ["-h"]
运行容器
docker run -p 90 -d --name ep_test2 shuoyu/df_test5 -g "deamon off;"
ADD指令
将文件或目录复制到使用dockerfile构建的镜像中,和COPY类型
ADD <src> …<dest>
ADD ["<src>" …"<dest>"](适用于文件路径中有空格的情况)
举例:
本地页面替换nginx中的默认页面,index.html和dockerfile在同一个目录下
#First Dockerfile
FROM ubuntu:14.04
MAINTAINER shuoyu 0808litong@163.com
RUN apt-get update
RUN apt-get install -y nginx
COPY index.html /usr/share/nginx/html/
EXPOSE 80
ENTRYPOINT ["/usr/sbin/nginx", "-g", "deamon off;"]
运行容器
docker run -d -p 80 --name cp_test shuoyu/df_test6
docker ps -l
curl http://127.0.0.1:port
COPY指令
将文件或目录复制到使用dockerfile构建的镜像中
COPY <src> …<dest>
COPY ["<src>" …"<dest>"](适用于文件路径中有空格的情况)
ADD和COPY对比
ADD包含类似tar的解压功能
单纯复制文件,Docker推荐使用COPY
VOLUME指令
用来向基于镜像创建的容器添加卷,一个卷是可以存在一个或多个容器的特定目录,该目录可以绕过联合文件系统,并提供如共享数据或对数据持久化功能。
VOLUME ["/data"]
WORKDIR指令
从镜像创建一个新容器时,在新容器内部设置工作目录,ENTRYPOINT或CMD指定的命令都会在目录下执行。在构建中为后续的指令制定工作目录。通常会使用绝对路径,如果使用的相对路径,工作路径会一直传递下去。
WORKDIR /path/to/workdir
路径传递实例:
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
/a/b/c
ENV指令
用来设置环境变量,与WORKDIR类型,也可以作用于构建过程中,运行过程中同样有效。
ENV <key><value>
ENV <key>=<value>…
USER指令
USER deamon
镜像会以什么样的用户去运行,如果不指定USER用户,默认会使用root用户。
USER nginx:基于该镜像启动的容器,就会以nginx用户的身份来运行
其它使用方式
USER user USER uid
USER user:group USER uid:gid
USER user:gid USER uid:group
ONBUILD指令
镜像触发器
当一个镜像被其他镜像作为基础镜像时执行
会在构建过程中插入指令
ONBUILD [INSTRUCTION]
举例:
#First Dockerfile
FROM ubuntu:14.04
MAINTAINER shuoyu 0808litong@163.com
RUN apt-get update
RUN apt-get install -y nginx
ONBUILD COPY index.html /usr/share/nginx/html/
EXPOSE 80
ENTRYPOINT ["/usr/sbin/nginx", "-g", "deamon off;"]
构建镜像
docker build -t="shuoyu/df_test7" .
运行容器(发现并没执行ONBUILD中的命令,ONBUILD指定的命令并不会在本次镜像中构建)
docker run -p 80 -d --name ob_test1 shuoyu/df_test7
docker ps
curl http://127.0.0.01:port
基于该镜像构建新镜像
FROM shuoyu/df_test7
MAINTAINER shuoyu 0808litong@163.com
EXPOSE 80
ENTRYPOINT ["/usr/sbin/nginx", "-g", "deamon off;"]
docker build -t="shuoyu/df_test8" .
运行新容器
docker run -p 80 -d --name ob_test2 shuoyu/df_test8
docker ps -l
Dockerfile构建过程
从基础镜像运行一个容器
执行一条指令,对容器做出修改
执行类似docker commit的操作,提交一个新的镜像层
再基于刚提交的镜像运行一个新容器
执行Dockerfile中的下一条指令,直至所有指令执行完毕
使用中间层镜像进行调试
查找错误
构建缓存
不使用缓存
docker build --no-cache
查看镜像的构建过程
docker history [image]
举例:docker history shuoyu/df_test1