一、docker概述与安装
1.docker概述
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可抑制的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器完全使用沙盒机制,相互之间不会存在任何接口。几乎没有性能开销,可以很容易的在机器和数据中心运行。最重要的是,他们不依赖于任何语言、框架或者包装系统
2.安装步骤
bash
# 1. yum包更新到最新
yum update -y
# 2.作用:安装需要的安装包
yun install -y yum-utils
# 3.配置yum源,阿里云
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
编辑文件/etc/docker/deamon.json
bash
mkdir /etc/docker
vim /etc/docker/deamon.json
在文件中添加以下内容,你自己的阿里云镜像源地址
bash
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://******.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
3.docker组成部分
镜像(image):Docker 镜像(image)就是一个只读的模板。镜像可以用来创建 Docker 容器,一个镜像可以创建多容器。 就好似Java 中的 类和对象镜像就相当于类,容器相当于对象!
容器(Container) :Docker 利用容器(Container)独立运行的一个或一组应用。容器是用镜像创建的运行实例。
它可以被启动、开始、停止、删除。每个容器都是相互隔离的,保证安全的平台。
可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序容器的定义和镜像几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的(可以执行一些命令)。
仓库(repository) :仓库(Repository)是集中存放镜像文件的场所。仓库(Repository)和仓库注册服务器(Registry)是有区别的。仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,
每个镜像有不同的标签(tag)
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
最大的公开仓库是 DockerHub,存放了数量庞大的镜像供用户下载。
3.卸载旧版本
1)卸载旧版本
bash
rpm -qa | grep docker
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
2)安装docker
bash
yum list | grep docker

bash
# 安装docker
yum install -y docker-ce
4.验证
bash
docker -v
docker version
运行docker容器
bash
systemctl enable docker && systemctl start docker && systemctl status docker

bash
# 查询docker版本信息
docker version
docker -v
二、docker使用
使用之前先配置docker的代理镜像源,在网上搜索配置镜像站
bash
{
"registry-mirrors": [
"https://docker.xuanyuan.me",
"https://docker.1ms.run",
"https://docker.m.daocloud.io"
]
}
# 重新加载配置文件
systemctl daemon-reload
systemctl restart docker
bash
# 启动docker服务
systemctl start docker
# 停止docker服务
systemctl stop docker.socket
systemctl stop docker
# 查看状态服务
systemctl status docker
1.拉取镜像
bash
docker pull centos:7

2.运行容器
bash
# 交互式创建容器,退出就停止了镜像
docker run -it --name=centos1 centos:7 /bin/bash

这就是一个非常小的centos系统,功能比较少但是可以安装软件之类的,同样的配置yum源
bash
# 备份原先的yum源
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
# 配置阿里云镜像源
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
# 清除旧缓存生成新缓存
yum clean all
yum makecache
安装启动httpd服务,在容器机里面使用不了systemctl命令,与权限相关
bash
yum install -y httpd
/usr/sbin/httpd -k start
查寻docker ip地址,这是在容器内部查询的需要容器安装iproute这个软件

宿主查询容器ip
bash
# 其中的centos1为创建的容器的名字
docker inspect centos1

3.测试网站
在安装的httpd服务中的写入个静态页面
bash
# 容器机进入httpd的html目录
cd /etc/www/html/
宿主机访问

三、docker容器内部使用systemctl
bash
# 创建一个新的容器centos02,给予相关的权限
docker run --privileged=true -it --name=centos02 centos:7 /sbin/init
# 配置yum镜像
cd /etc/yum.repos.d
rm -rf *
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
yum clean all
yum makecache
# 安装httpd应用
yum install httpd -y
# 使用systemctl管理服务
systemctl enable httpd --now
四、docker容器相关指令
1.概述
容器,也是docker中的核心概念,容器是由镜像运行产生的运行实例。镜像和容器的关系,就如同]ava语言中类和对象的关系课程实验课堂引入Docker提供的关于容器的操作有:
查看容器、创建容器、启动容器、停止容器、文件拷贝、目录挂载、查看容器ip地址、删除容器
2.查看容器
bash
# 查看正在运行的容器
docker ps
# 查看所有容器使用的命令
docker ps -a
3.创建并启动容器
可以基于已有的镜像来创建和启动容器,创建与启动容器使用命令:docker run(创建并启动容器)= docker create + docker start
参数说明:
--name:为创建的容器命名-i:表示运行容器-t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端-v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的容器目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上-d:在 run 后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t两个参数,创建后就会自动进去容器)-p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射 redis
1)交互式容器
以交互式方式创建并启动容器,启动完成后,直接进入当前容器。使用exit命令退出容器。需要注意的是以此种方式启动容器,如果退出容器,则容器会进入停止状态
bash
# 先拉取一个镜像;这一步不是每次启动容器都要做的,如果没有才需要拉取
docker pull centos:7
# 创建并启动名称为 centos01 的交互式容器;下面指令中的镜像名称 centos:7 也可以使用镜像id
docker run -it --name=centos01 centos:7 /bin/bash
2)守护式容器
创建一个守护式容器;如果对于一个需要长期运行的容器来说,我们可以创建一个守护式容器。命令如下(容器名称不能重复)
bash
docker run -di --name=centos2 centos7.0
# 进入容器内部
docker exec -it centos02 /bin/bash
3)端口映射启动容器
bash
# 将容器的80端口映射到宿主机的8080端口
docker run -di -p 8080:80 --name=centos2 centos:7

这里面可以安装httpd,nginx服务然后访问宿主机的8080端口即可实现端口映射
4.停止自启动容器
bash
# 停止容器
docker stop centos2
# 运行容器
docker start centos2
# 给已存在的容器开机自启动容器
docker update --restart=always 容器名称
# 给新建的容器开机自启动
docker run -di --name --restart=always 镜像名
# 关闭容器自启动
docker update --restart=no 容器名称
5.文件拷贝
所谓的文件拷贝就是将文件从容器中拷贝到宿主机,也可以将宿主机中的文件拷贝到容器中
需求:在宿主机的家目录中创建abc.txt文件,将该文件拷贝到centos1容器中的家目录
bash
docker cp abc.txt centos1:/root

需求:在centos02容器的家目录中创abd.txt文件,将该文件拷贝到宿主机的家目录
bash
docker cp centos1:/root/abd.txt /root

6.目录挂载
可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器创建容器时添加-v参数,后边为宿主机目录:容器目录
示例:
bash
docker run -di -v /usr/local/test:/root/test --name=centos03 centos:7
需求:将宿主机中的/test 日录与容器centos03中的/usr/local/test 日录挂载
bash
docker run -di -v /test:/usr/local/test --name=centos3 centos:7

7.删除容器
删除容器之前需要先停止容器,比如这里删除centos3
bash
docker stop centos3
docker rm centos3

bash
# 删除镜像
docker rmi 镜像ID
# 强制删除
docker rmi -f 镜像名/镜像ID
只要有任何容器基于这个镜像都无法删除这个镜像,正确操作应该是
1.删除所有基于该镜像的容器
bash
docker rm -f 容器名/容器ID
2.在删除镜像
bash
docker rmi 镜像名
五、docker应用部署
1.MYSQL部署
1)拉取镜像
bash
# 拉取MYSQL 5.7镜像
docker pull centos/mysql-57-centos7
2)创建容器
bash
# 设置一个-e参数设置mysql远程登录密码
docker run -di --name=mysql5.7 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 centos/mysql-57-centos7

因为在开始创建镜像的时候加了-e参数可以root远程登录,因此就能使用navicat远程连接
2.tomcat容器部署
1)拉取tomcat镜像
bash
docker pull tomcat:8

2)以目录挂载的方式运行容器
可以节省一些操作进入容器当中的操作,直接用目录挂载的方式在宿主机就能操作
bash
docker run -di --name=tomcat -p 8080:8080 -v /usr/local/tomcat/webapps:/usr/local/tomcat/webapps tomcat:8
# 宿主机进入挂载的目录
cd /usr/local/tomcat/webapps
# 创建index页面,放在ROOT下
mkdir ROOT
echo "<h1>this is tomcat index html</h1>" >> index.html
mv index.html ROOT

六、镜像概述以及基本制作
1.基本概念
Docker 镜像(Image)是用于创建容器的静态、只读模板 ,它打包了运行软件所需要的文件系统、运行依赖、程序代码、配置文件、环境变量等全部运行资源,是容器运行的基础。
2.原理
1. 分层文件系统(UnionFS,联合挂载技术)
这是 Docker 镜像最核心的技术。镜像不是一个单一文件,而是由多层只读文件层堆叠而成,每一层只记录上一层的增量变化:
- 下层为基础层,上层为新增层;
- 所有层联合挂载,对外呈现一个完整的文件系统;
- 所有镜像层永久只读,无法修改。
2. 内核复用机制
Docker 镜像不包含操作系统内核 ,仅包含精简的用户态文件系统。容器启动时,直接复用宿主机的 Linux 内核。这也是 Docker 镜像体积远小于虚拟机镜像的根本原因。
3. 读写层隔离机制
镜像全程只读,当通过镜像启动容器时:Docker 会在镜像的最顶层,额外添加一层专属的可读写层 。容器内所有的文件修改、新增、删除操作,只会作用在这一层,不会改动底层镜像。
4. 镜像层共享
多个不同的镜像 / 容器,可以共享相同的底层只读层。例如:Tomcat、MySQL 镜像可共用同一个 CentOS7 基础系统层,极大节省服务器存储空间。
3、镜像文件制作
1)先打包一个最小化安装的centos系统
打包系统的根目录,本质上就是打包该系统的文件系统,我们只需要文件系统,所以,一些资源目录在打包的时候需要排除掉
在一个新的centos系统打包目录,这里打包镜像之前先配置一下yum源还有拓展镜像
bash
tar --numeric-owner --exclude=/proc --exclude=/sys -cvf centos7u6.tar /
打包好之后将这个镜像我件放到我们的docker主机

将这个镜像文件做成本地镜像
bash
docker import centos7u6.tar centos7u6:latest
docker images
2)在镜像中安装配置软件

这里就能够创建容器了,但是这里只能是交互式创建因为这个基础镜像是没有进程的,也就是没有应用端口,没法做后台运行
bash
docker run -it --name=centos01 -p 80:80 centos7u6:latest /bin/bash
此时就可以进入系统安装软件了

和普通系统一样,安装yum源,安装软件做端口映射就可以,这里安装好httpd之后打包成应用镜像
3)使用commit命令对正在运行的容器提交为一个镜像
bash
docker commit centos01 centos_httpd:v1
docker images
这里新开一个窗口打包镜像

这里打包下来了,创建容器
bash
docker run -it --name=centos_httpd -p 8080:80 centos_httpd:v1 /bin/bash
这里将虚拟机的80端口映射到宿主机的8080端口,开启访问httpd、


七、dockerfile制作
1.概述
Dockerfile 是 Docker 官方提供的一种用来自动化构建镜像的脚本工具。它通过一系列的指令来生成一个镜像,包括内部系统设置、软件安装、环境变量配置、启动命令等。优点是易于维护和分享,且可通过 Git 等版本控制工具进行管理;缺点则是构建速度较慢,不太适合快速迭代的场景。
Dockerfile 是一个文本文件,其内包含了一条条的指令(instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。有了 Dockerfile,当我们需要定制自己额外的需求时,只需在 Dockerfle 上添加或者修改指令,重新生成 image 即可,省去了敲命令的麻烦。

2.常见命令

3.编写规则与步骤
dockerfile 编写规则:
- 文件名必须是 Dockerfile
- Dockerfile 中所用的所有文件一定要和 Dockerfile 文件在同一级父目录下
- Dockerfile 中相对路径默认都是 Dockerfile 所在的目录
- Dockerfile 中一能写到一行的指令,一定要写到一行,因为每条指令都被视为一层,层多了执行效率就慢
- Dockerfile 中指令大小写不敏感,但指令都用大写(约定俗成)
- Dockerfile 非注释行第一行必须是 FROM
基于 dockerfile 创建镜像的步骤:
- 创建一个目录,用于存储 Dockerfile 所使用的文件
- 在此目录中创建制作镜像所使用到的文件
- 在此目录中创建 Dockerfile 文件及编写 Dockerfile
- 在此目录中使用 docker build 创建镜像 (读取 Dockerfile 文件)
- 使用创建的镜像启动容器 (测试验证)
4.案例
案例:通过Dockerfile创建一个可以启动容器时就直接启动httpd应用的镜像
1)创建目录
bash
mkdir httpd
2)准备镜像所需要的文件
bash
vim httpd.sh
#!/bin/bash
# 如果httpd已经在运行,则禁止httpd
rm -rf /run/httpd/*
# 启动httpd
exec /sbin/httpd -D FOREGROUND
httpd项目文件
bash
echo "<h1>this is created by docker file</h1>" >> index.html
3)编写dockerfile文件
bash
FROM centos7u6:latest
RUN yum install httpd -y
ADD httpd.sh /httpd.sh
RUN chmod +x /httpd.sh
ADD index.html /var/www/html
EXPOSE 80
WORKDIR /
CMD ["/bin/bash","/httpd.sh"]
4)构造镜像文件
bash
docker build -t centos7u6_httpd:latest .
这里创建好了之后直接创建容器,后台启动
bash
docker run -di -p 80:80 --name=centos_httpd1 centos_httpd

