docker 学习笔记
Docker 核心概念
镜像(image):一个镜像代表一个软件,例如 mysql 镜像,nginx 镜像。
特点:只读
容器(container):基于某个镜像运行一次就是启动一个程序实例,称之为一个容器,称之为一个服务。
特点:可读可写
仓库(repository):用来存储 docker 中所有镜像具体位置。
远程仓库:docker 在世界范围内维护一个唯一远程仓库。
本地仓库:当前自己机器中下载镜像的存储位置。
示例:拉取 mysql5.7 的镜像
docker pull mysql:5.7
配置 docker 下载镜像加速
1、安装 docker 之后设置 docker 下载时的加速服务器
2、注册阿里云账号,在控制台查找容器镜像服务
3、选择镜像工具下的镜像加速器,按照操作文档操作即可
hello-world 应用
docker run 镜像名,根据 run 后面的镜像运行一个容器
在运行之前先在自己的本地仓库查找对应的镜像,否则从 docker hub 中查找。
docker 引擎以及镜像的相关操作
查看 docker 引擎相关信息,以及 docker 帮助相关信息
1、用来展示 docker 信息(版本 等等)
docker info
可以看到 docker 是一个典型的 C/S 架构,包含 client 和 server 信息。
2、可以查看版本号
docker version
3、查看 docker 的所有帮助命令
docker --help
4、docker 执行命令的格式
docker [options] command(具体命令)
操作镜像 image 的相关命令
1、查看本地仓库中存在哪些镜像
docker images
-
REPOSITORY :镜像名称
-
TAG:版本
-
IMAGE ID:id
-
CREATE:镜像创建的时间
-
SIZE:镜像大小
2、下载一个镜像
docker pull 镜像名:版本号
docker pull 镜像名:@DIGEST(摘要)
根据摘要下载镜像
3、不通过 dockerhub 而通过命令行搜索镜像
docker search 镜像名[:版本号]
4、删除镜像
docker image rm 镜像名
5、强制删除
docker image rm -f
6、获取镜像 id
docker images -q
docker rmi -f $(docker images -q)
容器命令
1、将打包的 tar 镜像文件导入到自己的 docker 仓库
docker load -i 导入的 tar 镜像文件名
2、通过镜像运行一个容器(以 tomcat 镜像为例)
a. 简单运行
docker run 镜像id/镜像名
b. 映射宿主机端口与容器中的端口进行映射
docker run -p 宿主机端口:容器端口
通过这个命令,我们可以启动多个运行容器
c. 启动容器,映射外部端口,后台启动
docker run -d(后台运行)
d. 启动容器,指定容器名称
docker run --name 名称
3、查看运行的容器
a. 查看正在运行的容器
docker ps
-
CONTAINER ID:容器 id
-
IMAGE:基于的镜像
-
COMMAND:容器内执行的命令
-
CREATE:创建的时间
-
STATUS:当前状态(UP/DOWN)
-
PORTS:容器内服务监听的端口
-
NAMES:容器的名称
b. 查看所有容器(运行/非运行)
docker ps -a
c. 返回正在运行的容器 id
docker ps -q
4、停止、重启容器的命令
docker start 容器id/容器名
docker restart 容器id/容器名
docker stop 容器id/容器名 正常停止容器运行
docker kill 容器id/容器名 立即停止容器运行
5、删除一个容器
删除停止的容器
docker rm 容器名/容器id
删除正在运行的容器
docker rm -f 容器名/容器 id
6、查看容器内服务运行日志
docker logs 容器 id/容器名称 一闪而过
docker logs -f 容器 id/容器名称 实时查看
docker logs -t 容器 id/容器名称 加入时间戳
docker logs --tail n 容器 id/容器名称 查看容器尾部的n行
7、查看容器内的进程
docker top 容器 id/容器名称
8、宿主机与容器内部进行交互
进入容器的交互模式
docker exec -it 容器id/容器名称 /bin/bash(终端应用)
退出容器
exec
9、操作系统与容器的文件交互
从容器复制文件到操作系统
docker cp 容器id/容器名:容器下的资源路径 宿主机中的路径
从操作系统复制文件到容器
docker cp 宿主机中的路径 容器id/容器名:容器下的资源路径
10、查看容器内部的细节
docker inspect 容器id/容器名称
11、数据卷(Volume)
作用:实现宿主机系统与容器之间的文件共享
在启动容器之前指定数据卷
a. 自定义数据集目录
docker run -v 宿主机名目录:容器目录
举例
docker run -d -p 8080:8080 -v /c/contest/:/usr/local/contest tomcat
b. 自动数据卷目录
docker run -d -p 8080:8080 -v 自定义名称:/usr/local/contest tomcat
12、将容器打包成一个新的镜像
docker commit -m "deploy" -a "an" 容器id 打包的镜像名:镜像版本
-m :信息
-a :作者
13、将镜像备份出来
docker save 镜像名称:Tag -o 文件名.tar
镜像的原理(镜像的分层)
镜像为什么这么大
一个软件镜像不仅仅是软件包,也包含软件包所需的操作系统依赖,软件自身依赖以及自身软件包组成。
为什么 docker 镜像要采用分层镜像原理
docker 在设计镜像时,每个镜像都是由 n 个镜像共同组成。
UnionFS(联合文件系统)
为什么用联合文件系统
Docker 中的网络通信机制以及网桥的使用
为什么提供网络功能
Docker 允许通过外部访问容器或者容器互联的方式来提供网络服务。
高级网络配置
Docker 启动时,会自动在主机上创建一个 docker 虚拟网桥,实际上是 Linux 的一个 Bridge,可以理解为一个软件交换机,它会在挂载到它的网口之间进行转发。
当宿主机向网球上的接口发送一个数据包,Docker 上的网桥也会收到一个同样的数据包。
docker 网桥使用
一般在使用 docker 网桥(bridge)实现容器与容器通信时,都是站在一个应用角度进行容器通信。
a.查看现有的网桥配置。
查看 docker 网桥配置。
docker network ls
b.创建自己的网桥
docker create 网桥名 --> docker create -d bridge ems(网桥名称)
c.启动容器时指向网桥
docker run -d -p 8081:8080 --network ems --name xxx tomcat
注意:一旦在启用容器时指定了网桥之后,可以在任何这个网桥关联的容器中使用容器的名字与其他容器通信。
d.删除网桥
docker network rm 网桥名
Dockerfile
Dockerfile 简介
Dockerfile 用来帮助我们自己构建一个自定义镜像 Dockerfile 成为镜像构建文件
Dockerfile 构建镜像的原理/过程
Dockerfile 命令
FROM
当前镜像是基于哪一个镜像,第一个指令必须是 FROM
FROM <images>
FROM <images>[:<tag>]
FROM <images>[@digest] 使用摘要
docker build
docker build -t mycentos:01 .
RUN
构建镜像时需要运行的指令。
FROM centos
RUN yum install -y vim
FROM centos
RUN ["yum","install","-y","vim"]
EXPOSE
用来指定构建的镜像在运行为容器时对外暴露的端口。
EXPOSE 80
WORKDIR
WORKDIR /data
如果提供了相对路径,则是与上一次 WORKDIR 相对。
ADD
从上下文中拷贝文件到指定路径映像文件系统中
ADD home.txt /mydir/
COPY
从上下文中拷贝文件到指定路径映像文件系统中
COPY home.txt /mydir
和 ADD 不同之处,ADD 可以下载 URL,COPY 不行。
VOLUMN
定义可以挂载到宿主机器目录。
VOLUMN ["/data"]
ENV
用来为构建镜像设置环境变量,这个值将会出现在构建阶段中的所有后续指令环境中。
ENV <key> <value>
ENV <key>=<value>
ENV BASE_DIR /data/bb
WORKDIR $BASE_DIR
ENTRYPOINT
用来指定容器启动时的执行命令
ENTRYPOINT command param1 param2
往往用来设置容器启动后的第一个命令,是固定的。
CMD 可以用来设置容器启动后的第一个命令的默认参数,是可以变化的。
docker-compose
compose 是定义和运行多个 Docker 容器的应用,前身是开源项目 Fig。
compose 是官方的开源项目,负责实现对 Docker 容器集群的快速编排。
在日常工作中,经常碰到需要多个容器相互配合完成某项任务的情况,要实现一个 Web 项目,除了Web项目本身,还需要后端的数据库、负载均衡容器等。
docker-compose 允许用户通过一个单独的 docker-compose.yaml 模板文件定义一组相关联的应用容器为一个项目。
Compose 有两个概念:
-
服务 (service):一个应用的容器,实际上可以包含若干运行相同镜像的容器实例。
-
项目 (project):由一组关联的应用容器组成的一个完整的业务单元,在 docker-compose.yml 文件中定义。
Compose 的默认管理对象是项目,通过子命令对项目中一组容器进行便捷地生命周期管理。
第一个 docker-compose 程序
a. 创建一个 docker-compose.yaml 文件
b. 在配置文件中定义一个项目存在哪些服务
version: "3.0"
services:
tomcat: #服务名唯一
image: tomcat:8.0-jre8 #创建当前这个服务使用镜像是谁
ports:
- 8080:8080
c. 运行docker-compose
docker-compose up
docker-compose 命令
ports
暴露端口信息
宿主端口:容器端口 HOST:CONTAINER
当使用 HOST:CONTAINER 格式时,如果使用的容器端口小于 60 且没有放到引号里面,会得到错误结果。
sysctls
配置容器内核参数
volumns
数据卷所挂载的路径,可以设置为宿主机路径 HOST:CONTAINER 或者数据卷名称 VOLUMN:CONTAINER
version: "3.0"
services:
tomcat: #服务名唯一
image: tomcat #创建当前这个服务使用镜像是谁
ports:
- 8080:8080
volumns:
- tomcatwebapps: /usr/local/tomcat/webapps
volumns: #声明上面服务所使用的自动创建的卷名
tomcatwebapps: #声明指定的卷名