1.docker安装
1.1 CentOS安装Docker
(1)系统要求
64位版本CentOS7,内核版本不低于3.10
(2)卸载旧版本
sudo yum remove docker docker-common docker-selinux docker-engine
(3)使用yum安装
sudo yum install docker-ce
注意:
如果是centos7 minimal版本,执行安装提示“没有可用软件包”,这个时候需要安装必要的软件依赖及更新增加docer-ce yum源
sudo yum install –y yum utils device-mapper-persistent-data lvm2
sudo yum-config-manager –add-repo https://download.docker.com/linux/centos/docker-ce.r- epo
(4)使用脚本安装
curl –fsSL https://get.docker.com –o get-docker.sh
sudo sh get-docker.sh –mirror Aliyun
(5)启动Docker CE
sudo sysemctl enable docker #设置开机启动
sudo systemctl start docker
(6)建立docker用户组
默认情况下,docker命令会使用Unix socket与Docker引擎通讯。而只有root用户与docker组用户才可以访问Docker引擎与Unix socket
sudo groupadd docker #建立docker组
sudo usermod –aG docker $USER #将当前用户加入docker组
(7)测试Docker是否正确安装
docker run hello-world
1.2 CentOS卸载Docker
(1)删除docker安装包
sudo yum remove docker-ce
(2)删除docker镜像
sudo rm –rf /var/lib/docker
1.3 CentOS7配置镜像加速器
(1)对于使用systemd的系统,请在/etc/docker/daemon.json中写入如下内容
{
“registry-mirrors”:[
]
}
(2)重启服务生效
sudo systemctl daemon-reload
sudo systemctl restart docker
(3)检查加速器是否生效
docker info
2.docker命令
2.1获取镜像
- 从docker镜像仓库获取镜像的命令是docker pull。
Docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名:[:标签]
如果没有给出仓库地址,默认会从官方获取镜像
2.2运行镜像
(1)
docker run –it –rm ubuntu:16.04 bash
(2)
-it:-i:交互式操作,-t:终端
--rm:容器退出后随之将其删除
ubuntu:16.04:用来启动的镜像
bash:希望有个交互式shell,因此用bash
2.3删除本地镜像
(1) docker image rm [选项] <镜像1>[<镜像2>…]
<镜像>可以是镜像短ID、镜像长ID、镜像名或者镜像摘要
- 使用docker images ls –q来配合docker image rm,这样可以批量删除希望删除的镜像
docker image rm $(docker images ls –q ubuntu) #删除所有仓库名为Ubuntu的镜像
- 或者删除所有在ubuntu:16.04之前的镜像
docker image rm $(docker image ls –q –f before=ubuntu:16.04)
2.3 Docker容器操作
容器是独立的一个或一组应用,以及它们的运行态环境。
2.3.1启动容器
启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态的容器重新启动
- 新建并启动
docker run
- 启动已终止容器
docker container start 或者 docker start
启动一个bash终端,允许用户进行交互
docker run –t –I ubuntu:16.04 /bin/bash
-t让Docker分配一个伪终端并绑定到容器的标准输入上,-i则让容器的标准输入保持打开。
当利用docker run来创建容器时,docker在后台允许的标准操作包括:
- 检查本地是否存在指定的镜像,不存在就从共有仓库下载
- 利用镜像创建并启动一个容器
- 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
- 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
- 从地址池配置一个ip地址给容器
- 执行用户指定的应用程序
- 执行完毕后容器被终止
2.3.2后台运行
-d参数
只是不把执行命令额结果输出在当前宿主机。
2.3.3进入容器
(1)在使用-d参数时,容器启动会进入后台,使用docker exec命令可以进入到运行中。
(2) exec命令 –i–t参数
docker exec –it 容器ID /bin/bash ,可以进入熟悉的linux命令提示符。
2.3.3导出和导入容器
(1)导出容器
docker export 容器ID > 导出文件名.tar
(2)导入容器
可以使用docker import从容器快照文件中再导入为镜像
cat 导出文件名.tar | docker import – 镜像用户/镜像名:镜像版本
可以使用指定URL或者某个目录来导入
docker import http://study.163.com/image.taz exzmple/imagerepo
2.3.3删除容器
(1)删除容器
docker container rm ubuntu:16.04
如果删除一个运行中的容器,可以添加-f参数。
(2)清理所有处于终止状态的容器
docker container ls –a 可以查看所有已经创建的包括终止状态的容器。
docker container prue 清理所有处于终止状态的容器
3.构建私有镜像
镜像的定制实际上就是定制每一层所添加的配置、文件。我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,这个脚本就是Dockerfile。
3.1使用Dockerfile构建私有镜像
Dockerfile是一个文本文件,其中包含了一条条的指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
以构建nginx镜像为例
FROM nginx
RUN echo ‘<h1>Hello,Docker!</h1>’ /usr/share/nginx/html/index.html
- FROM指定基础镜像
所谓定制镜像,一定是以一个镜像为基础,在其上进行定制。基础镜像是必须指定的,而FROM就是指定基础镜像,因此一个Dockerfile中FROM是必备的指令,并且必须是第一条指令。在Docker Hub上有非常多的高质量的官方镜像,有可以直接拿来使用的服务类镜像,如nginx、redis、mysql等;可以在其中找一个最符合目标的镜像为基础镜像进行定制。
如果没有找到对应服务的镜像,官方镜像中还踢动了一些更为基础的操作系统镜像,如ubuntu、debian等。
除此之外,Docker还存在一个特殊的镜像,名为scratch。这个镜像是虚拟额概念,并不实际存在,它表示一个空白的镜像。
FROM scratch
…
如果以scratch为基础镜像的话,意味着你不以任何镜像为基础,接下来所写的指令将作为镜像第一层开始存在。
- RUN执行命令
RUN指令是用来执行命令行的命令。由于命令行的强大能力,RUN指令在定制镜像时是最常用的指令之一。格式:RUN <命令>
exec格式:RUN[“可执行文件”,” 参数1”,”参数2”]
- 构建镜像
docker build –t nginx:v3
3.2 Dockerfile指令详解
3.2.1 COPY复制文件
格式:
- COPY<源路径>…<目标路径>
- COPY[“<源路径>”,…”<目标路径>”]
3.2.2 ADD更高级的复制文件
ADD指令和COPY的格式性质基本一致。但在COPY基础上增加了一些功能。
比如源路径可以是一个URL。
Docker最佳实践文档中,尽可能使用COPY
3.2.4 CMD容器启动命令
- shell格式: CMD<命令>
- exec格式:CMD[“可执行文件”,”参数1”,”参数2”…]
- 参数列表格式:CMD[“参数1”,”参数2”…]。在指定了ENTRYPOINT指令后,用CMD指定具体的参数。
3.2.5 ENTRYPOINT入口点
ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及参数。ENTRYPOINT在运行时也可以替代,不过比CMD都要略显繁琐,需要通过docker run的参数 –entrypoint来指定。
当指定ENTRYPOINT后,CMD的含义就发生了改变,不再是直接的运行其命令,而是将CMD的内容作为参数传给ENTRYPOINT指令,换句话说实际执行时,将变为:
<ENTRYPOINT>”<CMD>”
3.2.6 ENV设置环境变量
格式有两种:
- ENV <key> <value>
- ENV <key1>=<value1> <key2>=<value2>…
例子:
ENV VERSION=1.0 DEBUG=ON NAME=”EMMAYU”
$VERSION #使用环境变量
3.2.7 ARG构建参数
格式:
- ARG <参数名>[=<默认值>]
构建参数和EVN的效果一样,都是设置环境变量。所不同的是ARG所设置的构建环境的环境变量,在将来容器运行时是不会存在这些环境变量的。
3.2.8 VOLUME定义匿名卷
格式:
- VOLUME [“<路径1>”,”<路径2>”…]
- VOLUME <路径>
3.2.9 EXPOSE声明端口
格式为EXPOSE<端口1>[<端口2>…]
EXPOSE指令是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务。
3.2.10 WORKDIR指定工作目录
格式为WORKDIR<工作目录路径>
使用WORKDIR指令可以来指定工作目录,以后各层的当前目录就被改为指定的目录,如果目录不存在,WORKDIR会帮你建立目录。
3.2.11 USER指定当前用户
格式: USER<用户名>
USER指令和WORKDIR相似,都是改变环境状态并影响以后的层。WORKDIR是改变工作目录,USER这是改变之后层的执行RUM,CMD以及ENTRYPOINT这类命令的身份。
3.2.12 HEALTHCHECK健康检查
格式:
HEALTHCHECK[选项]CMD<命令>:设置检查健康检查状况的命令
HEALTHCHECK NONE: 如果基础镜像有健康检查命令,可以屏蔽掉其健康检查指令。
3.2.12 ONBUILD
格式:ONBUILD<其它指令>
在当前镜像构建时并不会被执行。只有以当前镜像为基础镜像,构建下一集镜像的时候才会被执行。