我正在参与掘金创作者训练营第4期,点击了解活动详情,一起学习吧!
Docker的优点
1. 简化部署过程,提升可移植性
当我们要上线新机器的时候,需要配置相应的运行环境,其安装过程是比较繁琐且漫长的。如果使用Docker的话,只需要导入或从仓库拉取镜像,即可一键安装启动,大幅缩减配置时间,减少部署的复杂性。
2. 软件升级和版本控制
当你需要将项目从1.0
升级到2.0
的时候,稳妥起见一般是先停服务,再区分好不同版本的目录等,再启动新的服务。而使用Docker的话则是启动一个2.0
的容器,再停止1.0
的容器即可,当遇上故障,需要进行版本回滚时,也可以直接启动前面停止运行的容器即可先临时顶替上去,等后面新版本修复完成再切换回来。
3. 隔离性
多个服务部署在同一台机器,很多时候会因为一些陈旧的项目占满了整个服务器的性能,使得其他服务无法正常运行。而Docker能够确保每个容器都拥有自己的资源,在该容器的环境中,任何改动都不会影响到其他的容器,同时还能确保每个应用程序只使用分配给它的资源,不会出现不同服务抢占资源的情况,由其符合云计算时代的到来,让云空间可以得到更充分的利用。
创建Docker镜像的方式
当我们使用现有的容器,将其配置成所需的环境后,可以通过 commit
命令来将其打包成一个新的镜像。
也可以使用build
命令,通过Dockerfile
来创建镜像。
还可以使用工具,通过鼠标操作来创建镜像。
1. Docker commit 命令
语法:docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
OPTIONS说明:
-a
:提交的镜像作者-c
:使用Dockerfile
指令来创建镜像-m
:提交时的说明-p
:在commit
阶段,讲容器暂停
案例:将容器09ae7edbf678
保存为新的镜像。
2. Docker build 命令
语法:docker build [OPTIONS] PATH | URL | -
OPTIONS说明:
--build-arg=[]
:设置镜像创建时的变量--cpu-shares
:设置CPU
使用权重--cpu-period
:限制CPU
CFS
周期--cpu-quota
:限制CPU
CFS
配额--cpuset-cpus
:指定使用的CPU
id
--cpuset-mems
:指定使用的内存id
--disable-content-trust
:忽略校验,默认开启-f
:指定要使用的Dockerfile
路径--force-rm
:设置镜像过程中删除中间容器--isolation
:使用容器隔离技术--label=[]
:设置镜像使用的元数据-m
:设置内存最大值--memory-swap
:设置Swap
的最大值为内存+swap
,"-1"
表示不限swap
--no-cache
:创建镜像的过程不使用缓存--pull
:尝试去更新镜像的新版本--quiet, -q
:安静模式,成功后只输出镜像ID
--rm
:设置镜像成功后删除中间容器--shm-size
:设置/dev/shm
的大小,默认值是64M
--ulimit
:Ulimit
配置。--tag, -t
: 镜像的名字及标签,通常name:tag
或者name
格式可以在一次构建中为一个镜像设置多个标签。--network
: 默认default
。在构建期间设置RUN
指令的网络模式
案例:使用当前目录下的Dockerfile
创建镜像。
3. IDEA创建Docker镜像
-
Docker配置:
想要通过IDEA
访问Docker
,需要在Docker
中开启相关端口才行。- 配置文件位置:/usr/lib/systemd/system/docker.service
- 在ExecStart后面添加:-H tcp://0.0.0.0:2375
-
IDEA配置:
- 安装Docker插件,路径:File – Settings – Plugins – Marketplace – Docker
- 连接Docker,路径:File – Settings – Build, Execution, Deployment – Docker
-
POM配置:
- pom文件引入docker-maven-plugin插件
<!--使用docker-maven-plugin插件-->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<!--将插件绑定在某个phase执行-->
<executions>
<execution>
<id>build-image</id>
<!--用户只需执行mvn package ,就会自动执行mvn docker:build-->
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<!--指定生成的镜像名,这里是我们的项目名-->
<imageName>${project.artifactId}</imageName>
<!--指定标签 这里指定的是镜像的版本,我们默认版本是latest-->
<imageTags>
<imageTag>${project.version}</imageTag>
</imageTags>
<!--指定基础镜像jdk1.8-->
<baseImage>java</baseImage>
<!--
镜像制作人本人信息
<maintainer>xxx@email.com</maintainer>
-->
<!--切换到ROOT目录-->
<workdir>/ROOT</workdir>
<!--查看我们的java版本-->
<cmd>["java", "-version"]</cmd>
<!--${project.build.finalName}.jar是打包后生成的jar包的名字-->
<entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
<!--指定远程 docker api地址-->
<dockerHost>http://IP:2375</dockerHost>
<!-- 这里是复制 jar 包到 docker 容器指定目录配置 -->
<resources>
<resource>
<targetPath>/</targetPath>
<!--jar 包所在的路径 此处配置的 即对应 target 目录-->
<directory>${project.build.directory}</directory>
<!--用于指定需要复制的文件 需要包含的 jar包 ,这里对应的是 Dockerfile中添加的文件名 -->
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
复制代码
-
打包
- 通过maven打包会自动生成docker镜像
上面的三种方式都可以生成Docker
镜像,看着哪种方便使用那种就好了。
其它
1. Dockerfile文件创建
- 必须以 【Dockerfile】作为文件名
- 参数:
- FROM [image:tag]:定制的镜像都是基于该镜像基础上,这里使用 williamyeh/java8
- VOLUME [path]:挂载点
- ADD [fileName] [imageName]:从上下文目录中添加文件到容器里指定路径
- ENTRYPOINT [“param1″,”param2”,……]:启动参数
- 更多参数可以参考:www.runoob.com/docker/dock…
- 将jar包和Dockerfile同时上传至同一个文件夹中
- 构建镜像:docker build -t [imageName] .
- 创建容器:docker run -d -p [宿主机端口]:[容器内部端口] –name [containerName] [imageName]
2. Dockerfile FORM 底层镜像生成方法
- 查找镜像:docker search centos
- 下载镜像:docker pull centos/systemd
- 下载JDK:www.oracle.com/java/techno…
- 在下载的JDK.tar.gz文件目录中创建Dockerfile
# 系统镜像
FROM centos/systemd
# 自定义路径
ENV MYPATH /usr/local
WORKDIR $MYPATH
# 相关依赖下载
RUN yum -y install vim
RUN yum -y install net-tools
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
# 引用
ADD JDKJar.tar.gz /usr/local/java
# 环境变量
ENV JAVA_HOME /usr/local/java/jdk
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
EXPOSE 80
CMD echo $MYPATH
CMD echo "success-------------------OK"
CMD /bin/bash
复制代码
- 执行:docker build -t [镜像名称:版本号] .
- 注意后面有个小点,表示当前目录
3. Docker Harbor
可以通过Harbor
保存镜像,具体操作流程如下:
- 登录:docker login ip:port
- 改名:docker tag 镜像名:版本号 ip:port/仓库名称/镜像名称:版本号
- 推送:docker push ip:port/仓库名称/镜像名称:版本号
- 下载:docker pull ip:port/仓库名称/镜像名称:版本号
4. Docker镜像私服配置
方式一:daemon.json
- 位置:/etc/docker/daemon.json
- 添加参数:”insecure-registries”: [“IP:PORT”]
方式二:docker.service
- 位置:/usr/lib/systemd/system/docker.service
- 添加参数:在ExecStart处添加 –insecure-registry=IP:PORT 参数
以上两种配置方式只能选择其中一种
重启 docker:
- systemctl daemon-reload
- systemctl restart docker
查看:
- docker login IP:PORT
配置了registry
之后,我们可以通过login
命令来登录私服进行查看。