Docker基础(一)
Docker是一个开源的应用容器引擎,基于go语言并遵从Apache2.0协议开源。
Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。
开发者可以打包自己的应用到容器里面,然后迁移到其他机器的docker应用中,可以实现快速部署。如果出现的故障,可以通过镜像,快速恢复服务。
容器是完全使用沙箱机制,相互之间不会有任何接口,更重要的是容器性能开销极地。
Docker的应用场景
- Web应用的自动化打包和发布。
- 自动化测试和持续集成、发布。
- 在服务型环境中部署和调整数据库或其他的后台应用。
- 快速部署、隔离应用、提高开发效率、版本控制、简化配置,整合资源
Docker的优点
快速,一致的交付您的应用程序
Docker 允许开发人员使用您提供的应用程序或服务的本地容器在标准化环境中工作,从而简化了开发的生命周期。
响应式部署和扩展
Docker 是基于容器的平台,允许高度可移植的工作负载。Docker 容器可以在开发人员的本机上,数据中心的物理或虚拟机上,云服务上或混合环境中运行。
Docker 的可移植性和轻量级的特性,还可以使您轻松地完成动态管理的工作负担,并根据业务需求指示,实时扩展或拆除应用程序和服务。
在同一硬件上运行更多工作负载
Docker 轻巧快速。它为基于虚拟机管理程序的虚拟机提供了可行、经济、高效的替代方案,因此您可以利用更多的计算能力来实现业务目标。Docker 非常适合于高密度环境以及中小型部署,而您可以用更少的资源做更多的事情。
Docker架构
Docker三个基本概念
- 镜像(Image):Docker镜像就相同于是一个root文件系统。比如官方镜像ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
- 容器(Container):镜像和容器的关系,就像是面向对象程序设计中的类和实例一样,镜像是一个静态的定义,容器是一个镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
- 仓库(Repository):仓库可看着一个代码控制中心,用来保存镜像。
Docker 容器通过 Docker 镜像来创建。
MacOS Docker安装
使用 Homebrew 安装
macOS 我们可以使用 Homebrew 来安装 Docker。
Homebrew 的 Cask 已经支持 Docker for Mac,因此可以很方便的使用 Homebrew Cask 来进行安装:
brew cask install docker
==> Creating Caskroom at /usr/local/Caskroom
==> We'll set permissions properly so we won't need sudo in the future
Password: # 输入 macOS 密码
==> Satisfying dependencies
==> Downloading https://download.docker.com/mac/stable/21090/Docker.dmg
######################################################################## 100.0%
==> Verifying checksum for Cask docker
==> Installing Cask docker
==> Moving App 'Docker.app' to '/Applications/Docker.app'.
🍺 docker was successfully installed!
在载入 Docker app 后,点击 Next,可能会询问你的 macOS 登陆密码,你输入即可。之后会弹出一个 Docker 运行的提示窗口,状态栏上也有有个小鲸鱼的图标
启动终端后,通过命令可以检查安装后的 Docker 版本。
$ docker --version
Docker version 19.03.5, build 633a0ea
镜像加速
鉴于国内网络问题,后续拉取 Docker 镜像十分缓慢,我们可以需要配置加速器来解决。
Docker 官方中国区: https://registry.docker-cn.com
在任务栏点击 Docker for mac 应用图标 -> Perferences… -> Daemon -> Registry mirrors。在列表中填写加速器地址即可。修改完成之后,点击 Apply & Restart 按钮,Docker 就会重启并应用配置的镜像地址了。
之后我们可以通过 docker info 来查看是否配置成功。
$ docker info
...
Registry Mirrors:
https://registry.docker-cn.com
Live Restore Enabled: false
Docker初体验
创建一个mysql容器
在命令行中输入下面命令,新建一个mysql数据库
docker run -itd --name mysql-demo -p 8100:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql
{% asset_img 2.png 图片2 %}
首次本地会去远程仓库中拉取mysql 最新版本,拉取之后会运行起来然后打印一串hash值。
当第二次使用上面的命令docker会直接使用本地已有的镜像。
使用docker run
命令来在容器中运行一个应用程序
-itd
:
-i
以交互模式运行容器,通常与 -t 同时使用-t
为容器重新分配一个伪输入终端,通常与 -i 同时使用;-d
后台运行容器,并返回容器ID;
--name
:为容器指定一个名词
-p
:指定端口映射,格式为:主机(宿主):容器端口
-e MYSQL_ROOT_PASSWORD=
:设置环境变量
下面可以使用Navicat来连接下mysql,看是否正确访问
{% asset_img 6.png 图片 %}可以看到已经连接已经正常连接,可以访问到数据库中
使用docker ps
查看已有的容器
{% asset_img 3.png 图片 %}
我这里已经起了两个容器,都为mysql,名称各不相同。
docker ps [OPTIONS]
可以使用docker ps --help
查看命令
-a
:显示所有的容器,包括未运行的-s
:显示总的文件大小-f
:根据条件过滤显示的内容--format
:指定返回值的模板文件-l
:显示最近创建的容器-n
:列出最近创建的n个容器-q
:静默模式,只显示容器编号
表头字段的意思为:
CONTAINER ID:容器ID
IMAGE:使用的镜像
COMMAND:启动容器时运行的命令
CREATED:容器的创建时间
PORTS:容器的端口信息和使用的连接类型
NAMES:容器名称
STATUS:容器状态
- created(已创建)
- restarting(重启中)
- running(运行中)
- removing(迁移中)
- paused(暂停)
- exited(停止)
- dead(死亡)
查看本地已有的镜像:
docker images [OPTIONS]
-a
:列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层)--digests
:显示镜像的信息-f
:过滤-q
:显示镜像ID
提交本地镜像并打上tag,进行版本控制
docker commit d435eee2caa5 mysql:1.0
docker commit:从容器创建一个新的镜像,更上的hash是容器中的ID
-a
:提交镜像作者-c
:使用Dockerfile指令来创建镜像-m
:提交时的说明文字-p
:在commit时,讲容器暂定
然后镜像的快照就打成功了。
接下里使用新打的mysql镜像v1来创建容器
docker run -itd --name mysql-v1 -p 8101:3306 mysql:v1
使用docker ps
查看是否已经成功
可以看到运行中的容器已经有mysql-v1了,并且使用的镜像也是mysql:v1镜像
进入容器中执行命令
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
-d
:分离模式: 在后台运行-i
:即使没有附加也保持STDIN 打开-t
:分配一个伪终端
实例:
在容器 mynginx 中以交互模式执行容器内 /root/runoob.sh 脚本:
docker exec -it mynginx /bin/sh /root/runoob.sh
启动停止操作
docker start
:启动一个或多个已经被停止的容器docker stop
:停止一个运行中的容器docker restart
:重启容器
docker start mysql-demo
docker stop mysql-demo
docker restart mysql-demo