前言:个人学习笔记,仅供参考哈~有什么问题欢迎指出!!!
相信很多人都用过虚拟机。所谓虚拟机,就是在你的操作系统里面装一个软件,然后通过这个软件,再模拟一台甚至多台“子电脑”出来,如图:
虚拟机,类似于“子电脑”
在“子电脑”里,你可以和正常电脑一样运行程序,例如开QQ。如果你愿意,你可以变出好几个“子电脑”,里面都开上QQ。“子电脑”和“子电脑”之间,是相互隔离的,互不影响。
虚拟机属于虚拟化技术。
而Docker这样的容器技术,也是虚拟化技术,属于轻量级的虚拟化。
虚拟机虽然可以隔离出很多“子电脑”,但占用空间更大,启动更慢,虚拟机软件可能还要花钱(例如VMWare)。
而容器技术恰好没有这些缺点。它不需要虚拟出整个操作系统,只需要虚拟一个小规模的环境(类似“沙箱”)。
它启动时间很快,几秒钟就能完成。而且,它对资源的利用率很高(一台主机可以同时运行几千个Docker容器)。此外,它占的空间很小,虚拟机一般要几GB到几十GB的空间,而容器只需要MB级甚至KB级。
大家需要注意,Docker本身并不是容器,它是创建容器的工具,是应用容器引擎。
想要搞懂Docker,其实看它的两句口号就行。
第一句,是“Build, Ship and Run”。
也就是,“搭建、发送、运行”,三板斧。
举个例子:
我来到一片空地,想建个房子,于是我搬石头、砍木头、画图纸,一顿操作,终于把这个房子盖好了。
结果,我住了一段时间,想搬到另一片空地去。这时候,按以往的办法,我只能再次搬石头、砍木头、画图纸、盖房子。
但是,跑来一个老巫婆,教会我一种魔法。
这种魔法,可以把我盖好的房子复制一份,做成“镜像”,放在我的背包里。
等我到了另一片空地,就用这个“镜像”,复制一套房子,摆在那边,拎包入住。
Docker技术的三大核心概念,分别是:
镜像(Image)
容器(Container)
仓库(Repository)
我刚才例子里面,那个放在包里的“镜像”,就是Docker镜像。而我的背包,就是Docker仓库。我在空地上,用魔法造好的房子,就是一个Docker容器。
说白了,这个Docker镜像,是一个特殊的文件系统。它除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(例如环境变量)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
也就是说,每次变出房子,房子是一样的,但生活用品之类的,都是不管的。谁住谁负责添置。
每一个镜像可以变出一种房子。那么,我可以有多个镜像呀!
也就是说,我盖了一个欧式别墅,生成了镜像。另一个哥们可能盖了一个中国四合院,也生成了镜像。还有哥们,盖了一个非洲茅草屋,也生成了镜像。。。
这么一来,我们可以交换镜像,你用我的,我用你的,岂不是很爽?
于是乎,就变成了一个大的公共仓库。
负责对Docker镜像进行管理的,是Docker Registry服务(类似仓库管理员)。
不是任何人建的任何镜像都是合法的。万一有人盖了一个有问题的房子呢?
所以,Docker Registry服务对镜像的管理是非常严格的。
最常使用的Registry公开服务,是官方的Docker Hub,这也是默认的Registry,并拥有大量的高质量的官方镜像。
就在Docker容器技术被炒得热火朝天之时,大家发现,如果想要将Docker应用于具体的业务实现,是存在困难的——编排、管理和调度等各个方面,都不容易。于是,人们迫切需要一套管理系统,对Docker及容器进行更高级更灵活的管理。
就在这个时候,K8S出现了。。。作者君还没学这个
以linux环境为例:
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# 安装所需的软件包。yum-utils 提供了 yum-config-manager ,并且 device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2。
sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
# 设置docker仓库
# 官方源地址(比较慢)
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
# 阿里云源地址
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 清华大学源地址
sudo yum-config-manager \
--add-repo \
https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
# 安装最新版本的 Docker Engine-Community 和 containerd
sudo yum install docker-ce docker-ce-cli containerd.io
# 安装特定版本的 Docker Engine-Community
yum list docker-ce --showduplicates | sort -r
# 通过其完整的软件包名称安装特定版本,该软件包名称是软件包名称(docker-ce)加上版本字符串(第二列),从第一个冒号(:)一直到第一个连字符,并用连字符(-)分隔。例如:docker-ce-18.09.1。
sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
CenOS8安装docker是会出现和podman冲突的情况,删除即可:
yum erase podman buildah
sudo systemctl start docker
systemctl start docker # 启动docker
systemctl stop docker #关闭docker
docker images #列出所有镜像
docker ps # 列出当前运行容器
docker ps -a # 列出所有容器
docker stop $(docker ps -a | awk '{ print $1}' | tail -n +2) #关闭所有容器
docker start [容器ID/name] #启动容器
docker rm [容器ID/name] #删除容器
docker rmi [镜像ID/name] #删除镜像
# 登陆到一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub
docker login
# 登出一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub
docker logout
# 实例
docker login -u 用户名 -p 密码
docker logout
# docker save : 将指定镜像保存成 tar 归档文件。
docker save [OPTIONS] IMAGE [IMAGE...]
# 参数:
# -o :输出到的文件。
# 实例:将镜像 runoob/ubuntu:v3 生成 my_ubuntu_v3.tar 文档
docker save -o my_ubuntu_v3.tar runoob/ubuntu:v3
# docker load : 导入使用 docker save 命令导出的镜像。
docker load [OPTIONS] [XXX.tar]
# 参数:
# --input , -i : 指定导入的文件,代替 STDIN。
# --quiet , -q : 精简输出信息。
# 实例:导入镜像
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
# 参数
# -a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
# -d: 后台运行容器,并返回容器ID;
# -i: 以交互模式运行容器,通常与 -t 同时使用;
# -P: 随机端口映射,容器内部端口随机映射到主机的端口
# -p: 指定端口映射,格式为:主机(宿主)端口:容器端口
# -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
# --name="nginx-lb": 为容器指定一个名称;
# --dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
# --dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
# -h "mars": 指定容器的hostname;
# -e username="ritchie": 设置环境变量;
# --env-file=[]: 从指定文件读入环境变量;
# --cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;
# -m :设置容器使用内存最大值;
# --net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
# --link=[]: 添加链接到另一个容器;
# --expose=[]: 开放一个端口或一组端口;
#--volume , -v: 绑定一个卷
# 实例
docker run -d -p 9090:8080 --name oneoscontroller 915198348329
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。相当于告诉docker我要做什么事情。
docker build则相当于是执行dockerfile里面的每一件事情,制作一个镜像。
1、新建Dockerfile文件
FROM alpine:latest
MAINTAINER h1027_g0828@163.com
CMD echo "hello dockerfile"
解释:
FROM:定制的镜像都是基于 FROM 的镜像,这里的 alpine就是定制需要的基础镜像。后续的操作都是基于 alpine。
MAINTAINER: 指定镜像的作者名称和邮箱(可以省略)
CMD:需要执行的命令,相当于在shell脚本中执行的命令。
与CMD有相同功能的有RUN、ENTRYPOINT,三个都能执行命令,但是有区别:
RUN命令执行命令并创建新的镜像层,通常用于安装软件包。在构建镜像的时候执行。多条命名会依次执行,每执行一次镜像多一层。
CMD命令设置容器启动后默认执行的命令及其参数,但CMD设置的命令能够被docker run命令后面的命令行参数替换。此命令会在容器启动且 docker run 没有指定其他命令时运行。多个只有最后一条生效。
ENTRYPOINT配置容器启动时的执行命令(不会被忽略,一定会被执行,即使运行 docker run时指定了其他命令)。相当于是容器的入口。多个只有最后一条生效。
我们可用两种方式指定 RUN、CMD 和 ENTRYPOINT 要运行的命令:Shell 格式和 Exec 格式:
Shell格式:<instruction> <command>。例如:apt-get install python3
Exec格式:<instruction> ["executable", "param1", "param2", ...]。例如: ["apt-get", "install", "python3"]
CMD 和 ENTRYPOINT 推荐使用 Exec 格式,因为指令可读性更强,更容易理解。RUN 则两种格式都可以。
?2、构建命令
docker build -t hello_dockerfile .
3、运行镜像
# 查看镜像是否存在
docker images
# 运行镜像
docker run ["镜像名称"]
1、FROM
基础镜像。定制的镜像都是基于 FROM 的镜像,下面的操作都是基础该镜像。一般都基于:alpine
FROM alpine
2、RUN
用于执行后面跟着的命令行命令。只在构建镜像的时候执行,一般用于构建镜像的时候下载文件。
# shell格式,等同于,在终端操作的 shell 命令。
?RUN <命令行命令>
??
?# exec格式,例如:RUN ["./test.php", "dev", "offline"] 等价于 RUN ./test.php dev offline
?RUN ["可执行文件", "参数1", "参数2"]
3、COPY
复制指令,从上下文目录中复制文件或者目录到容器里指定路径。
COPY [--chown=<user>:<group>] <源路径1>... <目标路径>
?COPY [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"]
[--chown=<user>:<group>]:可选参数,用户改变复制到容器内文件的拥有者和属组。
<源路径>:源文件或者源目录,这里可以是通配符表达式,其通配符规则要满足 Go 的 filepath.Match 规则。
<目标路径>:容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建。
4、ADD
5、CMD
6、ENTRYPOINT(一般用作容器的入口)
7、ENV
设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。
ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...
8、ARG
9、VOLUME
10、EXPOSE
11、WORKDIR
注意:
DockerHub 从 2020 年 11 月 2 日,正式开始限制非付费用户的拉取频率:
匿名用户,每 6 小时只允许 pull 100 次
已登录用户,每 6 小时只允许 pull 200 次
超过限制会报错:
toomanyrequests: You have reached your pull rate limit. You may increase the limit by authenticating and upgrading: https://www.docker.com/increase-rate-limit
解决方法:
# 打开镜像源配置文件 vim /etc/docker/daemon.json # 修改镜像源,添加中科大镜像源 { "registry-mirrors": ["https://ustc-edu-cn.mirror.aliyuncs.com"], } # 重启docker systemctl restart docker
# 查询镜像
docker search mysql
# 拉取最新版本镜像
docker pull mysql:latest
# 创建docker容器
docker run \
-d \
-p 3306:3306 \
--name mymysql \
-e MYSQL_ROOT_PASSWORD=root \
mysql:latest
# 进入容器
docker exec -it [容器ID] /bin/sh
# 添加远程访问权限
alter user 'root'@'%' identified with mysql_native_password by 'root';
# 查看版本
select version();