Docker学习笔记

前言:个人学习笔记,仅供参考哈~有什么问题欢迎指出!!!

一、简介

1、docker和虚拟机

相信很多人都用过虚拟机。所谓虚拟机,就是在你的操作系统里面装一个软件,然后通过这个软件,再模拟一台甚至多台“子电脑”出来,如图:

虚拟机,类似于“子电脑”

在“子电脑”里,你可以和正常电脑一样运行程序,例如开QQ。如果你愿意,你可以变出好几个“子电脑”,里面都开上QQ。“子电脑”和“子电脑”之间,是相互隔离的,互不影响。

虚拟机属于虚拟化技术。

而Docker这样的容器技术,也是虚拟化技术,属于轻量级的虚拟化

虚拟机虽然可以隔离出很多“子电脑”,但占用空间更大,启动更慢,虚拟机软件可能还要花钱(例如VMWare)。

而容器技术恰好没有这些缺点。它不需要虚拟出整个操作系统,只需要虚拟一个小规模的环境(类似“沙箱”)。

它启动时间很快,几秒钟就能完成。而且,它对资源的利用率很高(一台主机可以同时运行几千个Docker容器)。此外,它占的空间很小,虚拟机一般要几GB到几十GB的空间,而容器只需要MB级甚至KB级。

2、docker

大家需要注意,Docker本身并不是容器,它是创建容器的工具,是应用容器引擎。

想要搞懂Docker,其实看它的两句口号就行。

第一句,是“Build, Ship and Run”。

也就是,“搭建、发送、运行”,三板斧。

举个例子:

我来到一片空地,想建个房子,于是我搬石头、砍木头、画图纸,一顿操作,终于把这个房子盖好了。

结果,我住了一段时间,想搬到另一片空地去。这时候,按以往的办法,我只能再次搬石头、砍木头、画图纸、盖房子。

但是,跑来一个老巫婆,教会我一种魔法。

这种魔法,可以把我盖好的房子复制一份,做成“镜像”,放在我的背包里。

等我到了另一片空地,就用这个“镜像”,复制一套房子,摆在那边,拎包入住。

3、三大核心概念

Docker技术的三大核心概念,分别是:

  • 镜像(Image)

  • 容器(Container)

  • 仓库(Repository)

我刚才例子里面,那个放在包里的“镜像”,就是Docker镜像。而我的背包,就是Docker仓库。我在空地上,用魔法造好的房子,就是一个Docker容器

说白了,这个Docker镜像,是一个特殊的文件系统。它除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(例如环境变量)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。

也就是说,每次变出房子,房子是一样的,但生活用品之类的,都是不管的。谁住谁负责添置。

每一个镜像可以变出一种房子。那么,我可以有多个镜像呀!

也就是说,我盖了一个欧式别墅,生成了镜像。另一个哥们可能盖了一个中国四合院,也生成了镜像。还有哥们,盖了一个非洲茅草屋,也生成了镜像。。。

这么一来,我们可以交换镜像,你用我的,我用你的,岂不是很爽?

于是乎,就变成了一个大的公共仓库。

负责对Docker镜像进行管理的,是Docker Registry服务(类似仓库管理员)。

不是任何人建的任何镜像都是合法的。万一有人盖了一个有问题的房子呢?

所以,Docker Registry服务对镜像的管理是非常严格的。

最常使用的Registry公开服务,是官方的Docker Hub,这也是默认的Registry,并拥有大量的高质量的官方镜像。

就在Docker容器技术被炒得热火朝天之时,大家发现,如果想要将Docker应用于具体的业务实现,是存在困难的——编排、管理和调度等各个方面,都不容易。于是,人们迫切需要一套管理系统,对Docker及容器进行更高级更灵活的管理。

就在这个时候,K8S出现了。。。作者君还没学这个

二、Docker安装

以linux环境为例:

1、卸载旧版本

sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

2、设置仓库

# 安装所需的软件包。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

3、安装 Docker Engine-Community

# 安装最新版本的 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

 4、启动docker

sudo systemctl start docker

三、命令

1、常见命令

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] #删除镜像

 2、login和logout

# 登陆到一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub
docker login

# 登出一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub
docker logout

# 实例
docker login -u 用户名 -p 密码

docker logout

2、save

# 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

  3、load

# docker load : 导入使用 docker save 命令导出的镜像。
docker load [OPTIONS] [XXX.tar]

# 参数:
#		--input , -i : 指定导入的文件,代替 STDIN。
# 	--quiet , -q : 精简输出信息。

# 实例:导入镜像

4、run

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

5、Dockerfile

5.1、概念

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。相当于告诉docker我要做什么事情。

docker build则相当于是执行dockerfile里面的每一件事情,制作一个镜像。

5.2、构建镜像

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 ["镜像名称"]

 5.3、Dockerfile语法

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

1、创建Mysql容器

# 查询镜像
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();

相关推荐

  1. docker学习笔记

    2023-12-20 16:34:02       38 阅读
  2. Docker学习笔记

    2023-12-20 16:34:02       20 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-20 16:34:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-20 16:34:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-20 16:34:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-20 16:34:02       18 阅读

热门阅读

  1. Web安全 - 深入同源策略

    2023-12-20 16:34:02       37 阅读
  2. 蓝底白字车牌的定位与字符分割识别 MATLAB 仿真

    2023-12-20 16:34:02       34 阅读
  3. [PTA]矩阵列平移

    2023-12-20 16:34:02       38 阅读
  4. 05-MySQL中的limit和union关键字

    2023-12-20 16:34:02       33 阅读
  5. 【libevent】IO引擎及实现

    2023-12-20 16:34:02       30 阅读
  6. springboot 解析微信小程序获取手机号

    2023-12-20 16:34:02       23 阅读
  7. 基于改进鲸鱼算法的最小乘支持向量机数据分类

    2023-12-20 16:34:02       29 阅读
  8. Python用Pygame实现一个五子棋小游戏

    2023-12-20 16:34:02       35 阅读
  9. iOS将framework转为xcframework

    2023-12-20 16:34:02       35 阅读
  10. Dubbo RPC-Redis协议

    2023-12-20 16:34:02       42 阅读
  11. Prolist组件实现动态竖排展示

    2023-12-20 16:34:02       33 阅读
  12. 在vue中,文件转base64示例

    2023-12-20 16:34:02       33 阅读
  13. WPF 全局异常处理

    2023-12-20 16:34:02       40 阅读
  14. Spring 声明式事务

    2023-12-20 16:34:02       41 阅读
  15. Hive Serde

    2023-12-20 16:34:02       40 阅读
  16. MySQL的恢复与备份

    2023-12-20 16:34:02       25 阅读