Docker(一)基础知识
一、什么是容器
容器技术已经成为应用程序封装和交付的核心技术
容器技术的核心有以下几个内核技术组成:
- Cgroups( Control Groups ) - 资源管理,可以对单个程序限制使用几u几g的资源
- NameSpace - 进程隔离(命名空间)
- SELinux安全,基于文件的权限限制
由于是在物理机上实施隔离,启动一个容器,可以像启动一个进程一样快速
Docker是完整的一套容器管理系统
Docker提供了一组命令,让用户更加方便直接地使用容器技术,而不需要过多关心底层内核技术
二、容器的优点
相比于传统的虚拟化技术,容器更加简洁高效
传统虚拟机需要给每个VM安装操作系统
容器不需要操作系统,使用宿主机的共享公共库和程序
#虚拟机vs容器:
三、容器的缺点
容器的隔离性没有虚拟化强
共用Linux内核,安全性有先天缺陷
SELinux难以驾驭
监控容器和容器排错是挑战
四、安装前准备
需要64位操作系统,32位不支持
至少RHEL7及以上的版本
关闭防火墙,和OpenStack一样,Docker会接管防火墙的工作
五、安装Docker
环境信息:
- node1:192.168.0.30
- docker1:192.168.0.31
- docker2:192.168.0.32
1.VMware安装虚拟机使用CentOS7-1804.iso;docker软件包在RHEL7-extras.iso中
链接:https://pan.baidu.com/s/1yBrcvFCOL13xLvfBdi08qg?pwd=vr6i
提取码:vr6i
#配置本地yum源
vim /etc/yum.repos.d/local.repo
[CentOS7-Base]
name=CentOS7-Base
baseurl=file:///iso/base
enabled=1
gpgcheck=0
[RHEL7-Extras]
name=RHEL7-Extras
baseurl=file:///iso/extras
enabled=1
gpgcheck=0
2.卸载防火墙
systemctl stop firewalld
systemctl disable firewalld
yum autoremove -y firewalld #autoremove 可以将即使是不使用的依赖包也删除
rm -rf /etc/firewalld/
rm -rf /var/lib/firewalld/
rm -rf /var/log/firewalld/
检查是否卸载成功:
rpm -qa|grep -i firewalld 返回空
3.软件包安装
docker1、docker2上执行:
yum install -y docker
systemctl restart docker
systemctl enable docker
4.安装完成后会多一个网络配置docker0
[root@docker1 ~]# ifconfig
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 0.0.0.0
ether 02:42:f4:de:54:dc txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.0.31 netmask 255.255.255.0 broadcast 192.168.0.255
inet6 fe80::20c:29ff:fe2a:55a4 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:2a:55:a4 txqueuelen 1000 (Ethernet)
RX packets 377 bytes 29160 (28.4 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 515 bytes 112413 (109.7 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 32 bytes 2592 (2.5 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 32 bytes 2592 (2.5 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
六、镜像管理
在Docker中容器是基于镜像启动的
镜像是启动容器的核心
镜像采用分层设计,类似于vmware的链接克隆,母盘不能改动,克隆出的虚拟机可以再次做链接克隆,只要保证上一个克隆机和母盘不改动即可
使用快照的COW技术,确保底层数据不丢失
#一般母盘会从官方镜像仓库下载镜像,Docker官方提供的公共镜像仓库:https://hub.docker.com
docker search busybox #在镜像仓库查找镜像,OFFICIAL为[OK]的代表这个镜像是官方镜像
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker.io docker.io/busybox Busybox base image. 3013 [OK]
docker.io docker.io/radial/busyboxplus Full-chain, Internet enabled, busybox made... 54 [OK]
docker.io docker.io/yauritux/busybox-curl Busybox with CURL 23
docker.io docker.io/arm32v7/busybox Busybox base image. 10
docker.io docker.io/arm64v8/busybox Busybox base image. 4
docker.io docker.io/odise/busybox-curl 4 [OK]
docker.io docker.io/i386/busybox Busybox base image. 3
docker.io docker.io/s390x/busybox Busybox base image. 3
docker.io docker.io/busybox42/zimbra-docker-centos A Zimbra Docker image, based in ZCS 8.8.9 ... 2 [OK]
docker.io docker.io/joeshaw/busybox-nonroot Busybox container with non-root user nobody 2
docker.io docker.io/p7ppc64/busybox Busybox base image for ppc64. 2
docker.io docker.io/prom/busybox Prometheus Busybox Docker base images 2 [OK]
docker.io docker.io/amd64/busybox Busybox base image. 1
docker.io docker.io/busybox42/nginx_php-docker-centos This is a nginx/php-fpm server running on ... 1 [OK]
docker.io docker.io/ppc64le/busybox Busybox base image. 1
docker.io docker.io/spotify/busybox Spotify fork of https://hub.docker.com/_/b... 1
docker.io docker.io/vukomir/busybox busybox and curl 1
docker.io docker.io/antrea/busybox 0
docker.io docker.io/arm32v5/busybox Busybox base image. 0
docker.io docker.io/busybox42/alpine-pod 0
docker.io docker.io/busybox42/php-fpm-ldap 0
docker.io docker.io/hugegraph/busybox test image 0
docker.io docker.io/openebs/busybox-client 0
docker.io docker.io/privatebin/chown Docker image providing busybox' chown, st... 0
docker.io docker.io/rancher/busybox 0
docker pull docker.io/busybox #从镜像仓库下载镜像(从官方仓库下载镜像)
Using default tag: latest
Trying to pull repository docker.io/library/busybox ...
latest: Pulling from docker.io/library/busybox
325d69979d33: Pull complete
Digest: sha256:560af6915bfc8d7630e50e212e08242d37b63bd5c1ccf9bd4acccf116e262d5b
docker images #查看镜像,REPOSITORY镜像名,TAG标签
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/busybox latest 8135583d97fe 2 weeks ago 4.863 MB
[root@docker1 ~]# docker save docker.io/busybox:latest -o busybox.tar #导出镜像,并将镜像复制到另外一台机器上
[root@docker1 ~]# ls
busybox.tar
[root@docker2 ~]# docker load -i busybox.tar #导入镜像
9547b4c33213: Loading layer 5.092 MB/5.092 MB
Loaded image: docker.io/busybox:latest.092 MB
[root@docker2 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/busybox latest 8135583d97fe 2 weeks ago 4.863 MB
[root@docker1 ~]# docker run -it docker.io/centos:latest /bin/bash #下载好centos镜像后,使用run生成一个容器。下次run还会生成一个新容器
[root@78a0b70d6cad /]# cat /etc/redhat-release #已经进入容器了,查看容器系统版本
CentOS Linux release 8.4.2105
七、命名空间(进程隔离)
uts:主机名,和真机主机名无联系
net:网络,给容器一套单独的网络
pid:进程,容器内只有属于容器内的进程
user:用户,容器内只有属于容器内的用户
mount:容器内的根目录与宿主机不在一起
ipc:信号向量,容器内只能kill掉容器内的进程,无法kill宿主机进程;而宿主机可以kill掉容器内进程
#示例:
[root@docker1 ~]# docker run -it docker.io/centos:latest /bin/bash #进入容器
[root@29049e15549e /]# sleep 56789 #执行一个进程
[root@docker1 /]# ps -ef|grep sleep #重新打开一个宿主机bash,可以查看到容器内进程
root 2715 2683 0 04:50 pts/1 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 56789
root 2741 2720 0 04:51 pts/2 00:00:00 grep --color=auto sleep
八、Docker命令
1.镜像常用命令
docker images #查看镜像列表
docker history #查看镜像制作历史
docker inspect #查看镜像底层信息
docker pull #下载镜像
docker push #上传镜像
docker rmi #删除本地镜像,命令为docker rmi 镜像名:标签,删除前确保已经没有使用此镜像创建的容器,有的话需要先删除容器
docker save #镜像另存为tar包
docker load #使用tar包导入镜像
docker search #搜索镜像
docker tag #修改镜像名称和标签,注意镜像名+标签必须唯一,如果不唯一修改会失败。命令docker tag 旧镜像名:旧标签 新镜像名:新标签,修改后相当于创建了一个软连接
#演示:
[root@docker1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/busybox latest 8135583d97fe 2 weeks ago 4.863 MB
[root@docker1 ~]# docker tag docker.io/busybox:latest aa:bb
[root@docker1 ~]# docker images #可以看到镜像ID一致
REPOSITORY TAG IMAGE ID CREATED SIZE
aa bb 8135583d97fe 2 weeks ago 4.863 MB
docker.io/busybox latest 8135583d97fe 2 weeks ago 4.863 MB
[root@docker1 ~]# docker rmi aa:bb
Untagged: aa:bb
Untagged: docker.io/busybox@sha256:560af6915bfc8d7630e50e212e08242d37b63bd5c1ccf9bd4acccf116e262d5b
[root@docker1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/busybox latest 8135583d97fe 2 weeks ago 4.863 MB
2.容器常用命令
docker run #运行容器,创建一个新的容器并把它运行起来,参数-i交互式的;-t终端;-d后台运行
docker ps #查看容器列表,参数-a显示所有启动过的容器;-q仅显示容器ID
docker stop #关闭容器
docker start #启动容器
docker restart #重启容器
docker attachlexec #进入容器,使用attach进入容器退出后会停止容器,因此大多数情况使用的是docker exec -it 容器ID bash
docker inspect #查看容器底层信息
docker top #查看容器内进程列表,使用格式docker top 容器ID
docker rm #删除容器,删除前需要停止容器
#演示1:
可以先docker run -itd创建并后台运行一个容器,然后使用docker exec -it访问容器;docker stop|start管理容器,这样这个容器就可以当成虚拟机使用了,重启之后的内容也不会丢失
[root@docker1 ~]# docker run -itd docker.io/centos:latest
15257daa0b4f5a61d005f26316d4dd128aeedb621d3d8c5daba203154e1a8a3a
[root@docker1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
15257daa0b4f docker.io/centos:latest "/bin/bash" 10 seconds ago Up 8 seconds fervent_babbage
[root@docker1 ~]# docker exec -it 15257daa0b4f bash
[root@15257daa0b4f /]#
#演示2:
docker rm $(docker ps -aq) 删除所有已创建过的容器
29049e15549e
928a6443d41c
6b28b5de794b
78a0b70d6cad
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通