Ciallo~(∠・ω<)⌒☆
一、安装docker
1.卸载旧版
如果系统中已经存在docker,则应该先将旧的版本进行卸载:
yum erase docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
2.配置docker的yum库
需要安装一个yum工具:
yum install -y yum-utils
配置yum的docker源:
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3.安装docker
使用yum进行安装
yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
4.启动docker
输入下面指令来启动docker
设置docker开机自启
systemctl enable docker
启动docker
systemctl start docker
一些简单的docker命令:
#启动docker
systemctl start docker
#停止docker
systemctl stop docker
#重启docker
systemctl restart docker
#设置docker开机自启
systemctl enable docker
5.配置镜像加速器
由于docker的默认源是国外的,所以下载速度会非常的慢,故需要设置镜像加速器进行加速,这里使用阿里云镜像加速器
参见阿里云的文档:
注:复制命令的时候一条一条的复制!
二、快速入门
1.部署mysql
使用docker安装mysql,仅需要下面的一条语句:
docker run -d --name mysql -p 3306:3306 -e TZ=Asia/Beijin -e MYSQL_ROOT_PASSWORD=123 mysql
如图所示,等待一会儿即可安装完成
此时我们可以通过docker ps
来查看我们的mysql是否正在运行
若出现如下输出则表示正常运行
若只有表头而没有内容,则可以使用docker logs mysql
来查看mysql日志,从中得出错误点
我们打开windows上的软件来连接数据库以验证MySQL启动:
可以看到,我们成功连接上了虚拟机的MySQL
注
此处连接失败可以尝试确认centos系统的ip地址,并令防火墙放行3306端口
2.镜像与容器
当我们使用docker安装应用时,docker会自动从镜像仓库中搜索并下载应用的镜像,镜像包括应用本身以及运行所需要的环境、配置、系统函数库,避免了我们去手动的配置环境,极大的方便了我们安装应用,并且,由于docker安装时将环境等配置也一并安装,故docker可以跨系统安装应用。
docker在运行镜像时通常会创建一个隔离的环境,称为容器,可以保证应用之间不会发生依赖冲突,保证应用能够顺利运行。
3.命令解读
在使用docker安装MySQL时,我们运行了如下的一条命令:
docker run -d --name mysql -p 3306:3306 -e TZ=Asia/Beijin -e MYSQL_ROOT_PASSWORD=123 mysql
其中,各部分的命令含义如下:
docker run
- 创建并运行一个容器
-d
表示令容器在后台运行
--name
- 给容器起一个名字,必须唯一,后续再次启动该容器时就依据该名字来找到容器
-p
- 设置端口映射,其格式为
主机端口:容器内端口
- 因为容器内包含了应用运行需要的环境,甚至端口都是内部的私有的端口,所以我们在外面是不能直接访问到容器内的端口的,故通过端口映射,我们可以将容器内的端口映射到主机的端口上面去,通过主机端口即可访问到容器的端口
- 如:我想要再安装一个MySQL应用,而MySQL应用的默认端口号为3306,我便可将MySQL在容器内的端口映射到主机上去——-p 3307:3306,将容器内的3306端口映射到主机的3307端口,此时我通过主机的3307端口即可访问到容器内的MySQL
- 设置端口映射,其格式为
-e KEY=VALUE
- 设置容器内的环境变量,通常取决于应用,按照应用官方文档中设置
mysql
- 运行镜像的名字,docker依据此名字在镜像仓库内寻找镜像
- 镜像名字的标准形式为
repository:tag
,其中repository指镜像名,tag指镜像的版本 - 如果我们不写版本则默认版本为latest,表示最新版本
三、docker基础
0.目录
- 常见命令
- 数据卷
- 自定义镜像
- 网络
1.常见命令
首先先上黑马老师的一图流:
docker pull <镜像名>
- 从镜像仓库中拉取一个镜像到本地
docker images
- 查询本地的镜像
docker rmi <镜像名>
- 删除本地的镜像
docker run --name <容器名> -p <主机端口>:<容器内端口> -e <环境变量设置> <镜像名>
- 使用一个镜像创建一个容器,若该镜像存在于本地就使用该镜像,若不存在则从镜像仓库内拉取一个镜像
- 参数见二-3
docker stop <容器名>
- 停止一个容器的运行
- 该容器并未被删除,只是停止了运行
docker start <容器名>
- 运行一个容器
docker ps
- 查询所有运行中的容器
- 加入参数
-a
可以查看所有的容器
docker -rm <容器名>
- 删除一个容器
- 删除容器时必须确保容器是停止状态的,否则必须添加参数
-f
强制删除
docker logs <容器名>
- 查看某个容器的运行日志
- 可以添加参数
-f
使得持续监视容器运行
docker exec <容器名> <交互方式>
- 进入到某个容器内部
- 输入方式通常为
bash
,即命令行交换 - 加入参数
-it
,表示添加一个可输入的终端 - 在终端中可以输入
exit
退出终端
docker build
- 将一个dockerfile转换成docker的镜像
docker save <镜像名>
- 将一个docker镜像储存到本地(通常储存为压缩包)
- 通常带上参数
-o <name>
,表示保存的文件名及其格式 - 如:-o nginx.tar nginx:latest
docker load <文件名>
- 将一个docker镜像压缩包转换为docker本地镜像
- 带上参数
-i <name>
指定要读取的保存的镜像文件 - 可以带上参数
-q
表示读取过程不输出日志
- 此外,还有以下命令
docker inspect <容器名>
- 查看某个容器的详情
2.数据卷
2.1 介绍
数据卷(volume)是一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁
由于容器只满足应用运行的需求,故里面通常都不会有vim之类的工具帮助修改容器内的文件内容,且我们将直接资源传入容器十分的麻烦。而数据卷可以帮助我们将容器内的目录映射到宿主机上面,使得我们可以直接通过修改宿主机目录下的文件来改变容器内文件内容
对于一个容器(这里以nginx为例)
我们使用Nginx部署静态网站时,通常需要修改如下文件
但是由于容器内不含vim编辑器,所以我们无法使用命令docker exec -it nginx bash
进入容器对html和conf文件夹下的文件进行修改,此时我们便可以用到数据卷
我们可以生成两个数据卷html、conf,将容器内的html文件夹和conf文件夹映射到宿主机文件系统中,通常映射到宿主机对应文件夹内的_data文件夹中
2.2 数据卷命令
命令 | 说明 |
---|---|
docker volume create | 创建数据卷 |
docker volume ls | 查看所有的数据卷 |
docker volume rm | 删除指定数据卷 |
docker volume inspect | 查看某个数据卷的详情 |
docker volume prune | 清除数据卷 |
2.2.1 数据卷挂载
2.2.1.1 默认挂载
在执行docker run 命令时使用-v 数据卷名:容器内目录
可以完成数据卷的挂载,若数据卷不存在,则会自动创建数据卷
挂载时数据卷默认存储在*/var/lib/docker/volumes/*目录下
但是,如果容器已经创建了,则我们不能为其挂载数据卷
2.2.1.2 自定义位置挂载
默认方式挂载数据卷时,数据卷的位置较深,不便于记忆与操作,故我们在挂载数据卷时,若使用自定义的目录则能大大方便我们对数据的管理
在执行docker run命令时添加参数-v 本地目录:容器内目录
即可自定义位置挂载数据卷
注:
本地目录必须以根目录/
或者相对目录./
开头,不能直接以名称开头,会被识别为数据卷而非本地目录
如:
-v mysql:/var/lib/mysql
会在默认目录下创建数据卷mysql
-v ./mysql:/var/lib/mysql
会在当前目录下创建数据卷mysql
2.2.2 默认挂载例:利用Nginx容器部署静态资源
需求
- 创建Nginx容器,修改Nginx容器内的html目录下的index.html文件内容
- 将静态资源部署到Nginx的html目录
步骤
首先,使用docker创建一个名为nginx的nginx容器,使用-p将其默认运行端口80映射到宿主机的80端口上,再使用-v创建数据卷html并令其与容器内的*/usr/share/nginx/html*文件夹联系起来
docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html nginx
然后,我们可以使用命令检查数据卷html是否创建
docker volume ls
确认数据卷html创建后,我们可以使用命令查看数据卷的详细信息
docker volume inspect html
从中我们可以看到文件夹在主机上映射的位置
让我们进入该文件夹
cd /var/lib/docker/volumes/html/_data
使用ls查看文件夹内容
我们可以看到index.html和50x.html,这两个文件即为nginx容器内/usr/share/nginx/html文件夹夹下的内容,我们已经成功的完成了映射
此时,当我们打开浏览器,输入localhost,即可看到nginx的页面
我们对index文件进行修改,并导入静态资源到文件夹内
此时再次访问localhost会发现nginx的index成功的被我们所修改,且静态资源也成功导入
2.2.3 自定义位置挂载例:安装并挂载mysql
需求
通过查看docker仓库中mysql镜像的描述,我们得知需要挂载以下两个目录:
- 数据目录:
/var/lib/mysql
- 配置文件:
/etc/mysql/conf.d
步骤
首先,我们拟将这两个文件夹放在/home/data
目录下,故我们先创建两个文件夹来准备接受挂载
mkdir /home/mysql
cd /home/mysql
mkdir ./data
mkdir ./conf
然后,创建一个容器
docker run -d --name mysql -p 3306:3306 -v /home/mysql/data:/var/lib/mysql -v /home/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 mysql
使用命令docker inspect mysql
查看mysql容器的信息,可以发现,数据目录和配置目录已经成功挂载
3.自定义镜像
3.1 镜像的结构
镜像就是包含了应用程序、程序运行的系统函数库、运行配置等文件的文件包。构建镜像的过程就是把上述文件打包的过程
在构建镜像时,docker会将镜像的各部分分成层
进行压缩后打包,添加安装包、依赖、配置等操作都会形参新的一层
对于一个完整的镜像,我们可以将应用依赖的系统函数库、环境、配置、文件等
抽出来作为一个基础镜像,当我们制作新的镜像时,可以在基础镜像的基础上添加层,使得镜像构建更加方便
当我们需要构建一个自定义镜像时,可以针对需求去docker镜像仓库直接下载对应的基础镜像,使得我们无需自己去制作基础镜像
对于镜像的最顶层,即镜像运行的入口,我们称之为入口
,一般是程序启动的脚本和参数
3.2 构建一个应用镜像的步骤
- 准备一个系统运行环境(通常为Linux运行环境)
- 安装应用对应语言的编译器并配置环境
- 拷贝应用包
- 编写运行脚本
3.3 镜像构建文件——Dockerfile
Dockerfile是一个文本文件(但是不需要后缀名),其中包含了一个一个的构建镜像的指令,用指令来说明要执行什么操作构建镜像。Docker可以根据Dockerfile帮我们构建镜像
常见的指令如下:
指令 | 说明 | 示列 |
---|---|---|
FROM | 指定基础镜像 | FROM python:3 |
ENV | 设置环境变量 | ENV key value |
COPY | 拷贝本地文件到镜像的指定目录 | COPY ./project.tar.gz /tmp |
RUN | 执行的shell命令,一般是安装过程的命令 | RUN tar -zxvf /tmp/project.tar.gz |
EXPOSE | 指定容器运行时监听的端口,是给镜像使用者看的,镜像不是必须运行在该端口上 | EXPOSE 8080 |
ENTRYPOINT | 镜像中应用的启动命令,容器运行时调用 | ENTRYPOINT python manage.py runserver |
注:部分基础镜像官方会给出Dockerfile的基础内容,此时要参考官方文档进行Dockerfile的编写以及文件的补齐
例:
FROM python:3
WORKDIR /usr/src/app
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
COPY . /MyDjangoProject ./
ENTRYPOINT [ "python", "./MyDjangoProject/manage.py","runserver" ]
3.4 构建镜像
将我们的Dockerfile文件和我们的应用文件放在同一个文件夹内
在该文件夹内输入以下指令
docker build -t <镜像名>:<版本> .
-t
:给镜像起名,版本号不指定时默认为latest.
:指定Dockerfile所在目录,如果在当前目录则指定为.
如
docker build -t testimage:1.0 .
4.Docker网络
4.1 默认连接方式
默认情况下,所有容器都是以bridge方式连接到Docker的一个虚拟网桥上
此时,我们虽然可以通过ip地址使得我们的容器内应用互联,但是,当我们将容器重启后,容器的ip地址会发生变化,此时原来的连接可能就会失效
如:
docker start mysql
docker inspect mysql
docker stop mysql
docker start nginx
docker start mysql
docker inspect mysql
执行后可以看到,两次查询中,mysql在bridge上的ip发生了变化
为解决该问题,我们可以使用自定义网络来对容器进行网络连接
4.2 自定义网桥
在Docker中,我们可以通过自定义网络将容器连接起来,在自定义网络中,容器之间可以使用容器名
互相访问,容器名会将连接导向容器的ip
而创建并管理自定义网络需要使用Docker的网络操作命令
4.3 Docker常见的网络操作命令
命令 | 说明 |
---|---|
docker network create <自定义网络名> | 创建一个网络 |
docker network ls | 列出所有的网络 |
docker network rm <网络名> | 删除指定的自定义网络 |
docker network prune | 清除所有未使用的网络 |
docker network connect <网络名> <容器名> | 将指定容器连接上指定网络 |
docker network disconnect <网络名> <容器名> | 使指定容器从指定网络上断开 |
docker network inspect <网络名> | 查看某网络的详细信息 |
注
将容器连接到网络也可以在创建容器时就进行连接:在使用docker run
指令创建容器时,可以添加参数--network <网络名>
来将容器连接到指定网络上
例:
#创建网络test
docker network create test
#将mysql容器连接到网络test上
docker network connect test mysql
此时如果查看mysql的详细信息,会发现其在test网络中有一个名字为容器名mysql的DNS
docker inspect mysql
我们也可以进到网络中的另一个容器内使用ping <容器名>
的方式来进行校验,这里不做展示