docker基础知识

(一)docker 基础语法

# 启动docker
sudo service docker start
sudo systemctl start docker
# 停止docker
sudo service docker stop
# 重启docker
sudo servcie docker restart
# 设置docker随服务启动自启动
sudo service docker enable
# 查看docker运行状态
sudo service docker status
# 查看docker版本
docker version
docker info

(二) docker镜像命令

# 创建自定义镜像
docker build [OPTIONS] PATH | URL | -
1. 常用OPTIONS选项说明
–build-arg,设置构建时的环境变量
–no-cache,默认false。设置该选项,将不使用Build Cache构建镜像
–pull,默认false。设置该选项,总是尝试pull镜像的最新版本
–compress,默认false。设置该选项,将使用gzip压缩构建的上下文
–disable-content-trust,默认true。设置该选项,将对镜像进行验证
–file, -f,Dockerfile的完整路径,默认值为‘PATH/Dockerfile’
–isolation,默认–isolation=“default”,即Linux命名空间;其他还有process或hyperv
–label,为生成的镜像设置metadata
–squash,默认false。设置该选项,将新构建出的多个层压缩为一个新层,但是将无法在多个镜像之间共享新层;设置该选项,实际上是创建了新image,同时保留原有image。
–tag, -t,镜像的名字及tag,通常name:tag或者name格式;可以在一次构建中为一个镜像设置多个tag
–network,默认default。设置该选项,Set the networking mode for the RUN instructions during build
–quiet, -q ,默认false。设置该选项,Suppress the build output and print image ID on success
–force-rm,默认false。设置该选项,总是删除掉中间环节的容器
–rm,默认–rm=true,即整个构建过程成功后删除中间环节的容器

2. PATH | URL | -说明
给出命令执行的上下文。
上下文可以是构建执行所在的本地路径PATH,也可以是远程URL,如Git库、tarball或文本文件等,还可以是-。
构建镜像的进程中,可以通过ADD命令将上下文中的任何文件(注意文件必须在上下文中)加入到镜像中。

可以是PATH,如本地当前PATH为.

如果是Git库,如https://github.com/docker/rootfs.git#container:docker,则隐含先执行git clone --depth 1 --recursive,到本地临时目录;然后再将该临时目录发送给构建进程。

-表示通过STDIN给出Dockerfile或上下文。


# 查看自己服务器镜像列表
docker images
# 搜索镜像
docker search 镜像名
docker images | grep 镜像名(不加tag)
# 拉取镜像(不加tag表示拉取该镜像最新版本latest)
sudo docker pull 镜像名:tag
sudo docker pull 镜像名

# 运行镜像(创建容器) 
 镜像名:tag
创建容器常用的参数说明:
创建容器命令:docker run
 -i:表示运行容器
 -t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。
 --name :为创建的容器命名。
 -v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
 -d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t两个参数,创建后就会自动进去容器)。
 -p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射
 --restart=always 表示,该容器随docker服务启动而自动启动
例子(docker --name mynginx -p 80:80 -d nginx)

# 删除单个镜像
docker rmi -f 镜像名/镜像ID
#删除多个 其镜像ID或镜像用用空格隔开即可 
docker rmi -f 镜像名/镜像ID 镜像名/镜像ID 镜像名/镜像ID
#删除全部镜像  -a 意思为显示全部, -q 意思为只显示ID
docker rmi -f $(docker images -aq)
# 强制删除镜像
docker image rm 镜像名称/镜像ID

# 保存镜像(将我们的镜像 保存为tar 压缩文件 这样方便镜像转移和保存)
docker save 镜像名/镜像ID -o 镜像保存在哪个位置与名字
docker save tomcat -o /myimg.tar
# 加载镜像(将保存的镜像恢复为镜像)
docker load -i 镜像保存文件位置

#更改镜像名和tag
docker tag 源镜像名:TAG 想要生成新的镜像名:新的TAG


(三) docker容器命令

# 查看正在运行的容器
docker ps
# 查看所有容器(包含正在运行的和停止的容器)
docker ps -a

# 进入容器(只能进入正在运行的容器)
docker exec -it 容器名/容器ID /bin/bash
# 退出容器
#直接退出  未添加 -d(持久化运行容器) 时 执行此参数 容器会被关闭  
exit
# 优雅退出 --- 无论是否添加-d 参数 执行此命令容器都不会被关闭
Ctrl + p + q

# 停止、重启、启动容器
 docker stop/restart/start 容器名/容器ID
 # kill 容器
 docker kill 容器名/容器ID
 
 #删除单个容器
docker rm -f 容器名/容器ID
#删除多个容器 空格隔开要删除的容器名或容器ID
docker rm -f 容器名/容器ID 容器名/容器ID 容器名/容器ID
#删除全部容器
docker rm -f $(docker ps -aq)

# 容器文件拷贝(无论容器是否开启,都可以拷贝)
#docker cp 容器ID/名称:文件路径  要拷贝到外部的路径  | 要拷贝到外部的路径  容器ID/名称:文件路径
#从容器内 拷出
docker cp 容器ID/名称: 容器内路径  容器外路径
#从外部 拷贝文件到容器内
docker  cp 容器外路径 容器ID/名称: 容器内路径

# 查看容器日志
docker logs -f --tail=要查看末尾多少行 默认all 容器ID
# 更改容器名字
docker rename 容器ID/容器名 新容器名

(三) docker运维命令

#  删除异常停止的容器
docker rm `docker ps -a | grep Exited | awk '{print $1}'` 
 
#  删除名称或标签为none的镜像
docker rmi -f  `docker images | grep '<none>' | awk '{print $3}'`

# 清楚所有无容器使用的镜像(只要是镜像无容器使用(容器正常运行)都会被删除,包括容器临时停止)
docker system prune -a

(四) dockerfile语法

Dockerfile的基本指令有十三个,分别是:FROM、MAINTAINER、RUN、CMD、EXPOSE、ENV、ADD、
COPY、ENTRYPOINT、VOLUME、USER、WORKDIR、ONBUILD

FROM
  用法:FROM <image>
  说明:第一个指令必须是FROM了,其指定一个构建镜像的基础源镜像,如果本地没有就会从公共库中拉取,
  没有指定镜像的标签会使用默认的latest标签,可以出现多次,可以在一个Dockerfile中构建多个镜像。

MAINTAINER
  用法:MAINTAINER <name> <email>
  说明:描述镜像的创建者,名称和邮箱

RUN
  用法:RUN "command" "param1" "param2"
  说明:RUN命令是一个常用的命令,执行完成之后会成为一个新的镜像,这里也是指镜像的分层构建。
  一句RUN就是一层,也相当于一个版本。这就是之前说的缓存的原理。
  我们知道docker是镜像层是只读的,所以你如果第一句安装了软件,用完在后面一句删除是不可能的。
  所以这种情况要在一句RUN命令中完成,可以通过&符号连接多个RUN语句。
  RUN后面的必须是双引号不能是单引号(没引号貌似也不要紧),command是不会调用shell的,所以也不会继承相应变量,要查看输入RUN "sh" "-c" "echo" "$HOME",而不是RUN "echo" "$HOME"。

 CMD
  用法:CMD command param1 param2
  说明:CMD在Dockerfile中只能出现一次,有多个,只有最后一个会有效。
  其作用是在启动容器的时候提供一个默认的命令项。
  如果用户执行docker run的时候提供了命令项,就会覆盖掉这个命令。没提供就会使用构建时的命令。

EXPOSE
  用法:EXPOSE <port> [<port>...]
  说明:告诉Docker服务器容器对外映射的容器端口号,在docker run -p的时候生效。

ENV
  用法:EVN <key> <value> 只能设置一个
       EVN <key>=<value>允许一次设置多个
  说明:设置容器的环境变量,可以让其后面的RUN命令使用,容器运行的时候这个变量也会保留。

ADD
  用法:ADD <src>   <dest>
  说明:复制本机文件或目录或远程文件,添加到指定的容器目录,支持GO的正则模糊匹配。
  路径是绝对路径,不存在会自动创建。如果源是一个目录,只会复制目录下的内容,目录本身不会复制。
  ADD命令会将复制的压缩文件夹自动解压,这也是与COPY命令最大的不同。

 COPY
  用法:COPY <src> <dest>
  说明:COPY除了不能自动解压,也不能复制网络文件。其它功能和ADD相同。

ENTRYPOINT
  用法:ENTRYPOINT "command" "param1" "param2"
    说明:这个命令和CMD命令一样,唯一的区别是不能被docker run命令的执行命令覆盖,
    如果要覆盖需要带上选项--entrypoint,如果有多个选项,只有最后一个会生效。

VOLUME
  用法:VOLUME ["path"]
  说明:在主机上创建一个挂载,挂载到容器的指定路径。
  docker run -v命令也能完成这个操作,而且更强大。
  这个命令不能指定主机的需要挂载到容器的文件夹路径。
  但docker run -v可以,而且其还可以挂载数据容器。

USER
  用法:USER daemon
  说明:指定运行容器时的用户名或UID,后续的RUN、CMD、ENTRYPOINT也会使用指定的用户运行命令。

WORKDIR
  用法:WORKDIR path
  说明:为RUN、CMD、ENTRYPOINT指令配置工作目录。
  可以使用多个WORKDIR指令,后续参数如果是相对路径,则会基于之前的命令指定的路径。
  如:WORKDIR  /home  WORKDIR test 。
  最终的路径就是/home/test。
  path路径也可以是环境变量,比如有环境变量HOME=/home,WORKDIR $HOME/test也就是/home/test。

ONBUILD
  用法:ONBUILD [INSTRUCTION]
  说明:配置当前所创建的镜像作为其它新创建镜像的基础镜像时,所执行的操作指令。
  意思就是,这个镜像创建后,如果其它镜像以这个镜像为基础,会先执行这个镜像的ONBUILD命令。

(五) dockerfile优化

1. 减少RUN指令的使用
RUN yum -y update
RUN yum install -y gcc gcc-c++
整合为yum install -y gcc gcc-c++ && yum -y update

2. 清理镜像构建的中间产物
构建镜像的过程中,当dockerfile的指令执行完成后,删除镜像不需要用的的文件。
如使用yum安装组件,最后可使用yum clean all镜像清理不需要的文件或者使用系统rm命令删除不需要的源文件,或者一些压缩包等。
(因为镜像每层都是只读的,所以要写一层)
RUN yum install -y gcc gcc-c++ && yum -y update && yum clean all

3. 多阶段构建(使用FROM命令生成多个镜像,将指定的镜像做为其他镜像的基础镜像环境来构建)

4. 使用更小体积的linux 发行版本

5. 选择精简的基础镜像。
选择体积最小的基础镜像可有效降低镜像体积。如:alpine、busybox等。基础镜像并非越小越好,满足需求和扩展性以及开发者使用的熟悉程度才是更重要的因素。

6. 减少镜像的层数
在使用dockerfile构建镜像时,dockerfile中的每一条指令都会生成一个层,因此可以通过合并dockerfile中可合并的指令,减少最终生成镜像的层数。例如:在dockerfile中使用RUN执行shell命令是,可以用"&&"将多条命令连接起来。

7. 充分利用镜像构建缓存
1)利用构建的缓存来加快镜像构建速度,Docker构建默认会开启缓存,缓存生效有三个关键点,镜像父层没有发生变化,构建指令不变,添加文件校验和一致。只要一个构建指令满足这三个条件,这一层镜像构建就不会再执行,它会直接利用之前构建的结果。
2)某一层的镜像缓存失效之后,它之后的镜像层缓存都会失效。我们应该把变化最少的部分放在Dockerfile的前面,这样可以充分利用镜像缓存。
3)dockerfile中有可能导致缓存失效的命令WORKDIR、CMD、ENV、ADD等,像这些命令最好放到dockerfile底部,以便在构建镜像过程中最大限度使用缓存。

8. 优化网络请求
使用一些镜像源或者在dockerfile中使用互联网上的url时,去用一些网络比较好的开源站点,这样可以节约时间、减少失败率

9. 尽量不要在Dockerfile从外部拉依赖或者资源包,比如从maven中央仓库拉依赖会由于网络问题导致失败,可以从集团maven仓库拉。针对固化的依赖或者资源,可以放到基础镜像里面,能够降低构建的时长。

注意

# 启动容器时没有设置随docker服务自启动,但又想让容器自启动(不用删除旧容器)
docker  update --restart=always 容器Id 或者 容器名
或
docker container update --restart=always 容器Id 或者 容器名

#提交镜像(我们运行的容器可能在镜像的基础上做了一些修改,有时候我们希望保存起来,封装成一个更新的镜像,这时候我们就需要使用 commit 命令来构建一个新的镜像)
docker commit -m="提交信息" -a="作者信息" 容器名/容器ID 提交后的镜像名:Tag

补充:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值