Docker 学习笔记

简单记录一下常见的命令,一些高级的部分由于还没有用到,未来再补充。

入门

到底能干嘛

虚拟机占用资源多,冗余步骤多,启动速度慢。
Docker:打包镜像发布测试,一键运行;更便捷的升级和扩缩容

容器化技术不是模拟完整的操作系统,容器内的应用直接运行在宿主机的内核上,容器没有自己的内核,也没有虚拟硬件,每个容器间是隔离的。Docker 就是一个容器,Tomcat,redis,是我们从 repository 拉取的镜像 image,然后我们用镜像创建的容器相当于 java 用类创建一个对象、

安装

sudo yum install -y yum-utils
sudo  yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo yum install docker-ce docker-ce-cli containerd.io
systemctl start docker
docker version
docker run hello-world # 发生了什么
# 首先会判断本机是否有这个镜像,如果有就run,没有就去配置的远程仓库找,下载到本地运行

docker images # 查看 docker 镜像
阿里云镜像加速
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

底层原理

Docker 是一个 CS 结构的系统,守护进程运行在主机上,通过 Socket 从客户端访问。
DockerServer 接收到 Docker-Client 的指令,就会去执行。
镜像原理
https://blog.csdn.net/pjsdsg/article/details/90445128

镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境的开发软件,它包含运行某个软件所需的所有内容,
包括代码、运行时、库、环境变量和配置文件。

UnionFS(联合文件系统)

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

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

docker 的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。

bootfs(boot file system) 主要包含bootloader和kernel,bootloader 主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就存在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。

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

对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序库就可以了,因为底层直接用Host(宿主机)的kernel,自己只需要提供rootfs就行了,由此可见对于不同的Linux发行版,bootfs基本是一致的,rootfs会有差别,因此不同的发行版可以公用bootfs。

**采用这种分层结构最大的一个好处就是共享资源,**比如有多个镜像都从相同的base镜像构建而来,那么宿主机只需要在磁盘上保存一份base镜像,同时内存中也只需要加载一份base镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。 docker 镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作 “容器层” ,“容器层” 之下的都叫镜像层。

所以为什么 docker 比 VM 快

  • docker 有着比 vm 更少的抽象层

  • docker 利用的是宿主机的内核

常用命令

  • 帮助命令
# 帮助
docker version
docker info # 显示 docker 的系统信息
docker [命令] --help
# 官方文档地址 https://docs.docker.com/engine/reference/run/
docker stats # 查看 docker 状态
docker image inspect 
docker history 镜像ID
  • 镜像命令
# 镜像命令
docker images
docker search mysql
docker pull mysql # latest
docker pull mysql:5.7
docker rmi -f ID1 ID2
docker rmi -f $(docker images -aq) # 递归删除全部
  • 容器命令
# 容器命令
# 有了镜像才能创建容器

docker pull centos
docker run [可选命令] image

docker run -it centos  # 创建并进入容器 i是以交互模式运行 t是分配终端
# 
exit # 停止并退出容器
Ctrl + P + Q # 容器不停止退出

docker ps # 当前正在运行的容器
docker ps -a # 停止且没有删除的容器
docker ps -a -n=1 # 最近运行的n个容器
docker ps -aq # 历史运行过的容器ID
docker rm 容器ID  # 删除单个容器
docker rm $(docker ps -aq) # 递归删除所有容器
docker ps -a -q|xargs docker rm # 删除所有容器
# 创建容器
docker run -it centos
docker run -d centos # docker 容器使用后台运行,前台就必须有一个进程,如果没有,就会自动停
docker run -it -rm tomcat:9.0 # exit 容器后自动删除 ps -a 里面不会有 
docker run -d -p 3355:8080 --name tomcat01 tomecat #将容器外部的端口绑定容器内部的端口 形成映射
docker run -it -v  /宿主机绝对路径目录:  /容器内目录  镜像名 # -v 挂载数据卷
docker run -P # 不指定端口,随机映射端口


# 进入后台的容器
docker exec -it 容器ID /bin/bash # 进入后台容器 开启新的终端
docker attach -it # 进入容器正在执行的终端,不会启动新的进程

# 启动关闭的容器 关闭容器(g)
docker start 容器ID # 启动
docker restart 容器ID
docker stop 容器ID # 关闭容器
docker kill 容器ID # 强行关闭容器
  • 查看日志和进程信息
docker logs -tf # 显示日志
docker logs -tf --tail n ID # 查看指定容器最后n条日志 

docker top ID # 容器内部的进程信息
docker inspect ID # 查看容器的元数据
  • 拷贝文件到主机上
docker cp 容器ID:/home/test.java /home 
  • 提交镜像
docker commit -a="提交人" -m="描述信息" ID imageName:tag #commit 到本地 image 库

容器数据卷

https://blog.csdn.net/weixin_40322495/article/details/84957433

当我们在使用docker容器的时候,会产生一系列的数据文件,这些数据文件在我们关闭docker容器时是会消失的,但是其中产生的部分内容我们是希望能够把它给保存起来另作用途的,Docker将应用与运行环境打包成容器发布,我们希望在运行过程中产生的部分数据是可以持久化的而且我们希望容器之间能够实现数据共享

通俗地来说,docker容器数据卷可以看成使我们生活中常用的u盘,它存在于一个或多个的容器中,由docker挂载到容器,但不属于联合文件系统,Docker不会在容器删除时删除其挂载的数据卷。

特点:

1:数据卷可以在容器之间共享或重用数据

2:数据卷中的更改可以直接生效

3:数据卷中的更改不会包含在镜像的更新中

4:数据卷的生命周期一直持续到没有容器使用它为止

  • 容器数据卷绑定
# 指定路径挂载
docker run -it -v  /宿主机绝对路径目录:  /容器内目录  镜像名
docker run -it -v /home/test:/home centos /bin/bash
# 这个命令会在宿主机和容器内分别建立两个目录,两个目录是对接的(双向绑定),里面的数据可以共享。如果我们不知道数据卷是否挂载成功时,我们可以通过以下方式来检查数据卷的挂载结果。
docker inspect  容器id # Mounts 
# 也可以具名挂载和匿名挂载
docker run -v /容器内目录 # 匿名挂载
docker run -v 宿主相对目录:/容器内目录 # 具名挂载 默认文件夹内 /var/lib/docker
docker volume ls # 可以查看具名挂载和匿名挂载的情况
docker volume inspect 宿主相对目录 # 可以查看具体在哪


# 我们在挂载的时候还可以给数据卷加上权限,假如我们要宿主机只能读取容器的数据卷内容不能修改,我们可以添加只读权限
docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名 # 只读
docker run -it -v /宿主机绝对路径目录:/容器内目录:rw 镜像名 # 读写
  • 数据卷同步数据(共享,双向拷贝)
# 我们现在将不同容器之间的数据进行同步
# 被挂载的容器叫做  子容器 -volume-from 父容器
docker run -it --name docker02 --volumes-from docker01 镜像名
# 这样创建的容器是共享数据的 共享的只有Mount所在的文件夹

# 或者说是共享机制,数据是双向拷贝的,是一种备份机制,数据卷的生命周期一直持续到没有容器使用它为止。

DockerFile

Dockerfile是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker通过读取Dockerfile中的指令自动生成映像。docker build命令用于从Dockerfile构建映像。可以在docker build命令中使用-f标志指向文件系统中任何位置的Dockerfile。

简直不说人话

Docker File 就是用来构建 Docker 镜像的构建文件,本质上是命令脚本

先简单体验一下

mkdir /home/dockertest
vim /home/dockertest/dockerfile01
FROM centos
VOLUME ["volume01","volume02"] # 配置匿名数据卷挂载 在根目录下会生成两个文件夹 
CMD echo "----end----"
CMD /bin/bash
docker build -f /home/dockertest/dockerfile01 -t mycentos:1.0 . # 注意后面有个空格和点.
docker ps # 这样就创建一个新的

具体就是 写 dockerfile 定制镜像 然后 build

原生镜像都是功能很简单的,我们可能需要一层层加我们需要的功能,比如在基础的 bootfs 和 roofs 上面增加 jdk tomcat 之类的

docker 是面向开发的,我们以后要发布项目,做镜像,就需要编写 dockerfile

FROM centos # 相当于基础的模板镜像,最下面的几层,我们在这个基础上往上面增加层
MAINTAINER   # 开发者信息 姓名加邮箱
RUN   # 构建镜像的时候需要运行的命令
ADD # 添加内容,往基础镜像上面加东西
WORKDIR # 工作目录 启动后进入的目录
VOLUME # 目录挂载
EXPOSE # 暴露端口

CMD # 指定容器启动的时候运行的命令,只有最后一个会生效
ENTRYPOINT # 指定容器启动的时候运行的命令,可以追加命令

ENY # 构建的时候设置环境变量
FROM centos
MAINTAINER Gale<gale617@foxmail.com>
ENV MYPATH /usr/local # 类似键值对
WORKDIR $MYPATH

RUN yum -y install vim # 安装 vim
RUN yum -y install net-tools # 安装 net-tools

EXPOSE 80

CMD echo $MYPATH
CMD echo "----end----"
CMD /bin/bash
docker build -f dockerfile -t mycentos:1.0 . # 注意后面有个空格和点.
# -f 是 file 文件路径 -t 镜像名[:tag]
  • CMD 和 ENTRYPOINT 的区别
CMD ["ls","-a"] 
# CMD 下 我们追加的命令会替换原来的命令
docker run ID -l # 报错
docker run ID ls -al # 成功

ENTRYPOINT ["ls","-a"]
docker run ID -l # 成功 追加拼接到了我们启动命令后

Docker 网络

每个容器都有 docker 分配的地址

ip addr

每启动一个容器,我们的服务器本机 会多一对网卡,这涉及到一个技术虚拟网络设备evth-pair,相当于一个接口,连接本机和容器

容器和容器之间通过本机连接

–net

https://blog.csdn.net/weixin_34608222/article/details/113537311

上面我们注意到有一个 --net属性

安装Docker时,它会自动创建三个网络,bridge(创建容器默认连接到此网络)、 none 、host,docker run创建Docker容器时,可以用 --net 选项指定容器的网络模式 :

none模式,使用--net=none指定,该模式关闭了容器的网络功能。
host模式,使用--net=host指定,容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
bridge模式,使用--net=bridge指定,默认设置 ,此模式会为每一个容器分配、设置IP等,并将容器连接到一个docker0虚拟网桥,通过docker0网桥以及Iptables nat表配置与宿主机通信。
container模式,使用--net=container:NAME_or_ID指定,创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围。

–link(不推荐)

主要功能是单向配置 域名映射,就不需要ping ip了。

docker run -d -P --name tomcat02 --link tomcat01 tomcat
docker exec -it tomcat02 ping tomcat01   # 其实就是配置了 hosts 映射,单向配置 /etc/hosts

自定义网络

# 查看所有的网络
docker network ls  
# 创建
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
docker network inspect mynet
# 此网络内的 不用 --link 也可以互相完成域名映射的配置
# 

网络连通

不同网络间怎么互联

docker network connect mynet tomcat01 # 连接一个容器到一个网络
# 连接之后就是把 tomcat01 也放到了 mynet 中,一个容器两个 ip

SpringBoot 发布成 Docker 镜像

  1. 打包 package(测试一下 java -jar xxxx.jar)

  2. 编写 dockerfile

    FROM java:8
    
    COPY *.jar /app.jar # 拷贝到j
    
    CMD ["--server.port=8080"]
    
    EXPOSE 8080
    
    ENTRYPOINT ["java", "-jar", "/app.jar"] # 运行jar包
    
  3. 构建镜像

  4. 发布

实战:制作我们自己的Tomcat镜像

  • 准备我们自己的 jdk,Tomcat 压缩包

  • touch readme.txt
    
  • 编写 dockerfile 文件

FROM centos
MAINTAINER Gale<gale617@foxmail.com>

COPY readme.txt /usr/local/readme.txt
ADD jdk-8u11-linux-x64.tar.gz /usr/local/ # 自动解压
ADD apach-tomcat-9.0.22.tar.gz /usr/local/

RUN yum -y install vim # 安装 vim
RUN yum -y install net-tools # 安装 net-tools

ENV MYPATH /usr/local # 类似键值对
WORKDIR $MYPATH 

ENV JAVA_HOME /usr/local/jdk1.8.0_11

ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/toos.jar

ENV CATALINA_HOME /usr/local/apach-tomcat-9.0.22

ENV CATALINA_BASH /usr/local/apach-tomcat-9.0.22

ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

EXPOSE 8080

CMD /usr/local/apach-tomcat-9.0.22/bin/startup.sh && tail -F /usr/local/apach-tomcat-9.0.22/logs/catalina.out
docker build -f dockerfile -t diytomcat:1.0 .
  • 发布到 dockerhub,也可以发布在别的地方
docker login -u ... -p
# 可以先改名
docker tag ID gale/diytomcat:1.0
docker push gale/diytomcat:1.0 
# 会按照层级上传
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值