Docker工具学习与应用
标签(空格分隔): 测试工具
一、容器与虚拟化
1.1 Docker简述
1.1.1 一些特性
- 容器没内核,直接运行在宿主机内核上,能使用宿主机最大系统资源
- 启动速度较快
- 迁移方便
1.1.2 组件
- image 镜像
- container 容器
- dockerhub 镜像仓库
- dockerfile 部署的操作文件
1.1.3 用户获取docker权限
sudo groupadd docker #添加docker用户组
sudo gpasswd -a $USER docker #将登陆用户加入到docker用户组中
newgrp docker #更新用户组
docker images #测试docker命令是否可以使用sudo正常使用
1.1.4 引用Docker优势
使用前:
- 环境不兼容
- 破坏当前宿主机环境
- 卸载环境残余
使用后:
- 解决环境兼容问题
- 保证宿主机环境干净
- 迁移方便
1.2 Docker指令
1.2.1 获取镜像
从Dokcer镜像站中拉取
# 搜索
docker search 镜像名:tag # tag就是具体的版本
# 拉取
docker pull nginx
1.2.2 查看当前镜像
docker image ls
# 或者
docker images 镜像名(:tag)
-q # 只列出id
--format "" # 格式化显示
-a # 列出所有镜像
# 查看镜像信息
docker info
# 查看镜像详细信息
docker image inspect 镜像ID
1.2.3 删除镜像
docker rmi 镜像ID/名字/容器使用记录/反引号引用(如下)
`docker images -aq`
指定ID的前三位也可
删除容器
docker rm 容器ID
`docker ps -aq`
1.2.4 运行镜像
- -d 后台运行容器
- -p 80:80 端口映射(宿主机端口:容器内端口)
netstat -tunlp 查看当前宿主机的端口占用情况
- -i 交互式命令操作
- -t 开启一个终端
- –rm 容器退出时删除该容器
docker run 参数 镜像的名字/ID (/bin/bash)
/bin/bash的作用是表示载入容器后运行bash ,docker中必须要保持一个进程的运行,要不然整个容器启动后就会马上kill itself,这个/bin/bash就表示启动容器后启动bash。
run的作用是创建加启动,如果镜像不存在本地,就会去下载该镜像
1.2.5 导入/导出镜像
# 导出
docker image save centos:7.8.2003 > /opt/centos782003.tgz
# 导入
docker image load -i /opt/centos782003.tgz
1.2.6 查看容器运行状态
docker ps
# CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# 容器ID 依赖镜像 运行的命令 创建时间 运行持续时间 容器的端口映射 容器生成的随机名字
1.2.7 停止容器
docker stop 容器ID
1.3 Docker 的生命周期
- Dockerfile:构建镜像的脚本
- Images: 镜像文件
- Push/Pull:从仓库里拉取与推送
- Save/Load: 本地镜像文件导入与导出
- Start/Restart/Stop:镜像文件的启停
- Containers:具体的容器
- Commit:将容器生成镜像
1.4 镜像原理
linux内核:提供操作系统基本功能,和硬件交互(读取磁盘数据的内存管理、进程调度、文件管理、管理网络)
centos、ubuntu:提供软件功能,如apt、yum安装等
cat /etc/redhat-release
查看centos版本
cat /etc/lsb-release
查看ubuntu版本
一个完整的系统 = linux内核 + 发行版、
Docker镜像分层原理:
镜像相当于【发行版】作用,需要准备好linux内核,上层使用不同【发行版】。
Docker 通过联合文件系统,将不同层整合为一个文件系统,为用户隐藏了多层视角。
视频链接
Docker镜像是在基础镜像之后开始安装软件,配置软件,添加新的层构建出来
特性点
- 多个容器共享一个镜像
- 容器写入存在复制特性
容器运行后会在最上层创建一个可写的容器层,其他的基础镜像层是只读的。一切操作都是在容器层,会从上往下寻找需要的内容。
删除操作会对镜像层记录删除操作。
1.4.1 镜像和容器的关系
docker 容器=镜像+可读层
简单来说,镜像是文件,容器是进程。
容器是基于镜像创建的,即容器中的进程依赖于镜像中的文件。
参考链接
二、容器管理
2.1 容器运行
docker run = 创建 + 启动
每次执行都会产生 容器记录
docker run 参数(-it) 容器名字/ID (某条命令)
- -d 参数 表示在后台运行
- –rm 一般调试用,用于某程序挂了自动删除记录
- –name 给容器设置参数
- -p (宿主机端口:容器内端口) 端口映射
- -P 随机端口映射
2.1.1 注意点
- 容器内的进程必须处于前台运行,否则会直接退出
2.1.2 日志查看
docker logs -f 容器ID
# -f 代表实时刷新,不加则表示打印所有的
2.1.3 进入正在运行的容器
docker exec -it 容器ID bash
/bin/bash的作用是表示载入容器后运行bash ,docker中必须要保持一个进程的运行,要不然整个容器启动后就会马上kill itself,这个/bin/bash就表示启动容器后启动bash。
2.1.4 查看容器映射端口
docker port 容器ID
2.1.5 容器提交
docker commit 容器ID 镜像名
对容器进行操作后提交生成新的镜像。
三、DockerFile 镜像定制
3.1 主要组成
基础镜像信息 FROM 镜像名
制作镜像指令 RUN 语句
容器启动时候执行指令 CMD 【“bin/bash”】
3.2 指令集
FROM 指定基础镜像版本
MAINTAINER 指定维护者信息,可以没有
RUN 为容器安装配置一些环境,依赖软件等
ADD 添加宿主机文件到容器内,但是多了一个自动解压操作
COPY 添加宿主机文件到容器内,无任何别的操作(会保留元数据,如权限和访问时间等)
WORKDIR 设置工作目录,相当于cd 某个目录
VOLUME 设置存储卷,目录映射
EXPOSE 在容器内暴露端口
CMD 容器启动后运行的指令
3.3 构建流程
1.编写dockerfile文件
FROM nginx
RUN echo '<meta charset='utf-8'>阿畅学Docker' > /usr/share/nginx/html/index.html
2.构建镜像
docker build XXXXX
3.修改镜像名
docker tag 镜像ID 想要修改的名字
3.4 部分指令说明
3.4.1 ADD
特性和COPY基本一致,有以下特点
- 源文件是URL,docker 会访问该URL,放入目标路径,权限为6 0 0 ,需要加RUN指令进行调整。
- 源文件是URL,且为压缩包,不会自动解压,需要使用RUN指令去解压。
- 源文件是压缩文件(gzip,bzip2,xz,tar)等,会自动解压到目标路径。
3.4.2 CMD
CMD [“参数1”,“参数2”](注意需要中括号)
容器内没有后台进程概念,必须前台运行。容器是为了主进程存在的。
启动容器应该如下
CMD [“nginx”, “-g”, “daemon off;”]
3.4.3 ENTRYPOINT
作用和CMD一样,若dockerfile中同时存在CMD和ENTRYPOINT,会把CMD的内容当做参数传给ENTRYPOINT
一些坑
- CMD运行的指令如果不是前台运行的,会立刻挂掉容器,生成容器使用记录。
- dockerfile如果有CMD指令,生成的容器 通过
docker run XXXX (指令语句)
,指令语句会 覆盖 dockerfile里的CMD指令。- 一个方法是使用完整语句覆盖原先的
- 另一个是使用 ENTRYPOINT ,可以在run后跟指令语句实现新增
3.4.4 ENV和ARG
设置环境变量
# dockerfile脚本
ENV NAME="Tian"
ENV AGE="18"
ENV MYSQL_VERSION=5.6
# 后续语句所有操作都可以通过 $变量名 使用,方便维护dockerfile脚本
# ARG 和 ENV 都一样设置环境变量
# ENV在构建镜像和容器运行时可以使用
# ARG只能用于构建镜像需要设置,容器运行时候消失
3.4.5 VOLUME
容器运行时,存储层不写入任何数据,运行在容器内产生数据,推荐方式是挂载,写入宿主机,进行维护。
作用是将容器内的目录挂载到宿主机上.
也可以通过docker run -v 参数
进行映射挂载操作
VOLUME 路径
#
VOLUME ["/data1","/data2"]
3.4.6 EXPOSE
指定容器运行时对外提供的端口
docker port 容器ID
# 查看容器的端口
3.4.7 WORKDIR
用于dockerfile中指定工作目录
3.4.8 USER
用于改变环境,用于切换用户。