目录
一、Docker 简介
1、Docker引擎
可以理解为一个运行在服务器上的后台进程,也成为Docker Daemon 或Docker服务。它本质上是一个服务,只要启动该服务,就能随时使用它。我们可以通过Docker命令客户端发送相关Docker命令,并于Docker引擎进行通信。
2、Docker客户端
Docker客户端有两种:一种是Docker命令客户端,一种是REST API。
3、Docker镜像
Docker镜像就像我们使用的光盘,引擎就像光驱。把镜像载入到引擎中就可以使用镜像中的应用程序。一般情况下我们需要先将程序打包到Docker镜像中,随后才能将镜像交给其他人使用。
4、Docker容器
当我们获取到一个Docker 镜像后,可随时运行该Docker镜像,此时便会启动一个Docker容器,该容器中将运行镜像中封装的程序。如果将Docker镜像比作类的话,容器就相当于类创建的实例,一个Docker镜像理论上可以运行无数个Docker容器。
5、Docker镜像注册中心
Docker官方提供了一个叫DockerHub的镜像注册中心用于存放公有和私有镜像。https://hub.docker.com/
二、Docker的特点
1.快速运行。
启动虚拟机要几分钟,启动Docker仅需几秒
2.节省资源
Docker容器运行在Docker引擎上,共享宿主硬件资源,虚拟机则需要虚拟出很多太硬件。
3.便于交付
传统的软件交付物是程序,而Docker交付的是镜像,镜像不仅封装了应用程序,而且还包含了运行程序所需的相关环境。
4.容易管理
Docker可以很方便的结成protainer等可视化管理工具,很方便的查看镜像、容器。也可以通过命令客户端查看容器、镜像的状态。
三、Docker安装
1.更新yum
yum update
2.添加yum的docker包仓库
tee[逸虚凌辰1] /etc/yum.repos.d/docker.repo <<-'EOF'
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF
3.安装Docker引擎
yum install docker-engine
4.启动Docker引擎服务
service docker start
5.列出镜像
docker images
6.拉取镜像
docker pull centos
7.搜索镜像
docker search centos
8.导入导出镜像
docker save centos > centos.tar
docker load < centos.tar
四、Dockers常用操作
1.创建并启动容器
docker run -i [逸虚凌辰2] -t[逸虚凌辰3] centos [逸虚凌辰4] /bin/bash[逸虚凌辰5]
2.列出容器
docker ps
docker ps -a查看所有容器,
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
79df7cba5557 centos "/bin/bash" 4 minutes ago Exited (0) 3 minutes ago adoring_turing
3.进入容器
docker attach 79df7cba5557
进入运行中的容器
4.向运行中的容器执行命令
docker exec 79df7cba5557 -i -t ls -l[逸虚凌辰6]
5.停止容器
docker stop 79df7cba5557
6.终止容器
docker kill 79df7cba5557
7.启动容器
docker start 79df7cba5557
8.重启容器
docker restart 79df7cba5557
9.删除容器
docker rm 79df7cba5557
这个命令只能删除已经停止的容器
docker rm -f 79df7cba5557
强制删除运行中的程序
docker rm -f ‘docker ps -a -q’
批量强制删除所有容器
10.删除镜像
docker rmi -f centos
docker rmi [镜像id]
强制删除所有镜像
docker rmi -f ‘docker images -a -q’
11.导入导出容器
docker export 79df7cba5557 < centos.tar
docker import foo.tar huangyong/centos:latest
12.Docker指令汇总
Docke 命令 |
描述 |
attach |
进入一个运行中的容器 |
build |
从Dockerfile中构建镜像(自动构建镜像) |
commit |
从容器变更中构建镜像(手工制作镜像) |
cp |
在容器和本地之间复制文件或者目录 |
create |
创建一个新容器(但不启动容器) |
diff |
查看容器文件系统的变更情况 |
events |
从服务器上获取实时事件 |
exec |
在运行中的容器执行一条命令 |
export |
将容器导出未tar文件 |
history |
显示镜像历史 |
images |
列出镜像 |
info |
显示docker引擎的基本信息 |
inspect |
获取容器与镜像的基本信息 |
kill |
终止一个运行中的容器 |
load |
从镜像tar文件中导入镜像 |
login |
登陆Docker Registry |
loginout |
注销Docker Reginstry |
logs |
获取容器的日志信息 |
network |
管理docker网络 |
pause |
暂停容器中所有进程 |
port |
获取容器的端口映射信息 |
ps |
列出容器 |
pull |
从docker Registry中拉取镜像 |
push |
推送镜像到Docker Registry中 |
rename |
从新命名容器 |
restart |
重启容器 |
rm |
删除一个或者多个容器 |
rmi |
删除一个或者多个镜像 |
run |
在新容器中运行一条命令(启动容器) |
save |
将镜像导出未为tar文件 |
search |
搜索镜像 |
start |
启动一个或者多个已停止的容器 |
stats |
获取容器的资源使用信息 |
stop |
停止一个运行中的容器 |
tag |
为镜像打标签 |
top |
获取容器的进程活动信息 |
unpause |
回复容器中的所有进程 |
update |
更新一个或者多个容器的配置信息 |
version |
显示docker的版本 |
volume |
管理容器数据卷 |
wait |
等待容器停止,随后可输入退出 |
五、制作Java镜像
1.下载JDK8
2.复制JDK8到主目录的software文件夹下
3.启动容器
docker run -i -t -v[逸虚凌辰7] /software:/mnt/software centos /bin/bash
此时进入容器中,会在mnt/software中发现我们复制的JDK
解压JDK,安装到/opt目录下
tar -zxf [逸虚凌辰8] /mnt/software/jdk-8u191-linux-x64.tar.gz -C/opt
建立jdk快捷方式
ln -s [逸虚凌辰9] /opt/jdk1.8.0_191 /opt/jdk
ll /opt/jdk
验证jdk版本
/opt/jdk/bin/java -version
4.提交镜像
另外打开一个终端,查看当前容器。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
583c6bbdf18e centos "/bin/bash" 19 minutes ago Up 19 minutes optimistic_chandrasekhar
docker commit 583c6bbdf18e prim/java
然后查看镜像就会看到我们生成的镜像。
5.验证镜像
docker run --rm[逸虚凌辰10] prim/java /opt/jdk/bin/java -version
六、使用Dokcerfile构建镜像
1. Dockerfile结构
Dockerfile是编写Docker镜像的脚本
- 设置基础镜像
FROM:centos:latest
FROM指令的固有格式“仓库名:标签名” - 设置维护者信息
可以指定镜像由谁创建的,由谁维护的
MAINTAINER “Yang Rui”[email protected] - 设置需要添加到容器中的文件
ADD jdk-8u91-linux-x64.tar.gz /opt
ADD指令的第一个参数为宿主机的来源地址(可使用相对路径)第二个是容器的目标路径(必须为绝对路径)使用ADD命令,将自动解压来源路径中的压缩包,将解压后的文件复制到目标路径中。一般将Dockerfile文件和需要添加到容器的文件放在同一目录,有助于编写路径来源。 - 设置镜像制作过程中执行的命令
例如创建链接
RUN ln -s /opt/jdk1.8.0_91 /opt/jdk
如果要使用多条命令可以写多条RUN。但是可以将多条命令通过\命令换行符合并成一条,可以减少镜像的体积。原因是镜像每执行一条命令就会形成新的“镜像层” - 设置容器启动时所需要执行的命令
我们使用docker run是,可以在命令的最后一段添加一个容器启动时需要执行的命令,在Dockerfile中也有对应的CMD指令。
CMD /opt/jdk/binjava -version
如果我们在docker run命令是指定了需要执行的命令,那么该命令将覆盖Dockerfile中的CMD命令。
Dockerfile中还有一个与CMD指令类似的ENTRYPOINT指令,它不能被覆盖。
CMD指令要么没有,要么只有一条。
2.使用Dockerfile构建镜像
进入到jdk所在的目录,然后构建Dockerfile文件
cd /software
vim Dockerfile
添加如下构建文件
FROM centos:latest
MAINTAINER "Yang Rui"<[email protected]>
ADD /software/jdk-8u191-linux-x64.tar.gz /opt
RUN ln -s /opt/jdk1.8.0_91 /opt/jdk
CMD /opt/jdk/bin/java -version
然后执行构建镜像命令
docker build -t[逸虚凌辰12] yangrui/java .[逸虚凌辰13]
使用tag命令重命名一样的镜像
docker tag e0b70251236c prim/java:1.0
一般情况下,安装完JDK后,我们需要配置JAVA_HOME和Path环境变量才能在命令中使用Java命令。在Dockerfile中我们可以使用Env指令来设置所需的环境变量。
指定JAVA_HOME和PATH
FROM centos:latest
MAINTAINER "Yang Rui"<[email protected]>
ADD jdk-8u191-linux-x64.tar.gz /opt
RUN ln -s /opt/jdk1.8.0_91 /opt/jdk
ENV JAVA_HOME /opt/jdk
ENV PATH $JAVA_HOME/bin:$PATH
CMD java -version
3.Dockerfile指令汇总
Dockerfile指令 |
描述 |
FROM |
设置基础镜像 |
MAINTAINER |
设置维护者信息 |
ADD |
设置需要添加到容器中的文件(自动解压) |
COPY |
设置需要复制到容器中的文件(无法解压) |
USER |
设置运行RUN指令的用户 |
ENV |
设置环境变量,可在RUN指令中运用这些变量 |
ENTRYPOINT |
设置容器启动时需要运行的命令(无法覆盖) |
CMD |
设置容器启动时需要执行的命令(可以被覆盖) |
WORKDIR |
设置进入容器时的工作目录 |
EXPOSE |
设置壳被暴露的端口号(用于端口映射) |
VOLUME |
设置可被挂在的数据卷(用于目录映射) |
ONBUILD |
设置在构建时需要自动执行的指令 |
七、使用DockerRegistry管理镜像
1.使用DockerHub
使用翻墙软件(蓝灯)注册dockerhub,然后登陆创建自己的Repository。
docker login
登陆dockerhub
docker push prim/java
把本地镜像上传至自己的镜像仓库
2.搭建Docker Registry
启动Dockers Registry
如果是使用的阿里云ECS,要提前在安全组开放端口50000
docker run -d[逸虚凌辰14] -p[逸虚凌辰15] 50000:5000 -v[逸虚凌辰16] ~/[逸虚凌辰17] docker-registry:/tmp/registry registry
此时docker ps可以查看registry已经在容器运行了。
然后,浏览器输入http://59.110.142.242:50000/v2/_catalog
如果有json返回则说明仓库搭建成功。
vim /usr/lib/systemd/system/docker.service
增加 ExecStart=/usr/bin/dockerd --insecure-registry 59.110.142.242:50000
然后重启服务,加载仓库配置
systemctl daemon-reload
systemctl restart docker
重命名镜像标签
由于我们创建的镜像默认注册中心是DockerHub,使用Docker push命令推送的目的地址都是DockerHub,我们需要更改镜像的标签。添加59.110.142.242:50000/
docker tag b4401d8b4a2a 59.110.142.242:50000/prim/java
推送镜像到私有仓库
docker push 59.110.142.242:50000/prim/java
私有仓库还可以指定用户名密码,在同一局域网上可以拉取仓库的镜像。
还可以将DockerRegistry与Nginx集成将他们部署到一台稳定的服务器上,通过Nginx反响代理的方式来调用Docker Registry,并将IP绑定到一个内部域名上,比如docker-registry.xxx.com,这样局域网内部的用户可以通过该域名访问DockerRegistry。
八、Tips
1. 调整Docker内存限制
docker stats
使用-m指定内存大小
docker run -d -p 8080:8010 -m 512m 172.0.0.1:5000/demoe.msa/msa-api-hello:1.0.0
[逸虚凌辰1]Linux tee命令用于读取标准输入的数据,并将其内容输出成文件。
tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件
使用指令"tee"将用户输入的数据同时保存到文件"file1"和"file2"中,输入如下命令
$ tee file1 file2
[逸虚凌辰2]表示启动容器后,打开标准收入设备,可使用键盘进行输入。开启了input(输入)功能
[逸虚凌辰3]表示启动容器后,分配一个伪终端TTY,将与服务器建立一个会话。
[逸虚凌辰4]表示将要运行的镜像名称
[逸虚凌辰5]表示运行容器中的bash应用程序,进入到系统中
[逸虚凌辰6]以长格式显示目录下的内容列表。输出的信息从左到右依次包括文件名,文件类型、权限模式、硬连接数、所有者、组、文件大小和文件的最后修改时间等。
[逸虚凌辰7]把宿主的磁盘挂载到容器中,可以理解为目录映射。
[逸虚凌辰8]-c :建立一个压缩文件的参数指令(create 的意思);
-x :解开一个压缩文件的参数指令!
-t :查看 tarfile 里面的文件!
特别注意,在参数的下达中, c/x/t 仅能存在一个!不可同时存在!
因为不可能同时压缩与解压缩。
-z :是否同时具有 gzip 的属性?亦即是否需要用 gzip 压缩?
-j :是否同时具有 bzip2 的属性?亦即是否需要用 bzip2 压缩?
-v :压缩的过程中显示文件!这个常用,但不建议用在背景执行过程!
-f :使用档名,请留意,在 f 之后要立即接档名喔!不要再加参数!
例如使用『 tar -zcvfP tfile sfile』就是错误的写法,要写成
『 tar -zcvPf tfile sfile』才对喔!
-p :使用原文件的原来属性(属性不会依据使用者而变)
-P :可以使用绝对路径来压缩!
-N :比后面接的日期(yyyy/mm/dd)还要新的才会被打包进新建的文件中!
--exclude FILE:在压缩的过程中,不要将 FILE 打包!
[逸虚凌辰9]为某一个文件在另外一个位置建立一个同不的链接,这个命令最常用的参数是-s,具体用法是:ln -s 源文件 目标文件
[逸虚凌辰10]表示容器退出时可自动删除容器,也就是说在执行完我们的查看版本命令后容器自动退出。
[逸虚凌辰11]如果fileA存在,使用touch指令可更改这个文件或目录的日期时间,包括存取时间和更改时间;
如果fileA不存在,touch指令会在当前目录下新建一个空白文件fileA。
touch 命令详解
功能说明:改变文件或目录时间。
语 法:touch [-acfm][-d <日期时间>][-r <参考文件或目录>][-t <日期时间>][--help] [--version][文件或目录...] 或 touch [-acfm][--help][--version][日期时间][文件或目录...]
补充说明:使用touch指令可更改文件或目录的日期时间,包括存取时间和更改时间。
参 数:
-a或--time=atime或--time=access或--time=use 只更改存取时间。
-c或--no-create 不建立任何文件。
-d<时间日期> 使用指定的日期时间,而非现在的时间。
-f 此参数将忽略不予处理,仅负责解决BSD版本touch指令的兼容性问题。
-m或--time=mtime或--time=modify 只更改变动时间。
-r<参考文件或目录> 把指定文件或目录的日期时间,统统设成和参考文件或目录的日期时间相同。
-t<日期时间> 使用指定的日期时间,而非现在的时间。
--help 在线帮助。
--version 显示版本信息
[逸虚凌辰12]指定构建镜像的名字
[逸虚凌辰13]表示当前目录
[逸虚凌辰14]表示将在后台启动该容器。
[逸虚凌辰15]表示对容器中暴露的端口进行端口映射,冒号左边为宿主机端口,右边为容器内部需要暴露的端口
[逸虚凌辰16]挂在本地磁盘到容器磁盘
[逸虚凌辰17]表示当前目录