1 前言
在学习具体的docker技术之前,我们先来大概了解一下在与之相关的一些概念
物理机
很久之前,服务器部署应用于物理机之上,整个过程极慢,而且成本就高,也较难迁移和扩展,甚至受限于特定硬件厂商
虚拟机
受限于物理机的诸多缺点,虚拟机应运而生,一台物理机可以通过vmware虚拟化安装多个多个操作系统,每个操作系统都可以运行单独的app,因此一个物理机可以部署多个app
虚拟化的局限性在于,每一个虚拟机都是一个完整的操作系统,要分配系资源,当虚拟机增多时,每个虚拟机可用资源就比较少了,此时必须扩容
Linux部署形式:vmware + (IOS镜像)= 一个可以使用的Linux操作系统
像lnmp集群部署、mysql集群部署、zabbix监控系统我们都是在安装的Linux虚拟机上学习和使用的
部署流程:安装-修改配置文件-启动-使用各种功能
虚拟机工具巨头
· vmware workstation (个人学习使用)主要用于windows平台,创建虚拟机(安装系统)
· 企业版虚拟化 vmware esxi虚拟化工具,高性能服务器结合,进行服务器资源虚拟化
· linux下的虚拟机工具,kvm(创建虚拟机+安装各种系统)
· docker
什么是虚拟化技术
它是异种骨资源管理技术,将计算机的各种实体资源(CPU、内存、磁盘空间、网络适配器等)予以抽象、转换后呈现出来并可供分割、组合为一个或多个电脑配置环境
vmware创造性地提出了一个二进制翻译技术。vm在虚拟机操作系统和宿主计算机之间扮演了一个桥梁的角色,将虚拟机中要执行的指令“翻译”成恰当的指令在物理计算机上执行,以此来模拟虚拟机中的程序
2 安装部署
容器技术
Docker由go语言开发,是基于Linux内核的Cgroups、NameSpace,以及Union FS等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术
由于隔离的进程独立于宿主机恶化其它隔离进程,也被称之容器
利用Docker可以实现开发、测试、生产环境的部署一致性,极大的减少运维成本
容器技术和虚拟机的差异
虚拟机技术虚拟的是完整的系统(非常重),docker技术可以实现环境隔离(轻量级)
容器技术直接运行在宿主机的内核上,容器没有自己的内核,不能对硬件虚拟,也因此更轻便
同样配置的宿主机,最多可以启动10个虚拟机的话,可以启动100+的容器数量
启动一个虚拟机,执行的是完整的开机流程,可能需要20s,而启动一个容器只需要1s
KVM需要硬件CPU的虚拟化支持,而容器不需要
docker可以更高效的利用系统资源
只需要docker镜像就可以跨机器、平台测试、运维代码
2.1 docker安装部署
1.购买并解析域名
2.购买服务器
3.更新密码
4.登录云服务器
ssh root@47.100.202.97
Welcome to Alibaba Cloud Elastic Compute Service !
docker最核心的组件
· image镜像,构建容器(我们将应用程序运行所需的环境,打包为镜像文件)
· Container,容器(你的应用程序,就跑在容器中)
· 镜像仓库(保存镜像文件,可以提供上传、下载镜像)作用好比github
· Dockerfile,将你部署项目的操作,写成一个部署脚本,这就是dockerfile,且该脚本还能够构建出镜像文件
5 安装docker
环境准备:一些Linux基础;Centos 7
第一步:下载安装vmware,https://www.vmware.com/
第二步:安装Linux虚拟机
在虚拟机安装Docker依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
添加Docker CE的软件源信息
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装Docker CE
yum makecache fast
yum -y install docker-ce
查看Docker版本
docker -v
查看操作系统版本
cat /etc/os-release
启动Docker
注意:无论何时启用docker,都必须确保远程服务器是连接的,若没有连接,请使用以下命令
ssh root@47.100.202.97
systemctl start docker
2.2 Docker底层原理
Docker是一个Client- Server结构的系统,它的守护运行在主机上,通过Socket从客户端访问
Docker Server会接收到Docker client的指令,接着就会执行它
Docker为什么比虚拟机快,因为它的抽象层更少,直接利用的是宿主机的内核
2.3 Docker的常用命令
帮助命令
docker version
docker info
docker --help
2.3.1 镜像命令
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 6 months ago 13.3kB
docker -a --all
docker -q --quiet
docker search
docker pull
docker rmi //dele command
2.3.2 容器命令
1.使用docker拉取镜像(centos)
docker pull centos
Using default tag: latest
latest: Pulling from library/centos
a1d0c7532777: Pull complete
Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest
查看当前所有镜像
docker images //view all downloaded images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 6 months ago 13.3kB
centos latest 5d0da3dc9764 7 months ago 231MB
//一些常见的命令
-d //run at backend
-it //run interactively and enter into a container
-p //identify container port -p 8080:8080
2.启用并进入、退出容器
docker run -it centos //start and enter container
[root@249d502c705a /]# // 249d502c705a is image id
ls // view files in container
bin etc lib lost+found mnt proc run srv tmp var
dev home lib64 media opt root sbin sys usr
[root@249d502c705a /]# exit // exit container and container would stop
exit
[root@iZuf6haxydq6zubpf1diuhZ ~]# //now you are in host
ctrl + P + Q // exit but not stop
[root@7097eba682d3 /]# [root@iZuf6haxydq6zubpf1diuhZ ~]#
docker ps //view again
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7097eba682d3 centos "/bin/bash" About a minute ago Up About a minute sad_rubin
3.查看当前所有在运行的容器
docker ps //run at now
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
docker ps -a //view all containers have ever been runned
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
249d502c705a centos "/bin/bash" 16 minutes ago Exited (130) 13 minutes ago nostalgic_almeida
b7d27d0311db hello-world "/hello" 8 hours ago Exited (0) 8 hours ago amazing_cerf
c75453b50cdd hello-world "/hello" 9 hours ago Exited (0) 9 hours ago quirky_kirch
docker ps -a -n=1 //just list the latest container has been runned
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
249d502c705a centos "/bin/bash" 19 minutes ago Exited (130) 15 minutes ago nostalgic_almeida
docker ps -aq //list all container ids
249d502c705a
b7d27d0311db
c75453b50cdd
4.删除容器
docker rm 7097eba682d3 // delet a identify container,the running can not be deleted
docker rm 5637c729cb90
5637c729cb90 // delete asccess!
docker rm -f $(docker ps -aq) //force to delete all containers
5.启动和停止容器
docker start 2dc2b3517a23
docker restart 2dc2b3517a23
docker stop 2dc2b3517a23
docker kill 2dc2b3517a23
6.常用其他命令
docker run -d centos //start at backend
9110ce46e6b446ce65e4e7d398da4c30e3a439e160344c07b9ca2ccd3cbd4a52
docker logs -tf --tail 10 c29cd7a12e41 //if there is no log in container,it will print nothing
docker run -d centos bin/sh -c "while true;do echo yivei;sleep 1;done" //you can input a test and rerun logs command as follow
docker logs -tf --tail 10 c29cd7a12e41 //now it lists logs as follow
[root@iZuf6haxydq6zubpf1diuhZ ~]# docker logs -tf --tail 10 c29cd7a12e41
2022-04-17T01:29:01.648293615Z yivei
2022-04-17T01:29:02.650880028Z yivei
2022-04-17T01:29:03.653628153Z yivei
2022-04-17T01:29:04.656317351Z yivei
2022-04-17T01:29:05.658861168Z yivei
2022-04-17T01:29:06.661429835Z yivei
2022-04-17T01:29:07.664096826Z yivei
2022-04-17T01:29:08.667242807Z yivei
7.查看容器中进程信息
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c29cd7a12e41 centos "bin/sh -c 'while tr…" 14 minutes ago Up 14 minutes funny_rubin
[root@iZuf6haxydq6zubpf1diuhZ ~]# docker top c29cd7a12e41
UID PID PPID C STIME TTY TIME CMD
root 14119 14100 0 09:22 ? 00:00:00 bin/sh -c while true;do echo yivei;sleep 1;done
root 16130 14119 0 09:37 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1
8.查看镜像元数据
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c29cd7a12e41 centos "bin/sh -c 'while tr…" 14 minutes ago Up 14 minutes funny_rubin
docker inspect c29cd7a12e41
9.进入当前正在运行的容器
方式一:
//打开新的终端
docker exec -it c29cd7a12e41 /bin/bash
[root@c29cd7a12e41 /]# // successful
[root@c29cd7a12e41 /]# ls
bin etc lib lost+found mnt proc run srv tmp var
dev home lib64 media opt root sbin sys usr
方式二:
如下方式是直接进入正在执行的命令行
docker attach c29cd7a12e41 //
10.从容器内拷贝文件到主机上
docker attach 7d796cccebe9 //进入容器
cd /home //进入本地目录
touch jianquanqin.java 7d796cccebe9 //创建文件
exit // 退出容器
docker cp 7d796cccebe9:/home/jianquanqin.java /home //将文件拷贝至主机
2.3.4 容器使用范例
安装Nginx
docker search // 也可以去dockerhub 去查看详细的版本信息
docker pull nginx //下载Nginx
docker images //查看下载的镜像
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 12766a6745ee 2 weeks ago 142MB
hello-world latest feb5d9fea6a5 6 months ago 13.3kB
centos latest 5d0da3dc9764 7 months ago 231MB
docker run -d --name nginx2 -p 22:80 nginx //运行镜像 --name 重命名
curl localhost:3344 //测试
然后再使用公网ip去测试 //测试成功
注意:要使用公网,请务必保证安全组开了合适的端口,否则无法访问成功