【2023裸辞失业后之初学Docker1】

学习视频来自 https://www.bilibili.com/video/BV1gr4y1U7CY

Docker简介

Docker出现原因
    开发一个程序,如何保证在服务器能跑,如何保证在部署过程中不出现令人头疼的版本、配置问题,答案就是使用容器。Docker之所以发展如此迅速,也是因为它对此给出了一个标准化的解决方案-----系统平滑移植,容器虚拟化技术。
    安装的时候,把原始环境一模一样地复制过来。开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作”的问题。
在这里插入图片描述
docker理念
    Docker是基于Go语言实现的云开源项目。
    Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次镜像,处处运行”。

什么是Docker
     Docker 是在Linux容器技术的基础上发展过来的。将应用打成镜像,通过镜像成为运行在Docker容器上面的实例,而 Docker容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器。只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作。

与虚拟机的比较
    虚拟机(virtual machine)就是带环境安装的一种解决方案。
它可以在一种操作系统里面运行另一种操作系统,比如在Windows10系统里面运行Linux系统CentOS7。应用程序对此毫无感知,因为虚拟机看上去跟真实系统一模一样,而对于底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响。这类虚拟机完美的运行了另一套系统,能够使应用程序,操作系统和硬件三者之间的逻辑不变。
在这里插入图片描述但是虚拟机存在以下缺点
1 资源占用多 2 冗余步骤多 3 启动慢

http://120.27.193.132:8888/down/R7bhAnrNdnIh
docker三要素
仓库:存放镜像的地方
镜像:初学可以理解java中的类
容器:初学可以理解java中的对象

也是一个CS的架构,类似Mysql

在这里插入图片描述

docker下载安装

官网:https://www.docker.com/
官方仓库:https://hub.docker.com

linux上安装
以下内容在官网可以看到
官网安装步骤
1,确认是centos7以上版本 cat /etc/redhat-release
2,卸载旧版本

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

3,yun安装gcc相关

yum -y install gcc
yum -y install gcc-c++

4,安装需要的软件包

sudo yum install -y yum-utils

5,设置镜像仓库

sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

6,安装docker引擎,按y下一步就行

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

7,启动docker

sudo systemctl start docker

8,测试

docker version

9,运行一个docker镜像

docker run hello-world

在这里插入图片描述
阿里云镜像加速
在这个地址
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
一步步执行2里面的命令即可
在这里插入图片描述

常用命令

帮助启动类命令

systemctl start docker
systemctl stop  docker
systemctl restart docker
systemctl status docker
#开机启动docker
systemctl enable docker
docker info
docker --help
docker 具体命令 --help

镜像命令

#列出本地主机的所有镜像
#REPOSITORY:表示镜像的仓库源,TAG:镜像的标签版本号,IMAGE ID:镜像ID,CREATED:镜像创建时间,SIZE:镜像大小
docker images

#从远程仓库搜索镜像,stars为点赞数,official为官方认证,AUTOMATED是否自动构建
docker search hello
#拉取镜像,不写tag默认是最新的
docker pull 镜像名字:tag 
#查看镜像,容器所占空间等信息
docker system df
#删除镜像
docker rmi -f 名字/或者id
#删除多个
docker rmi -f 名字/或者id,名字/或者id
#传参删除
docker rmi -f $(docker images -aq)

什么是虚悬镜像?
仓库名、标签都是的镜像,俗称虚悬镜像dangling image
在这里插入图片描述

容器命令

以安装ubuntu为例
创建运行容器docker run -it ubuntu /bin/bash
在这里插入图片描述

·	新建+启动容器
	·	docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
	·	 OPTIONS说明
		 OPTIONS说明(常用):有些是一个减号,有些是两个减号
 
		--name="容器新名字"       为容器指定一个名称;
		
		docker run -it --name=myubuntu ubuntu bash
		
		-d: 后台运行容器并返回容器ID,也即启动守护式容器(后台运行);
 
		-i:以交互模式运行容器,通常与 -t 同时使用;
		-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;
		也即启动交互式容器(前台有伪终端,等待交互);
 
		-P: 随机端口映射,大写P
		-p: 指定端口映射,小写p

在这里插入图片描述
列出所有的容器docker ps

-a :列出当前所有正在运行的容器+历史上运行过的
-l :显示最近创建的容器。
-n:显示最近n个创建的容器。
-q :静默模式,只显示容器编号。

退出容器

两种方式
exit		  :退出时容器会关闭
ctrl+p+q  	:退出时容器不会关闭

启动已经停止的容器

docker start 容器id或者名字

停止容器

docker stop 容器id或者名字

强制停止容器

docker kill 容器id或者名字

删除已经停止的容器

docker rm 容器id或者名字
##强制删除,正在运行的也可以删除
docker rm -f 容器id或者名字
#删除所有的的
docker rm -f $(docker ps -a -q)

启动守护式容器(后台服务器)

docker run -d 容器名

查看容器的日志

docker logs 容器id

查看容器内部细节

docker inspect 容器id

进入正在运行的容器

docker exec -it 容器id /bin/bash
docker attach 容器id

    两个的区别是attach相当于直接进入,exec相当于远程连接进入,attach进入后exit退出会直接把容器关掉,exec进入退出是相当于关闭远程连接
从容器复制文件到主机

docker cp 容器id:容器内路径 目的路径

导入和导出容器

#导出容器的内容留作为一个tar归档文件[对应import命令]
docker export 容器ID > 文件名.tar 
#从tar包中的内容创建一个新的文件系统再导入为镜像[对应export]
cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号 

镜像分层概念

镜像
    是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,我们把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码、运行时需要的库、环境变量和配置文件等),这个打包好的运行环境就是image镜像文件。

分层的镜像
    以我们的pull为例,在下载的过程中我们可以看到docker的镜像好像是在一层一层的在下载。
UnionFS(联合文件系统)
    Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像
Docker镜像加载原理
     docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。
    bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是引导文件系统bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。rootfs (root file system) ,在bootfs之上。包含的就是典型 Linux 系统中的 /dev, /proc, /bin, /etc 等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。

    rootfs (root file system) ,在bootfs之上。包含的就是典型 Linux 系统中的 /dev, /proc, /bin, /etc 等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。

为什么 Docker 镜像要采用这种分层结构呢
    镜像分层最大的一个好处就是共享资源,方便复制迁移,就是为了复用。

比如说有多个镜像都从相同的 base 镜像构建而来,那么 Docker Host 只需在磁盘上保存一份 base 镜像;
同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。
重点理解
    Docker镜像层都是只读的,容器层是可写的 当容器启动时,一个新的可写层被加载到镜像的顶部。 这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。
    当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。
所有对容器的改动 - 无论添加、删除、还是修改文件都只会发生在容器层中。只有容器层是可写的,容器层下面的所有镜像层都是只读的。
在这里插入图片描述

commit命令

	docker commit提交容器副本使之成为一个新的镜像
	docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]	
·	案例演示ubuntu安装vim
·	原始的默认Ubuntu镜像是不带着vim命令的

1,运行容器
docker run -it ubuntu  /bin/bash
2,在容器内使用vim ,发现vim not found
3,先更新apt,再安装vim,测试之后发现能使用vim
apt-get update
apt-get install vim
4,退出容器,提交成一个新的镜像
docker commit -m "添加vim" -a "Xiao" f4ec3bdba1c3 myubuntu:1.0
5,再运行这个容器,发现是有vim的

本地镜像发布到腾讯云

1,先进到容器镜像服务
在这里插入图片描述
2,创建一个命名空间,创建完成之后创建仓库,选中你创建的命名空间
在这里插入图片描述3,点击快捷指令,按照需求执行即可

docker容器数据卷

    卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性:
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷

     将运用与运行的环境打包镜像,run后形成容器实例运行 ,但是我们对数据的要求希望是持久化的

    Docker容器产生的数据,如果不备份,那么当容器实例删除后,容器内的数据自然也就没有了。
为了能保存数据在docker中我们使用卷
特点:
1:数据卷可在容器之间共享或重用数据
2:卷中的更改可以直接实时生效,爽
3:数据卷中的更改不会包含在镜像的更新中
4:数据卷的生命周期一直持续到没有容器使用它为止

命令如下

docker run -it -v /宿主机目录:/容器内目录 ubuntu /bin/bash

宿主机和容器内添加容器卷案例

docker run -it -v /tem/hostdockerdata:/tem/dockerdata --name=u1 ubuntu
#在该目录下,我们发现创建修改文件都会同步到宿主机或者容器中
#如果失败,尝试加上参数 --privileged=true
#如果是CentOS7安全模块会比之前系统版本加强,不安全的会先禁止,所以目录挂载的情况被默认为不安全的行为,在SELinux里面挂载目录被禁止掉了额,如果要开启,我们一般使用--privileged=true命令,扩大容器的权限解决挂载目录没有权限的问题,也即使用该参数,container内的root拥有真正的root权限,否则,container内的root只是外部的一个普通用户权限

使用命令docker inspect 容器id进行查看
在这里插入图片描述

读写规则

默认是rw 上面的案例等于

docker run -it -v /tem/hostdockerdata:/tem/dockerdata:rw --name=u1 ubuntu

ro:容器内部只能读,不能写

docker run -it -v /tem/hostdockerdata:/tem/dockerdata:ro --name=u1 ubuntu

我们在容器内想去修改,会提升如下
在这里插入图片描述

容器卷的继承

docker run -it --volumes-from 父容器id或者名字--name u2 ubuntu

常用软件按照(以后我安装一个就在这个更新一个)

安装Redis

1,新建一个文件夹,存放redis的文件等等,你可以自己选一个地方

mkdir -p /usr/local/dockerApp/redis

2,随便弄一个redis.conf文件放到里面,并且修改配置文件(没有可以复制redis配置文件模板 命名redis.conf即可),如果不是复制的需要修改
    将daemonize yes注释,或者daemonize no(因为该配置和docker run中-d参数冲突,会导致容器一直启动失败)
    注释 #bind 127.0.0.1(允许远程连接)
     开启redis数据持久化 appendonly yes 可选
     密码 requirepass 自行设置

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3,创建容器(运行下面命令时)

docker run  -p 6380:6379 --name myRedis --privileged=true -v /usr/local/dockerApp/redis/redis.conf:/etc/redis/redis.conf -v /usr/local/dockerApp/redis/data:/data -d redis:6.0.8 redis-server /etc/redis/redis.conf

4,如果是云服务器记得开放6380端口,(坑:如果发现开发端口还访问不到记得重启网络服务 service network restart 我被这玩意折磨了一天,云服务开放了端口还是访问不到,翻了无数帖子才想到是云服务器的问题,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值