Docker学习

2019/8/21 posted in  服务器

最近要搞微服务,学习了很多,发现网上对使用Docker进行部署推崇备至,而且之前也用过Docker来搭建Maven私有仓库和Redis,觉得学习下整理一篇博客还是蛮有必要的哈哈。

应用场景

  • Web 应用的自动化打包和发布。
  • 自动化测试和持续集成、发布。
  • 在服务型环境中部署和调整数据库或其他的后台应用。
  • 从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。

CentOs安装Docker

看了网上很多教程,发现没有说的那么麻烦,还是很传统的下载安装方式。

  • 先进行yum更新yum update
  • 使用yum命令进行安装yum install -y docker(备注:-y 表示不询问 使用默认配置进行安装,等待提示 完毕!)
  • 查看是否安装成功yum list installed | grep docker(备注:命令为 查看yum安装完成文件列表 并 筛选docker安装信息)
  • 启动docker服务systemctl start docker
  • 查看是否启动成功systemctl status docker
  • 使用docker命令 docker images(备注:查看docker已经安装的镜像 裸机状态下为空)

Docker常用命令

从docker仓库搜索镜像

docker search [镜像名称]

拉取镜像

docker image pull 镜像名称:版本号 # 不指定版本默认为最新版

删除镜像

docker image rm 镜像名称/镜像ID

查看本地镜像

docker images

重命名镜像

docker tag [old_name] [new_name]

创建容器

docker run [option] 镜像名 [向启动容器中传入的命令]

[option]常用可选参数说明:

  • -i 表示以“交互模式”运行容器,与容器交互
  • -t 表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即 分配一个伪终端。
  • –name 为创建的容器命名
  • -v 表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录,即 宿主机目录:容器中目录),可以使 用多个-v 做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后 共享到容器上。
  • -d 在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t 两个参数,创建后就会自动进去容器)。
  • -p 表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p 做多个端口映射
  • -e 为容器设置环境变量
  • –network=host 表示将主机的网络环境映射到容器中,容器的网络与主机相同
  • -rm 在容器退出时,自动删除其缓存
sudo docker run -it –name=ubuntu1 113a43faa138 /bin/bash

# -it 创建一个伪终端交互界面,name指定容器名称,否则随机一个名字 113a43faa138 镜像id /bin/bash 创建后执行的命令 
sudo docker run -dit --name=ubuntu -v ~/Desktop/ceshi:/ceshi ubuntu
# -v <本机目录:容器目录>创建一个共享目录,左边是本机的目录,右边是容器中的目录,在本机修改内容对应的容器中的目录内容也会改变, 目录不存在会自动创建

查看所有容器

sudo docker container ls #查看所有正在运行的容器
sudo docker container ls --all # 查看所有已创建的容器
  • container id 容器id
  • image 镜像名称
  • command 创建后运行的命令
  • created 创建时间
  • status 关闭时间
  • ports 绑定的端口
  • names 容器名称

运行已经开启的容器

sudo docker container exec -it <容器名/id> <运行后使用的第一个命令>
# 运行使用的第一个命令一般默认为 /bin/bash 否则无法进入交互界面

停止与启动容器

# 停止一个已经在运行的容器
sudo docker container stop [容器名或容器id]

# 启动一个已经停止的容器
sudo docker container start [容器名或容器id]

# kill掉一个已经在运行的容器
sudo docker container kill [容器名]

删除容器

docker container rm [容器名或容器id]

容器保存为镜像

sudo docker commit [容器名] [镜像]名
sudo docker commit ubuntu1 myubuntu  # 将容器名为ubuntu1的容器转换为叫myuntu的镜像,原本的容器并不会删除

镜像打包成文件

sudo docker save -o 保存的文件名 镜像名
sudo docker save -o ./ubuntu.tar ubuntu

将镜像加载到本地

sudo docker load -i  <文件名>
sudo docker load -i ./ubuntu.tar

Dockerfile

Dockerfile是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker通过读取Dockerfile中的指令自动生成映像。

Dockerfile的格式

  1. #用来表示注释。
  2. 指令大小写不敏感,一般大写,参数小写。
  3. Docker顺序执行Dockerfile中的指令来构建image。
  4. 第一个指令以"From"开始。
  5. Dockerfile文件名首字母必须大写。

工作目录

Dockerfile在制作过程中,所有相关的文件都需要在一个文件夹中,这个文件夹叫做工作目录,Dockerfile所在的目录及其子目录。

mkdir /tmp/image1
cd /tmp/image1

Dockerfile指令

FROM命令

除了注释行外,Dockerfile的第一个命令。

FROM <repository>[:<tag>]
FROM <repository>@<digest>
  repository:指定base image的名称
  tag: 指定base image的标签
  digest:image的hashcode

LABLE命令

用于提供Dockerfile制作者的信息,这个命令可以出现在任何位置,一般建议在FROM指令之后。用key value的形式来描述一个image的metadata。

LABLE <key>=<value>
例如:
LABLE maintainer="leveldc<leveldc@126.com>"

COPY命令

用于从宿主机复制文件到镜像文件。

COPY <src>...<dist>
COPY ["<src>",..."<dist>"]
  src:  复制文件的源文件或目录,支持通配符
  dist: 目标路径
说明:
1. <src>必须是build的上下文中的路径,不能是其父目录的文件。
2. 如果<src>是目录,其内部文件及子目录会被递归复制,<src>本身不会被复制。
3. 如果指定了多个<src>或在<src>中使用了通配符,则<dist>必须是一个目录,且以/结束。
4. 如果<dist>不存在,会被自动创建,包括其父目录。
例如:
COPY index.html /data/web/html

ADD命令

类似COPY命令, 支持TAR文件或者TAR.gz和URL路径。
TAR:拷贝本地的tar文件会自动解压缩到docker镜像中。
URL:拷贝服务器地址上的文件并将文件添加到docker 镜像中。

ADD <src>...<dist>
ADD ["<src>",..."<dist>"]
  src:  添加文件的源文件或目录,支持通配符
  dist: 目标路径
说明:
1. 如果<src>为URL且<dist>不以/结尾则<src>指定的文件将被直接下载并创建为<dist>;如果以/结尾,则文件被拷贝至<dist>/<filename>
2. 如果<src>是本地tar文件,则被展开为一个目录,如果是一个URL的tar文件,则不会自动展开。
3. 如果<src>有多个,则dist需要以/结尾,否则将会把src的内容直接写进<dist>。
例如:
ADD http://mirror.bit.edu.cn/apache/tomcat/tomcat-8/v8.5.37/bin/apache-tomcat-8.5.37.tar.gz /usr/local/src/
ADD apache-tomcat-8.5.37.tar.gz /usr/local/src/

WORKDIR命令

指定Docker镜像中的工作路径,可以定义多次,命令执行的时候以最新定义的一次为准。
例如:WORKDIR /usr/local/

VOLUME命令

Dockerfile中的卷只能设置容器中的挂载点目录,只能设置docker管理的卷。
例如:VOLUME /data/mysql

EXPOSE命令

为容器打开指定要监听的端口来和外部通信。

EXPOSE <port>[/<protocol>][<port>[</protocol>]]
protocol:传输协议,tcp/udp, 默认tcp.
可以一次指定多个端口,例如:
`EXPOSE 32332/udp 32332/tcp`

这里的端口并不会直接暴露给宿主机,而是以启动docker容器时候的参数来决定。
docker run -p/-P

ENV命令

定义Dockerfile的环境变量,可以被在Dockfile ENV命令后面的其他命令引用。

 ENV <key> <value>
  ENV <key>=<value> ...
  说明:
  1.第一种格式key后面的所有内容都被认为是value,只可以定义一个
  2.第二种格式可以定义多个<key>=<value>, 如果value中有空格,需要加"\"进行转义,也可以对value加双引号。另外反斜杠可以用来表示续行。
  建议使用第二种。
  3.Dockerfile中定义的ENV可以在启动容器以后直接使用,在运行为容器的时候通过-e参数可以重新给变量赋值。要分清什么参数是在build阶段的,什么是在容器启动阶段。

RUN命令

RUN命令时基于基础镜像所提供的命令来运行,发生在创建镜像的过程中。目的是为了创建镜像。
RUN 命令如果执行了yum,需要在安装完成后删除缓存以减小镜像大小。

RUN <command>
RUN ["<executable>","<param1>","<parm2>"]

说明:
第一种默认启动为/bin/sh 子进程。
第二种执行方式是由linux直接来执行,没有/bin/sh,所以不支持shell的语法,如果需要可以使用:
RUN ["/bin/bash","-c","<executable>","<param1>"]来执行。
例如:
RUN cd /usr/local/src/ && \
    tar -xf  ${WEB_SERVER_VERSION}

CMD命令

CMD命令发生在容器启动时,当一个镜像文件被创建为容器的时候执行,一个容器默认只启动一个进程,所以一个Dockerfile中只可以有一个CMD,如果有多个,则最后一个生效用来指定容器启动时默认执行的程。

CMD <command>
CMD ["<executable>","<param1>","<parm2>"]
CMD ["<param1>","<parm2>"]
说明:
在执行docker run命令的时候,可以指定新的命来来覆盖CMD的内容。如果docker在启动的时候不希望接受命令行输入的命令,可以使用ENTRYPOINT.

ENTRYPOINT命令

和CMD功能类似,但是不接受在docker run的时候修改启动命令,docker run的参数只能以变量的形式传给ENTRYPOINT定义的启动程序。

如果需要改变,需要在docker run的时候指定 --entrypoints参数。

ENTRYPOINT用来支持多环境

USER命令

用于指定运行image或运行Dockerfile中的RUN CMD ENTRYPOINT指令指定的程序时的用户名或者UID。

USER <UID>|<UserName>
CMD ["<executable>","<param1>","<parm2>"]
CMD ["<param1>","<parm2>"]

HEALTHCHECK命令

容器健康检测

HEALTHCHECK [OPTIONS] CMD command
OPTIONS:
  --interval=DURATION(间隔多久检测)
  --timeout=DURATION(检测超时)
  --start-period=DURATION(等待多久开始检测,default=0)
  --retries=N(default=3)
  returns:
  0:success
  1:unhealthy
  2:reserved
  例如:
  HEALTHCHECK --interval=5m --timeout=30s CMD curl -f http://localhost/ || exit 1

SHELL命令

镜像默认的shell

SHELL ["executable","parameters"]

STOPSIGNAL命令

进程为1的命令可以接受docker stop命令,主进程停止,容器就停止。

ARG命令

在build的过程中起作用,使一个dockerfile可以适用多个环境,用法和ENV类似,但是起作用的时间不一样。该变量可以通过 build --arg参数修改。

ONBUILD命令

在Dockerfile中定义一个并发器,当别的镜像是基于有ONBUILD的镜像构建新的镜像的时候,会触发ONBOUILD指令

ONBUILD<INSTRUCTION>

docker buld

创建docker镜像

docker build [OPTIONS] PATH | URL | -