Docker之docker run、docker exec、数据卷、Dockerfile-程序员宅基地

技术标签: Docker  容器  运维  docker  

Docker之docker run、docker exec

1.docker run命令介绍

docker run 参数

-i:保持容器运行。通过和-t同时使用。加入-it这两个参数以后,容器创建后会自动进入容器中,退出容器后,容器会自动关闭。
-t:为容器重新分配一个伪输入终端,通常和-i同时使用。
-d:以守护(后台)模式运行容器。创建一个容器在后台运行,需要使用docker exec 进入容器。
-it:创建的容器一般称为交互式容器。
-id:创建的容器一般称为守护式容器、
–name:威创建的容器命名。
-p:映射端口 外部端口:容器内部暴露的端口

后面的/bin/bash的作用是表示载入容器后运行bash ,docker中必须要保持一个进程的运行,要不然整个容器启动后就会马上kill itself,这个/bin/bash就表示启动容器后启动bash。

比如现在有一个正常的centos7镜像
第一次docker run 进入的时候,/bin/bash在最后加不加都行;
但是之后docker exec 进入的时候,/bin/bash必须得加

2.docker run -it --name=c1 centos:7 /bin/bash

退出容器:ext
注-t形式创建的只要退出容器,容器则自动关闭
进入容器内部后·root@后面的主机名会发生变化·即变成容器的id

在这里插入图片描述

3.docker run -id --name=c2 centos:7、docker exec -it c2 /bin/bash

注:下图与紧接着上图的

在这里插入图片描述

4.docker run -idt --name=demo centos:7 /bin/bash、docker exec -it demo /bin/bash

与任何图都没有关系

3效果一样

在这里插入图片描述

5.docker run -it --name=demo centos:7

2效果一样

在这里插入图片描述

6.docker run -id --name=demo centos:7、docker exec -it demo

可以发现docker run后面可以不加/bin/bash,但是docker exec后面必须得加/bin/bash

在这里插入图片描述

7.docker run -i --name=demo centos:7 /bin/bash

我开起了两个会话

窗口1运行后发现,光标一直在闪

在这里插入图片描述

窗口2ps后发现有个容器在运行

在这里插入图片描述

窗口1如果按ctrl c的话,不会停止,只能把会话关闭了才行;

在这里插入图片描述

窗口1按了ctrl c后,窗口2ps仍旧可以看到有容器在运行

在这里插入图片描述

窗口1把会话关闭了后,窗口2ps就看不到有容器在运行

在这里插入图片描述

8.docker run -i --name=demo centos:7

7效果是一样的

运行后发现,光标一直在闪

在这里插入图片描述

9.docker run -d --name=demo centos:7 /bin/bash

发现生成了一个停止状态的容器

在这里插入图片描述

10.docker run -d --name=demo centos:7

9一样

发现生成了一个停止状态的容器

在这里插入图片描述

11.docker run -t --name=demo centos:7 /bin/bash

我开起了两个会话

窗口1运行后发现,进去容器里;
当我输入eixit后光标一直在闪

在这里插入图片描述

窗口2ps后发现有个容器在运行

在这里插入图片描述

窗口1一直退不出容器,按ctrl c后可退出光标

在这里插入图片描述

窗口1关闭会话后,窗口2ps后发现仍然有个容器在运行

在这里插入图片描述

12.docker run -t --name=demo centos:7

11效果一样
还发现ll也执行不了

在这里插入图片描述

一个正常的centos是可以ll的

在这里插入图片描述

13.数据卷

13.1数据卷概念

数据卷:
• 数据卷是宿主机中的一个目录或文件
• 当容器目录和数据卷目录绑定后,对方的修改会立即同步
• 一个数据卷可以被多个容器同时挂载
• 一个容器也可以被挂载多个数据卷
数据卷作用:
• 容器数据持久化
• 外部机器和容器间接通信
• 容器之间数据交换

13.2配置数据卷

创建启动容器时,使用 –v 参数设置数据卷:

# V后面要加一个空格,宿主机目录与后面的冒号与容器内目录之间不能有空格,这两个目录的名字可以不一样
docker run ... –v 宿主机目录(文件):容器内目录(文件) ... 

注意事项:
1.目录必须是绝对路径
2.如果目录不存在,会自动创建
3.可以挂载多个数据卷,即多写几个-v就行了
4.注:如果容器删除了,但是数据卷并不会被删除,它仍然存在于宿主机目录里

数据同步演示实例:

docker run -it --name=c1 -v /root/data:/root/data container centos:7 /bin/bash

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

新键后数据会再恢复,即可持入化

在这里插入图片描述

一个容器可挂载多个目录演示

docker run -it--name=c2 -v/root/data2:/root/data2 -v /root/data3:/root/data3 centos:7 /bin/bash

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

多个容器挂载同一个数据卷

在这里插入图片描述

13.2配置数据卷容器

在这里插入图片描述

紧接着12。
把之前的容器都给删了·且宿主机的数据卷也被我手动被删除。

1.创建启动c3数据卷容器,使用-V参数设置数据卷

docker run -it --name=c3 -v /volume centos:7 /bin/bash

2.创建启动c1c2容器,使用-volumes-from参数设置数据卷

docker run -it --name=c1 --volumes-from c3 centos:7 /bin/bash
docker run -it --name=c2 --volumes-from c3 centos:7 /bin/bash

在这里插入图片描述

通过docker inspect容器名;
Source:表示宿主机源文件位置;
Destination表示数据卷在容器中的挂载位置;
c1c2c3的source与Destination都是一样的;
source可以看到主机里volumes存放的位置;
这是我们在创建c1时系统自动为我们创建的;
c1c2c3都会在根目录下生成一个volumes文件夹

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

14.镜像原理

Docker镜像本质是一个文件,但不是普通的文件:
Docker镜像本质是一个分层文件系统

Docker中一个centos镜像为什么只有200MB,而一个centos操作系统的iso文件要几个G,注:iso也是镜像文件:
Centos的iso镜像文件包含bootfs7和rootfs,而docker的centos镜像复用操作系统的bootfs,只有rootfs和其他镜像层

Docker中一个tomcat镜像有500MB,而一个tomcat安装包只有70多MB(这里的tomcat安装包是指在centos7中安装的tar.gz包):
由于docker中镜像是分层的,tomcat虽然只有70多MB,但他需要依赖于父镜像和基础镜像,所有整个对外暴露的tomcat镜像大小500多MB

操作系统组成部分:
进程调度子系统
进程通信子系统
内存管理子系统
设备管理子系统
文件管理子系统
网络通信子系统
作业控制子系统

Linux文件系统(即文件管理子系统)由oootfsi和rootfsi两部分组成
bootfs:包含bootloader(引导加载程序)和kernel(内核)
rootfs:root文件系统,包含的就是典型Linux系统中的/dev,/proc,bin,/etc等标准目录和文件
不同的inux发行版,bootfs基本一样,而rootfs,不同,如ubuntu,centos等
通俗点就是说内核都是一样的

在这里插入图片描述

比如在docker中下载tomcat镜像·系统会默认把rootfs镜像、jdk镜像也默认下载下来·但是对外不暴露(即这个jdk镜像与我们自己又下载的jdk镜像是不冲突没有任何关系的)。
所以tomcat文件才比较大;所以tomcat镜像其实是由rootfs镜像、jdk镜像、tomcat三个组成的。
注:比如在docker下载完tomcat镜像后需要再去下载nginx镜像,nginx是也是基于rootfs的,系统不会再去重复下载rootfs镜像,会进行复用

在这里插入图片描述

Docker镜像是由特殊的文件系统叠加而成;
最底端是bootfs,并使用宿主机的bootfs;
第二层是root文件系统rootfs,称为base image,然后再往上可以叠加其他的镜像文件;
统一文件系统(Union File System)技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统;
一个镜像可以放在另一个镜像的上面,位于下面的镜像称为父镜像,最底部的镜像成为基础镜像。
当从一个镜像启动容器时,Docker会在最顶层加载一个读写文件系统作为容器

15.只读镜像

在这里插入图片描述

16.制作镜像

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

16.Dockerfile

16.1Dockerfile

Dockerfile是用来做docker镜像的;
Dockerfile是一个文本文件;
包含了一条条的指令;
每一条指令构建一层,基于基出镜像(明确来说是父镜像),最终构建出一个新的镜像;
对于开发人员:可以为开发团队提供一个完全一致的开发环境;
对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了
对于运维人员:在部署时,可以实现应用的无缝移植

centos7的dockerfile如下:

image-20220222150037653

16.2Dockerfile案例一

注:docker提供的centos7本身的默认登陆路径是/,且不能使用vim,只能使用vi

在这里插入图片描述

案例需求:
自定义centos7镜像。要求:
1.默认登录路径为/usr
2.可以使用vim
案例实现步骤:
①定义父镜像:FROM centos:7
②定义作者信息:MAINTAINER itheima<itheima@itcast…cn>
③执行安装vim命令:RUN yum install-yvim
④定义默认的工作目录:ORKDIR /usr
⑤定义容器启动执行的命令:CMD/bin/bash
通过dockerfile构建镜像:docker bulid-f dockerfile.文件路径 -t 镜像名称:版本

在这里插入图片描述

16.3Dockerfile案例二

案例需求:
定义dockerfile,发布springbootI项目
案例实现步骤:
①定义父镜像:FROM java:8
②定义作者信息:MAINTAINER itheima [email protected]
③将jar包添加到容器:ADD springboot.jar app.jar第一个*.jar是jar包本身的名字,第二个*jar是添加成镜像后镜像的名字
④定义容器启动执行的命令:CMD java-jar app.jar
⑤通过dockerfile构建镜像:docker bulid-f dockerfile文件路径-t镜像名称:版本

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

16.4Dockerfile案例三

FROM golang:alpine

ENV GO111MODULE=on \
    CGO_ENABLED=0 \
    GOOS=linux \
    GOARCH=amd64

WORKDIR /build

COPY . .

RUN go build -o app .

WORKDIR /dist

RUN cp /build/app .

# 声明服务端口
EXPOSE 8888

# 启动容器时运行的命令
CMD ["/dist/app"]

第一种:
docker build -f ./dockerfile -t demoimage .
docker run -id -p 8888:8888 --name=democontainer demoimage

在这里插入图片描述

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

第二种:
docker build -f ./dockerfile -t demoimage .
docker run -it -p 8888:8888 --name=democontainer demoimage

在这里插入图片描述

一直在闪光标,按了ctrl c后自动退出容器

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

第三种:
docker build -f ./dockerfile -t demoimage .
docker run -it -p 8888:8888 --name=democontainer demoimage /bin/sh

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

17.docker compose

使用docker compose编排nginx+springboot项目

image-20221019195437678

1.创建docker-compose目录

mkdir ~/docker-compose
cd ~/docker-compose

2.编写 docker-compose.yml 文件(启动一个app项目的容器,然后再启动一个nginx容器,然后通过nginx反向代理来启动app,即通过nginx一访问就可以访问到app里面的容器的项目了)注:以下代码中键值对间的空格都不要丢

version: '3'
services:
  nginx:
   image: nginx
   ports:
    - 80:80
   links:
    - app
   volumes:
    - ./nginx/conf.d:/etc/nginx/conf.d
  app:
    image: app
    expose:
      - "8080"

image-20211215150632313

image-20211215150531932

image-20211215150435944

3.创建./nginx/conf.d目录

mkdir -p ./nginx/conf.d
cd nginx/conf.d

image-20211215150815953

4.在./nginx/conf.d目录下 编写itheima.conf文件

vim itheima.conf
server {
    
    listen 80;
    access_log off;

    location / {
    
        proxy_pass http://app:8080;
    }
   
}

image-20211215151000800

image-20220223102111844

5.在~/docker-compose 目录下 使用docker-compose 启动容器

cd ../../
docker-compose up

image-20211215151323265

6.出现以下说明访问成功:

image-20211215151352934

7.外部机器测试访问

http://192.168.109.100/hello 或者 http://192.168.109.100:80/hello 或者 192.168.109.100:80/hello  或者 192.168.109.100/hello 

image-20211215151451445

8.多按几次ctrl+C即可停止

image-20211215151854343

9.查看docker ps -a 下的情况,可以看到多了两个;看docker images 由于配置的问题, 多了一个nginx:latest

image-20211215151946653

image-20211215152908586

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_52690231/article/details/127362557

智能推荐

大神自述|7岁接触建模的大神建模师,分享建模经验与技巧_建模师大神-程序员宅基地

文章浏览阅读522次。我的名字是瑞恩·里德(Ryan Reid),我目前是大学学习3D图形和设计的高级学生。 我从小就开始画画,我父亲在七岁时向我介绍了3D软件,自从我一直在学习和练习我的手艺。 我会显示一些我创建Mondus的过程 。在我进入Mondus建模之前,我想找到CG社区没有挖掘的东西。 我首先在ZBrush中做了一些头脑风暴和概念,然后选择创造一个非洲男性,有着色(也称为白化病)。 我做了一些关于它是如何造成的研究,它基本上是一个遗传的疾病,其特征是很少或没有黑色素生产。 我遇到一个名叫Deejay Jewell的_建模师大神

Java版WMS系统奇门云网关(奇门仓储)接口实现_奇门wms struct-程序员宅基地

文章浏览阅读4.8k次,点赞2次,收藏9次。基于spring框架 实现的奇门云网关 WMS端 通用API方法:package org.tempuri;import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.StringReader;import java.io.Strin..._奇门wms struct

原生应用的开发-flutter、rn - window篇_pc原生应用开发技术-程序员宅基地

文章浏览阅读471次。原生应用开发框架React-Nativefacebook 推出的使用react,js开发的原生框架react官网Weex阿里巴巴开源的使用vue开发的原生框架weex官网Flutterdart语言,类似es6,如果对面向对象有深入理解的话,很快上手,google公司推出的Flutter官网React-Native基于react优雅的架构设计支持热重..._pc原生应用开发技术

faiss学习(二)另外两种基础索引,保存索引_indexivfflat-程序员宅基地

文章浏览阅读9.7k次,点赞2次,收藏8次。在上一篇文章里面的官方demo建立索引方式使用的是最基本的索引,这里在介绍两种基础索引更多索引类别1--更快的检索IndexIVFFlat官方介绍:为了加快搜索速度,可以将数据集分割成几部分。我们在d维空间中定义Voronoi单元格,并且每个数据库矢量都落入其中一个单元格中。在搜索时,只有查询x所在单元中包含的数据库向量y与少数几个相邻查询向量进行比较。(划分搜索空间)这是通过Inde..._indexivfflat

IAR源文件注释中文显示乱码_iar中文乱码-程序员宅基地

文章浏览阅读1.7w次,点赞5次,收藏14次。IAR注释中文显示乱码,在Tools&amp;gt;&amp;gt;Options&amp;gt;&amp;gt;Editor&amp;gt;&amp;gt;Default character 选择正确的编码比如UTF-8,然后关闭文件,再次打开。_iar中文乱码

SLS 智能告警平台最新技术总结_数据中台 告警系统-程序员宅基地

文章浏览阅读1.6k次。本文主要讲述过去一年内可观测平台 SLS 的改进和迭代。_数据中台 告警系统

随便推点

Linux中禁用ctrl alt del快捷键重启_linx 关闭 ctrl alt del-程序员宅基地

文章浏览阅读363次,点赞7次,收藏8次。【代码】Linux中禁用ctrl alt del快捷键重启。_linx 关闭 ctrl alt del

Vue.js动态获取浏览器高度、宽度并进行实时修改DOM元素高度_vue3 dom元素获取距离浏览器工具栏的高度-程序员宅基地

文章浏览阅读4.7k次,点赞2次,收藏7次。需求:项目中有高度、宽度自适应需求,需要适应不同分辨率的高度及宽度,在不同分辨率下效果区别不会很大html代码如下:<template> <div id="home"> <div class="head" > <v-head></v-head> </div&..._vue3 dom元素获取距离浏览器工具栏的高度

在SpringBoot中使用Spring Security实现权限控制_spring-security配置允许访问ip-程序员宅基地

文章浏览阅读6.8k次,点赞2次,收藏6次。以前在Spring框架中使用Spring Security需要我们进行大量的XML配置,但是,Spring Boot在这里依然有惊喜带给我们,我们今天就一起来看看。 毫无疑问,Spring Boot针对Spring Security也提供了自动配置的功能,这些默认的自动配置极大的简化了我们的开发工作,我们今天就来看看这个吧。创建Project并添加相关依赖 配置applicat..._spring-security配置允许访问ip

vmware16,vmware17虚拟机安装以及序列号备份,安装win11,进入启动界面闪退_vm17pro密钥许可证-程序员宅基地

文章浏览阅读737次,点赞9次,收藏8次。检测到hyper-v 时,勾选自动安装。_vm17pro密钥许可证

用sqoop将hive导入mysql中文乱码_sqoop --default-character-set=utf8-程序员宅基地

文章浏览阅读1.5k次。修改/etc/my.cnfcharacter-set-server=utf8[client]default-character-set=utf8注释掉 sql_mode重新新建mysql表在hive的元数据库中执行以下SQL语句,然后重新创建刚才的表即可 。alter table COLUMNS_V2 modify column COMMENT varchar(256) character set utf8;alter table TABLE_PARAMS modify column PAR_sqoop --default-character-set=utf8

python中将xml格式转json格式-程序员宅基地

文章浏览阅读845次。一、简介 在用python写脚本时,通常需要处理xml格式的文件或字符串。由于json格式处理的方便性, 我们可将其转为json格式进行处理。 二、步骤 1、安装工具包xmltodict 在命令行输入:pip install xmltodict 2、在代码使用xmltodict.parse(xml_str)进行处理 如 def load_json(xml_path): #获取xml文件 xml_f..._python xml 转json 格式