docker原理简单介绍
docker是一种虚拟化容器技术。
虚拟化:早期为了节约成本和学习只有在宿主机中基于 kvm(基于内核的虚拟机)等技术虚拟出来完整的操作系统,而这个完整的操作系统会大量的占用宿主机的硬件资源,当创建的虚拟机太多时就会造成宿主机与虚拟机的性能大幅下降。这时候容器技术就出现了。
容器:容器一般创建在虚拟机中,可以创建很多的容器,服务等程序运行在其中,互不影响,宿主机也是直接提供自己的内核硬件资源给其使用,合理使用了宿主机的资源,可以运行很多应用服务
docker容器中可以运行多个不同的服务程序等,方便管理,互不影响,合理地对宿主机的资源。事先下载某个镜像然后再在容器里面运行该镜像对应的服务,可以是多个服务;容器仓库有很多镜像,主要是网络与本地进行操作,可以根据自己pull或者push仓库;客户端可以对该容器、镜像等进行管理。
如下是图示:
以上原理描述根据自己学习后的理解来讲的
docker容器的安装及使用
学习期间先将防火墙和seLinux关闭
[root@localhost yum.repos.d]# systemctl stop firewalld
[root@localhost yum.repos.d]# setenforce 0
安装步骤
1,安装docker源,也可以自己指定源
dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
这时可以看到 /etc/yum.repos.d/ 目录下多了 个docker-ce.repo 的repo仓库,该仓库可以自动下载我们所需要的docker
源安装好了后执行如下命令
yum clean all 清除以前的yum缓存
yum makecache 重新加载
输入命令 yum list docker-ce 查看是否有docker ce 版本了
2,安装docker
dnf install docker-ce --nobest --allowerasing -y
稍等一会,安装好了后就查看是否安装好了
[root@localhost yum.repos.d]# docker version
Client: Docker Engine - Community
Version: 23.0.5
API version: 1.42
.....
这样就安装完成了
3,配置内核参数
如果外界想要访问到docker容器,docker容器就需要网络流量,网络方式与宿主机桥接方式相连
写入以下:
[root@localhost yum.repos.d]# cat <<EOF > /etc/sysctl.d/docker.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.all.rp_filter = 0
net.ipv4.ip_forward=1
EOF
然后运行下面参数
modprobe br_netfilter 自动启动一些内核模块
sysctl -p /etc/sysctl.d/docker.conf 加载参数
4,配置docker加速器
先创建一个文件:touch /etc/docker/daemon.json,写入以下参数
{
"registry-mirrors" : [
"https://8xpk5wnt.mirror.aliyuncs.com"
]
}
然后命令:systemctl daemon-reload
5,运行docker
systemctl start docker
这时候docker就启动了,接下来简单使用以下docker
docker的完整简单的使用
一些docker 命令:
docker pull 镜像 拉取某个镜像,用于后面创建该镜像的容器
docker image ls 查看本地有的镜像
docker rmi 镜像id 删除某个镜像
docker ps 查看运行起的容器
docker search 。。。 搜索有没有某个镜像
docker run 参数 镜像的名字/id 运行某个镜像
如 docker run -d -p 80:80 nginx 解释: -d 是后台运行容器的意思,-p是端口映射,将宿主机的80端口映射为容器80端口,当访问宿主机80端
口时就会访问到容器的80端口
docker stop 容器id 停止某个容器
要在容器中运行某个服务,就先要获取该服务的镜像
1,获取某个镜像(以httpd 服务为例)
获取httpd 镜像,先查看有没有httpd 镜像
[root@localhost yum.repos.d]# docker search httpd
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
httpd The Apache HTTP Server Project 4409 [OK]
clearlinux/httpd httpd HyperText Transfer Protocol (HTTP) ser… 2
paketobuildpacks/httpd 0
......
运行以上代码发现有叫httpd的镜像,就是第一个,而且是官方的。
获取该镜像:
[root@localhost yum.repos.d]# docker pull httpd
查看已经获取到的镜像,发现有httpd
[root@localhost yum.repos.d]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd latest dabbfbe0c57b 16 months ago 144MB
hello-world latest feb5d9fea6a5 19 months ago 13.3kB
2,运行该镜像,该镜像会在容器中运行
[root@localhost yum.repos.d]# docker run -d -p 80:80 httpd
d7bac3e1e750c3d8858368a80497aeb4592534ad37a3f24ede106f48055eb3d0
命令解释: -d 是后台运行容器的意思,-p是端口映射,将宿主机的80端口映射为容器80端口,当访问宿主机80端
口时就会访问到容器的80端口
查看运行的80端口:
[root@localhost yum.repos.d]# netstat -lntup
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 1085/cupsd
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 43008/docker-proxy
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1089/sshd: /usr/sbi
tcp6 0 0 ::1:631 :::* LISTEN 1085/cupsd
tcp6 0 0 :::80 :::* LISTEN 43014/docker-proxy
可以发现80端口是docker代理的
3,宿主机访问该容器里面的内容
该虚拟机ip为192.168.190.129 具体根据自己虚拟机ip来看
访问的结果如下图:
到此完整的一个docker简单使用就完成了
思考:不用docker部署httpd服务怎么实现?
参考以前写的文章,http服务器搭建及案例。