docker容器入门指南(centos7)

参考文章

  1. 安装使用:https://www.cnblogs.com/kingsonfu/p/11576797.html
  2. 更新国内yum源
    https://blog.csdn.net/anigon/article/details/54018733
  3. docker的简单使用
    https://blog.csdn.net/deng624796905/article/details/86493330
  4. 镜像和容器的区别
    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

  1. 容器技术
    为了了解docker,首先你需要了解容器技术,容器技术是实现操作系统虚拟化的一种途径,可以让您在资源受到隔离的进程中运行应用程序及其依赖关系。通过使用容器,我们可以轻松打包应用程序的代码、配置和依赖关系,将其变成容易使用的构建块,从而实现环境一致性、运营效率、开发人员生产力和版本控制等诸多目标。容器可以帮助保证应用程序快速、可靠、一致地部署,其间不受部署环境的影响。容器还赋予我们对资源更多的精细化控制能力,让我们的基础设施效率更高。

*容器与虚拟机的区别
在这里插入图片描述

docker与虚拟机的区别

服务器虚拟化解决的核心问题是资源调配,而容器解决的核心问题是应用开发、测试和部署。

容器技术严格来说并不是虚拟化,没有客户机操作系统,是共享内核的。容器可以视为软件供应链的集装箱,能够把应用需要的运行环境、缓存环境、数据库环境等等封装起来,以最简洁的方式支持应用运行,轻装上阵,当然是性能更佳。Docker镜像特性则让这种方式简单易行。当然,因为共享内核,容器隔离性也没有虚拟机那么好。

在这里插入图片描述

docker容器和镜像的区别

如下图所示,容器是由镜像实例化而来,这和我们学习的面向对象的概念十分相似,我们可以把镜像看作类,把容器看作类实例化后的对象

也可以说镜像是文件, 容器是进程。 容器是基于镜像创建的, 即容器中的进程依赖于镜像中的文件, 这里的文件包括进程运行所需要的可执行文件, 依赖软件, 库文件, 配置文件等等…

在这里插入图片描述

小问题

  1. 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

  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"]

在这里插入图片描述

  1. 弄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
  1. 切换到相应的目录然后执行下面的命令(记得空格后的.)
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

  1. 在相应在的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>
  1. 注意与该包相关的服务都开启,不然编译打包可能会失败

  2. 执行打包并上传docker命令
    mvn clean package docker:build -DpushImage

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值