在 mac 系统中, docker 容器暴露的地址, 不能被 ping 通, 但可以通过暴露端口的方式访问
一、 什么是容器运行时
运行和管理容器进程、镜像的工具
二、 容器运行时分类
分为高层运行时, 和低层运行时, 他们的区别在于提供的功能不完全相同, 有些只有容器运行的功能, 有些还提供了容器镜像的管理功能。 在实际工作中, 他们是配合使用的
2.1 低层运行时
主要负责与宿主机操作系统打交道, 根据指定的容器镜像在宿主机上运行容器的进程,并对整个生命周期进行管理
2.2 高层运行时
主要负责容器镜像的管理, 转化等工作, 为容器的运行提前做准备
高层运行时与低层运行时各司其职, 容器运行时一般先由高层运行时将容器镜像下载下来, 并解压转换为容器运行时需要的操作系统文件, 再由低层运行时启动和管理容器
三、 docker 的组成
四、 容器运行机制
常见的 docker 的命令
1. docker version // 查看版本信息
2. docker info // 查看 docker 的服务状态
3. docker ps // 查看正在运行的 docker 容器列表 -a(所有的容器)
4. docker images // 查看本地的 docker 镜像列表
5. docker logs <container_id> // 查看 docker 容器的日志
6. docker top <container_id> // 查看 docker 内部运行的进程
7. docker port <container_id> // 查看 docker 容器的端口映射情况
五、docker 安装 (查看官方文档)
六、Docker 使用生态
6.1、 Docker host
用于安装 docker daemon 的主机, 即为 docker host , 并且该主机中可基于容器镜像运行容器
6.2、 Docker daemon (其中高层运行时和底层运行时都处于这个里面)
用于管理 docker host 中运行的容器、容器镜像、容器网络等,管理由 containerd.io 提供的容器
6.3、 Registry (下载镜像直接使用)
容器镜像仓库, 用于存储已生成运行模板的仓库, 用户使用时, 可直接从容器镜像仓库中下载容器镜像(即容器运行模板),就可以运行容器镜像中包含的应用了。
例如: Docker Hub, 也可以使用 Harbor 实现企业私有的容器镜像仓库
6.4、 Docker client
docker daemon 客户端工具, 用于同 docker daemon 进行交互, 并且可以执行 docker 命令, 启动、停止、删除容器、查看容器日志、查看容器状态等操作, 执行用户指令, 可以部署到 docker host 上也可以部署到其他主机上,能够连接上 docker daemon 即可操作
6.5 images (镜像)
把应用运行环境及计算资源打包生成可用于启动容器的不可变的基础设施文件模板,主要功能是启动一个容器。(镜像就是一个文件系统, 借助 docker host 内核启动一个容器。不包含操作系统的内核部分, 就是一个文件系统,所以移植起来很方便, 只要能够运行他都可以使用 )
6.6 container (容器)
由容器镜像生成,生成一个应用程序运行的环境, 包含容器镜像中的所有文件和用户后面添加的文件,属于基于容器镜像生成的可读写的层,这也是应用程序活跃的空间
6.7 docker desktop
提供一个简单的界面, 可以从机器上直接管理你的容器
七、运行一个 docker 容器
如果已经有容器, 可以使用 docker start 容器 id;如果是 image 就应该创建一个 docker 容器, docker run image
7.3 docker 命令
docker -h \ 直接敲 docker \ docker --help 查看 docker 的帮助信息 也可以查看子命令下的命令
docker run --help ...等 Run 'docker COMMAND --help' for more information on a command.
docker run --help
Usage: docker run \[OPTIONS] IMAGE \[COMMAND] \[ARG...] // docker run - it nginx /bin/bash
后面的 \[COMMAND] \[ARG...] 是容器内要执行的命令,是可选参数
// 查看官网命令 找到官网 ===》 reference 文档
- docker run
- docker ps -[可选] 查看容器列表
- docker inspect -[可选] 查看容器信息
- docker exec [option] 容器 执行命令 -- 可以不进入容器内,执行容器内容的命令
docker exec -it nginx1 ls
bin boot dev docker-entrypoint.d docker-entrypoint.sh etc home lib media mnt opt proc root run sbin srv sys tmp usr var - docker attach 容器 进入容器里面, 如果不需要使用,可以通过 exit 退出, 如果还要使用使用 ctrl + p + q 退出, 在运行容器的是否使用命令可以进入容器内部, 使用 ctl + p + q 不关闭容器的情况下退处,后续使用 docker attach 容器 可以再次进入容器, 在运行容器的时候后面要加进入容器后的 shell, 一般是 /bin/bash , 这样才可以直接使用 attach 直接进去
- docker stop 容器 停止容器, 如果批量停止使用 docker stop $(docker ps -aq)
- docker start 容器 启动容器, 如果批量启动使用 docker start $(docker ps -aq)
- docker top 容器 查看容器的进程的进程信息
- docker stats [option] 容器 查看容器的资源占用情况
- docker rm 容器 删除容器,一定要先关闭后删除 批量删除使用 docker rm $(docker ps -aq)
- docker prune 删除所有
八、 镜像的操作
8.1 镜像的操作
查看镜像
docker images \ docker images list
搜索镜像
docker search 镜像名
建议到 docker hub 上去查看
镜像下载:
docker pull 镜像名, 如果下载的镜像属于一个 imageId , 但是 tag 不同, 他会下载很快
镜像删除:
docker rmi 镜像名
8.2 什么是镜像
镜像是只读的容器模板, 是 docker 容器的基础;为 docker 容器提供了静态文件系统运行环境;镜像是容器的静止状态;容器是镜像的运行状态
8.2.1 容器镜像采用什么进行组织 (联合文件系统)
镜像本身被分为很多层, 需要将这些层联合起来形成一个新的文件系统,
用到了联合文件系统联合文件系统:
- 是实现联合挂载技术的文件系统
- 可以实现在一个挂载点同时挂载多个文件系统, 将挂载点的原目录与被挂载内容进行整合,使最终可见的文件系统包含整合之后的各层文件和目录
联合文件系统,有很多工具比如: docker overlay2, aufs, btrfs, zfs, devicemapper 等
8.2.2 docker overlay2 1. registry/repository: registry(注册表, 大仓库 ) 是 repository(容器镜像的分层, 把它联合起来就是一个容器的仓库, 小仓库) 的集合, repository 是镜像的集合(就是一个仓库) 2. image: image 是存储镜像相关的元数据,包括镜像的架构,镜像默认配置信息, 镜像的容器配置信息等, 他是逻辑上的概念, 并没有物理上的镜像文件与之对应 3. layer: 镜像层,组成了镜像, 单个 layer 可以被多个镜像共享
最后挂载在 docker 挂载点上的文件目录是被整合了的
8.2.3 查看 docker host 存储驱动方式 storage driver 存储驱动方式
docker info | grep overlay 或则 docker info
8.2.4 了解 images 分层 这个不好实操
8.3 Docker 容器镜像操作命令
8.3.1 docker commit
容器内部写文件会反映在 overlay 的可读写层, 这个可读写层也是可以做成镜像的。 docker 通过 commit 和 build 操作实现镜像的构建。commit 将容器提交为一个镜像, build 在一个镜像的基础上构建镜像, 使用 commit 将上节的容器提交为一个镜像(如果在容器内修改了内容, 使用 commit)
docker commit --help // create a new image from a container's change, 他内部生成了 hash 值, 并将该值在原来的基础上添加一个镜像层(在原来的基础上添加标识)
8.3.2 docker save 导出容器镜像, 方便分享
docker save -o 镜像名.tar 镜像名 // 会打成 tar 包
8.3.3 docker load
把他人分享的 docker 导入本地, 这是 docker 常见的容器分发方式之一
8.3.4 docker export id 把正在运行的 docker 导出
docker export -o 镜像名.tar 镜像名
8.3.5 docker import 镜像名.tar 自定义名称
导入他人使用 export 导出的正在运行的镜像
注意: docker export 和 docker import 只在容器运行时才可以使用, 在实际生产中一般使用 docker save
8.4 docker build
docker build 命令用于从 Dockerfile 构建 Docker 镜像。
docker build 命令通过读取 Dockerfile 中定义的指令,逐步构建镜像,并将最终结果保存到本地镜像库中。
构建镜像:
docker build -t myimage:latest .
九、 容器镜像的上传
9.1 镜像上传到 docker hub, 创建的是一个镜像仓库, 仓库就是存放镜像的, 打 tag
首先要有 dockerhub 的账号 --- 也可以使用阿里云的
其次,本地必须要有个一个镜像, 可以使用 tag 创建一个镜像 tag , docker tag source:tag younamespace:tag
```
// 创建一个 tag
docker tag nginx:latest luochunxiaoman/first_lc_docker:first1
// 上传到镜像仓库
luochun@luochundeMacBook-Pro bin % docker push luochunxiaoman/first_lc_docker:first1
The push refers to repository [docker.io/luochunxiaoman/first_lc_docker]
eff28c52527d: Mounted from library/nginx
222b689eab41: Mounted from library/nginx
d1b06a1c3b85: Mounted from library/nginx
736977886b2f: Mounted from library/nginx
99c4c4e89701: Mounted from library/nginx
1f989e199813: Mounted from library/nginx
8560597d922c: Mounted from library/nginx
first1: digest: sha256:86703d1a0662b039707c38745090a736c68cfd6c7799e8558a75bcd1414786e5 size: 1778
```
十、 使用 Docker 容器化部署企业级应用的必要性
- 有利于快速实现企业级应用部署
- 有利于快速实现企业级应用恢复
10.1 运行 nginx 镜像
-
查看官方文档
登录 docker hub 搜索 nginx
-
通过 docker 来运行 nginx 并将目录挂载到宿主机
通常用 docker 运行 nginx 我们访问到的页面是 nginx 中的页面, 在 docker 容器中页面被放在 /usr/share/nginx/html 目录下, 我们将这个目录挂载到宿主机的 /Users/luochun/nginx/html/ 目录下, 这样我们就可以在宿主机中访问到 nginx 页面了, 这里的目录有限制, 我在本机 /private 文件夹下创建了一个 docker 文件夹, 在里面创建了一个 html 文件, 这样你在访问地址就可以看到自己写的内容了。
执行 docker run --name nginx-server1 -v /private/docker/nginx/resume:/usr/share/nginx/html:ro -d -p 80:80 nginx:latest
这里使用 -p 80:80 将docker 内部的端口暴露出来, mac 中无法直接访问docker 中的地址, -v 是挂载目录, -p 是将 docker 内部的端口往外暴露,本机 docker 挂载点在 /private/docker
10.2 运行一个 nginx(反向代理服务器) 应用容器
nginx 内部默认端口是 80 挂载配置文件, 需要创建一个 nginx 容器, 把配置文件复制出来修改后使用 等同于将容器内部的 nginx 配置文件复制出来,然后挂载在主机(就是自己的电脑)。
我的操作:
在 /private 文件夹下定义了一个 docker 文件, 文件夹下有目录: html , nginxConfig , 分别用来挂载 nginx 容器内部的 html 页面和 nginx 配置文件, 这样在运行容器时其实文件都是走的主机
运行容器:
docker run --name nginx-server2 -v /private/docker/nginx/nginxConfig/nginx.conf:/etc/nginx/nginx.conf -v /private/docker/nginx/html:/usr/share/nginx/html -d -p 81:80 nginx:latest
10.3 运行一个 tomcat (web server and servlet container)应用容器
tomcat 默认端口是 8080,可以按照官网配置运行一个简单的 tomcat docker 容器, 他部署的方式其实和 nginx 差不多, 以及文件目录挂载等, 只是 tomcat 中他默认的文件目录在/usr/local/tomcat/webapps/ 下, 这是 tomcat 中存放静态文件资源的地方, 如果文件夹下什么都没有, 会返回一个 404 页面 基于这个文件目录我执行了
docker run --name tomcat-first -p 8081:8080 --rm -it -d \ -v /private/docker/tomcat/:/usr/local/tomcat/webapps:ro tomcat
10.4 运行一个 mysql 数据库容器, mysql 默认端口是 3306
按照官网来看, 很容易就启动了一个 mysql 容器,但是对于 mac 来说 docker 官方有些 mysql 没有支持的架构, 我这里使用的是 mysql:8.0
docker run --name mysql-first -p 3306:3306 -e MYSQL_ROOT_PASSWORD=lc123456 -d mysql:8.0
这样就可以运行一个 myysql 数据库容器了, 默认的端口是 3306, 默认的 root 密码是 lc123456, 但是我们需要看在容器中是否可以访问这个数据库, 使用命令行执行容器内部的命令
docker exec -it mysql-first mysql -uroot -plc165379
上面的命令可以访问到容器内部的数据库, 可以看到我们其实访问到了数据库
注意:
这里面还有一个知识点, 如何将容器内的目录挂载到宿主机?不知道为什么, 一直有问题,这个需要下来细看下
补充:
一般情况下, 需要将容器内 mysql 的配置文件(/etc/mysql/conf.d ), 以及数据存放位置(/var/lib/mysql), 以及数据的日志文件存放地址 (/var/log/mysql)
运行命令:
docker run --name mysql-first -it -p 3306:3306 \
> -v /private/docker/mysql8.4/conf.d/:/etc/mysql/conf.d \
> -v /private/docker/mysql8.4/data/:/var/mysql:ro \
> -v /private/docker/mysql8.4/log/:/var/log/mysql:ro \
> -e MYSQL_ROOT_PASSWORD=lc123456 \
> -d mysql:8.0