参考文章
- 安装使用:https://www.cnblogs.com/kingsonfu/p/11576797.html
- 更新国内yum源
https://blog.csdn.net/anigon/article/details/54018733- docker的简单使用
https://blog.csdn.net/deng624796905/article/details/86493330- 镜像和容器的区别
https://www.cnblogs.com/baizhanshi/p/9655102.html
5.更新docker源
https://blog.csdn.net/baidu_19473529/article/details/78126869
6.dockerfile基础命令
https://www.jianshu.com/p/168fbb97b447
7.Docker的run命令参数
https://www.cnblogs.com/yfalcon/p/9044246.html
什么是docker
- 容器技术
为了了解docker,首先你需要了解容器技术,容器技术是实现操作系统虚拟化的一种途径,可以让您在资源受到隔离的进程中运行应用程序及其依赖关系。通过使用容器,我们可以轻松打包应用程序的代码、配置和依赖关系,将其变成容易使用的构建块,从而实现环境一致性、运营效率、开发人员生产力和版本控制等诸多目标。容器可以帮助保证应用程序快速、可靠、一致地部署,其间不受部署环境的影响。容器还赋予我们对资源更多的精细化控制能力,让我们的基础设施效率更高。
*容器与虚拟机的区别
docker与虚拟机的区别
服务器虚拟化解决的核心问题是资源调配,而容器解决的核心问题是应用开发、测试和部署。
容器技术严格来说并不是虚拟化,没有客户机操作系统,是共享内核的。容器可以视为软件供应链的集装箱,能够把应用需要的运行环境、缓存环境、数据库环境等等封装起来,以最简洁的方式支持应用运行,轻装上阵,当然是性能更佳。Docker镜像特性则让这种方式简单易行。当然,因为共享内核,容器隔离性也没有虚拟机那么好。
docker容器和镜像的区别
如下图所示,容器是由镜像实例化而来,这和我们学习的面向对象的概念十分相似,我们可以把镜像看作类,把容器看作类实例化后的对象。
也可以说镜像是文件, 容器是进程。 容器是基于镜像创建的, 即容器中的进程依赖于镜像中的文件, 这里的文件包括进程运行所需要的可执行文件, 依赖软件, 库文件, 配置文件等等…
小问题
- yum源更新使用update还是upgrade?
答:其实我更推荐用yum upgrade取代yum update,yum update只更新系统中已有的软件包,不会更新内核软件包(kernel-这个包),yum upgrade是更彻底的update,会分析包的废弃关系,可以跨小版本升级(比如从centos 7.1升级到centos 7.4),除了做了yum update完全相同的事之外,还会更新kernel-的包,也会卸载掉已经废弃的包。
新部署系统需要yum update/upgrade是因为yum不会给你解决依赖冲突(但是apt会)。
举个例子,你的系统中已经安装了kernel-2.6.32.500,但是你要安装的某个软件包依赖于kernel-2.6.32.600,此时yum会报错退出,告诉你依赖不满足,并不会升级kernel包(只是举个例子而已,实际上几乎没有软件包直接依赖于kernel包),所以你只能yum update/upgrade一次,把系统中所有的软件包全部更新,这样满足新部署的软件包的依赖。
在debian/ubuntu的系统中,apt会对这种情况自动处理,会自动升级依赖的软件包。
换句话来说,对于新部署的服务器,也是推荐upgrade全部的软件包,已获得最新的安全补丁。即使对于已经上线的服务器,也是推荐定期打安全漏洞补丁,减少漏洞带来的侵害。(取自:https://segmentfault.com/q/1010000011264410/)
使用yum源安装docker
//查看是否已经安装docker
yum list installed | grep docker
//更新yum源
yum upgrade
//安装docker
yum -y install docker
//测试是否安装成功
systemctl start docker
更新docker源
//修改/etc/docker/daemon.json文件
vi /etc/docker/daemon.json
//加入代码
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
//重启docker
systemctl restart docker
docker下载镜像和使用容器的基本命令
//搜索镜像(以mysql为例)
docker search mysql
//从仓库下载镜像
docker pull centos/mysql-57-centos7
//启动容器(-di : 使用守护进程方式 --name:指定容器名)
docker run -di --name=tensquare_mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root centos/mysql-57-centos7
//查找目前运行的docker容器
docker ps [-a(查询全部容器,包括未运行) ]
//删除容器
docker rm 容器名
Dockerfile
参考文章:https://www.cnblogs.com/edisonchou/p/dockerfile_inside_introduction.html
1. dockerfile基础命令
FROM:指定基础镜像
第一条指令。scratch是虚拟的镜像,表示一个空白的镜像。
RUN:执行命令
shell 格式: RUN <命令> ,RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
exec 格式: RUN ["可执行文件", "参数1", "参数2"] 。run可以写多个,每一个指令都会建立一层,所以正确写法应该是↓
RUN buildDeps='gcc libc6-dev make' \
&& apt-get update \
&& apt-get install -y $buildDeps \
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-3.2.5.tar.gz" \
&& mkdir -p /usr/src/redis \
&& tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 \
&& make -C /usr/src/redis \
&& make -C /usr/src/redis install \
&& rm -rf /var/lib/apt/lists/* \
&& rm redis.tar.gz \
&& rm -r /usr/src/redis \
&& apt-get purge -y --auto-remove $buildDeps
COPY:复制文本
COPY <源路径>... <目标路径>
COPY ["<源路径1>",... "<目标路径>"]
<源路径> 可以是多个、以及使用通配符,通配符规则满足Go的filepath.Match 规则,如:COPY hom* /mydir/ COPY hom?.txt /mydir/
<目标路径>使用 COPY 指令,源文件的各种元数据都会保留。比如读、写、执行权限、文件变更时间等。
ADD:高级复制文件
ADD ubuntu-xenial-core-cloudimg-amd64-root.tar.gz /
<源路径> 可以是一个 URL ,下载后的文件权限自动设置为 600 。
CMD:容器启动命令
shell 格式: CMD <命令>
exec 格式: CMD ["可执行文件", "参数1", "参数2"...]
CMD ["nginx", "-g", "daemon off;"]
ENTRYPOINT:入口点
同CMD,指定容器启动程序及参数。
通过–entrypoint 参数在运行时替换。
用例一:使用CMD要在运行时重新写命令才能追加运行参数,ENTRYPOINT则可以运行时接受新参数。
示例:
FROM ubuntu:16.04
RUN apt-get update \
&& apt-get install -y curl \
&& rm -rf /var/lib/apt/lists/*
ENTRYPOINT [ "curl", "-s", "http://ip.cn" ]
追加-i参数
$ docker run myip -i
......
当前 IP:61.148.226.66 来自:北京市 联通
ENV:设置环境变量
在其他指令中可以直接引用ENV设置的环境变量。
ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...
示例:
ENV VERSION=1.0 DEBUG=on NAME="Happy Feet"
ARG:构建参数
与ENV不同的是,容器运行时不会存在这些环境变量。
可以用 docker build --build-arg <参数名>=<值> 来覆盖。
VOLUME:定义匿名卷
VOLUME ["<路径1>", "<路径2>"...]
VOLUME <路径>
EXPOSE:暴露端口
EXPOSE <端口1> [<端口2>...]
EXPOSE :EXPOSE 仅仅是声明容器打算使用什么端口而已,并不会自动在宿主进行端口映射。
WORKDIR:指定工作目录
WORKDIR <工作目录路径>
RUN cd /app
RUN echo "hello" > world.txt
两次run不在一个环境内,可以使用WORKDIR。
USER:指定当前用户
这个用户必须是事先建立好的,否则无法切换。
USER <用户名>
HEALTHCHECK:健康检查
HEALTHCHECK [选项] CMD <命令> :设置检查容器健康状况的命令
HEALTHCHECK NONE :如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令
HEALTHCHECK 支持下列选项:
--interval=<间隔> :两次健康检查的间隔,默认为 30 秒;
--timeout=<时长> :健康检查命令运行超时时间,如果超过这个时间,本次健康检查就被视为失败,默认 30 秒;
--retries=<次数> :当连续失败指定次数后,则将容器状态视为 unhealthy ,默认 3次。
FROM nginx
RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*
HEALTHCHECK --interval=5s --timeout=3s \
CMD curl -fs http://localhost/ || exit 1
- 简单实例
#基于centos镜像 from [image_name:tag]镜像名:版本
FROM centos
#维护人的信息
MAINTAINER The CentOS Project <543648875@qq.com>
#安装httpd软件包
RUN yum -y update
RUN yum -y install httpd
#开启80端口
EXPOSE 80
#复制网站首页文件至镜像中web站点下
ADD index.html /var/www/html/index.html
#复制该脚本至镜像中,并修改其权限
ADD run.sh /run.sh
RUN chmod 775 /run.sh
#获取容器的日志(例如打印容器mytest应用后10行的内容。)
docker logs --tail="10" mytest
#当启动容器时执行的脚本文件
CMD ["/run.sh"]
- 弄jdk环境的实例
#依赖镜像名称和tag
FROM centos:7
#指定镜像创建者信息
MAINTAINER CHEN
#切换工作目录
WORKDIR /usr
RUN mkdir /usr/local/java
#ADD 复制并且解压,把java添加到容器中
ADD jdk-8u231-linux-x64.tar.gz /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_11
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
- 切换到相应的目录然后执行下面的命令(记得空格后的.)
docker build -t='jdk1.8' .
2. dockers私人仓库(相当于注册github)
//创建仓库
docker run -di --name=cor_registry -p 5000:5000 registry
//查看仓库
http://101.37.149.133:5000/v2/_catalog
//修改daemon.json
vim /etc/docker/daemon.json
//添加以下东西
//修改docker下载镜像的地址
{
“registry-mirrors”:["https://docker.mirrors.ustc.edu.cn"],
//信任地址
"insecure-registries":["101.37.149.133:5000"]
}
//然后重启docker
systemctl restart docker
//然后将相应需要的镜像标记
docker tag jdk1.8 101.37.149.133:5000/jdk1.8
//然后push到私人仓库
docker push 101.37.149.133:5000/jdk1.8
2. 使用maven插件完成镜像的创建和上传
//首先修改宿主机的docker配置,使其可以远程访问
vim /lib/systemd/system/docker.service
>在ExecStart=/usr/bin/dockerd后添加-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
//刷新配置,重启服务
systemctl daemon-reload
DockerMaven
- 在相应在的project加依赖
<!--docker插件-->
<build>
<!-- 为当前工程起名称 -->
<finalName>app</finalName>
<plugins>
<!-- spring boot的maven插件 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!-- docker的maven插件,官网:https://github.com/spotify/docker‐maven‐plugin -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.13</version>
<configuration>
<!-- 做成镜像后镜像的名称 -->
<imageName>101.37.149.133:5000/${project.artifactId}:${project.parent.version}</imageName>
<!-- 基础镜像 -->
<baseImage>jdk1.8</baseImage>
<!-- 执行命令,打jar包 -->
<entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
<dockerHost>http://101.37.149.133:2375</dockerHost>
</configuration>
</plugin>
</plugins>
</build>
-
注意与该包相关的服务都开启,不然编译打包可能会失败
-
执行打包并上传docker命令
mvn clean package docker:build -DpushImage