笔记——Docker的使用

一、Docker的理论知识

概念

Docker主要是由Go语言编写的,具有高效性、简洁性和并发性的特点很适合构建高性能的应用程序和工具,你可以打包什么程序语言编写的应用程序。

Docker在概念上与虚拟机非常类似,但是他轻量很多。
Docker并不会像虚拟机一样去模拟底层硬件,这样可以让每个应用他提供完全隔离的运行环境。
容器:可以在不同的环境中配置不同的工具以及软件,且互不影响,
           在Docker中成为容器(container)
镜像:可以理解为虚拟机的快照或者存档,通过镜像可以创建很多不同的容器。
Dockerfile:就像是一个自动化的脚本,主要用于创建镜像,好比虚拟机中安装操作系统和软件一样。

Docker与虚拟机的区别?

特性普通虚拟机Docker
跨平台只能在图形化界面使用,如windows/Mac在各类windows和linux系统中都支持。
性能性能损耗大,内存占比高,他是将完整的系统都虚拟出来了性能好,值虚拟软件所需的环境,极大的减少了没用的配置
自动化需要手动安装所有的东西只需要输入命令就可以自动化安装完毕所需的配置
稳定性稳定性不高,不同的系统差异大稳定性好,不同的系统都是同一样的部署方式

二、Docker主要功能

打包、分发、部署

打包:就是把你软件所需的依赖,第三方库,其他软件打包到一起。
分发:把你打包好的安装包上传给一个镜像仓库,其他人可以非常方便的获取安装。
部署:拿着安装包就可以一个命令运行起来你的应用,自动模拟出对应的运行环境,不论Windows/linux/Mac.

常规应用开发部署方式:自己在 Windows 上开发、测试 --> 到 Linux 服务器配置运行环境部署。

防止本地没有问题,上传以后到处都是问题等行为

用 Docker 开发部署流程:自己在 Windows 上开发、测试 --> 打包为 Docker 镜像(可以理解为软件安装包) --> 各种服务器上只需要一个命令部署好

确保了不同机器上跑都是一致的运行环境,不会出现我机器上跑正常,你机器跑就有问题的情况。

三、Docker命令

安装命令

docker -v:安装完毕后检查版本。(结束后记得换加速镜像)
systemctl start docker:启动docker
systemctl stop docker:关闭docker
systemctl restart docker:docker重启
systemctl enable docker:docker开启自启动
docker ps:检测是否有容器启动,若未有容器启动将会报错。(带-a可以查看所有服务)
systemctl status docker:查看docker状态

镜像与容器命令

 docker images:将显示服务器上当前可用的所有 Docker 镜像的列表。
若没启动服务将会弹出类似的疑问。

docker start 容器名:启动该容器
docker stop 容器名:关闭该容器

docker exec -it 容器名 /bin/bash:进入容器内部,在容器内部开启新的终端,是可以再次开启新的容器的(-it 表示添加一个可交互的命令行,/bin/bash代表使用bash进行交互

docker inspect 容器名:查询某个容器的详细信息
exit:退出当前容器:(在进入是加入-it时即可在容器内部使用exit退出)
docker attach 容器名:进入容器内部,不可再次开启容器
docker pull 镜像名:下载镜像到本地。
docker run  -d -e 环境变量设置 -p本机连接端口:远程映射端口 --name 容器名 --network 什么网络 什么镜像:创建并运行一个容器。
因为如果不加-d他会卡在哪里等待执行,若你ctrl+c强制中断就会连同容器一起中断,所以需要添加为后台执行,基本是绑定一套的命令,
-e就是设置环境变了如 name=123一样,-p代表端口,:前的是主机端口,:后的是容器内部端口,--name表示该镜像容器服务的名称,唯一,--network可以不写如果没有自定义网络的话,这是写将其直接创建在知道网络内的关键字, 最后镜像名就是从那个镜像下复制。)
docker rmi 镜像名:删除镜像.
docker rm 容器名:删除容器。(删除前记得进行关闭
docker logs -f 容器名:持续查看该容器的日志(-f代表持续查看,可不加)
docker push 是上传至镜像仓库

自定义镜像命令

docker build -t 镜像名/容器名:标签:构建自定义镜像。(其中 -t 后面的可以不写就是起名为了好识别,不过一般情况还是带上,里面的镜像名、容器名、标签都是可选的)
docker save 镜像1 镜像2... -o 打包后的名字.tar将一个或多个镜像打成一个tar包。
docker load -i 镜像tar包:载入一个镜像文件。
docker export 容器1 容器2...  -o 打包后的名字.tar:讲一个或多个容器打成一个tar包。
docker import 镜像tar包 镜像名:载入一个镜像文件。
docker commit 容器名 镜像名:版本号标签(可选):将一个容器创建成一个镜像。(可以对已经关闭的容器使用,若不写版本号只需要填写两个名字即可

docker save 和 docker export的区别?

1.docker save打包保存的是镜像(image),docker export打包保存是容器(container)。
2.docker load用来载入镜像包,docker import用来载入容器包,两者都会恢复为镜像。
3.docker load不可以重命名,文件名就是镜像名。
4.docker import载导入时可以对导入后的镜像重命名。

四、docker的数据卷

数据卷是一个虚拟的目录,是容器内目录与宿主机目录之间的桥梁

docker volume create:创建数据卷
docker volume inspect:查看某个数据卷详情
docker volume ls:查看所有数据卷
docker volume rm 数据卷名:删除指定数据卷,多个可以用空格隔开。
docker volume prune:删除所有未使用的数据卷,出现y/n询问。

挂在文件会Linux系统中的/var/lib/docker/volumes/挂载同名/_data目录下。

//平时使用的时候 尽量使用 指定路径挂载和 具名挂载,
-v /容器内路径 匿名挂载
-v 卷名:/容器内路径 具名挂载
-v /宿主机路径:/容器内路径 指定路径挂载

数据卷权限:
-v 容器内路径:ro Readonly 只读
-v 容器内路径:rw Readwrite 可读可写

默认是可读可写

#一但设置了容器权限,我们挂载出来的内容 就是有限制的
docker run -d -p --name nginx1 -v html:/usr/share/nginx/html:ro nginx #只读
docker run -d -p --name nginx2 -v html:/usr/share/nginx/html:rw nginx #可读可写

#如果设置是ro(只读)的话,这个路径就只能通过宿主机操作,容器内部 是无法操作的


数据卷挂载

优点:耦合度低,由docker来管理目录。
缺点:文件夹路径较长不好寻找

(挂载到宿主机 上volume中)

1.以nginx为例,启动需要输入
docker run -p 80:80 --name 容器的名字 -d -v 数据卷:容器内的目录 nginx
-p 表示端口映射
--name 是启动后容器的名字
-d 表示以后台模式运行,不执行docker stop 镜像服务名就会不停止运行。
-v 表示挂在的数据卷和容器内的目录位置
nginx 表示是什么镜像
注意:此步骤自动创建数据卷,不用create再进行创建。

2.启动可以通过查看数据卷来看一下是否有刚创建的数据卷,此处的html就是我的数据卷名。

3.确认创建之后用docker volume inspect html 命令来查看详细的信息

4.确认之后发现在linux系统下创建了一个/var/lib/docker/volumes/html/_data 与容器的/usr/share/nginxhtml(就是容器路径)  他俩个为双向绑定

5.此时在服务器连接软件内找到此文件夹直接修改即可。

本地目录挂载

优点:文件夹容易寻找。
缺点:耦合度高,文件夹需要自己管理。

匿名数据卷

匿名挂载不需要指定宿主机目录,也不需要指定卷名。

1.匿名数据卷就是生成的数据卷名字是非常长的字符(如图),这种被称为匿名数据卷。
2.若要使用匿名数据卷中内容,其实可以将其拷贝出来,但是匿名卷名字太长了,应当避免使用匿名卷,而不是想办法使用匿名卷。

同样以mysql为例

docker run -p 80:80 --name 容器的名字 -d -v 本地的目录:容器内的目录 nginx

这个本地的目录必须以,/和./开头不然会被误认为是数据卷名                                                                                                      


五、DockerFile

dokcer镜像的组成概念

入口(Entrypoint):镜像运行的入口一般就是程序的启动脚本或者参数。

层(layer)daockerfile的镜像制作,每次的操作都会形成一层,如添加安装包、依赖等每次都算。
基础镜像(BaseImages):将部分镜像内容作为起始镜像,可以简化docker的镜像制作过程且之后的镜像可以共享前面的某层或者几层,从而极大的提高了镜像的制作与安装,空间也会节约。

DokcerFile是什么

本质上就是一个文本文件,用一些指令来描述整个镜像的结构和步骤等。

docker build -t 起镜像名:[版本号]   .
-t:是给将要构建的镜像起个名字,然后:之后带版本号,若不填写就是最新版本。
-f:指定执行dockerfile的目录。
.:最后的点代表指定Dockerfile执行所在的目录,在linux中单一个 . 是当前目录的意思。

常用命令

FROM:指定你的基础镜像是什么。
如:FROM Ubunto    这是以Ubunto为基础镜像。
ENTRYPOINT:镜像中的启动命令,容器运行时调用。不会被命令行传来的替代,而是追加在后面执行。
如:ENTRYPOINT Java -jar xx.jar
ENV:设置环境变量,可以在后面指令使用。
如:ENV: key   value
COPY:拷贝本地文件到镜像的指定目录,若没此目录将会创建。
如:COPY  ./ceshi.tar.gz/tmp

ADD:相当于copy加了一个自动解压的功能。
RUN:执行Linux中sell的命令,一般是安装过程的命令。
如:RUN tar -zxvf /tmp/ceshi.tar.gz && EXPORTS path=/tmp/jrell:$path 等
USER:该镜像以什么用户去执行,若不写默认root;
EXPOSE:指定容器运行时监听的端口,是给镜像使用者看的。
如:EXPOSE 8080  (这是给使用者看的,用不用都行,不代表可以直接使用8080进入)
MAINTAINER :作者的信息。一般是姓名+邮箱
CMD :ENTRYPOINT几乎一样指定容器启动run时要运行的命令,只有最后一个会生效。会被run命令行传来的命令替代。(RUN 是在 docker build 时运行。CMD 是在docker run 时运行
WORKDIR : 指明镜像默认的工作目录。

注意点

1.dockerfile命令都是大写。
2.从上往下执行的。
3.#表示为注释。
4. 每一条指令都会创建并提交一个新的镜像层。所以Dockerfile中一定要惜字如金,能写到一行的指令,一定要写到一行,否则会造成镜像臃肿。
5.Dockerfile中提到所有文件一定要和Dockerfile文件在同一级父目录下,可以为Dockerfile父目录的子目录。

问题记录

在尝试自己构建Centos的时候他是不支持ifconfig和vim等命令的,我们需要把官方的centos的镜像作为基础镜像,然后将其构建为支持ifconfig和vim命令的镜像

1.先在root下新建个文件夹后写入DockerFile内容为图

2.切换到DockerFile所在的目录,写入命令构建build

docker build -f Dockefile -t mycentos:0.1 .

大概率会报这个错,这是因为 2020 年 12 月 8 号,CentOS 官方宣布了停止维护 CentOS Linux 的计划” 带来的yum源的问题 (没问题的可以直接跳到10步)

解决方式为进入镜像更改里面的文件(就是dockerfile中FORM后面的镜像),别把宿主机改了
3.进入官方镜像

docker run -it centos

4.进入到 yum 的 repos 目录

cd /etc/yum.repos.d/
5.随后按顺序一次执行命令修改centos文件内容(过程可能较慢)

sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*

sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*

6.然后生成缓存更新

yum makecache

7.重新安装vim

yum -y install vim

8.安装完毕后退出

exit

9.查看一下镜像有没有成功

docker commit -m="update yum" 1cb4c96e5986  centos:0.2

1cb4c96e5986 为你的镜像id
centos:0.2 
是镜像名,后面是tag标签

10.之后再回到Fockerfile所在目录构建再构建一次

docker build -f Dockefile -t mycentos:0.1 .

11.之后查看镜像就可以看到你创建的centos   tag是0.1的镜像了

docker  images


六、Docker的容器网络

命令

ip addr:linux查询网络

docker network create 网络名/ID:创建一个网络
docker network ls:查看所有网络
docker network rm 网络名/ID:删除指定网络
docker network prune:清理未使用的网络
docker network connect 网络名/ID  容器名:使指定容器链接加入某网络
docker network disconnect 网络名/ID:使容器链接离开某网络
docker network inspect 网络名/ID:查询某网络详细信息

自定义网络

加入自定义网络之后,容器之间可以通过容器名互相访问。

1.放入前查询一次mysql1(这是容器名)和mysql2(容器名)容器的网桥是什么,也就是他的默认网桥。

2.加入网络以后将会多出来一个网桥,这个网桥是从头开始的不过不是127.17.0.1,而是从127.18.0.2开始的,因为127.18.0.1是新建的自定义网络的ip后面加入的也只能按顺序往后排,

注意

此状态下 mysql1可以访问也就是ping,mysql2但是mysql2无法访问1,如果使用
docker run  -d -e 环境变量设置 -p本机连接端口:远程映射端口 --name 容器名 --network 什么网络 什么镜像
来创建容器到网络将会只能访问mysql1无法访问mysql2。

命令含义可以在上面Docker命令的安装命令中查看。

问题记录

一、在docker的mysql容器中安装ping

在有网的情况下,进入容器后输入以下命令,安装ping工具

apt update
apt install iputils-ping

Centos用这个

yum install iputils -y

安装完后就直接可以使用了


七、Docker容器部署操作

docker hub是官方镜像仓库位置

部署mysql8.0

docker pull mysql

docker pull mysql命令来下载mysql,若要指定版本那就是docker pull mysql:版本号。
例如:docker pull mysql:8.011


docker images -a

安装完毕后可以通过此命令来查看是否有mysql镜像。


docker run -p 3306:3306 --name mysql1 -e MYSQL_ROOT_PASSWORD = root -d mysql

此命令式代表创建并运行一个mysql的镜像服务。
-p 代表端口,:前的是主机端口,:后的是容器内部端口。
--name 表示该镜像容器服务的名称,唯一
-e 代表环境变量设置,此处设置mysql1镜像服务的密码为root
-d 表示以后台模式运行,不执行docker stop 镜像服务名就会不停止运行。
mysql 指定运行镜像的名字(完整写法为mysql:版本号若不填写就为最新版本号)


docker ps

可以查看已经启动的服务里是否有mysql1镜像服务。

存在服务至此就部署安装完毕了,可以通过navicat等连接工具尝试连接了。

问题记录

1.若本地连接(localhost)出现报错10060,需要再镜像内开启mysql远程连接权限。
2.不是本地连接出现此报错,需要开启远程连接权限同时还需要在云服务器的安全组内添加对外端口开放许可。

具体步骤

1.#在容器内登录mysql

若登不进去就新建文件夹/mysql/conf后编写custom.cnf文件(内容如图)
修改字符集编码,并跳过权限判定可以直接输入

mysql -uroot -p

进入即可

[mysqld]
init-connect="SET collation_connection=utf8mb4_0900_ai_ci"
init_connect="SET NAMES utf8mb4"
skip-character-set-client-handshake
skip-grant-tables

2.use mysql;
切换到mysql数据库

3.select host, user, authentication_string, plugin from user;
查看user权限表内的root是一个还是两个(图中为一个)

4.如果是两个就需要删掉一个带百分号的
DELETE FROM user WHERE user = 'root' AND host = '%' AND plugin = 'caching_sha2_password';

5.如果只有一个那就需要修改root用户的接受范围,默认的localhost只可本机登录改成无限制。
update user set host='%' where user ='root';

root的host修改为百分号

6.如果你是mysql8.0那还需要修改root的密码编辑改回8.0版本以前的方式
# 修改加密规则
ALTER USER 'root'@'%' IDENTIFIED BY 'root(自己的密码)' PASSWORD EXPIRE NEVER; 
# 更新用户的密码
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root(自己的密码)';

给root添加新密码并修改为以前的加密规则让数据库连接工具的编码方式可以连接


# 刷新权限
flush privileges;
# 重置密码
ALTER USER 'root'@'%' IDENTIFIED BY 'root(自己的密码)';

最后将custom.cnf文件中的skip-grant-tables一句话注释或者删除掉关闭权限跳过


部署nginx

docker pull:直接安装最新版的nginx就可以

运行结束后可以查看是否存在镜像,若不存在看一下下载过程发生什么错误,存在镜像就完成了。

nginx的目录中/etc/nginx/conf是专门放配置文件的,
/usr/share/nginx/html是专门放静态资源的都可供挂载操作。

docker run -d --name 容器名 -p 80:80  nginx:就可以启动容器了

  • 12
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值