docker入门介绍

1、简介

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

docker官网:https://docker.com

docker仓库地址:https://hub.docker.com/

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wHT2gPpX-1637225026124)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/2edb31ff-cc6e-431d-993b-3430972b94ca/Untitled.png)]

1.1、docker能做什么?

dcoker作为一个目前市场上一个最流行的一个虚拟化部署应用,他能快速搭建日常所需要的环境,同时又能避免一些软件的安装带来的一些冲突问题,从而保证服务的正常稳定运行。同时也在日常的测试中也会用,例如破坏性测试。可以保证同一套环境下做多种破坏性实验,并且破坏之后可以重新部署。目前使用最广泛的应用就是在微服务的搭建以及集群的部署上。

  • Web 应用的自动化打包和发布。
  • 自动化测试和持续集成、发布。
  • 在服务型环境中部署和调整数据库或其他的后台应用。
  • 从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。

1.2、docker的好处

  • 持续部署与测试

Docker在开发与运维的世界中具有极大的吸引力,因为它能保持跨环境的一致性。在开发与发布的生命周期中,不同的环境具有细微的不同,这些差异可能是由于不同安装包的版本和依赖关系引起的。然而,Docker可以通过确保从开发到产品发布整个过程环境的一致性来解决这个问题*Docker容器通过相关配置,保持容器内部所有的配置和依赖关系始终不变。

  • 多云平台

Docker最大的好处之一就是可移植性。在过去的几年里,所有主流的云计算提供商,包括亚马逊AWS和谷歌的GCP,都将Docker融入到他们的平台并增加了各自的支持。Docker容器能运行在亚马逊的EC2实例、谷歌的GCP实例、Rackspace服务器或者VirtualBox这些提供主机操作系统的平台上。

  • 环境标准化和版本控制

Docker容器可以在不同的开发与产品发布生命周期中确保一致性,进而标准化你的环境。除此之外,Docker容器还可以像git仓库一样,可以让你提交变更到Docker镜像中并通过不同的版本来管理它们。

  • 隔离性

Docker可以确保你的应用程序与资源是分隔开的。

虚拟机中运行了很多应用程序,这些应用程序包括团队协作软件(例如Confluence)、问题追踪软件(例如JIRA)、集中身份管理系统(例如Crowd)等等。由于这些软件运行在不同的端口上,所以你必须使用Apache或者Nginx来做反向代理。到目前为止,一切都很正常,但是随着你的环境向前推进,你需要在你现有的环境中配置一个内容管理系统(例如Alfresco)。这时候有个问题发生了,这个软件需要一个不同版本的Apache Tomcat,为了满足这个需求,你只能将你现有的软件迁移到另一个版本的Tomcat上,或者找到适合你现有Tomcat的内容管理系统(Alfresco)版本。

  • 安全性

从安全角度来看,Docker确保运行在容器中的应用程序和其他容器中的应用程序是完全分隔与隔离的,在通信流量和管理上赋予你完全的控制权。Docker容器不能窥视运行在其他容器中的进程。从体系结构角度来看,每个容器只使用着自己的资源(从进程到网络堆栈)。

2、安装docker

2.1、cnetos安装

官方安装脚本:

国外

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

国内

curl -sSL https://get.daocloud.io/docker | sh

最简单的安装:

yum install docker -y
#安装之后记得重启该服务否则服务器重启之后docker需要手动启动才能使用
systemctl restart docker.service

安装好之后默认的docker workspase :/var/lib/docker

2.2、windows安装

Docker 并非是一个通用的容器工具,它依赖于已存在并运行的 Linux 内核环境。

Docker 实质上是在已经运行的 Linux 下制造了一个隔离的文件环境,因此它执行的效率几乎等同于所部署的 Linux 主机。

因此,Docker 必须部署在 Linux 内核的系统上。如果其他系统想部署 Docker 就必须安装一个虚拟 Linux 环境。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6lUoQK2D-1637225026125)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/566d8916-9ce3-46d5-b24b-4d0dcfa7d88d/Untitled.png)]

安装方式:https://www.runoob.com/docker/windows-docker-install.html

3、docker的使用

3.1、docker的命令

docker命令表

3.2、部署一个mysql

1、搜索一个镜像

要部署一个应用那么首先要明白你要部署一什么样的应用?什么版本的应用?这些镜像都是在哪里下载的?

仓库地址:https://hub.docker.com/

我们要部署的是mysql5.6

docker search mysql

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WjGIh3kU-1637225026126)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/4f64a5db-1c05-4540-a0d0-84cc14d829b0/Untitled.png)]

2、下载镜像

搜索到远程仓库中的所有的镜像后我们要选择一个镜像下载下来,在下载的时候要学会选择,一般情况下我们会选择官方的镜像

原因

  • 非官方的镜像对于企业来说并不是安全的可能存在一些隐藏脚本
  • 选择使用人数最多的
  • 仓库就类似与的github、gitee一样各种镜像参差不齐有些镜像甚至都不能使用
  • 官方镜像的搭建一定是最符合搭建规范的
docker pull mysql:5.6

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XD9mfMvk-1637225026128)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/cafca15b-33ea-43d1-810b-0b400a0c0315/Untitled.png)]

以上你看到的进度条是否好奇?为什么会有这么多的进度条呢?直接展示一个百分比不就好了吗?

3、查看本地镜像

下载下来之后我们检查一下我们目前主机上存在那些image。如果存在是否我们就不需要下载呢?

docker images

在这里插入图片描述

4、运行镜像——容器

docker run 常用参数:

-d: 后台运行容器,并返回容器ID;

-i: 以交互模式运行容器,通常与 -t 同时使用;

-P: 随机端口映射,容器内部端口随机映射到主机的端口

-p: 指定端口映射,格式为:主机(宿主)端口:容器端口

-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;

-name=“nginx-lb”: 为容器指定一个名称;

-dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;

-e username=“ritchie”: 设置环境变量;

-env-file=[]: 从指定文件读入环境变量;

-cpuset=“0-2” or --cpuset=“0,1,2”: 绑定容器到指定CPU运行;

-**m 😗*设置容器使用内存最大值;

-volume , -v: 绑定一个卷

。。。。。。

docker run  -it -d -p8080:3306 --name mysql5.6 mysql:5.6 sh -c 'service mysql start && tail -f /var/log/mysql/error.log'

5、查看正在运行的容器

这里的docker ps命令是否有点和常用的ps -ef | grep xxx有点相似呢?

是的,在docker中每一个container(容器)的运行实际上在我们的宿主机中都是一个单独的一个进程,甚至你在宿主机中使用ps 命令都能查的到当前在运行的容器进程内容

#查看当前在运行的容器
docker ps
#当然如果你的容器启动的时候就报错了或则说因为某些原因导致你的应用被kill调或者死掉了
#那么docker ps是无法查看的只能通过特定的参数进行查看 docker ps -a

6、验证部署是否成功以及是否可以正常使用

如果要验证mysql的是否能够正常使用,那么我们只要能登录到mysql并到mysql上并且执行sql语句那么我们的mysql就算搭建成功了。

docker exec  -it  mysql5.6 bash

在这里插入图片描述

7、查看容器的日志

#注意docker中不支持制定行数
docker logs -f mysql5.6

8、停止容器

当我们在使用完之后为了不占用当前宿主机的资源(cpu、内存等)我们应该立即将其stop。这样避免资源浪费。当时你不用担心的是即使你把你的容器stop之后你的数据是不会丢失的。你的数据以及文件会存储在docker 的文件系统中 /var/lib/docker这个目录中。当你以后需要用到它的时候你可以再次将它启动。这样就可以恢复到你原来的一个状态了。就类似与虚拟机中的暂停。

#启动
docker start mysql5.6
#停止
docker stop mysql5.6
#重启
docker restart mysql5.6

9、删除容器

在我们日常的测试过程中,或者你临时起意建立的应用。你可能只是一次性使用,也许你以后甚至半年一年都不再使用的时候,在这里我不建议你保留它。除非容器中含有重要数据(当然一般情况下容器是不会存储数据的,后面会讲到持久化部署)、或者这个应用非常难部署并且后续你可能会使用(当然这个容器是可以提交保存有点类似git)。这里我为什么不建议保留呢,因为你即使停了但是还是会占用一部分的磁盘的。在生产上如果没有定期清理的化很容易造成磁盘被撑爆。

#注意只有停止的容器才能删除,在运行的容器是不允许被直接删除的
#还有dcoker有docker rmi这个命令切记不要和rm搞混了
#docker rmi是删除image的,而rm是删除container的
dcoker rm mysql5.6

10、其他日常维护命令

#重命名容器
docker rename mysql5.6 mysql5
#查看docker版本
docker version
#查看端口映射情况
docker port mysql5.6
#查看镜像的修订历史
docker history
#查看容器文件系统的变化
docker diff mysql5.6 
#查看容器当前的状态
docker stats mysql5.6
#复制
docker cp ./test.txt mysql5.6:/test.txt
。。。。。

3.3、制作一个镜像

使用docker制作自己的镜像需要自己编写一个Dockerfile文件。在日常的开发测试工作中CICD打包使用的镜像都是运维人员编写好的基础镜像,开发人员进行CI的时候过程中会将打包好的war包或者Jar包命名成指定的文件、或者放到指定的目录之后,执行Docker build命令将打好的包放入镜像内进行存储起来,并打好对应的tag<标签>也就是镜像的版本。在提交到远程的仓库中。

常用的仓库。

Dockerfile

#基础镜像
FROM docker.io/liuqingsheng/centos7:latest
#作者
MAINTAINER liuqingsheng
#环境变量
ENV HITCHHIKER_HOME /usr/local/hitchhiker/build
#安装 nodejs 运行环境
RUN yum install -y nodejs && npm install -g pm2 && npm -g install n  && n 16.13.0
#获取最新的hitchhiker安装包
RUN mkdir /usr/local/hitchhiker && cd /usr/local/hitchhiker && yum install -y unzip && yum install wget -y && wget http://hitchhiker.oss-cn-hongkong.aliyuncs.com/Hitchhiker.zip && unzip Hitchhiker.zip
#工作目录
WORKDIR /usr/local/hitchhiker/build
EXPOSE 8080 9527
ENTRYPOINT ["/usr/bin/node","/usr/local/hitchhiker/build/setup.js","&"]

编写好Dockerfile之后我们需要执行一下build命令,否则就无法生成新的镜像

#编译一个hitchhiker 版本号为latest ,这个版本号可以自定义
docker build -t hitchhiker:latest .
#查看编译好的images
docker images

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S2KKoiZl-1637225026132)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/09ed9b12-5472-4f7b-8b47-bd3dd801b1c6/Untitled.png)]

在这里插入图片描述

最后可以自己尝试运行他(运行可以参考之前mysql的部署)

3.4、持久化部署

在之前的部署中有一个很大的问题,那就是我们的容器是一个虚拟的文件系统,当我们将他停掉之后那么虽然他不会自己删除掉,但是在你停掉这个容器的时候别人清理了一下docker的容器呢?这个时候你的数据就game over了。特别是数据库这些数据极其的重要。这个时候我们就需要将数据库的所有数据都保留下来该怎么做呢?

挂载:挂载指的是将宿主机的文件系统挂载到容器中,建立一个链接。这样在容器中写入的数据就会完整的保存在宿主机上了。这样即使容器甚至镜像被删除了我们还是可以恢复应用以及数据。

注意:挂载的数据一定要和你的应用相匹配,否则很容易导致数据不兼容。

docker run -itd --name=redis -p6379:6379 -e REDIS_HOME=xxxx -v xxx<服务器路径>:xxx<容器路径> redis:latest bash

4、上传镜像

上传镜像之前需要去你想上传的仓库中注册一个账号,并在你的宿主机上登录这个账号。否则你是无法上传镜像的。无法上传镜像的话那么你就只能通过文件的形式去在不同的主机中使用你的Dockerfile,并且每次都需要重新build,比较耗时。

这里我上传的是docker官方的仓库,当然你比较追求效率的话可以使用阿里云的仓库。英文官方的仓库是在国外的访问会比较的慢,而阿里云是国内比较快,同时如果你是用的是阿里云的主机的话甚至都可以使用阿里云内部vpc网络进行下载,也就是说走内网进行下载镜像。

#登录命令
docker login #<仓库地址:不填的话默认是官方的>然后输入用户名和密码即可

在这里插入图片描述

#修改镜像的tag 在你上传的时候需要将images名称改成你准备上传仓库的地址以及命令不修改的话是没办法上传到你的仓库的
docker tag  hitchhiker:latest  docker.io/liuqingsheng/hitchhiker:latest
#上传你的镜像到你的仓库中
docker push  docker.io/liuqingsheng/hitchhiker:latest

在这里插入图片描述

上传成功后登录官方的镜像仓库就能在https://hub.docker.com中看到自己的镜像了同时别人也可以通过 docker命令下载你的镜像进行使用,当然你也可以将你的镜像设置为私有的,这样就只有登录你的账号才能下载了。

在这里插入图片描述

在这里插入图片描述

点击镜像的tag后你可以看到你这个镜像的所有层级也就是你这个镜像执行的所有命令。这里说到层这个概念就不得不提一下层这个概念了。我们的Dockerfile最多只能写128层。这里的层你可以理解为Dockerfile中的行数。如果超过了这个行数是没有办法编译的。

同时我们在选择基础镜像的时候也要注意,因为层是有限制128的所以一些镜像本身如果已经很庞大有100层了。那么就不要去选择他了。在我们编写Dockerfile的时候也要注意不要一个命令就写一个RUN ,我们建议是一个步骤写一层。多条命令用 “&&”隔开。这样能使我们的层数保持合理的层数。同时后续人员想优化你的Dockerfile的时候也便于下手。

在这里插入图片描述

5、垃圾清理

在我们使用docker的过程中很容易产生一些不必要的层、特别是测试你的dokerfile的时候。还有docker运行一段时间,会产生大量的垃圾镜像和垃圾容器。这个时候会很容易将我们的服务器磁盘撑爆。那么我们就要去删除这些垃圾、或者说不需要的容器、镜像。

#清理磁盘,删除关闭的容器、无用的数据卷和网络
docker system prune
#命令清理得更加彻底,可以将没有容器使用Docker镜像都删掉,做之前一定要考虑清除
docker system prune -a
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值