MAC安装Docker
Docker学习
什么是docker
当人们说“Docker”时,他们通常是指 Docker Engine,它是一个客户端 - 服务器应用程序,由 Docker 守护进程、一个REST API指定与守护进程交互的接口、和一个命令行接口(CLI)与守护进程通信(通过 封装REST API)。Docker Engine 从 CLI 中接受docker 命令,例如 docker run 、docker ps 来列出正 在运行的容器、docker images 来列出镜像,等等
- docker是一个软件,可以运行在window、linux、mac等各种操作系统上。
- docker 是一个开源的应用容器引擎,基于Go 语言开发并遵从 Apache2.0 协议开源,项目代码托 管在github上进行维护
- docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任 何流行的 Linux 机器上
- 容器是完全使用沙箱机制,相互之间不会有任何接口,更重要的是容器性能开销极低
docker基本组成
docker主机(Host):安装了Docker程序的机器(Docker直接安装在操作系统之上);
docker仓库(Registry):用来保存各种打包好的软件镜像;仓库分为公有仓库和私有仓库。(很类似 maven)
docker镜像(Images):软件打包好的镜像;放在docker仓库中;
docker容器(Container):镜像启动后的实例称为一个容器;容器是独立运行的一个或一组应用
docker与操作系统比较
docker是一种轻量级的虚拟化方式。与传统操作系统技术的特性比较如下表:
特性 | 容器 | 虚拟机 |
---|---|---|
启动速度 | 秒级 | 分钟级 |
性能 | 接近原生 | 较弱 |
内存代价 | 很小 | 较多 |
硬盘使用 | 一般为MB | 一般为GB |
运行密度 | 单机支持上千个容器 | 一般几十个 |
隔离性 | 安全隔离 | 完全隔离 |
迁移性 | 优秀 | 一般 |
传统的虚拟机方式提供的是相对封闭的隔离。Docker利用Linux系统上的多种防护技术实现了严格的隔 离可靠性,并且可以整合众多安全工具。从 1.3.0版本开始,docker重点改善了容器的安全控制和镜像 的安全机制, 极大提高了使用docker的安全性
docker安装与卸载(基于MAC)
由于之前我安装过,所以需要先卸载一遍
卸载
## 1)进入docker的安装目录
cd /usr/local/bin/
## 2)删除与docker相关的文件夹
sudo rm -rf docker*
sudo rm -rf com.docker.*
sudo rm -rf hub-tool*
sudo rm -rf kube*
sudo rm -rf vpnkit*
安装
注意匹配版本,我的是macOS10.14所以不能适配最新版,我用的桌面版本是4.7.0
安装完成后打开即可
配置阿里云镜像加速器
-
访问这个地址,使用自己的阿里云账号登录,查看菜单栏左下角,发现有一个镜像加速器:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 找到自己的镜像加速器的地址链接
-
打开Mac中Docker的配置选项,并添加
然后点击apply & restart
- 最后用docker info命令检查配置是否生效
docker命令
docker -v
docker version
docker info
命令分类
-
Docker环境信息 — docker [info|version]
-
容器生命周期管理 — docker [create|exec|run|start|stop|restart|kill|rm|pause|unpause]
-
容器操作管理 — docker [ps|inspect|top|attach|wait|export|port|rename|stat]
-
容器rootfs命令 — docker [commit|cp|diff]
-
镜像仓库 — docker [login|pull|push|search]
-
本地镜像管理 — docker [build|images|rmi|tag|save|import|load]
-
容器资源管理 — docker [volume|network]
-
系统日志信息 — docker [events|history|logs]
官网说明
https://docs.docker.com/engine/reference/run/
Docker镜像(image)
Docker Hub地址
docker hub类似maven远程仓库地址
https://hub.docker.com/
作为一名研发人员,则可以将镜像理解为类(Class)。是一个应用程序。 首先需要先从镜像仓库服务中拉取镜像。常见的镜像仓库服务是 Docker Hub,但是也存在其他镜像仓库服务。
拉取操作会将镜像下载到本地 Docker 主机,可以使用该镜像启动一个或者多个容器。
镜像由多个层组成,每层叠加之后,从外部看来就如一个独立的对象。镜像内部是一个精简的操作系统 (OS),同时还包含应用运行所必须的文件和依赖包。
因为容器的设计初衷就是快速和小巧,所以镜像通常都比较小。
前面多次提到镜像就像停止运行的容器(类)。实际上,可以停止某个容器的运行,并从中创建新的镜像。
在该前提下,镜像可以理解为一种构建时(build-time)结构,而容器可以理解为一种运行时(run- time)结构,如下图所示
Docker镜像常用命令
-
pull
- 下载镜像的命令。镜像从远程镜像仓库服务的仓库中下载。默认情况下,镜像会从 Docker Hub 的 仓库中拉取
- 通过下载过程,可以看到,一个镜像一般是由多个层组成,类似 f7e2b70d04ae 这样的串表示层的 唯一 ID
- 注意:
- 如果多个不同的镜像中,同时包含了同一个层,这样重复下载,在下载之前,会去检测本地是否会有同样 ID 的层,如果本地已经存在了,就直接使用本地的就好了
- 不同仓库中,可能也会存在镜像重名的情况发生,我们在使用 pull命令时,还需要在镜像前面指定仓库地址(Registry), 如果不指定,则 Docker 会使用您默认配置的仓库地址
- 常用参数
- -a, --all-tags=true|false : 是否获取仓库中所有镜像,默认为否;
- --disable-content-trust : 跳过镜像内容的校验,默认为 true;
-
images
- 列出本机已有的镜像
- 各字段说明
- REPOSITORY:表示镜像的仓库源
- TAG:镜像的标签
- IMAGE ID:镜像ID
- CREATED:镜像创建时间
- SIZE:镜像大小
-
save
- 将指定镜像保存成 tar 归档文件(-o :输出到的文件。)
mkdir -p /data cd /data docker save tomcat:9.0.20-jre8-alpine -o tomcat9.tar docker save tomcat:9.0.20-jre8-slim > tomcat9.slim.tar
-
load
- 导入使用 docker save命令导出的镜像
- --input , -i : 指定导入的文件,代替 STDIN
- --quiet , -q : 精简输出信息
- 导入使用 docker save命令导出的镜像
-
inspect
- 获取容器/镜像的元数据
- -f :指定返回值的模板文件
- -s :显示总的文件大小
- --type :为指定类型返回JSON
- 获取容器/镜像的元数据
-
history
- 查看指定镜像的创建历史
- -H :以可读的格式打印镜像大小和日期,默认为true;
- --no-trunc :显示完整的提交记录;
- -q :仅列出提交记录ID。
-
还有tag命令(标记本地镜像,将其归入某一仓库)和rmi命令,删除镜像等
- 删除镜像时注意,推荐image的名称删除镜像,因为id显示不全会出现重复
-
清理镜像
-
我们在使用 Docker 一段时间后,系统一般都会残存一些临时的、没有被使用的镜像文件,可以通过以 下命令进行清理。执行完命令后,还是告诉我们释放了多少存储空间!
-
docker image prune
- a, --all : 删除所有没有用的镜像,而不仅仅是临时文件
- -f, --force:强制删除镜像文件,无需弹出提示确认
-
Docker容器常用命令
新建并启动容器
-
docker run
-
docker run [OPTIONS] IMAGE [COMMAND] [ARG...] 例如: docker run -it --rm -p 8080:8080 tomcat:9.0.20-jre8-alpine
-
常用参数
- -d, --detach=false: 后台运行容器,并返回容器ID
- -i, --interactive=false: 以交互模式运行容器,通常与 -t 同时使用
- -P, --publish-all=false: 随机端口映射,容器内部端口随机映射到主机的端口。不推荐各位小伙伴 使用该参数
- -p, --publish=[]: 指定端口映射,格式为:主机(宿主)端口:容器端口,推荐各位小伙伴们使用
- -t, --tty=false: 为容器重新分配一个伪输入终端,通常与 -i 同时使用
- --name="nginx-lb": 为容器指定一个名称
- -h , --hostname="laosiji": 指定容器的hostname
- -e , --env=[]: 设置环境变量,容器中可以使用该环境变量
- --net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型
- --link=[]: 添加链接到另一个容器;不推荐各位小伙伴使用该参数
- -v, --volume : 绑定一个卷
- --privileged=false: 指定容器是否为特权容器,特权容器拥有所有的capabilities
- --restart=no:指定容器停止后的重启策略
- no:容器退出时不重启
- on-failure:容器故障退出(返回值非零)时重启
- always:容器退出时总是重启,推荐各位小伙伴们使用
- --rm=false: 指定容器停止后自动删除容器,不能以docker run -d启动的容器
-
容器日志
-
docker logs : 获取容器的日志
-
#语法 docker logs [OPTIONS] CONTAINER #例如 docker logs -f tomcat9
- -f : 跟踪日志输出
- --tail :仅列出最新N条容器日志
其他命令
还有一些其他的就不一一列举了
-
docker rm :删除一个或多个容器。docker rm命令只能删除处于终止或退出状态的容器,并不能删除 还处于运行状态的容器
#需要先停止运行中的容器再删除,否则无法删除容器 docker stop tomcat9 #按照容器名称删除 docker rm tomcat9
-
docker ps:列出容器
#查看运行中的容器 docker ps tomcat9 #查看所有容器 docker ps -a tomcat9
-
docker create :创建一个新的容器但不启动它。用法同 docker run命令
docker create -it --name tomcat9 -p 8080:8080 9.0.20-jre8-alpine
-
启动、重启、终止容器
docker start tomcat9 docker stop tomcat9 docker restart tomcat9
-
docker exec :在运行的容器中执行命令。早期有attach命令,对于阻塞命令会等待,所以不方便。在Docker 1.3.0后提供了exec 可以在容器内直接执行任意命令
#有bash命令的linux系统:例如centos docker exec -it tomcat9.1 /bin/bash #没有bash命令的linux系统:例如alpine系统 docker exec -it tomcat9.2 sh
-
docker update :可以动态地更新容器配置。可以更新一个或多个容器配置。多个容器名称或ID之间使 用空格分隔。但update命令不是很成熟,有很多配置项不能动态更新。推荐大家还是rm容器后,再重 新run一个新的镜像
#更新容器restart策略 docker update --restart always tomcat9
-
docker kill :杀掉一个运行中的容器。
docker kill tomcat9
安装mysql(熟悉前面的命令)
docker官网地址
https://hub.docker.com/_/mysql
基础镜像
拉取镜像
docker pull mysql:8.0.28
备份镜像
docker save mysql:8.0.28 -o mysql.8.0.28.tar
导入镜像
docker load -i mysql.8.0.28.tar
运行镜像
学习docker run -e参数
- -e , --env=[]: 设置环境变量,容器中可以使用该环境变量
- 向my.cnf文件中追加相关配置项
docker run -itd --name mysql --restart always \
--privileged=true \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:8.0.28 --character-set-server=utf8 \
--collation-server=utf8_general_ci
privileged参数
我们大多数熟悉 Unix 类系统的人,都习惯于通过使用 sudo 来随意提升自己的权限,成为 root 用户。 我们在使用 Docker 容器的过程中知道,docker提供了一个 --privileged 的参数,其实它与随意使用 sudo 有很大的不同,它可能会让你的应用程序面临不必要的风险,下面我们将向你展示这与以 root 身 份运行的区别,以及特权的实际含义。
- 作为 Root 运行:Docker 允许在其宿主机上隔离一个进程、capabilities 和文件系统,但是大多数容器实际上都是默认以
root 身份运行。这里我们拿 DockerHub 上几个比较流行的镜像来进行说明。 - 避免以 root 运行:虽然在容器内以 root 身份运行是很正常的,但如果你想加固容器的安全性,还是应该避免这样做
- 特权模式
- --privileged 可以不受限制地访问任何自己的系统调用。在正常的操作中,即使容器内有 root, Docker 也会限制容器的 Linux Capabilities 的,这种限制包括像 CAP_AUDIT_WRITE 这样的东西,它允 许覆盖内核的审计日志--你的容器化工作负载很可能不需要这个 Capabilities。所以特权只应该在你真正 需要它的特定设置中使用,简而言之,它给容器提供了几乎所有主机(作为root)可以做的事情的权 限。
- 本质上,它就是一个免费的通行证,可以逃避容器所包含的文件系统、进程、sockets 套接字等,当然 它有特定的使用场景,比如在很多 CI/CD 系统中需要的 Docker IN Docker 模式(在 Docker 容器内部 需要 Docker 守护进程),以及需要极端网络的地方
测试mysql
容器内测试
#进入容器:根据官网上的实例,使用bash命令进入容器
docker exec -it mysql bash
#登录mysql
mysql -uroot -p
#输入密码
123456
use mysql;
show databases;
#退出mysql
exit
#退出容器
exit