docker入门小结

docker是什么?它有什么优势?

快速获取开箱即用的程序

docker使得所有的应用传输就像我们日常通过聊天工具文件传输一样,发送方将程序传输到超级码头而接收方也只需通过超级码头进行获取即可,就像一只鲸鱼拖着货物来回运输一样。

修改方便

原有服务器上程序修改时我们需要到文件位置进行修改,有了docker之后修改程序只需要使用一条命令就能够完成应用的快速修改

程序启动关闭方式统一

在使用docker之前,我们不同的程序启动命令各不相同,例如:nginx使用./nginx,tomcat使用./startup.sh,而docker将这些启动命令都封装了起来,启动程序的命令格式基本统一。

隔离

docker使用一种叫做LXC的轻量级容器化虚拟技术,通过cgroupnamespace限制进程组所用的CPU内存等资源。而且相对于虚拟机而言,该技术创建一个隔离的空间更快、更高效。

docker解决了哪些问题?

环境统一

就以tomcat为例,docker会把tomcat启动所需要的jdk等环境都配置好了,像一个集装箱一样打包到鲸鱼上,当我们需要tomcat时,一条命令即可获取到tomcat,然后开箱即用。

限定进程使用的内存大小

过去我们常常会遇到某个进程把内存打爆导致其他程序也崩溃的情况,有了docker之后,它会将进程非法使用内存时,将其直接杀死。

部署方便

就以tb双十一为例,在双十一这个节点时,我们可能需要搭建一个更加庞大的集群,过去搭建过程中,我们可能需要为每台服务器都配置jdk,tomcat、mysql等乱七八糟,由于集群数量庞大,手工一台台配置过去,将会耗费大量的人力物力。
我们只需基于镜像即可完成服务的部署。

容器、镜像、仓库是什么?

镜像

镜像的英文名叫image,即我们打包好的应用镜像,本质来说就是快速构建程序的一个原料。
从本质上来说,image就是一些列文件的组合,可以包括程序运行文件,也可以包括环境配置文件等。
这里需要提到Linux联合文件系统的概念,它使得操作系统中不同的层级的文件可以在某个统一的层级上看到。

例如我有有一个文件夹f1里面有文件file1。还有一个文件夹f2,里面有文件file2。通过联合文件系统我们就可以使得在最上层的文件夹f3看到这两个文件夹的文件。

在这里插入图片描述

docker镜像也是按照这种方式进行创建的,将操作系统引导、基础镜像、各种用户需要的程序进行分层,下层对于上层来说都是只读,然后加载成同一层级的目录供外界使用,这样的一个文件我们就称之为镜像。

在这里插入图片描述

容器

我们通过镜像创建的进程即称之为程序。
我们完全可以把docker想象成一个虚拟机,与虚拟机不同的是,docker的文件系统是分层的,除了最上层的是可写的以外,其他层都是只读的。这就使得我们需要修改镜像文件时,它会把所需文件拷贝到最上层进行操作。而读文件也是自顶向下查找。
通过复制文件到最上层进行修改然后生成独立的容器,使得镜像不会被改变,这使得我们一个镜像文件可以创建出多种容器。

仓库

我们需要的镜像肯定都保存在某个仓库中,每次运输镜像都需要从这个仓库里查找,国内比较有名的大概就是网易蜂巢提供的镜像仓库,地址如下:

https://c.163yun.com/hub#/m/home/

docker安装

由于笔者使用centos进行安装,所以在安装前确认你的centos内核高于3.10,具体可以键入如下命令进行确认

uname -r 

以笔者为例,可以看到输出的版本为4,所以符合docker安装条件

4.19.91-24.1.al7.x86_64

安装前确保移除旧依赖(卸载干净)

删除所有docker相关的目录

rm -rf /etc/docker
rm -rf /run/docker
rm -rf /var/lib/dockershim
rm -rf /var/lib/docker

杀掉所有的docker进程

ps -ef | grep docker
kill -9 pid

查找docker相关安装包并使用yum -y remove移除

yum list installed | grep docker

安装相关依赖

yum install -y yum-utils \device-mapper-persistent-data \lvm2

设置仓库地址

yum-config-manager \--add-repo \https://download.docker.com/linux/centos/docker-ce.repo

安装docker

yum install docker-ce docker-ce-cli containerd.io

启动并加入开机启动

# 启动
systemctl start docker#设置为开机启动
systemctl enable docker

很多读者在这一步很可能会出现下面这些错误:

Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.

这里我们按照要求键入status命令查看一下输出:

systemctl status docker.service

若你和笔者一样键入查看docker状态的命令后输出下面的结果的话,你就可以和笔者一样步骤进行修复,反之则需自行百度:

● docker.service - Docker Application Container EngineLoaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)Active: failed (Result: exit-code) since Sat 2023-12-16 07:42:02 EST; 8s agoDocs: http://docs.docker.com
# 略Dec 16 07:42:02 MiWiFi-R1D-srv dockerd-current[29413]: Error starting daemon: SELinux is not supported with the overlay2 graph driver on this kernel. Either boot into a newer ...bled=false)

很明显报错原因是我们的Linux服务器的内核中的SELinux不支持 overlay2 graph driver ,所以我们需要修改docker配置避免这个校验:

vim /etc/sysconfig/docker

从下图可以看出,笔者将--selinux-enabled=false

在这里插入图片描述

完成之后再次启动docker就可以正常启动了。

修改docker源地址

编辑daemon.json(若不存在则新建)

vim /etc/docker/daemon.json

加入如下内容:

{
"registry-mirrors": ["https://fy707np5.mirror.aliyuncs.com"]
}

重启

systemctl daemon-reload
systemctl restart docker

验证是否安装成功

输入以下命令,如果正常输出docker版本信息说明安装成功了

docker version

运行docker run hello-world,若显示如下则说明安装成功


Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete 
Digest: sha256:0e11c388b664df8a27a901dce21eb89f11d8292f7fca1b3e3c4321bf7897bffe
Status: Downloaded newer image for hello-world:latestHello from Docker!
This message shows that your installation appears to be working correctly.To generate this message, Docker took the following steps:1. The Docker client contacted the Docker daemon.2. The Docker daemon pulled the "hello-world" image from the Docker Hub.(amd64)3. The Docker daemon created a new container from that image which runs theexecutable that produces the output you are currently reading.4. The Docker daemon streamed that output to the Docker client, which sent itto your terminal.To try something more ambitious, you can run an Ubuntu container with:$ docker run -it ubuntu bashShare images, automate workflows, and more with a free Docker ID:https://hub.docker.com/For more examples and ideas, visit:https://docs.docker.com/get-started/

(实践)部署nginx

首先我们得打开网易蜂巢镜像中心 https://c.163yun.com/hub#/m/home/

进入网站后,搜索nginx镜像

在这里插入图片描述

如下图所示,最上方就是最新的,我们点进去复制拉取命令进行镜像拉取

在这里插入图片描述

点击复制

在这里插入图片描述

回到输入docker pull 并粘贴刚刚复制的地址

docker pull hub.c.163.com/library/nginx:latest

完成后键入如下命令查看是否有nginx镜像

docker images

可以看到笔者已经成功安装拉到nginx镜像了

在这里插入图片描述

完成后我们即可启动nginx了,下面是前台运行的方式,笔者不建议使用,这里只做个展示

docker run hub.c.163.com/library/nginx

我们添加-d 进行后台启动

docker run -d hub.c.163.com/library/nginx

键入下面这个指令查看nginx是否运行成功

 docker ps

可以看到笔者的nginx已经成功运行了

在这里插入图片描述

我们都知道nginx默认端口是80,所以在浏览器键入ip地址能看到下图所示的页面说明docker部署nginx成功了

在这里插入图片描述

进入nginx容器内部进行操作

使用docker ps查看nginx进程id号

 docker ps|grep nginx

在这里插入图片描述

拿着CONTAINER ID运行命令docker exec -it 你的nginx CONTAINER ID bash,如下所示

docker exec -it 5a2438be1163  bash

可以看到,我们就像进入一个新的操作系统一样操作的nginx容器

在这里插入图片描述

使用ps -ef确认nginx是否在这容器中运行,需要注意的是容器内部可能没有ps命令,我们需要使用如下两条命令安装一下

apt-get updateapt-get install procps

完成后我们再次键入ps -ef即可看到nginx是否在运行了

在这里插入图片描述

同样的,我们还可以使用which命令看看nginx位置

which nginx

在这里插入图片描述

我们可以使用exit退出容器

如下所示,键入exit即可回到操作系统的终端界面

exit

在这里插入图片描述

停止nginx

有了上文的基础,相信读者也对docker操作有所感觉,停止也很简单,使用docker ps找到对应容器id,使用stop命令即可,如下所示

docker ps

停止

 docker stop 5a2438be1163

使用docker ps可以看出nginx已经成功停止了

在这里插入图片描述

使用不同的端口号运行对应容器

docker网络介绍

我们都知道docker的隔离性,网络也是个隔离性的一部分,Linux使用了命名空间来进行资源的隔离,比如pid namespace就是用来隔离进程的,mount namespace是用来隔离文件系统的,network namespace 是用来隔离网络的.每一个network namespace都提供了一个独立的网络环境,包括网卡路由iptable规则等等,都是与以其它的network space隔离的.

  1. docker容器在默认情况下,一般会分配一个独立的network-namespace,也就是网络类型中的Bridge模式(可以理解为虚拟机的那种桥接模式)。

因为Bridge使用的独立的network-namespace,这就我们需要使用桥接的方式的服务器和docker容器的端口构成映射关系确保外部用户可以通过映射端口来访问docker容器。

在这里插入图片描述

  1. 还有一种类型是Host模式(仅主机模式),如果在启动容器的时候指定使用Host模式,那么这个容器将不会获得一个独立的network namespace,而是和主机共同使用一个,这个时候容器将不会虚拟出自己的网卡,配置出自己的ip.而是使用宿主机上的ip和端口.也就是说在docker上使用网络和在主机上使用网络是一样的。

  2. 还有一种网络类型是None.也就是没有网络,这种情况docker将不会和外界的任何东西进行通讯。

在这里插入图片描述

(实践)将nginx在8081上运行

docker run -d -p 8081:80 hub.c.163.com/library/nginx

可以看到8081也可以正常访问

在这里插入图片描述

这里补充一下docker也支持随机分配映射端口,使用-P即可

docker run -d -P hub.c.163.com/library/nginx

在这里插入图片描述

(实践)基于docker部署一个MySQL数据库

  1. 拉MySQL镜像到本地
 docker pull hub.c.163.com/library/mysql:latest
  1. 键入run命令运行MySQL
 docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=XXXX hub.c.163.com/library/mysql
  1. 查看mysql对应容器id
docker ps |grep mysql
  1. 进入容器内部进行配置
docker exec -it f17636c0e3f2  bash
  1. 配置账户密码对外放权限,首先我们需要输入下面这段命令登录MySQL,密码为启动时设置的密码
mysql -u root -p

设置用户权限

# 使用MySQL
use mysql;# 查询user表
select host,user from user;
# 修改root用户密码
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '密码';
# 刷新
flush privileges;

创建一个名为test的数据库,并创建account表,语句如下:

CREATE DATABASE test;-- create table `account`
# DROP TABLE `account` IF EXISTS
CREATE TABLE `account` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(20) NOT NULL,`money` double DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
INSERT INTO `account` VALUES ('1', 'aaa', '1000');
INSERT INTO `account` VALUES ('2', 'bbb', '1000');
INSERT INTO `account` VALUES ('3', 'ccc', '1000');
  1. 本地尝试连接MySQL数据库

这里笔者遇到了一个坑,不知道为什么本地连接不到mysql上,明明将虚拟机的防火墙也关了为什么还连接不上呢?
在经过确认ip地址准确,防火墙也是绝对肯定关闭的情况下,这就说明我们的设置没有问题,但肯定是哪个配置出问题了,于是笔者使用telnet进行确认

telnet 192.168.0.128 3306

果然有问题,于是我们就需要再次通过搜素引擎解决问题了,但是我们该如何使用搜素引擎呢?
笔者认为面对这种问题,都需要对问题的现象关键字加以搜索例如

centos 关闭防火墙 无法访问

于是笔者找到了这篇文章
linux关闭防火墙了,但端口还是访问不了

真相大白了,centos即使关闭了防火墙,也只能使用22端口连接ssh,别的端口还是不能用,所以我们需要开启防火墙手动设置要分开的端口,就以mysql为例,我们需要这样做。

  1. 先开启firewalld:
systemctl start firewalld
  1. 放通端口:
firewall-cmd --zone=public --add-port=3306/tcp --permanent
  1. 重新加载配置文件
firewall-cmd --reload

尝试本地连接到docker上的数据库,如果可以查询到数据则说明MySQL部署成功了

在这里插入图片描述

关于更多docker常用命令

卸载docker

  1. 卸载docker软件包
yum -y remove docker-engine
  1. 若需要删除镜像、容器、卷以及自定义配置文件,可执行以下命令
rm -rf /var/lib/docker

搜索镜像

例如我们想搜索java相关的镜像

docker search java

可以得到这样的结果。每一列的意思分别是
NAME:镜像仓库名称
DESCRIPTION:镜像仓库描述
STARS:收藏数
OFFICIAL:表这个仓库是否是官方仓库,若显示ok则说明是官方创建和维护的

NAME                                 DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
node                                 Node.js is a JavaScript-based platform for s…   11312     [OK]

下载镜像

 docker pull java

列出镜像

使用这条命令就可以知晓我们之前所下载的镜像

docker images

下图列意依次为:

  1. REPOSITORY:镜像所属仓库
  2. TAG:镜像标签,默认lastest,即最新版
  3. IMAGE ID:镜像id
  4. CREATED:镜像创建的时间
  5. SIZE:镜像大小

在这里插入图片描述

删除镜像

如下所示,即意为删除java的镜像

docker rmi java

新建并启动容器

使用docker run即可创建并启动一个容器,这是最常用的一个命令,他还有很多的选项如下所示

-d 表示后台运行
-P 随机端口映射
-p 指定端口映射,有以下四种格式ip:hostPort:containerPortip::containerPortcontainerPort--network选项:指定docker的网络模式,该选项有以下几个参数
--network=bridge 连接默认网桥
--network=host 仅主机
--network=container:Name_or_I:这种就是格式docker让新建的容器使用已有容器的网络配置
--network=none 无网络配置

例如: 使用映射端口的形式运行nginx

docker pull nginxdocker run -d -p 91:80 nginx

停止容器

  1. 找到运行容器的id
 docker ps

如下图所示,可知nginxcontainer idc93a0e0ac108

在这里插入图片描述

  1. 运行stop命令
docker stop c93a0e0ac108

再次使用docker ps可以看到这个容器已经被关闭了

在这里插入图片描述

当然如果我们需要再开启还可以使用docker start 容器id启动

docker start c93a0e0ac108

进入容器

docker exec -it 容器id bash

退出容器

键入命令exit即可退出容器,回到终端界面

在这里插入图片描述

删除容器

docker rm 容器id

查看日志

docker logs 容器id

查看docker性能开销

docker stats

参考文献

docker入门利用docker部署web应用):http://t.csdn.cn/PYAr8

只需三步,完美卸载Docker:https://blog.csdn.net/wangerrong/article/details/126750198

解决docker启动报错“Error starting daemon: SELinux is not supported with the overlay2 graph driver on this:https://blog.csdn.net/haoding205/article/details/82492263

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/227586.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端API请求缓存的5种方案

文章目录 一、前言二、[方案一]数据缓存三、[方案二]单promise 缓存四、[方案三]多promise 缓存五、[方案四]添加时间有关的缓存六、[方案五]基于修饰器的方案四七、最后 一、前言 开发 web 应用程序时,性能都是必不可少的话题。 对于webpack打包的单页面应用程序…

win中查看MD5、Linux中查看MD5

win中的MD5计算 1、用GitBash Git Bash Here md5sum.exe 我记得-孙燕姿.mp32、win自带命令 certutil -hashfile 我记得-孙燕姿.mp3 MD5Linux中MD5计算 md5sum 我记得-孙燕姿.mp3

离线编译安装opencv库及多版本切换[ubuntu]

系统版本:ubuntu18.04 库版本:opencv4.6.0 & opencv3.6.0 一、多版本安装前准备 1. 卸载已经安装的opencv版本[可选] 1.1 卸载从软件仓库中安装的opencv sudo apt-get purge libopencv* 1.2 卸载使用source自行编译安装的opencv 首先进入原先编译…

Event事件的整理

很久没去看thinkphp框架文档,结果看到有更新到8.0版本。 好奇去下载框架运行, 好在我电脑都有运行的PHP版本是8.1多,拿捏这个新出的think 今天摸索event的这个事件功能, 文档的介绍是这样: (省略几十字)&#xff0…

《面向机器学习的数据标注规程》摘录

说明:本文使用的标准是2019年的团体标准,最新的国家标准已在2023年发布。 3 术语和定义 3.2 标签 label 标识数据的特征、类别和属性等。 3.4 数据标注员 data labeler 对待标注数据进行整理、纠错、标记和批注等操作的工作人员。 【批注】按照定义…

【已解决】ModuleNotFoundError: No module named ‘tensorflow‘

问题描述 Traceback (most recent call last): File "dataset_tool.py", line 16, in <module> import tensorflow as tf ModuleNotFoundError: No module named tensorflow 如果直接pip install tensorflow&#xff0c;还会报错 解决办法 方法一 pip i…

redis未授权漏洞复现

什么是redis redis就是个数据库&#xff0c;跟mysql不同的地方在于redis主要将数据存在内存中&#xff0c;读写速度非常快 redis未授权 其原因很简单&#xff0c;就是redis服务器在默认安装好不配置的情况下可以直接免密码登录&#xff0c;登录后在web目录写入一句话木马&am…

前端设计模式之旅:命令模式

引言 使用命令模式&#xff0c;我们可以将执行特定任务的对象与调用该方法的对象解耦。 核心思想 命令模式的核心思想是将请求封装成一个对象&#xff0c;从而使请求的发起者和请求的执行者解耦。 请求的发起者只需要知道如何创建命令对象并将其传递给请求者&#xff0c;而不需…

极坐标下的牛拉法潮流计算57节点MATLAB程序

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 潮流计算&#xff1a; 潮流计算是根据给定的电网结构、参数和发电机、负荷等元件的运行条件&#xff0c;确定电力系统各部分稳态运行状态参数的计算。通常给定的运行条件有系统中各电源和负荷点的功率、枢纽…

贪心算法:买卖股票的最佳时机II 跳跃游戏 跳跃游戏II

122.买卖股票的最佳时机II 思路&#xff1a; 想要获得利润&#xff0c;至少要以两天为一个交易单元&#xff0c;因为两天才会有股价差。因此可以将最终利润进行分解&#xff0c;如prices[3] - prices[0] (prices[3] - prices[2]) (prices[2] - prices[1]) (prices[1] - pr…

【Mars3d-ModelEntity】实现gltf模型不随地图缩放而改变大小

需求场景&#xff1a; 1.实现gltf模型不随地图缩放而改变大小 相关代码&#xff1a; const graphic new mars3d.graphic.ModelEntity({ name: "警车", position: [116.346929, 30.861947, 401.34], style: { url: "//data.mars3d.cn/gltf/mars/jingche/jingc…

python界面开发,使用wxpython库

入门学习Python时&#xff0c;使从接触一个项目开始&#xff0c;当时需要我开发一个界面&#xff0c;当时综合考量之后&#xff0c;最终选择了今天要分享的内容部分&#xff0c;也就是使用Python来开发&#xff0c;主要使用到的是Python库——wxPython库来进行界面开发&#xf…

论文阅读:Lidar Annotation Is All You Need

目录 概要 Motivation 整体架构流程 技术细节 小结 概要 论文重点在探讨利用点云的地面分割任务作为标注&#xff0c;直接训练Camera的精细2D分割。在以往的地面分割任务中&#xff0c;利用Lidar来做地面分割是目前采用激光雷达方案进行自动驾驶的常见手段。来自Evocargo …

phpstudy是什么?

PHPStudy 是一个集成环境工具&#xff0c;它将 PHP 开发所需的软件&#xff0c;如 Apache&#xff08;Web服务器&#xff09;、MySQL&#xff08;数据库服务器&#xff09;、PHP&#xff08;脚本语言&#xff09;等打包在一起&#xff0c;以便用户能够轻松安装和配置这些软件&a…

UniGUI 之UniDBGrid

目录 1]DataSource设置 2]显示MEMO类型里的文字 3]显示悬浮提示 4]显示当前记录及总记录数 5]读取所有记录&#xff0c;及分页 6]在前面加上序号列 7]不显示标题栏 8]列排序 9]编辑 和 更新 数据 10]获得某单元格里的内容 11]标题别名 12]将某列设置为CheckBox格式 13]列标题…

Redis设计与实现之字符串哈希表列表

目录 一、字符串 1、字符串编码 2、编码的选择 二、哈希表 1、字典编码的哈希表 2、压缩列表编码的哈希表 3、编码的选择 4、哈希命令的实现 三、列表 1、 编码的选择 2、 列表命令的实现 3、阻塞的条件 4、 阻塞 5、 阻塞因 LPUSH 、RPUSH 、LINSERT 等添加命令而…

【C语言】操作符详解(五)

目录 操作符的属性&#xff1a;优先级&#xff0c;结合性 优先级 结合性 表达式求值 整形提升 算术转换 问题表达式解析 表达式1 表达式2 表达式3 总结 操作符的属性&#xff1a;优先级&#xff0c;结合性 优先级 ⭐优先级&#xff1a;优先级指的是&#xff0c;如果一…

网络安全——Iptables防DDoS攻击实验

一、实验目的要求&#xff1a; 二、实验设备与环境&#xff1a; 三、实验原理&#xff1a; 四、实验步骤&#xff1a; 五、实验现象、结果记录及整理&#xff1a; 六、分析讨论与思考题解答&#xff1a; 一、实验目的要求&#xff1a; 1、掌握常见DDoS攻击SYN Flood的攻击…

Cmake基础(4)

这篇文章在上一篇的基础之上应用多文件&#xff0c;即一个项目中添加多个文件 文章目录 GLOBsource_group排除文件 上一篇文章的cmake基本不变&#xff0c;这篇文章的重点在于add_executable(${EXECUTABLE_NAME} main.cpp) GLOB file(GLOB cpp_list ${CMAKE_CURRENT_SOURCE_…

Arrays.asList()方法:陷阱与解决之道

在Java编程中&#xff0c;Arrays类提供了一系列用于操作数组的实用方法。其中&#xff0c;​Arrays.asList()​方法是一个常用的方法&#xff0c;用于快速将数组转换为List集合。然而&#xff0c;这个方法存在一些潜在的陷阱&#xff0c;可能导致出现意外的行为。本文将介绍​A…