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

安装完成后打开即可

配置阿里云镜像加速器

  1. 访问这个地址,使用自己的阿里云账号登录,查看菜单栏左下角,发现有一个镜像加速器:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 找到自己的镜像加速器的地址链接

  2. 打开Mac中Docker的配置选项,并添加

然后点击apply & restart

  1. 最后用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 : 精简输出信息
  • 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

posted @ 2022-04-27 17:42  小学程序员  阅读(4488)  评论(0编辑  收藏  举报