Docker之docker run、docker exec、数据卷、Dockerfile

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 itheima@itcast.cn
③将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

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GoGo在努力

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值