文章目录
- Docker之docker run、docker exec
- 1.docker run命令介绍
- 2.docker run -it --name=c1 centos:7 /bin/bash
- 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
- 5.docker run -it --name=demo centos:7
- 6.docker run -id --name=demo centos:7、docker exec -it demo
- 7.docker run -i --name=demo centos:7 /bin/bash
- 8.docker run -i --name=demo centos:7
- 9.docker run -d --name=demo centos:7 /bin/bash
- 10.docker run -d --name=demo centos:7
- 11.docker run -t --name=demo centos:7 /bin/bash
- 12.docker run -t --name=demo centos:7
- 13.数据卷
- 14.镜像原理
- 15.只读镜像
- 16.制作镜像
- 16.Dockerfile
- 17.docker compose
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如下:
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项目
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"
3.创建./nginx/conf.d目录
mkdir -p ./nginx/conf.d
cd nginx/conf.d
4.在./nginx/conf.d目录下 编写itheima.conf文件
vim itheima.conf
server {
listen 80;
access_log off;
location / {
proxy_pass http://app:8080;
}
}
5.在~/docker-compose 目录下 使用docker-compose 启动容器
cd ../../
docker-compose up
6.出现以下说明访问成功:
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
8.多按几次ctrl+C即可停止
9.查看docker ps -a 下的情况,可以看到多了两个;看docker images 由于配置的问题, 多了一个nginx:latest