www.docker.comjava
Docker 是什么?linux
Docker 是一个开源的应用容器引擎,基于Go语言并听从Apache协议的开源,让开发者能够打包他们的应用以及依赖包到一个可移植的镜像中,而后发布到任何流行的 Linux或Windows 机器上,也能够实现虚拟化。容器是彻底使用沙箱机制,相互之间不会有任何接口。git
若是没有Dockerweb
环境和配置变更,致使项目等不能简单的部署成功,咱们将须要的配置、系统、数据等等总体打包成咱们须要的镜像,简单启动就能够了,docker
Securely build and share any application, anywhere一次构建,到处运行。json
虚拟机:整套安装环境的一种解决方案,它能够在一种操做系统里面运行另外一个操做系统,好比在Windows系统里面运行Linux系统。应用程序对此没有感知,由于虚拟机看上去就和真实的操做系统如出一辙,可以使应用程序,操做系统和硬件三者之间的逻辑不变,而对于底层系统来讲,虚拟机就是一个普通文件,不须要了就删掉。ubuntu
虚拟机占用的资源多、步骤多,启动是分钟级的太慢。vim
容器化技术:由于如上的问题,Linux发展出了另外一种虚拟化技术,Linux容器(Linux Containers缩写LXC)。Linux容器不是模拟一个完整的操做系统,而是对程序进行隔离。有了容器,就能够将软件运行所须要的全部资源打包到一个隔离的容器中,容器和虚拟机不一样,不须要捆绑一整套的操做系统,只须要软件工做所须要的库资源和设置。系统所以而变得高效轻量并保证部署在任何环境中的软件都能始终如一的运行。centos
Docker | 面向对象 |
---|---|
镜像 | 类 |
容器 | 对象 |
概念 | 说明 |
---|---|
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。 |
yum -y remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-logrotate \ docker-latest-logrotate \ docker-logrotate \ docker-engine \ yum-utils \ device-mapper-persistent-data \ lvm2
#更新yum yum -y update yum install -y conntrack ipvsadm ipset jq sysstat curl iptables libseccomp yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
#指定版本安装 yum install -y docker-ce-18.09.0 docker-ce-cli-18.09.0 containerd.io #最新版本安装 yum -y install docker-ce docker-ce-cli containerd.io
systemctl start docker
systemctl enable docker
#版本 docker version
设置密码尽可能简单如:docker123tomcat
#1 mkdir -p /etc/docker #2 tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["http://hub-mirror.c.163.com"] } EOF #3 systemctl daemon-reload #4 systemctl restart docker
docker run hello-world
docker help
docker images
-a:显示全部的镜像
-q:仅显示id
REPOSITORY | 镜像仓库源 |
---|---|
TAG | 镜像标签 |
IMAGE ID | 镜像ID |
CREATED | 镜像建立时间 |
SIZE | 镜像大小 |
同一个REPOSITORY(仓库源)能够有多个TAG,表明这个仓库源的不一样版本,使用REPOSITORY:TAG来定义不一样的镜像。
若是不指定一个镜像的版本标签,例如:使用hello-world,docker将默认使用hello-world:latest镜像
docker search 须要的镜像
docker pull 须要的镜像:须要的版本tag
#删除单个 docker rmi -f 镜像ID #删除多个 docker rmi -f 镜像名1:TAG 镜像名2:TAG #删除所有 docker rmi -f ${docker images -qa}
docker ps
-a:显示全部的容器
-l:显示最近一条容器
-n:显示最近几条容器
-q:仅显示id
#新建容器并启动,若是没有镜像,会先去hubdocker上pull镜像 docker run 可选参数 镜像名(或ID) #重启容器 docker restart 容器名(或ID) #中止容器(普通<==>强制) docker stop 容器名(或ID) <==> docker kill 容器名(或ID) #启动以前建立的容器 docker start 容器名(或ID) #删除以前建立的容器<==>批量 docker rm -f 容器ID <==> docker ps -aq | xargs docker rm
-d:守护式后台运行容器,并返回容器ID(如使用tomcat)
-v:数据卷,指定主机的某个目录为容器的某个目录(如使用tomcat-> /root/tomcat/:/usr/local/tomcat/webapps/)
-i:交互式运行容器,一般-t一块儿使用(如使用linux中的linux)
-t:为容器从新分配一个伪输入终端,一般与-i一块儿使用(如使用linux中的linux)
--name="新容器名字":为容器指定一个名称
-P:随机端口映射
-p:指定端口映射,有如下4种格式
ip:hostPort:containerPort
ip::containerPort
hostPort:containerPort
containerPort
#新建启动容器 docker run --name="tomcat1" -dp 8888:8080 tomcat:8.0.52
#1 新建启动容器,以下图中目录变动为容器ID docker run --name='centos1' -it centos
#2 退出容器 exit -->容器中止退出 ctrl+p+q -->容器不中止退出(注意有前后顺序)
#3 进入一个运行的容器 docker exec -it 容器名(或ID) /bin/bash
docker commit -a='做者' -m='修改内容' 容器名(或ID) 容器前缀/容器名:TAG号
#进入容器目录 docker exec -it tomcat1 /bin/bash #替换index.jsp内容 cat > webapps/ROOT/index.jsp << EOF Hello Tomcat EOF
#提交容器 docker commit -a='Heaton' -m='my tomcat test' tomcat1 heaton/tomcat:0.0.1
#删除现有的运行容器 docker rm -f $(docker ps -q) #运行以前本身构建的镜像容器 docker run --name="tomcat1" -dp 8888:8080 heaton/tomcat:0.0.1
#登陆阿里云docker仓库,输入密码 dockerlogin --username=70xx@qq.com registry.cn-hangzhou.aliyuncs.com
#标记tag docker tag b60d74c216b8 registry.cn-hangzhou.aliyuncs.com/docker-tzy/rep1:0.0.1 #上传 docker push registry.cn-hangzhou.aliyuncs.com/docker-tzy/rep1:0.0.1
Docker容器产生的数据,若是不经过commit生成新的镜像,持久化,那么容器删除之后,数据就没有了。
为了能保存数据在docker中咱们使用数据卷。
docker inspect 容器ID --> 返回Docker对象的信息(查看挂载状况)
#建立可读可写 docker run -it -v /my_root:/my_docker centos #建立可读不可写(Read-only) #docker run -it -v /my_root:/my_docker:ro centos
#进入绑定文件夹,主机创建新文件 touch root.txt
#进入绑定文件夹,容器修改文件 echo "docker add" > root.txt
#中止容器,主机修改文件 echo "root add" > root.txt #在从新启动容器 docker start -i 34fe34e36ada
#建立Dockerfile文件 vim dockerFile,写入以下内容 #效果为docker run -it -v /my_root:/my_docker centos FROM centos VOLUME ["my_docker1","my_docker2"] CMD echo "success" CMD /bin/bash
#构建镜像 docker build -f /Dockerfile -t mybuild/centos:0.0.1 .
#运行,发现有2个容器卷 docker run -it mybuild/centos:0.0.1
如例1进行数据卷测试,发现数据共享
容器间数据共享
#运行容器1 docker run -it --name docker1 mybuild/centos:0.0.1 #运行容器2 docker run -it --name docker2 --volumes-from docker1 mybuild/centos:0.0.1 #运行容器3 docker run -it --name docker3 --volumes-from docker2 mybuild/centos:0.0.1
如例1进行数据卷测试
Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。
Java | HelloWord.java | HelloWord.class |
---|---|---|
Docker | images | DockerFile |
基础注意点
#
为注释执行流程
保留字
FROM | 基础镜像,当前镜像是基于那个镜像的。 |
---|---|
MAINTAINER | 做者 邮箱。 |
RUN | 容器构建时须要运行的命令。 |
EXPOSE | 暴露端口号 启动容器的时候还需使用 –p 指定端口。 |
WORKDIR | 指定在建立容器后,终端默认登陆后进来的工做目录,一个落脚点,默认根目录,一般绝对路径,CMD ENTRYPOINT 都会在这个目录下执行。 |
ENV | 构建镜像的过程当中设置环境变量, 构建和运行时都有效可使用$引用。 |
ADD | 将宿主机目录下的文件拷贝到镜像且会自动处理URL和 解压tar 压缩包。ADD 支持 URL 和 COPY后解压缩包。 |
COPY | 拷贝文件和目录到镜像中,将从构建上下文目录中<源路径>的文件/复制到新的一层镜像内<目标路径>的位置。通常都用ADD |
VOLUME | 容器数据卷, 数据保存和持久化。 |
USER | 指定该镜像由什么用户运行 不指定由root 运行。 |
CMD | 指定容器启动时要运行默认的命令,Dockerfile中能够有多个cmd , 但只有最后一个生效。CMD 会被docker run 以后的参数替换。 |
ENTERPOINT | 指定容器启动时要运行的命令。ENTERPOINT docker run 以后的参数会被当作参数传递给ENTRYPOINT , 以后造成新的命令组合,追加 |
ONBUILD | 触发器, 当构建一个被继承的dockerfile时运行命令, 父镜像在被子继承后的父镜像的onbuild 被触发。 |
- CMD
如 tomcat中,在Dockerfile最后有CMD ["catalina.sh","run"],意思为启动容器后执行tomcat启动命令,若是使用命令
docker run -it -p 8888:8080 tomcat:8.0.52 ls -l
,就会将ls -l这个查询指令经过参数传给CMD,这时容器运行就不会启动,而是查询目录。
- ENTERPOINT
若是是CMD ["ls","-l"]指令,咱们须要在加入一个 -a 的参数,那么CMD将不能完成在构建镜像后增长参数,这个时候能够把指令改为ENTERPOINT ["ls","-l"] ,咱们就能够在后面继续追加参数而不会替换原来的参数。
- 自建centos
- 修改运行后路径
- 使之可使用vim,ifconfig等命令
#继承自centos FROM centos #做者-邮箱 MAINTAINER Heaton #建立环境变量mypath ENV mypath /usr/local/src #指定建立容器后终端路径 WORKDIR $mypath #构建容器时运行命令 RUN yum -y install vim RUN yum -y install net-tools #暴露端口号 EXPOSE 80 #容器启动时要运行默认的命令 CMD echo "success" CMD /bin/bash
docker build -f /root/Dockerfile -t heaton/centos:0.0.1 .
docker run -it heaton/centos:0.0.1
#继承自centos FROM centos ONBUILD RUN echo "father onbuild----------------------------->"
docker build -f /root/Dockerfile1 -t heaton/father .
#继承自heaton/father FROM heaton/father RUN echo "son------>success"
docker build -f /root/Dockerfile2 -t heaton/son .