尚硅谷2022版Docker实战教程(docker教程天花板)
跟着周阳老师学的
Docker是基于Go语言实现的云开源项目。
Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次镜像,处处运行”。
Linux容器技术的出现就解决了这样一个问题,而 Docker 就是在它的基础上发展过来的。将应用打成镜像,通过镜像成为运行在Docker容器上面的实例,而 Docker容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器。只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作。
解决了运行环境和配置问题的软件容器,
方便做持续集成并有助于整体发布的容器虚拟化技术。
列出本地主机上的镜像
各个选项说明:
同一仓库源可以有多个 TAG版本,代表这个仓库源的不同个版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。
如果你不指定一个镜像的版本标签,例如你只使用 ubuntu,docker 将默认使用 ubuntu:latest 镜像
OPTIONS说明:

OPTIONS说明:


没有TAG就是最新版,等价于 docker pull 镜像名字:latest
示例:docker pull redis


docker rmi -f 镜像IDdocker rmi -f 镜像名1:TAG 镜像名2:TAGdocker rmi -f $(docker images -qa)
OPTIONS说明(常用):有些是一个减号,有些是两个减号
–name=容器新名字 : 为容器指定一个名称;
-d:后台运行容器并返回容器ID,也即启动守护式容器(后台运行);
-i:以交互模式运行容器,通常与 -t 同时使用;
-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;
也即启动交互式容器(前台有伪终端,等待交互);
-P:随机端口映射,大写P
-p:指定端口映射,小写p
1.进入新建名为myub1的ubuntu容器

2.查看正在运行的容器,发现ubuntu正在运行

没加OPTIONS只显示正在运行的容器
OPTIONS说明:
-a :显示所有的容器,包括未运行的。
-l :显示最近创建的容器。
-n :列出最近创建的n个容器。
在大部分的场景下,我们希望 docker 的服务是在后台运行的,
我们可以过 -d 指定容器的后台运行模式。



docker exec -it 容器ID/名字 bash
docker exec -it 容器ID/名字 sh
有的用sh才能进去,奇怪

退出容器输入exit即可
推荐大家使用 docker exec 命令,因为退出容器终端,不会导致容器的停止。
docker export 容器id > 导出名.tar 会导出在当前目录下
cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号,下面例子,发现已成功导入并运行了一个实例



所有的Docker镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的镜像层。分层时有文件更新直接替换,基础镜像一样时直接拿过来复用。
如redis下载不同版本时,第一层相同,直接复用,其他几层分层下载。
afb6ec6fdc1c: Already exists
608641ee4c3f: Pull complete
668ab9e1f4bc: Pull complete
78a12698914e: Pull complete
d056855f4300: Pull complete
618fdf7d0dec: Pull complete
docker commit提交容器副本使之成为一个新的镜像
docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]
原始的默认Ubuntu镜像是不带着vim命令的


docker容器内执行上述两条命令:
apt-get update
apt-get -y install vim
安装完成后,commit我们自己的新镜像,下面可以看出最后成功的生成新的镜像,并且有vim
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3e3b091c6c42 ubuntu "bash" 10 minutes ago Up 10 minutes awesome_robinson
fefe8083cf9f ubuntu "bash" 17 minutes ago Up 17 minutes dazzling_feynman
2e4c5b210b52 whyour/qinglong:2.11.3 "./docker/docker-ent…" 8 weeks ago Up 23 minutes 0.0.0.0:8353->5700/tcp, :::8353->5700/tcp qinglong
58e523263901 whyour/qinglong:2.11.3 "./docker/docker-ent…" 2 months ago Up 23 minutes 0.0.0.0:8354->5700/tcp, :::8354->5700/tcp qinglong2
[root@localhost ~]# docker commit -m="带vim的ununtu" -a="yhy" 3e3b091c6c42 vimubuntu:1.0
sha256:fe04d9dec70896d18a94108bcf0effeb75dde1fdbe3c8d8d4f10d2df55ba32a1
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
vimubuntu 1.0 fe04d9dec708 15 seconds ago 179MB
aero/ubuntu 1.0 6df7a1bdc1ee 22 hours ago 72.9MB
whyour/qinglong 2.11.3 124540254df2 6 months ago 497MB
redis latest 7614ae9453d1 8 months ago 113MB
ubuntu latest 26b77e58432b 17 months ago 72.9MB
[root@localhost ~]# docker run -it vimubuntu bash
Unable to find image 'vimubuntu:latest' locally
^Z
[1]+ 已停止 docker run -it vimubuntu bash
[root@localhost ~]# docker run -it fe04d9dec708 bash
root@f81980747e05:/# vim a
root@f81980747e05:/#
卷的本质是文件或者目录,存在一个或者多个容器中,由docker挂载到容器,但不属于联合文件系统。卷的概念不仅解决了数据持久化的问题,还解决了容器间共享数据的问题。
数据的持久化,当容器重启后保证数据不丢失,例如我们可以使用卷将 MySQL 的目录持久化,实现容器重启数据库数据将不会丢失。防止手贱删掉了容器,数据不见了。
如果将数据存储于镜像中,主机上的其他进程不方便访问这些数据。
数据卷可在容器之间共享或重用数据
数据卷中的更改不会包含在镜像的更新中
卷中的更改可以直接生效
数据卷的生命周期一直持续到没有容器使用它为止
Docker的数据管理(volume/bind mount/tmpfs)
docker存储有哪几种方式
命令:
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名
案例:
新建一个容器并指定映射关系,如果容器需要别名加上--name =“别名”
docker run -it --privileged=true -v /tmp/myHostData:/tmp/myDockerData myub1 /bash

–privileged=true 作用:
Docker挂载主机目录访问如果出现cannot open directory .: Permission denied
解决办法:在挂载目录后多加一个--privileged=true参数即可
如果是CentOS7安全模块会比之前系统版本加强,不安全的会先禁止,所以目录挂载的情况被默认为不安全的行为,
在SELinux里面挂载目录被禁止掉了额,如果要开启,我们一般使用--privileged=true命令,扩大容器的权限解决挂载目录没有权限的问题,也即
使用该参数,container内的root拥有真正的root权限,否则,container内的root只是外部的一个普通用户权限。
docker inspect 容器id\名 查看是否映射成功

经过实验可以看出,确实是共享的


docker run -it --privileged=true --volumes-from 父类 --name u2 ubuntu
继承我们上面刚创建的容器,可以看出,确实是继承了
