Docker
1、docker 简介
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。
一个完整的Docker有以下几个部分组成:
1.1 DockerClient客户端
1.2 Docker Daemon守护进程
1.3 Docker Image镜像
1.4 DockerContainer容器
相关概念
概念 | 说明 |
---|---|
Docker 镜像(Images) | Docker 镜像是用于创建 Docker 容器的模板,比如 Ubuntu 系统。 |
Docker 容器(Container) | 容器是独立运行的一个或一组应用,是镜像运行时的实体。 |
Docker 客户端(Client) | Docker 客户端通过命令行或者其他工具使用 Docker SDK (https://docs.docker.com/develop/sdk/) 与 Docker 的守护进程通信。 |
Docker 主机(Host) | 一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。 |
Docker Registry | Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。 |
Docker Machine(机器) | Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。 |
2、docker 安装
2.1 Docker CE CentOS7 安装
2.1.1 卸载 (首次安装可忽略)
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine \
docker-ce
2.1.2 安装
1.服务器联网,安装yum 工具
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2 --skip-broken
2.更新本地镜像源
vi /etc/docker/daemon.json
{
"registry-mirrors" : [
"https://8xpk5wnt.mirror.aliyuncs.com"
]
}
3. 安装
yum -y install docker-ce
3、docker 常用命令
1.基础命令
systemctl start docker #启动
systemctl stop docker #关闭
systemctl restart docker #重启
systemctl enable docker #开机自启
systemctl status docker #查看运行状态
docker version #查看版本信息
docker info #查看版本信息
2.镜像命令
docker images #查看docker中镜像列表
docker images -aq # -a 显示全部镜像 -q 只显示ID
docker search 镜像名 #搜索镜像
docker search --filter=STARS=9000 mysql #搜索 STARS>9000 的 mysql 镜像
docker pull 镜像名 #拉取镜像
docker pull 镜像名:Tag #拉取指定版本镜像不指定版本,默认拉取最新版本
docker run 镜像名 #运行镜像
docker run 镜像名:Tag #运行指定版本镜像
docker rmi -f 镜像名/镜像ID #删除一个镜像
docker rmi -f 镜像名/镜像ID 镜像名/镜像ID 镜像名/镜像ID #删除多个镜像,镜像名/ID 空格隔开
docker rmi -f $(docker images -aq) #删除全部镜像
docker save 镜像名/ID -o 路径/名称 # 指定路径名称保存镜像
docker load -i 镜像路径 #加载镜像
docker tag 源镜像名:版本号 新镜像名:版本号 #镜像标签
3.容器命令
docker ps #查看运行容器列表
docker ps -a #查看所有容器列表,包含已停止的容器
docker run -it -d --name 容器别名 -p 宿主机端口:容器端口 镜像名:Tag /bin/bash
# 运行容器
-it 交互式启动
-d 守护式运行
--name 给运行容器起个名字
/bin/bash 交互路径
-p 指定暴露端口
--restart=always # 开机时容器会随着docker服务启动而启动
-v 宿主机文件位置:容器文件位置 #数据挂载,即将容器内指定文件挂载到宿主机指定文件,-v 可以重复使用,一个容器可以同时挂载多个文件
docker exec -it 容器名/容器ID /bin/bash #进入容器 进入后exit 直接退出(未添加-d 运行的容器退出后,容器会被关闭)
docker stop 容器名/容器ID #停止容器
docker start 容器名/容器ID #启动容器
docker restart 容器名/容器ID #重启容器
docker rename 容器名/容器ID 新容器名 #容器改名
docker commit -m="提交信息" -a="作者信息" 容器名/容器ID 提交后的镜像名:Tag #提交镜像
docker cp 容器名称/ID:文件路径 外部文件保存路径 # 拷贝容器内文件到外部
docker cp 外部文件路径 容器名称/ID:文件路径 #拷贝外部文件到容器内
docker logs -f --taul=30 容器ID #查看末尾30行,容器日志,默认查看所有日志
docker system df #查看docker 磁盘使用情况
4、Dockerfile指令详解
FROM:指定基础镜像,定制的镜像都是基于FORM的镜像。
FROM 镜像名称
FROM 镜像名称:版本号
RUN:用于执行后面跟着的命令行,有两种命名方式。
shell格式:
RUN 命令行 #等同于在 shell 终端 操作 shell 命令
exec格式:
RUN ["可执行文件","参数1","参数2"] #等于 ["./test.php","dev","offline"] 等于 [./test.php dev offline]
PS: Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。
FROM centos
RUN yum -y install wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz
可以简写为
FROM centos
RUN yum -y install wget \
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
&& tar -xvf redis.tar.gz
COPY:复制指令,从上下文目录中复制文件或者目录到容器里指定路径。
COPY [--chown=<user>:<group>] <源路径1>... <目标路径>
COPY [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"]
PS: [--chown=<user>:<group>]:可选参数,用户改变复制到容器内文件的拥有者和属组。
<源路径>:源文件或者源目录,这里可以是通配符表达式。
<目标路径>:容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建。
ADD:ADD 指令和 COPY 的使用格类似(同样需求下,官方推荐使用 COPY)。功能也类似,不同之处如下
ADD 的优点:在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>。
ADD 的缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。
CMD:类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:
CMD 在docker run 时运行。
RUN 是在 docker build。
作用:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。
注意:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。
CMD <shell 命令>
CMD ["<可执行文件或命令>","<param1>","<param2>",...]
CMD ["<param1>","<param2>",...] # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数
推荐使用第二种格式,执行过程比较明确。第一种格式实际上在运行的过程中也会自动转换成第二种格式运行,并且默认可执行文件是 sh。
ENTRYPOINT:类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。
但是, 如果运行 docker run 时使用了 --entrypoint 选项,将覆盖 ENTRYPOINT 指令指定的程序。
优点:在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数。
注意:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。
ENTRYPOINT ["<executeable>","<param1>","<param2>",...]
ENV:设置环境变量
ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...
ARG:构建参数,与 ENV 作用一致。不过作用域不一样。ARG 设置的环境变量仅对 Dockerfile 内有效,也就是说只有 docker build 的过程中有效,构建好的镜像内不存在此环境变量。
构建命令 docker build 中可以用 --build-arg <参数名>=<值> 来覆盖。
ARG <参数名>[=<默认值>]
VOLUME:定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。
避免重要的数据,因容器重启而丢失,这是非常致命的。
避免容器不断变大。
VOLUME ["<路径1>", "<路径2>"...]
VOLUME <路径>
EXPOSE:仅仅只是声明端口。
帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。
在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。
EXPOSE <端口1> [<端口2>...]
WORKDIR:指定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。(WORKDIR 指定的工作目录,必须是提前创建好的)。docker build 构建镜像过程中的,每一个 RUN 命令都是新建的一层。只有通过 WORKDIR 创建的目录才会一直存在。
WORKDIR <工作目录路径>
USER:用于指定执行后续命令的用户和用户组,这边只是切换后续命令执行的用户(用户和用户组必须提前已经存在)。
USER <用户名>[:<用户组>]
ONBUILD:用于延迟构建命令的执行。简单的说,就是 Dockerfile 里用 ONBUILD 指定的命令,在本次构建镜像的过程中不会执行(假设镜像为 test-build)。当有新的 Dockerfile 使用了之前构建的镜像 FROM test-build ,这时执行新镜像的 Dockerfile 构建时候,会执行 test-build 的 Dockerfile 里的 ONBUILD 指定的命令。
ONBUILD <其它指令>
LABEL:LABEL 指令用来给镜像添加一些元数据(metadata),以键值对的形式,语法格式如下
LABEL <key>=<value> <key>=<value> <key>=<value> ...
比如我们可以添加镜像的作者:
LABEL org.opencontainers.image.authors="runoob"
5、Docker构建镜像
docker构建镜像最常用的两种方法
1.通过docker commit 构建镜像
2.通过Dockerfile 构建镜像
以上两种放过制作镜像大致分为3步
a.基于原镜像,启动一个 Docker 容器。在容器中进行一些操作,例如执行命令、安装文件等。
b.由这些操作产生的文件变更都会被记录在容器的存储层中。
c.将容器存储层的变更 commit 到新的镜像层中,并添加到原镜像上。
1.1 通过docker commit 构建镜像
docker commit 参数 容器 镜像名:标签
-a :提交的镜像作者;
-c :使用Dockerfile指令来创建镜像;
-m :提交时的说明文字;
-p :在commit时,将容器暂停
2.1 通过Dockerfile 构建镜像
docker build -t regenzm/first_image . # "."指定的是Dockerfile所在的路径
Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
PS:镜像构建时,一定要确保每一层只添加真正需要添加的东西,任何无关的东西都应该清理掉
Dockerfile 编译安装nginx
编写Dockerfile
FROM centos:7
# 指定原始镜像
ADD nginx-1.22.0.tar.gz /usr/local/src/
# 提前下载好nginx安装包,解压到指定目录
RUN yum -y install make zlib zlib-devel openssl openssl-devel gcc-c++ gcc libtool pcre \
# 安装常用命令,环境
&& cd /usr/local/src/nginx-1.22.0 \
# 进入解压后的目录
&& ./configure --prefix=/usr/local/nginx --with-http_ssl_module \
# 指定nginx安装目录,--with指定对应模块
&& make \
&& make install \
# 安装
&& sed -i '9adaemon off;' /usr/local/nginx/conf/nginx.conf \
# 关闭nginx后的启动
&& echo "hello Dockerfile" > /usr/local/nginx/html/index.html
# 修改nginx默认页面
EXPOSE 80
# 暴露容器运行时端口
CMD ["/usr/local/nginx/sbin/nginx"]
启动nginx
Docker build 构建镜像
docker build -t 原始镜像ID 新镜像名:TAG .
运行构建的容器
docker run -d -p80:80 镜像ID #最后无需加命令,如果跟命令的话,Dockerfile中 CMD 指定的命令不会运行
6、数据管理
Docker容器的分层
Docker镜像是分层设计的,镜像层是只读的,通过镜像启动的容器添加了一层可读写的文件系统,用户写入的数据都保存在这一层中。
LowerDir:image 镜像层(镜像本身,只读)
UpperDir:容器的上层(读写)
MergedDir:容器的文件系统,使用Union FS(联合文件系统)将lowerdir 和upperdir 合并给容器使用
WorkDir:容器在 宿主机的工作目录
查看指定容器的数据分层
docker inspect 12959f2c152f(容器ID)
Docker的数据类型分为两种:
- 数据卷(data volume):直接使用宿主机目录,数据卷类似于挂载的一块磁盘,数据容器是将数据保存在一个容器上 。
a. 创建数据卷
docker volume create 数据卷名称
b. 查看所有容器卷
docker volume
c. 查看指定容器卷详细信息
docker volume inspect 数据卷名称
d. 删除数据卷
docker volume rm 数据卷名称
e. 绑定数据卷。将数据卷绑定到容器中。将本地的my-vol数据卷挂载到/usr/share/nginx/html目录下。
docker run -it --name=test-nginx -p 80:80 -v my-vol:/usr/local/nginx/html nginx
- 数据卷容器(Data volume container):间接使用宿主机空间,数据卷容器是将宿主机的目录挂载至一个专门的数据卷容器,然后让其他容器通过数据卷容器读写宿主机的数据。
#将宿主机目录/var/www挂载到容器中的/data1。
#注意:宿主机本地目录的路径必须是使用绝对路径。如果路径不存在,Docker会自动创建相应的路径。
#-v选项可以在容器内创建数据卷
#挂载多个目录 使用多个 -v 即可
docker run -v /var/www:/data1 -itd centos:7 /bin/bash
标签:容器,指定,ID,镜像,Docker,docker
From: https://www.cnblogs.com/bb9527/p/16815124.html