docker练习
安装nginx
1 docker pull nginx #拉取nginx镜像 2 docker run -it -d -p 主机端口:容器内部端口 --name=自定义容器名称 镜像id 3 运行后访问id:端口出现图二内容就是成功了
部署es+kibana
1 docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single node" elasticsearch:8.3.3 2 (正常启动低配置启动会非常卡,这个东西会非常消耗资源) 3
部署portainer(图形化docker管理工具)
1 docker run -d -p 8000:8000 -p 9443:9443 -p 9000:9000 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:latest
启动完访问ip:9000
设置账号密码
docker镜像讲解
镜像是什么
镜像是一种轻量级,可执行的独立软件包,用来打包运行环境和基于运行环境开发的软件,它包
含运行某个软件所需的所有内容,包括代码,运行时,库,环境变量和配置文件
所有的应用,直接打包docker镜像,不需要运维再去部署环境,可以直接跑起来。
如何得到镜像
1.从远程仓库下载
2.拷贝
3.自己制作一个dockerfile
docker镜像加载原理
😀UnionFS(联合文件系统)😀UnionFS (Union File System)
2004年由纽约州立大学开发,它可以把多个目录内容联合挂载到同一个目录下,而
目录的物理位置是分开的。UnionFs可以把只读和可读写文件系统合并在一起,具
有写时复制功能,允许只读文件系统的修改可以保存到可写文件系统当中。
😀特性: 一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会
把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。
docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。
bootfs(boot file system)主要包bootloader和kernel,bootloader主要是引导加
kkerneI,Linu×刚启动时会加载bootfs文件系统,在docker镜像的最底层是bootfso这一层
与我们典型的Linu×/unix系统是一样的,包含boot加载器和内核。当boot加载完成
之后整个内核就都在内存中了,此时内存的使用杈已由bootfs转交给内核,此时系统也会
卸载bootfs。
rootfs(root file system),在bootfs之上。包含的就是典型Linux系统中
的/dev,/proc,/bin,/etc等标准目录和文件。rootfs就是各种不同的操作系统发版,比如
Ubuntu,Centos等等。
平时我们安装进虚拟机的CentOS是好几个G,为什么docker这里才200M?
对于一个精简的OS,rootfs可以很小,只需要包含最基本的命令,工具和程序库就可以
了,因为底层直接用Host的kerne|,自己只
需要提供rootfs就可以了。由此可见对于不同的linu×发行版,bootfs基本是一致的,
rootfs会有差别,因此不同的发行版可以公用bootfso
docker commit
从容器中创建一个新镜像
1 docker commit -a='提交人' -m='提交说明' 容器id 定义镜像名称 2 -a 提交镜像的作者 3 -m 提交时的说明 4 -p 在commit时将容器暂停
创建完镜像下次启动容器就可以使用此镜像,这就相当于虚拟机的快照,保存当前状态
docker数据卷
什么是数据卷
容器数据卷是为了实现容器的持久化和同步操作!容器间也是可以实现数据共享的(多个容器可以共享
一个地方的数据)
docker启动的容器内置都会有一个文件系统,数据都会存在docker内置的文件系统
我们可以把容器产生的数据放在linux的文件系统里面
好处:容器的持久化和同步操作!容器间也是可以数据共享的
我们以后修改只需要在本地修改容器内会自动同步
即使把容器删除本地数据也不会删除
使用数据卷
1 docker run -v linux路径:容器内部路径 -itdP --name=容器名称 镜像id 2 -v 挂载 3 docker inspect 镜像id 4 可以查看挂载 5
😀匿名挂载和具名挂载
匿名挂载:
docker run -itd -P -v /etc/nginx --name=nginx nginx
-v的时候只写内部路径
DRIVER VOLUME NAMElocal 0f863c6cdab7cc475c5c46619b67c26478539d6691169628cc1b98b08f9f6e66
docker inspect
具名挂载:
docker run -itd -P -v jumingguazai:/etc/nginx --name=nginx nginx
通过-v 卷名:容器内部路径
docker volume inspect jumingguazai
通过卷名查询路径
所有的docker容器内的卷,没有指定目录的情况下都是在/var/lib/docker/volumes/xx
我们通过具名挂载可以方便的找到我们的卷,一般还是使用具名挂载
-v 容器内的路径 就是匿名挂载
-v 卷名:容器内的路径 具名挂载
-v /宿主机的路径:容器内路径 指定路径挂载一般都是以/开头
通过-v容器路径: ro rw 改变读写权限
ro 只读
rw 可读可写
一旦设置了容器的权限容器对我们挂载出来的内容就有限定了
ro只能从宿主机来改变了 容器内不能改变
默认都是rw
docker run -itd -P -v jumingguazai:/etc/nginx:rw --name=nginx nginx
安装MySQL
安装MySQL5.7并把数据持久化存储
1 docker pull mysql:5.7 2 docker run -itd -p 13306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name=mysql5.7 3147495b3a5c 3 -e 环境配置 4 -v 卷挂载 5 MYSQL_ROOT_PASSWORD 设置MySQL root的密码
把容器删除了数据也不会丢失
多个MySQL数据同步
dockerfile
Dockerfile 介绍
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令
和说明。
dockerfile命令
FROM
基础镜像,当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板,第一条必
须是from
MAINTAINER
镜像维护者的姓名和邮箱地址
RUN
容器构建时需要运行的命令
RUN有两种格式
shell格式:
exec格式:EXPOSE
当前容器对外暴露出的端口
WORKDIR
指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点
如果我们没有指定当前关键字,那么就下启动的目录下运行
如果指定了,那么就会在指定的目录下运行容器实例
USER
指定该镜像以什么样的用户去执行,如果都不指定,默认是root
ENV
相当于定义变量: 用来在构建镜像过程中设置环境变量
1 # 定义 2 ENV 变量名 值 3 # 使用 4 $变量名
🤪关键字之后可以直接跟变量名
ADD
将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包
COPY
拷贝文件和目录到镜像中,容器内的指定路径,该路径不用事先建好,路径不存在的话,
会自动创建
1 # 语法一 2 COPY src dest 3 # 语法二 4 COPY ["src", "dest"]
VOLUME
容器数据卷,用于数据保存和持久化工作
CMD
指定容器启动后的要干的事情,类似于RUN
cmd有两种方式
方式1:
shell格式
1 CMD <命令>
😀推荐使用第二种方式,执行过程比较明确。第一种格式实际上在运行的过程中也会
自动转换成第二种格式运行,并且默认可执行文件是 sh
方式2:
exec格式
1 CMD ["<可执行文件或命令>","<param1>","<param2>",...] 2 CMD ["<param1>","<param2>",...] # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数
注意
😀Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker
run 之后的参数替换
和RUN命令的区别
CMD是在docker run 时运行
RUN是在 docker build时运行