目录
Docker的作用
Docker的核心概念
Docker安装
镜像命令
镜像下载
查看镜像
搜索镜像
删除镜像
容器命令
创建容器
列出容器
新建并启动容器(最常使用)
守护态运行
启动容器
终止容器
重启容器
进入容器
attach命令
exec命令(最常使用)
退出容器
删除容器
重点:各种参数的作用
核心命令
日志命令
查看容器里面的进程
从容器拷贝文件到主机上
Docker数据管理
什么是数据卷
配置数据卷
数据卷容器
DockerFile
构建镜像
常见的13种指令
CMD和MAINTAINER的区别
公有云
发布镜像到DockerHub
发布镜像到阿里云
部分图片来自百战程序员
Docker的作用
Docker只能在Linux中运行
开发者需要能方便高效构建应用,并且任何时间任何地点都可以获取。
Docker在开发和运维中的优势
对开发和运维( DevOps)人员来说,可能最梦寐以求的就是一次性地创建或配置,可以在任意环境、任意时间让应用正常地运行。而Docker恰恰是可以实现这一终极目标的瑞士军刀。
优势:
- 更快速的交付和部署
- 更高效的资源利用
- 更轻松的迁移和扩展
- 更简单的更新管理
Docker与虚拟机比较
作为一种轻量级的虚拟化方式,Docker在运行应用上跟传统的虚拟机方式相比具有显著优势。
特性 | 容器 | 虚拟机 |
启动速度 | 秒级 | 分钟级 |
磁盘使用 | 一般为MB | 一般为GB |
性能 | 接近原生 | 弱于 |
系统支持量 | 单机支持上千个容器 | 一般几十个 |
隔离性 | 完全隔离 | 完全隔离 |
Docker的核心概念
- 镜像(Image)
- 容器 (Container)
- 仓库 (Repository)
Docker 镜像 (Image) 类似于虚拟机镜像,可以将它理解为个面向 Docker引擎的模板,包含了文件系统。
镜像从何而来
- 从Docker Hub下载 原理相当于maven-> 中央仓库
- 通过Docker file自己创建出来
Docker容器
Docker容器(Container)类似于一个轻量级的沙箱,Docker利用容器来运行和隔离应用。容器是从镜像创建的应用运行实例,可以将其启动、开始、停止、删除,而这些容器都是相互隔离、互不可见的。
注意:
容器和镜像一样,也是若干层的叠加,唯一区别是所有只读层的最上面一层,是一层可读可写层,可以记住这个简单的公式:容器 = 容器镜像 + 可读可写层
Docker仓库
Docker仓库(Repository)类似于代码仓库,是Docker集中存放镜像文件的场所。目前,最大的公开仓库是Docker Hub,存放了数量庞大的镜像供用户下载。国内的公开仓库包括Docker Pool等,可以提供稳定的国内访问。
注意:
Docker利用仓库管理镜像的设计理念与Maven非常相似。
咱们再来理解docker的两句口号就更好理解了
- 「Build, Ship and Run (搭建,发送给同事,同事即可运行)」
- 「Build once,Run anywhere (搭建一次,运行到任何地方)」
Docker安装
系统环境
序号 | 软件 | 版本 |
1 | Centos | 7.5 |
2 | Linux内核 | 3.8之上 |
关闭防火墙
systemctl stop firewalld
关闭selinux
vim /etc/selinux/config
SELINUX=disabled
安装docker引擎
yum install -y docker
启动docker
systemctl start docker
设置docker自启动
systemctl enable docker
测试docker是否安装成功
docker run hello-world
镜像命令
镜像下载
Docker运行容器前需要本地存在对应的镜像,如果镜像不存在本地,Docker会尝试先从默认镜像仓库下载(默认使用Docker Hub公共注册服务器中的仓库),用户也可以通过配置,使用自定义的镜像仓库。
镜像下载
镜像是Docker运行容器的前提。
语法格式:
docker pull 镜像名字:[tag]
注意:
如果不指定tag,则下载Docker Hub公共注册服务器中仓库的最新版本。
例:下载mysql5.7
我这里已经下载过了,所以没有提示下载信息
查看镜像
列出本地主机上已有的镜像。
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
参数:
- 来自于哪个仓库,比如 ubuntu仓库。镜像的标签信息,比如14.04。
- 镜像的ID号(唯一)。
- 创建时间。
- 镜像大小。
镜像的ID信息十分重要,它唯一标识了镜像。
搜索镜像
搜索远端仓库中共享的镜像,默认搜索Docker Hub官方仓库中的镜像。
docker serach [镜像名字]
参数:
可以看到返回了很多包含关键字的镜像,其中包括镜像名字、描述、星级 (表示该镜像的受欢迎程度)、是否官方创建、是否自动创建等。
例子:搜索镜像mysql:5.7
删除镜像
使用镜像的标签删除镜像
docker rmi 源名字
docker rmi image id(image id可以只写前两位)
容器命令
创建容器
Docker的容器十分轻量级,用户可以随时创建或者删除容器。
语法格式
docker create -it 镜像名字
注意:
使用docker create命令新建的容器处于停止状态,可以使用docker start命令来启动它。
列出容器
docker ps
参数:
- -a: 显示未启动容器
- -q:返回容器id号
新建并启动容器(最常使用)
启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态( stopped)的容器重新启动。所需要的命令主要为docker run,等价于先执行docker create命令,再执行docker start命令。
语法格式:
docker run 镜像名字 /bin/echo
Docker在后台运行的标准操作包括:
- 检查本地是否存在指定的镜像,不存在就从公有仓库下载。
- 利用镜像创建并启动一个容器。
- 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层。
- 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去。
- 从地址池配置一个IP地址给容器。
- 执行用户指定的应用程序。
- 执行完毕后容器被终止。
下面命令则启动一个bash端,运行用户交互
docker run -t -i 镜像名字 /bin/bash
参数:
其中,-t选项让Docker 分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上,-i则让容器的标准输入保持打开。
exit命令退出。
例子:创建tomcat容器并启动后台运行
守护态运行
更多的时候,需要让Docker容器在后台以守护态(Daemonized)形式运行。用户可以通过添加-d参数来实现。
语法格式(在run后面加-d即可称为守护态运行):
docker run -d 镜像名字 /bin/bash -c "while true; do echo hello world ;sleep 1 ;done"
例子:创建tomcat容器并启动后台运行
启动容器
处于终止状态的容器,可以通过docker start命令来重新启动:
语法:
docker start 容器id
终止容器
docker restart命令会将一个运行态的容器终止,然后再重新启动
语法:
docker restart 容器id
重启容器
docker restart命令会将一个运行态的容器终止,然后再重新启动
语法:
docker restart 容器id
进入容器
在使用-d参数时,容器启动后会进入后台,用户无法看到容器中的信息。某些时候如果需要进入容器进行操作,有多种方法,包括使用docker attach命令、docker exec命令,以及nsenter工具等。
attach命令
语法格式:
docker attach 容器id
注意:
1、但是使用attach命令有时候并不方便。当多个窗口同时attach 到同一个容器的时候,所有窗口都
会同步显示。当某个窗口因命令阻塞时,其他窗口也无法执行操作了。
2、使用attach命令进入容器过后,使用exit退出,那么容器也会终止
exec命令(最常使用)
Docke自1.3版本起,提供了一个更加方便的工具exec,可以直接在容器内运行命令。例如进入到刚创建的容器中,并启动一个bash:
docker exec -it 容器id /bin/bash
注意:使用了exec命令进入容器,exit退出容器时不会终止容器
例子:进入mytomcat5,输出文件列表
退出容器
#如果docker容器在启动的时候没有加 -d 参数
exit # 会直接停止容器并退出
Ctrt + p + q # 容器不停止 并退出
删除容器
语法格式:
docker rm 容器id
参数:
- -f, --force=false强行终止并删除一个运行中的容器。
- -l, --link=false删除容器的连接,但保留容器。
- -V,--volumes=false删除容器挂载的数据卷。
例子:强制终止并删除mytomcat5容器
重点:各种参数的作用
一、选项说明
官方文档:https://docs.docker.com/engine/reference/commandline/run/
- -p 映射端口 宿主机端口号:容器内应用端口
- -P 随机端口
- --name容器的名字
核心命令
日志命令
语法格式:
docker logs 容器id
参数:
- -f, --follow 跟踪实时日志
- --since string 显示自某个timestamp之后的日志,或相对时间,如42m(即42分钟)
- --tail string 从日志末尾显示多少行日志, 默认是all
- -t, --timestamps 显示时间戳
- --until string 显示自某个timestamp之前的日志,或相对时间,如42m(即42分钟)
查看容器里面的进程
语法格式:
docker top 容器id
从容器拷贝文件到主机上
语法格式:
docker cp 容器id:容器内路径 目录路径
Docker数据管理
什么是数据卷
什么是容器数据卷
Docker中的数据可以存储在类似于虚拟机磁盘的介质中,在Docker中称为数据卷(Data Volume)
思考
- Docker容器删除后,在容器中产生的数据还在吗?
- Docker容器和外部机器可以直接交换文件吗?
- 容器之间能进行数据交互?
数据卷概念
- 数据卷是宿主机中的一个目录或文件。
- 当容器目录和数据卷目录绑定后,对方修改会立即同步。
- 一个数据卷可以同时被多个容器同时挂载。
- 一个容器也可以被挂载多个数据卷。
数据卷作用
- 容器数据持久化。
- 外部机器和容器间接通信。
- 容器之间数据交换。
一句话:
卷技术就是为了实现数据的持久化和同步操作,容器间也是数据共享。
配置数据卷
docker run -v 宿主机目录(文件):容器内目录(文件)
注意事项
- 目录必须是绝对路径
- 如果目录不存在则会自动创建
- 可以挂载多个数据卷
示例
给Tomcat服务器挂载/opt/webapps路径。
docker run -d --name mytomcat -p 8080:8080 -v /opt/webapps:/usr/local/tomcat/webapps tomcat
数据卷容器
Volume基本使用
参数:
create # 创建数据卷
inspect #查看数据卷元数据
ls #查看数据卷列表
prune #删除所有未使用的卷
rm #删除数据卷
创建一个自定义容器
docker volume create 容器数据卷名
查看所有容器卷
docker volume ls
查看指定容器卷详情信息
docker volume inspect 容器数据卷名
删除数据卷
docker volume rm 容器数据卷名
使用指定卷容器
有了自定义容器卷,我们可以创建一个使用这个数据卷的容器,这里我们以tomcat为例:
docker run -d -it --name=容器数据卷名 -p 8080:8080 -v 容器数据卷名:/usr/local/tomcat/webapps tomcat
注意:
-v代表挂载数据卷,这里使用自定数据卷edc-tomcat-vol,并且将数据卷挂载到/usr/local/tomcat/webapps 。如果没有通过-v指定,那么Docker会默认帮我们创建匿名数据卷进行映射和挂载。
DockerFile
构建镜像
简单示例
在一个空白的文本文件, 命名必须为Dockerfile
vim Dockerfile
示例1
Dockerfile文件内容:
#基础镜像
FROM centos
#维护者
MAINTAINER baizhan<baizhan@163.com>
#运行命令
RUN "yum install wget"
#启动容器运行命令
CMD echo "hello Dockerfile"
示例2
Dockerfile文件内容:
FROM java:8
MAINTAINER WCC
CMD java -version
构建镜像命令
docker build -t 镜像名字:版本 .
注意
. 代表Dockerfile文件在当前路径
常见的13种指令
FROM
指定基础镜像,必须为第一个命令。
指令格式:
FROM <image>
FROM <image>:<tag>
注意:
tag或digest是可选的,如果不使用这两个值时,会使用latest版本的基础镜像
MAINTAINER
维护者信息
指令格式:
MAINTAINER <name>
示例
MAINTAINER Jasper Xu MAINTAINER sorex@163.com
WORKDIR
工作目录,类似于cd命令
指令格式:
WORKDIR /usr/workdir
示例
WORKDIR /a (这时工作目录为/a)
WORKDIR b (这时工作目录为/a/b)
WORKDIR c (这时工作目录为/a/b/c)
示例
WORKDIR /OPT
RUN mkdir docker
WORKDIR /usr/local
RUN echo "test" > a.info
注意: 通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行。在使用docker run运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。
RUN
构建镜像时执行的命令
指令语法:
# 1. shell执行
格式 RUN<command>
# 2. exec执行
格式 RUN["executable", "param1", "param2"]
示例
WORKDIR /OPT
RUN mkdir docker
WORKDIR /usr/local
RUN echo "test" > a.info
注意:
RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,可以在构建时指定--no-cache参数,如:docker build --no-cache
ADD
将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget。
指令格式:
ADD <src>... <dest>
ADD ["<src>",... "<dest>"] 用于支持包含空格的路径示例:
示例
添加所有以"hom"开头的文件
ADD hom* /mydir/
? 替代一个单字符,例如:"home.txt"
ADD hom?.txt /mydir/
添加 "test" 到 WORKDIR/relativeDir/
ADD test relativeDir
添加 "test" 到 /absoluteDir/
ADD test /absoluteDir/
COPY
功能类似ADD,但是是不会自动解压文件,也不能访问网络资源。
语法格式:
COPY <源路径> <目标路径>
示例
COPY ./start.sh /start.sh
CMD
构建容器后调用,也就是在容器启动时才进行调用。指定这个容器启动的时候要运行的命令只有最后一个会生效可被替换。
指令格式:
CMD指令与RUN指令相似,也具有两种格式:
1. shell格式:CMD <命令>
2. exec格式: CMD ["可执行文件", "参数1", "参数2", …]
示例
CMD echo "This is a test." | wc -
CMD ["/usr/bin/wc","--help"]
注意: CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。
ENTRYPOINT
配置容器,使其可执行化。配合CMD可省去"application",只使用参数。
指定容器启动的要运行的命令,可以追加命令
指令格式:
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2 (shell内部命令)
示例
ENTRYPOINT ["top", "-b"]
注意:
ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT,而docker run命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT。Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令。
ENV
这个指令非常简单,就是用于设置环境变量而已,无论是接下来的指令,还是在容器中运行的程序,都可以使用这里定义的环境变量。
指令格式:
ENV <key>=<value>
示例
ENV JAVA_HOME=/usr/local/jdk1.7.0_79
ENV PATH=$JAVA_HOME/bin:$PATH
EXPOSE
指定于外界交互的端口
指令格式:
EXPOSE
示例
EXPOSE 80
注意:
EXPOSE并不会让容器的端口访问到主机。要使其可访问,需要在docker run运行容器时通过-p来发布这些端口,或通过-P参数来发布EXPOSE导出的所有端口。
VOLUME
用于指定持久化目录
指令格式:
VOLUME ["/path/to/dir"]
示例
VOLUME ["/data"]
VOLUME ["/var/www", "/var/log/apache2"]
注意:
一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:
1 卷可以容器间共享和重用
2 容器并不一定要和其它容器共享卷
3 修改卷后会立即生效
4 对卷的修改不会对镜像产生影响
5 卷会一直存在,直到没有任何容器在使用它
USER
USER指令用于将会用以什么样的用户去运行
指令格式:
USER user
USER user:group
注意:
使用USER指定用户后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT都将使用该用户。镜像构建完成后,通过docker run运行容器时,可以通过-u参数来覆盖所指定的用户。
ONBUILD
帮助别人定制而准备的
指令格式:
ONBUILD[INSTRUCTION]
示例
FROM centos
WORKDIR /data
ONBUILD RUN mkdir test
FROM test:02
CMD和MAINTAINER的区别
区别:
- CMD #指定这个容器启动的时候要运行的命令,可被替换
- ENTRYPOINT #指定这个容器启动的时候要运行的命令,可以追加命令
例子
Dockerfile文件
#基础镜像
from centos
#启动容器运行命令
CMD ["ls" ,"-a"]
构建镜像
docker build -t test:v1 .
此时如果运行一下命令则会报错
docker run test:v1 -l
但是如果把CMD换成ENTRYPOINT则可运行,因为CMD是将["ls" ,"-a"]替换为-l,而ENTRYPOINT是在["ls" ,"-a"]后面追加-l
公有云
发布镜像到DockerHub
创建仓库
设置仓库信息
注意:
DockerHub Docker Hub
发布基本命令
注册docker账号
docker login --username=kalista
注意:
填写注册Docker Hub的密码。
把容器提交到docker hub上
docker commit -m "镜像描述" -a "作者" 容器id/容器名字 远程库的名字:上传到docker hub上的名字
注意:
- -m 镜像描述
- -a 作者
将镜像,容器,远程库进行标识
docker tag 镜像id 远程库的名字:上传到docker hub上的名字
将于远程库有标识关系的库提交
docker push 远程库的名字:上传到docker hub上的名字
发布镜像到阿里云
创建仓库
创建镜像仓库
设置命名空间和仓库名字
登录阿里云Docker Registry
docker login --username=1858778****@163.com registry.cn-hangzhou.aliyuncs.com
注意:
用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。您可以在访问凭证页面修改凭证密码。
将镜像推送到Registry
docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/kalista/mytomcat:[镜像版本号]$
将镜像,容器,远程库进行标识
docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/kalista/mytomcat:[镜像版本号]
将于远程库有标识关系的库提交
docker push registry.cn-hangzhou.aliyuncs.com/kalista/mytomcat:[镜像版本号]
从Registry中拉取镜像
docker pull registry.cn-hangzhou.aliyuncs.com/kalista/mytomcat:[镜像版本号]
代码都是在阿里云对应仓库中有对应的