首页 > 其他分享 >Docker(4.36)学习笔记

Docker(4.36)学习笔记

时间:2024-12-29 21:08:30浏览次数:5  
标签:容器 name -- 笔记 4.36 镜像 docker Docker

1. 什么是Docker

Docker是基于Go语言实现的开源容器引擎,诞生于2013年年初,用于将应用程序及其依赖项打包为容器,以便在云或本地环境中自动部署和运行。Docker通过操作系统层面的虚拟化技术,将软件与其依赖项隔离,确保应用程序能够在不同的环境中一致地运行。

Docker的特点

  1. 容器化:Docker容器是一个轻量级的、可执行的独立软件包,包含应用程序运行所需的所有内容,如代码、运行时环境、系统工具、系统库和设置。这些容器可以在任何环境中一致地运行,不受外在环境差异的影响。

  2. 隔离性:Docker容器通过Linux内核的cgroup和namespace等技术实现进程隔离,确保应用程序在独立的容器中运行,互不干扰。

  3. 跨平台:Docker容器可以在Windows、macOS和Linux上运行,支持x86-64、ARM、s390x和ppc64le等多种架构。

Docker的优势:

  1. 速度快:Docker容器很快,启动和停止可以在秒级实现

  2. 占用资源少: 容器对系统资源需求很少,一台主机可以同时运行数千个Docker容器

  3. 操作便捷: 通过类似Git设计理念的操作来方便用户操作镜像

  4. Dockerfile: Dockerfile支持灵活的自动化创建和部署机制

2. Docker组件基本概念

  1. Image(镜像)

镜像是一个特殊的文件系统。它除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(例如环境变量)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。 在 Dockerfile 中, 每一条指令都会创建一个镜像层,继而会增加整体镜像的大小。

例如:一个镜像可以包含一个基本的操作系统环境,里面仅安装了tomcat等,可以把他看做一个tomcat镜像

镜像是创建Docekr容器的基础,通过版本管理和增量的文件系统,Docker提供了一套十分简单的机制来创建和更新现有的景象,用户可以直接从网上下载一个已经做好的应用镜像,并直接使用

  1. Container(容器)

Docker容器类似于一个轻量级的沙箱,Docker利用容器来运行和隔离应用,容器是从镜像创建的应用运行实例(一个镜像可以运行n个实例,即n个容器),他可以启动,开始,停止,删除,每个容器都是彼此隔离,不可见的,可以把容器看做一个简易版的linux系统环境以及运行在其中的应用程序打包而成的盒子

容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 命名空间。因此容器可以拥有自己的 root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。

  1. Registry(仓库)

Docker仓库类似于代码仓库,是集中存放镜像文件的地方,一个 Docker Registry中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。

通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过<仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。

目前最大的公开仓库是Docker Hub,其中存放着庞大的镜像提供给用户下载,docker也支持用户在本地网络内创建私有仓库

3. 安装与运行

安装:yum install docker-ce

查看: docker version

设置阿里云加速:

mkdir -p /etc/docker
vim /etc/docker/daemon.json
添加:
{
  "registry-mirrors": ["https://j2gvd296.mirror.aliyuncs.com"]
}

启停:

systemctl start docker

systemctl stop docker

4. 镜像操作

1. 下载

docker hub可以去查看具体版本

https://hub.docker.com/r/library/

docker pull NAME:TAG (TAG可以写成latest,获取最新版本)

2. 查看

docker images 查看所有下载的镜像

docker tar centos:7 mycentos:7 给镜像添加自定义标签,类似软链接

docker inspect centos:7 查看详细信息,返回json格式数据

docker history centos:7 查看该镜像创建历史

docker rmi mycentos:1(也可根据id删除) 删除镜像, -f 强制删除 ,如果是自定义标签,只会删除标签的副本,原来的还在

docker search 搜索镜像:

--limit int 显示个数,默认25个

--no-trunc 不截断输出结果

--filter filter 使用过滤器

3. 创建

  • 基于已有的容器创建

docker commit -m "add my file" -a "houzheng" ob97c97 test:0.1

-m 提交信息 -a 作者信息 之前运行的改变的容器id 仓库:版本

  • 基于Dockerfile创建

4. 保存和导入

docker save -o centos:7.tar centos:7 保存到本地

docker load -i centos:7.tar 从本地导入镜像

5. 上传

docker push docker用户名/仓库名:tag

例如:

docker push houzheng/helloworld:1

5. 容器操作

1. 创建

docker create -it --name=mydock centos:7

i:保持打开容器的标准输入
t:告诉docker为容器建立一个命令行终端。
name:指定容器名称,可以不填(随机)
默认不会启动,不加it容器启动会退出

docker run -it -d centos:7 创建并启动

-d 在后台运行,如果有 /bin/bash 不加d直接进入容器
-c "while true; do echo hello;" 后面执行命令

2. 查看

docker ps -a 查看所有容器,包括停止的

docker ps 查看运行的容器

docker ps -l :查看最新创建的容器,只列出最后创建的

docker ps -n=2 -n=x选项会列出最后创建的x个容器

查看容器详情: docker container inspect bb5fce124c49

查看容器内进程: docker top bb5fce124c49

查看容器详情:显示CPU,网络情况等 不持续 不截断输出 docker stats --no-stream --no-trunc bb5fce124c49

3. 启动进入

docker start id 启动

docker restart name/ID 重启容器

docker attach name/ID 进入容器

docker exec -it bb5fce124c49 /bin/bash 进入容器(如果是redis就 redis-cli这种类似)

4. 终止

docker stop name/id :将容器退出。

docker kill name/id:强制停止一个容器

docker stop $(docker ps -aq) 停止所有容器

docker pause 暂停

docker unpause 恢复

5. 删除

docker rm name/id:不能够删除一个正在运行的容器,会报错。需要先停止容器

docker rm $(docker ps -aq):-a标志列出所有容器,-q标志只列出容器的ID,然后传递给rm命令,依次删除容器

6. 导入导出

docker export id > name.tar

docker import name.tar - imcentos:0.1 导入变成镜像

7. 其他命令

docker cp -a zookeeper.out bb5fce124c49:/ 将文件复制到容器根目录下,-a 复制gid和UID信息 -L 复制软连接的目标内容

docker port bb5fce124c49: 查看端口映射

docker diff bb5fce124c49: 查看容器文件变更

8. 查看日志

docker logs -f name : 查看实时日志

6. 数据管理

1. 数据卷

数据卷是一个可供容器使用的特殊目录,他将主机操作系统目录直接映射进容器,类似于Linux中的mount行为,是用来持久化数据的一种机制。数据卷可以在容器之间共享,也可以从一个容器备份到另一个容器。

特点:

  • 可以在容器之间共享和重用,容器间传递数据将变得高效和方便

  • 数据修改会立马生效

  • 对数据卷的更新不会影响镜像

  • 数据卷会一直存在,直到没有容器使用,才可以安全卸载

创建的文件或者目录在 /var/lib/docker/volumes/里面

例如: 挂载主机/root/shell目录到 容器/opt/shell

docker run -it --mount type=bind,source=/root/shell,destination=/opt/shell --name=hehe centos:7

2. 数据卷容器

如果用户需要在多个容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。数据卷容器也是一个容器,但是它的目的是专门用来提供数据卷供其他容器挂载

创建数据卷容器:

 docker run -it -v /dbdata --name dbdata ubuntu

其他容器用--volumes-from来挂载dbdata容器中的数据卷:

docker run -it --volumes-from dbdata --name db1 ubuntu
docker run -it --volumes-from dbdata --name db2 ubuntu

此时,容器db1和db2都挂载同一个数据卷到相同的/dbdata目录。三个容器任何一方在该目录下的写入,其他容器都可以看到

7. 端口映射

docker run -itd -p 8009:8888 --name=houzh centos:7

-p 指定端口映射

-P 随机分配一个宿主机49000-49900的端口映射到容器内端口

docker run -it -p 192.168.171.128::5000 使用IP::端口映射任意端口到容器,本地主机会自动分配

8. 容器互联

docker run -itd --name=web --link db:webdb centos:7

使用 --link 连接db容器,webdb别名

9. Dockerfile

Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本

构建三步骤:

  1. 编写Dockfile文件

  2. 构建 docker build

  3. 运行 docker run

Dockerfile内容基础知识

  1. 每条保留字指令都必须为大写字母且后面要跟随至少一个参数 比如 From xxx 如果这个xxx啥都不写就会报错

  2. 指令按照从上到下,顺序执行

  3. #表示注释

  4. 每条指令都会创建一个新得镜像层,并对镜像进行提交

Dockerfile关键字:

  • From 基础镜像,当前新镜像是基于哪个镜像的

Docker Hub中99%的镜像都是通过在base镜像中安装和配置需要的软件构建出来的

  • MAINTAINER 镜像维护者的姓名和邮箱地址

  • run 容器构建时需要额外运行的命令

ps:相当于一串逻辑代码中加sout输出一句话在控制台,也就是需要执行

  • expose 当前容器对外暴露的端口

  • workdir 终端登录落脚点,指定在创建容器后,终端登录进去的默认目录,也就是一个落脚点

  • env 用来在构建镜像过程中设置环境变量ps: env my_path /usr/mytest

  • add 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理url和解压tar压缩包

  • copy 类似ADD,拷贝文件和目录到镜像中,对比 add 它就是只负责拷贝,不解压

  • volume 容器数据卷,用于数据保存和持久化工作

  • cmd 指定一个容器启动时要运行的命令

dockfile中可以有多个cmd指令,但只有最后一个生效,cmd会被docker run 之后的参数替换

  • entrypoint 指一个容器启动时要运行的命令,entypoint的适合cmd一样,都是在指定容器启动程序及参数;

经典考题:

cmd和entrypoint有啥区别?
cmd允许写多个,多个cmd以最后一个为准,其他虽然会执行但是不生效
entrypoint则是追加的形式
  • onbuild 当构建一个被继承的dockerfile时运行,父镜像在被子镜像继承父镜像的onbuild被触发 类似于触发器

先写一个父镜像

再写一个子镜像,继承父镜像,当构建的子镜像的时候,就会触发父镜像的onbuild

  • label 标签 也就是说明的意思

比如,自定义一个Dockerfile:

From centos

#作者以及邮箱
MAINTAINER wang<15727538286@163.com>

#把宿主机当前上下文的c.txt拷贝到容器 /usr/local
COPY C.txt /usr/local/cc.txt

#把java与tomcat添加到容器中
ADD jdk-8u181-linux-x64.tar.gz  /usr/local

ADD apache-tomcat-8.5.27.tar.gz  /usr/local

#安装vim编辑器

RUN yum -y install vim 

#设置工作访问的适合workdir路径,登录落脚点
ENV MYPATH /usr/local
WORKDIR $MYPATH

#配置java与tomcat环境变量

ENV JAVA_HOME  /usr/local/jdk1.8.0_181
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.27
ENV CATALINA_BASE /usr/local/apache-tomcat-8.5.27
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

#容器运行时监听的端口

EXPOSE 8080

#启动时运行tomcat
#ENTRYPOINT["/usr/local/apache-tomcat-8.5.27/bin/startup.sh"]
# CMD ["/usr/local/apache-tomcat-8.5.27/bin/catalina.sh","run"]
CMD /usr/local/apache-tomcat-8.5.27/bin/startup.sh&&tail -F /usr/local/apache-tomcat-8.5.27/bin/logs/catalina.out

docker build:

Docker build命令的基本语法如下:

docker build [OPTIONS] PATH | URL | -

其中,OPTIONS表示命令选项,PATH | URL | -表示Dockerfile的路径或URL,也可以是标准输入(-)。

二、常用的Docker Build命令选项

  1. —build-arg:设置构建时的变量。这个选项允许我们在构建过程中传递一些参数或变量,以便在Dockerfile中使用。

  2. —no-cache:不使用Build Cache构建镜像。默认情况下,Docker会使用缓存来加速镜像的构建过程。但是,在某些情况下,我们可能希望禁用缓存,以确保每次构建都是最新的。

  3. —pull:使用gzip压缩构建的上下文。这个选项可以让我们在构建镜像时,将上下文进行gzip压缩,以减少传输的数据量。

  4. —file, -f:指定Dockerfile的路径。默认情况下,Docker会在当前目录下查找名为Dockerfile的文件。但是,如果我们的Dockerfile不在当前目录下,或者我们想要使用不同的文件名,就可以通过这个选项来指定。

  5. —label:为生成的镜像设置metadata。这个选项允许我们在构建镜像时,为镜像添加一些标签(label),以便在后续的管理和查找中更加方便。

三、Docker Build命令的使用示例

假设我们有一个名为myapp的应用程序,它的Dockerfile位于当前目录下的myapp/目录下。我们可以使用以下命令来构建该应用程序的Docker镜像:

  1. docker build -``t myapp``:``latest -``f myapp``/``Dockerfile .

这个命令告诉Docker,我们要根据myapp/目录下的Dockerfile来构建一个名为myapp:latest的镜像。其中,-t选项用于指定镜像的名字和标签,-f选项用于指定Dockerfile的路径,最后的.表示Dockerfile所在的上下文路径。

10. helloworld之redis

下载镜像:docker pull redis:5.0.5

创建容器:docker run -itd -p 6379:6379 --name=myredis redis:5.0.5

使用数据卷映射配置文件:

docker run -p 6378:6379 --name redis01 -v 本机配置文件/redis.conf:/etc/redis/redis.conf -v 本机数据备份目录/data:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes

进入redis: docker exec -it f7c901e37252 redis-cli

11. docker compose

Compose 是用于定义和运行多容器Docker应用程序的编排工具。通过 Compose可以轻松、高效的管理容器,您可以使用 YML 文件来配置应用程序需要的所有服务。然后使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。

Compose创建的容器是基于Docker的,所以可以使用Docker进行管理,但是推荐使用声明式管理方式,也就是通过修改配置文件来管理。

使用Docker Compose

启动项目:

docker-compose up -d

查看运行中的服务:

docker-compose ps

停止和删除容器、网络:

docker-compose down

Docker-compose.yml配置详解

(1)顶级配置项

  • version 定义了版本信息

  • services 定义了服务的配置信息

  • networks 定义了网络信息,提供给 services 中的 具体容器使用

  • volumes 定义了卷信息,提供给 services 中的具体容器使用

格式:

version: "3.8" #这边的版本yml文件的版本号
services: # 容器
  servicename: # 服务名字,这个名字也是内部 bridge网络可以使用的 DNS name
    image: # 镜像的名字
    command: # 可选,如果设置,则会覆盖默认镜像里的 CMD命令
    environment: # 可选,相当于 docker run里的 --env
    volumes: # 可选,相当于docker run里的 -v
    networks: # 可选,相当于 docker run里的 --network
    ports: # 可选,相当于 docker run里的 -p
  servicename2:
volumes: # 可选,相当于 docker volume create
networks: # 可选,相当于 docker network create

yaml基础知识:

  • 大小写敏感,缩进表示层级关系

  • 缩进空格数不重要,相同层级左侧对齐即可。(不允许使用 tab 缩进!)

  • 由冒号分隔的键值对表示对象;一组连词线开头的行,构成一个数组;字符串默认不使用引号

(2)version配置指令

YML文件版本兼容性 详情请看官网文档

(3)networks配置指令

未显示声明网络,容器会被加入app_default网络中。配置自定义网络

version: '3'
services:
  proxy:
    build: ./proxy
    networks:
      - front
  db:
    image: postgres
    networks:
      - back
networks:
  front:
    driver: host
  back:
    driver: bridge

配置默认网络

version: '3'
services:
  web:
    build: .
    ports:
      - "8000:8000"
  db:
    image: postgres
networks:
  default:
    driver: overlay

使用已存在的网络

version: '3'
services:
  web:
    build: .
    ports:
      - "8000:8000"
  db:
    image: postgres
networks:
  default:
    external:
      name: my-pre-existing-network

(4)volumes配置指令

自定义卷供容器挂载使用

version: '3'
services:
   db:
     volumes:
       - db_data:/var/lib/mysql
   wordpress:
     volumes:
       - wordpress_files:/var/www/html
       
volumes:
  wordpress_files:
  db_data:

标签:容器,name,--,笔记,4.36,镜像,docker,Docker
From: https://www.cnblogs.com/houzheng/p/18639541

相关文章

  • 记录:wsl2 安装 CentOS8-stream 安装docker 安装redis-cluster集群 一些步骤及问题
     一。解压  下载的CentOS8-stream.zip压缩包,双击安装   (下载地址记录:wsl2安装centOS7一些问题解决并使用shell工具连接)  二。修改root密码 (安装后直接进入root 不知道密码所以修改)  直接passwd即可修改   三。yumli......
  • 学习笔记:旋转treap
    前言更好的阅读体验。无旋treap。默认读者会BST的基本操作、堆和旋转。本文旋转部分和上面那篇文章的相同。代码中是小根堆。思想treap既是一棵二叉查找树(tree),也是一个二叉堆(heap)。但是如果这两个数据结构用同一个权值维护,那么这两种数据结构是矛盾的。所以treap用......
  • 异或线性基学习笔记
    更好的阅读体验。前言本文的线性基指异或线性基。由于作者太菜了本文的语言不会特别规范。简介线性基简称基,它是一个数的集合,并且每个序列都拥有至少一个线性基。线性基有三个性质:线性基中的几个数异或后不能得到\(0\)。线性基中的数在异或后能得到原序列中的所有数。......
  • Open Notebook:开源 AI 笔记工具,支持多种文件格式,自动转播客和生成总结,集成搜索引擎等
    ❤️如果你也关注AI的发展现状,且对AI应用开发非常感兴趣,我会每日跟你分享最新的AI资讯和开源应用,也会不定期分享自己的想法和开源实例,欢迎关注我哦!......
  • 《程序员修炼之道:从小工到专家》阅读笔记
    一、重视基础知识书中强调了基础知识的重要性。如同盖房子,坚实的地基才能撑起高楼大厦。对于程序员来说,像数据结构、算法等基础知识是解决复杂问题的基石。例如在处理大量数据排序时,若熟悉不同排序算法的原理和时间复杂度,就能选择最合适的算法,提高程序效率。二、注重代码质量代......
  • 亚里士多德《形而上学》第7卷第7节阅读笔记
    亚里士多德的《形而上学》以其晦涩难懂著称。读英文稍微能理解一点,中文翻译完全看不懂。但是作为母语中文的读者,读英文虽然字面意思能看懂,却难以记忆和反思。这里我自己从JonathanBarnes编辑的英译本(W.D.Ross翻译的)自行翻译了一些要点为中文,方便理解。 7、8、9节都是围绕“生......
  • 折腾笔记[3]-迁移U盘的ubuntu到虚拟机
    摘要使用clonezilla工具迁移安装到U盘中的ubuntu18.04系统到vmware虚拟机.关键信息clonezillaubuntu18.04cpu:x86_64vmware:17.6.0ubuntu引导方式:UEFI+GRUB2windows11原理简介clonezilla简介[https://clonezilla.org/][https://linux.cn/article-3888-1.html]再......
  • ♂hook♂学习笔记~(持续更新)
    主要是从攻防世界中的easyhook中学习,感觉好神奇.参考了以下博客:攻防世界逆向高手题之EASYHOOK-CSDN博客RE套路/从EASYHOOK学inlinehook-c10udlnk-博客园先贴源码:sub_401370(aPleaseInputFla);scanf("%31s",input_flag);if(strlen(input_flag)==19)......
  • 2024-12-13《构建之法阅读笔记》
    构建之法阅读笔记(1) 第一章概论在这一章中,作者为我们介绍了一些关于软件工程的基本知识。①软件=程序+软件工程:正是因为对软件开发活动(构建管理、源代码管理、软件设计、软件测试、项目管理)相关的内容的完成,才能完成把整个程序转化成为一个可用的软件的过程。扩展的推论......
  • 玩转Docker | 使用Docker部署超级马里奥经典小游戏
    玩转Docker|使用Docker部署超级马里奥经典小游戏一、项目介绍项目简介项目预览二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署超级马里奥经典小游戏下载镜像创建容器检查容器状态检查服务端口安全设置四、访问超......