Dockers

CentOS安装 Docker

更新

 $ sudo yum update

官方脚本安装

 $ curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

设置开机启动

$ sudo systemctl enable docker

启动docker

$ sudo systemctl start docker

验证

$ sudo docker run hello-world

卸载 Docker

删除安装包:

yum remove docker-ce

删除镜像、容器、配置文件等内容:

rm -rf /var/lib/docker

Docker使用

容器里面,更新包

apt-get update

安装vim

apt-get -y install vim

commit把容器弄成镜像

docker commit -m "描述" -a "作者" 容器id 镜像名:版本号 

阿里云创建命名空间、创建镜像仓库

(下面根据自己)

登录阿里云库

docker login --username=zzyybuy registry.cn-hangzhou.aliyuncs.com

上传镜像

docker tag cea1bb40441c registry.cn-hangzhou.aliyuncs.com/atguiguwh/myubuntu:1.1

推送阿里云仓库的镜像

docker push registry.cn-hangzhou.aliyuncs.com/atguiguwh/myubuntu:1.1

拉取阿里云仓库的镜像

docker push registry.cn-hangzhou.aliyuncs.com/atguiguwh/myubuntu:1.1

改变镜像名

docker image tag 原来镜像id新镜像名:版本号#新增docker rmi 原来镜像名 #删除

私有仓库

下载官方镜像

docker pull registry

运行

docker run -d -p 5000:5000 -v /zzyyuse/myregistry/:/tmp/registry --privileged=true registry

构建镜像

docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]

查看私服镜像文件夹

curl -XGET http://192.168.111.162:5000/v2/_catalog

使私有仓库允许http

vim /etc/docker/daemon.json

内容

{ "registry-mirrors": ["https://aa25jngu.mirror.aliyuncs.com"], "insecure-registries": ["192.168.111.162:5000"]}

推送

docker push 192.168.111.162:5000/zzyyubuntu:1.2

验证

curl -XGET http://192.168.111.162:5000/v2/_catalog

pull

docker pull 192.168.111.162:5000/zzyyubuntu:1.2

运行一个带有容器卷存储功能的容器实例

docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录镜像名

查看数据卷是否挂载成功

docker inspect 容器ID

外面变化容器变化,容器变化外面bianh

docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:rw镜像名 #读写docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:ro 镜像名#只读

端口

docker run -p 8000:8080 --name启动容器名 镜像名

常见参数

Docker后台进程参数清单如下表:

参数

解释--api-enable-cors=false开放远程API调用的 CORS 头信息。这个接口开关对想进行二次开发的上层应用提供了支持。-b, --bridge=""挂载已经存在的网桥设备到 Docker 容器里。注意,使用 none 可以停用容器里的网络。--bip=""使用 CIDR 地址来设定网络桥的 IP。注意,此参数和 -b 不能一起使用。-D, --debug=false开启Debug模式。例如:docker -d -D-d, --daemon=false开启Daemon模式。--dns=[]强制容器使用DNS服务器。例如: docker -d --dns 8.8.8.8--dns-search=[]强制容器使用指定的DNS搜索域名。例如: docker -d --dns-search example.com-e, --exec-driver="native"强制容器使用指定的运行时驱动。例如:docker -d -e lxc-G, --group="docker"在后台运行模式下,赋予指定的Group到相应的unix socket上。注意,当此参数 --group 赋予空字符串时,将去除组信息。-g, --graph="/var/lib/docker"配置Docker运行时根目录-H, --host=[]在后台模式下指定socket绑定,可以绑定一个或多个 tcp://host:port, unix:///path/to/socket, fd://* 或 fd://socketfd。例如:$ docker -H tcp://0.0.0.0:2375 ps 或者$ export DOCKER_HOST="tcp://0.0.0.0:2375"$ docker ps--icc=true启用内联容器的通信。--ip="0.0.0.0"容器绑定IP时使用的默认IP地址--ip-forward=true启动容器的 net.ipv4.ip_forward--iptables=true启动Docker容器自定义的iptable规则--mtu=0设置容器网络的MTU值,如果没有这个参数,选用默认 route MTU,如果没有默认route,就设置成常量值 1500。-p, --pidfile="/var/run/docker.pid"后台进程PID文件路径。-r, --restart=true重启之前运行中的容器-s, --storage-driver=""强制容器运行时使用指定的存储驱动,例如,指定使用devicemapper, 可以这样:docker -d -s devicemapper--selinux-enabled=false启用selinux支持--storage-opt=[]配置存储驱动的参数--tls=false启动TLS认证开关--tlscacert="/Users/dxiao/.docker/ca.pem"通过CA认证过的的certificate文件路径--tlscert="/Users/dxiao/.docker/cert.pem"TLS的certificate文件路径--tlskey="/Users/dxiao/.docker/key.pem"TLS的key文件路径--tlsverify=false使用TLS并做后台进程与客户端通讯的验证-v, --version=false

DockeFile

Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。

构建三步骤

· 编写Dockerfile文件

· docker build命令构建镜像

· docker run依镜像运行容器实例

1.1.1. DockerFile构建过程解析

· Dockerfile内容基础知识

· 1:每条保留字指令都必须为大写字母且后面要跟随至少一个参数

· 2:指令按照从上到下,顺序执行

· 3:#表示注释

· 4:每条指令都会创建一个新的镜像层并对镜像进行提交

· Docker执行Dockerfile的大致流程

· (1)docker从基础镜像运行一个容器

· (2)执行一条指令并对容器作出修改

· (3)执行类似docker commit的操作提交一个新的镜像层

· (4)docker再基于刚提交的镜像运行一个新容器

· (5)执行dockerfile中的下一条指令直到所有指令都执行完成

·小总结

从应用软件的角度来看,Dockerfile、Docker镜像与Docker容器分别代表软件的三个不同阶段,

* Dockerfile是软件的原材料

* Docker镜像是软件的交付品

* Docker容器则可以认为是软件镜像的运行态,也即依照镜像运行的容器实例

Dockerfile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合力充当Docker体系的基石。

1 Dockerfile,需要定义一个Dockerfile,Dockerfile定义了进程需要的一切东西。Dockerfile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等;

2 Docker镜像,在用Dockerfile定义一个文件之后,docker build时会产生一个Docker镜像,当运行 Docker镜像时会真正开始提供服务;

3 Docker容器,容器是直接提供服务的。

DockerFile常用保留字指令

· 参考tomcat8的dockerfile入门

· https://github.com/docker-library/tomcat

FROM

基础镜像,当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板,第一条必须是from

MAINTAINER

镜像维护者的姓名和邮箱地址

RUN

容器构建时需要运行的命令

两种格式

shell格式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UauiyZ5N-1685680438072)(file:///C:\WINDOWS\TEMP\ksohtml19732\wps2.png)]

RUN yum -y install vim 允许加强

exec格式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2AGQfGMq-1685680438072)(file:///C:\WINDOWS\TEMP\ksohtml19732\wps3.png)]

RUN是在 docker build时运行

EXPOSE

· 当前容器对外暴露出的端口

WORKDIR

指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点

USER

指定该镜像以什么样的用户去执行,如果都不指定,默认是root

ENV

用来在构建镜像过程中设置环境变量

ENV MY_PATH /usr/mytest

这个环境变量可以在后续的任何RUN指令中使用,这就如同在命令前面指定了环境变量前缀一样;

也可以在其它指令中直接使用这些环境变量,

比如:WORKDIR $MY_PATH

ADD

将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包

COPY

类似ADD,拷贝文件和目录到镜像中。 将从构建上下文目录中 的文件/目录复制到新的一层的镜像内的 位置

COPY src dest

COPY [“src”, “dest”]

:源文件或者源目录

:容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建。

VOLUME

容器数据卷,用于数据保存和持久化工作

CMD

指定容器启动后的要干的事

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w4WNrAyV-1685680438073)(file:///C:\WINDOWS\TEMP\ksohtml19732\wps4.jpg)]

注意

Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换

参考官网Tomcat的dockerfile演示讲解

官网最后一行命令

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NmvCIu1b-1685680438073)(file:///C:\WINDOWS\TEMP\ksohtml19732\wps5.jpg)]

· 我们演示自己的覆盖操作

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OwhCsK4K-1685680438073)(file:///C:\WINDOWS\TEMP\ksohtml19732\wps6.jpg)]

它和前面RUN命令的区别

CMD是在docker run 时运行。

RUN是在 docker build时运行。

ENTRYPOINT

也是用来指定一个容器启动时要运行的命令

类似于 CMD 指令,但是ENTRYPOINT不会被docker run后面的命令覆盖, 而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序

自定义镜像mycentosjava8

Centos7镜像具备vim+ifconfig+jdk8

jdk8下载地址:

https://www.oracle.com/java/technologies/downloads/#java8

下载tar.gz结尾

上传到新建文件myfile

myfile文件里面新建DockerFile

vim DockerFile

dockerfile文件内容

FROM centos #基于镜像MAINTAINER zzyy#用户名 邮箱ENV MYPATH /usr/localWORKDIR $MYPATH #进入容器之后的文件位置#安装vim编辑器RUN yum -y install vim#安装ifconfig命令查看网络IPRUN yum -y install net-tools#安装java8及lib库RUN yum -y install glibc.i686RUN mkdir /usr/local/java#ADD 是相对路径jar,把jdk-8u171-linux-x64.tar.gz添加到容器中,安装包必须要和Dockerfile文件在同一位置ADD jdk-8u171-linux-x64.tar.gz /usr/local/java/#配置java环境变量ENV JAVA_HOME /usr/local/java/jdk1.8.0_171ENV JRE_HOME $JAVA_HOME/jreENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATHENV PATH $JAVA_HOME/bin:$PATHEXPOSE 80CMD echo $MYPATHCMD echo "success--------------ok"CMD /bin/bash

构建·

docker build -t 新镜像名字:TAG .

docker build -t centosjava8:1.5

运行

docker run -it centosjava8:1.5 /bin/bash

没有仓库或者标签就是虚悬镜像

docker部署springboot项目

springboot项目打包、Linux新建myfile文件

jar包文件与dockerfile文件同在一个目录

文件内容

FROM java:8# 作者MAINTAINER zzyy# VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmpVOLUME /tmp# 将jar包添加到容器中并更名为zzyy_docker.jarADD docker_boot-0.0.1-SNAPSHOT.jar zzyy_docker.jar# 运行jar包RUN bash -c 'touch /zzyy_docker.jar'ENTRYPOINT ["java","-jar","/zzyy_docker.jar"]#暴露6001端口作为微服务EXPOSE 6001

spring启动端口与6001端口一致

构建

·docker build -t zzyy_docker:1.6 .

运行

docker run -d -p 6001:6001 zzyy_docker:1.6