您现在的位置是:首页 >技术杂谈 >技术复盘(4)--docker网站首页技术杂谈

技术复盘(4)--docker

jianjian?? 2023-05-12 20:06:59
简介docker原理,安装docker,docker常用命令和一些坑,docker卸载,docker数据卷,dockerFile,构建docker私有仓库图形化界面。

资料地址

docker官网:https://www.docker.com/
docker中文网:https://docker.p2hp.com/
docker-hub官网:https://hub.docker.com/
docker-compose:https://pan.baidu.com/s/1zBg83EwPdn1fce92_CnU1w?pwd=hf01
提取码:hf01
学习地址-B站狂神:https://www.bilibili.com/video/BV1og4y1q7M4

环境

centos7

初始docker

docker作用:将内核与容器隔离,容器内放置运行的程序和环境,每一个容器之间又相互隔离。防止环境干扰,避免不必要的加载。
在这里插入图片描述
docker命令图解–复习专用:
在这里插入图片描述

特点:

  1. 应用更快速的交付和部署
    传统:一堆帮助文档,安装程序
    Docker :打包镜像发布测试,一键运行
  2. 更便捷的升级和扩缩容
    使用了Docker之后,我们部署应用就和搭积木一样!项目打包为一个镜像,如镜像中有tomcat7 mysql5,需要升级,升级为tomcat8 mysql8后,又作为一个新的镜像。别人只需要拿到这个镜像即拿到了整个升级后的环境。
  3. 更简单的系统运维
    在容器化之后,我们的开发,测试环境都是高度一致的。
  4. 更高效的计算资源利用
    Docker是内核级别的虚拟化,可以再一个物理机上可以运行很多的容器实例!服务器的性能可以被压榨到极致。

名词解释:

  1. 镜像( image )
    docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,tomcat镜像===> run ==> tomcat01容器(提供服务器),通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的)。当然,一个镜像中通常会含有多个环境,如mysql8 tomcat8,为保证你和你的小组成员开发环境一致,你可以将这个镜像分享给你的小组成员。
  2. 容器( container )
    Docker利用容器技术,独立运行一个或者一个组应用,通过镜像来创建的。
    启动,停止,删除,基本命令!
  3. 仓库
    仓库就是存放镜像的地方!仓库分为公有仓库和私有仓库!Docker Hub (默认是国外的)阿里云…都有容器服务器
    :

安装docker

官方安装教程:https://docs.docker.com/engine/install/centos/【供参考】

1.卸载旧的版本:我这儿没有旧的版本,没有的可以略过这一步骤

sudo yum remove docker 
                  docker-client 
                  docker-client-latest 
                  docker-common 
                  docker-latest 
                  docker-latest-logrotate 
                  docker-logrotate 
                  docker-engine

在这里插入图片描述
2.设置存储库,采用阿里的镜像进行下载

sudo yum install -y yum-utils

sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

在这里插入图片描述
在这里插入图片描述
3.更新yum软件包索引

yum makecache fash

在这里插入图片描述
4.安装docker,版本号为19.03.8
docker-ce表示社区版,docker-ee代表企业版
docker-ce-cli-19.03.8:表示docker客户端的版本号,不指定默认为最新

sudo yum install docker-ce-19.03.8 docker-ce-cli-19.03.8 containerd.io

5.启动docker

sudo systemctl start docker

6.查看docker版本号:能查询出来代表安装成功

docker version

7.运行hellow-world镜像

docker run hello-world

日志解读:
Unable to find image "hello-world:latest’ locally:未找到hello-world镜像
latest: Pulling from library/hello-world:去拉取最新的hello-world镜像
Pull complete :拉取成功
Hello from Docker!
This message shows that your installation appears to be working correctly.
如果你能看见Hello from Docker!就代表docker是安装正常的
在这里插入图片描述
8.补充:如果是买的云服务器,还可以配置镜像加速器,能够能快的下载镜像。具体怎么操作每个云服务器厂家不同略有区别。
9.安装docker compose,这个不知道的可以先不安,也不会有太大影响。我下载了个能正常用的,在资料地址处,将其下载下来上传到/usr/local/bin目录处。下面的地址是国内镜像下载,我下载后无法正常使用

curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
  1. 使Docker Compose二进制文件可执行
sudo chmod +x /usr/local/bin/docker-compose

11.测试Docker Compose是否安装成功

docker-compose --version

在这里插入图片描述

docker常用命令-都需要先启动docker

注意:在docker中,镜像和容器这两者容易混淆,从docker仓库中拉去的叫镜像,把镜像拿来启动后的叫容器。本文中有些地方也对这两者混淆了。

1.启动docker,停止为stop

sudo systemctl start docker

2.查询docker版本,最好在docker启动后查看,否则查看的信息不全

docker version

3.显示docker巨详细的信息

docker info

4.查看日志

docker logs

docker镜像命令:

1.查看自己主机上的所有镜像

docker images

2.删除镜像,通常通过id删除

docker rmi -f <镜像id或名称>

3.查询docker镜像,以mysql为例

docker search mysql

4.拉取docker镜像,以mysql5.7为例,不指定版本默认为最新版

docker pull mysql:5.7

docker容器命令:

1.运行docker镜像,以hello-world为例

run命令参数:
--name="name"	容器名称
-p				指定端口[小p]
	-p 容器端口:主机端口
	-p 容器端口
	容器端口
-P				随机端口[大p]
-d				以后台方式运行
【后台启动问题:后台启动后如果没有前台进程,就会自动停止】
-it				使用交互方式运行,可以进入容器内部
【-it需要指定个工作目录,通常为/bin/bash】
docker run hello-world

2.停止docker容器,以hello-world为例

docker stop hello-world

3.列出当前正在运行的 Docker 容器

参数
-a			列出所有docker容器,包括已暂停或退出的容器
docker ps

4.退出容器

exit

5.删除容器

参数:
-f			强制删除
docker rm <容器id>

6.启动/停止/重启/强制停止 容器

docker start <容器id>
docker stop<容器id>
docker restart<容器id>
docker kill<容器id>

7.查看容器中的进程

docker top <容器id>

8.查看容器元数据

docker inspect <容器id>

9.进入当前正在运行的容器,开辟一个新的终端

docker exec -it <容器id> <命令行,通常为/bin/bash>

10.进入当前正在运行的容器,不开辟新的终端

docker attach  <容器id> 

11.容器内的文件拷贝到主机

docker cp <容器id>:<容器内路径> <主机路径>

docker容器打包为镜像

1.docker容器打包为镜像,目前还未上传

#命令和git原理类似
docker commit -m="提交的描述信息." -a="作者" 容器id 目标镜像名:[TAG]

docker坑

1.docker安装的容器都是最小可运行的,安装时最好百度一下或参考官网

docker卸载

1.卸载依赖

sudo yum remove docker-ce-19.03.8 docker-ce-cli-19.03.8 containerd.io 

2.删除工作路径,这是docker的默认工作路径

rm -rf /var/lib/docker

docker数据卷

需求:数据存在容器中,容器删除后数据也会丢失,基于此,需要将docker容器中的数据同步到主机上。
1.启动centos,将容器内/home目录挂载到主机内/home/ceshi目录下,双向绑定,数据双向同步

-v全称:volume

docker run -it -v <容器目录>:<主机目录> <镜像> /bin/bash
docker run -it -v /home/ceshi:/home centos /bin/bash

2.实际运用:将mysql5.7配置文件和数据文件挂载在主机上,且mysql密码为root
-e全称:environment

docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/data -e MYSQL_ROOT_PASSWORD="root" --name="mysql01"  mysql:5.7

dockerFile构建过程

dockerFile基础知识:

  1. 每个保留关键字(指令)都是必须是大写字母
  2. 执行从上到下顺序执行
  3. #表示注释
  4. 每一个指令都会创建提交一个新的镜像层,并提交!

dockerfile命令:

FROM		#基础镜镜像,—切从这里开始构建
MAINTAINER	#镜像是谁写的,姓名+邮箱
RUN			#镜像构建的时候需要运行的命令
ADD			#步骤: tomcat镜像,这个tomcat压缩包,自动解压!添加内容
WORKDIR		#镜像的工作目录
VOLUME		#挂载的目录
EXPOSE		#保留端口配置
CMD			#指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT	#指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD		#当构建一个被继承DockerFile这个时候就会运行ONBUILD的指令。触发指令。
COPY		#类似ADD,将我们文件拷贝到镜像中
ENV			#构建的时候设置环境变量!

构建jdk+tomcat镜像
1.上传jdk和tomcat,等会代码在mycentos中编写
在这里插入图片描述

2.编写代码

FROM centos
MAINTAINER lijian<2435024850@qq.com>

ADD jdk-8u162-linux-x64.tar.gz /usr/local
ADD apache-tomcat-7.5.87.tar.gz /usr/local

ENV MYPATH /usr/local
WORKDIR $MYPATH

ENV JAVA_HOME /usr/local/jdk1.8.0_162
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.87
ENV CATALINA_BASH /usr/local/apache-tomcat-8.5.87
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

EXPOSE 8080

CMD /usr/local/apache-tomcat-8.5.87-src/bin/startup.sh && tail -F /url/local/apache-tomcat-8.5.87/bin/logs/catalina.out

3.构建镜像

docker build -f mycentos -t diytomcat .

4.验证,启动容器并进入容器,输入java -version检测jdk,有则代表jdk成功,检测tomcat的话需要增加webapp和增加端口映射,这儿就不检测tomcatt了。
在这里插入图片描述
5.发布镜像到docker hub,步骤为:登录docker hub -> 对镜像打标签 -> 上传镜像,打标签格式为docker tag <镜像id或镜像名> <hub用户名>/<上传镜像名>:<版本号>,具体过程看图。
在这里插入图片描述
6.上传成功后就能在docker hub中找到自己刚刚上传的,和github是差不多的。
在这里插入图片描述

搭建私有仓库–非图形化界面

1.私有仓库本质也是一个镜像,拉取镜像

 docker pull registry

2.以后台+交互的方式启动镜像,端口映射为5000:5000,随后访问**http://<自己的ip地址>:5000/v2/_catalog**如下图所示表示搭建成功。

docker run -id --name=registry -p 5000:5000 registry

在这里插入图片描述

3.让本地的docker信任远程仓库,一般情况下docker仓库和自己的docker是两台不同的机器,但这儿只是为了学习,就搭建在的一台机器上。编辑vim /etc/docker/daemon.json ,将"insecure-registries":["<服务器ip>:5000"]插入到最后面,保存退出,如下图所示。
在这里插入图片描述
4.重启docker和docker仓库

systemctl restart docker
docker start registry 

在这里插入图片描述
5.上传镜像到docker私有仓库,以mysql5.7为例:先将mysql打标签,打标签规则为打成的标签名必须以要上传仓库的ip地址:端口号命令,再将标签上传

docker tag <镜像名>:<版本号> <仓库地址>:<端口号>/<上传后的镜像名>:<上传后的镜像版本号>
docker tag mysql:5.7 <仓库地址>:5000/mysql:5.7


docker push  <仓库地址>:5000/mysql:5.7

在这里插入图片描述
6.上传成功后我们再次访问html,就会发现repositories里多了个mysql
在这里插入图片描述
7.拉取镜像,拉取前先查看镜像极其具体的版本号:


查看:http://<仓库ip地址>:5000/v2/<需要查看的镜像>/tags/list
http://<仓库ip地址>:5000/v2/mysql/tags/list

拉取:docker pull <仓库ip地址>:5000/<镜像名>:<版本号>
docker pull <仓库ip地址>:5000/mysql:5.7 

在这里插入图片描述

搭建私有仓库–图形化界面

【和搭建私有仓库–非图形化界面有很多相同点】
前置条件:该过程要求必须安装docker-compose
1.让本地的docker信任远程仓库,编辑vim /etc/docker/daemon.json ,将`“insecure-registries”:[“<服务器ip>:5000”,“<服务器ip>:8080”]
插入到最后面,保存退出,如下图所示。其中5000为docker-registry的端口,8080为docker-registry-ui的端口,5000可以选择不配置。
在这里插入图片描述
2.重启docker

systemctl restart docker

3.找个地方新建个目录,在目录中创建docker-compose.yml目录,将下列代码输入其中。

version: '3.0'
services:
        registry:
                image: registry
                volumes:
                        - ./registry-data:/var/1ib/registry
        ui:
                image: joxit/docker-registry-ui:static
                ports:
                        - 8080:80
                environment:
                        - REGISTRY_TITLE=个人docker仓库地址
                        - REGISTRY_URL=http://registry:5000
                depends_on:
                        - registry

在这里插入图片描述
4.启动docker-compose.yml,因为docker-compose.yml为docker-compose的默认文件,所以直接docker-compose up -d启动即可

docker-compose up -d

5.启动后正常贴图,访问地址:<ip地址>:8080
在这里插入图片描述
6.上传镜像的话和搭建私有仓库–非图形化界面中的一致,参考即可。

docker理论知识

作于复习,不建议不了解的同学直接阅读。

1.联合文件系统
UnionFS ( 联合文件系统): Union文件系统(UnionFS )是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtualfilesystem)。Union文件效统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

特性∶一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。

实际运用:docker pull命令就是基于联合文件系统

2.docker镜像加载原理
bootis(boot file system):主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
roots (root file system):在bootfs之上。包含的就是典型Linux系统中的/dev, /proc, /bin, /etc等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。|

3.具名挂载和匿名挂载
字面意思,具名挂载就是指定挂载地,匿名随机生成一个挂载地,查看匿名挂载地方法:通过**docker volume inspect <容器id>**查看详情,详情里的mounts会有匿名挂载地。不建议匿名挂载,容易找不到。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。