系统启动docker
systemctl start docker
系统关闭docker
systemctl stop docker
查看docker安装的镜像
docker images
查看运行的docker容器
docker ps
查看所有docker容器
docker ps -a
yum安装docker
yum install -y docker
查看是否安装完成
yum list installed |grep docker
查看当前的docker服务
systemctl status docker
查看docker版本
docker version
查看远程docker
docker search mysql
拉取镜像mysql
docker pull mysql:指定版本
查看本地镜像
docker images
换镜像拉取地址
vi /etc/docker/daemon.json
{
"registry-mirrors":["https://docker.mirrors.ustc.edu.cn"]
}
删除容器(需要先停止容器)
docker rm 容器id或者容器名称
删除镜像
docker rmi mysql:5.7 镜像名称+版本
docker rmi imageId
创建容器
docker run
-i 表示运行容器
--name 名字
-p 暴露出的端口 前面是宿主机的端口,后面是容器的duankou
-P 大写P 是映射宿主机随机端口
-d 后台运行 会创建一个守护石容器在后台运行, 如果只加 -it 创建容器会直接进入到容器中
-v 表示目录映射关系 前者是宿主机目录 后者是映射到宿主机上的目录 可以使用多个 -v做多个目录或文件映射
-t 可以为容器重新分配一个伪输入终端
docker run 运行并进入
docker run -p 3306:3306 --name mysql02 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:tag //正确
参数解释
-p : 端口映射
--name: 给容器命名
-e :指定密码
-d :选择镜像
运行docker容器
docker exec -it fe bash
将我们使用的docker的用户添加到docker组中
将一个已有用户 username 增加到一个已有用户组 docker 中,使此用户组成为该用户的附加用户组,可以使用带 -a 参数的 usermod 指令。-a 代表 append, 也就是将用户添加到新用户组中而不必离开原有的其他用户组。不过需要与 -G 选项配合使用:
sudo usermod -a -G docker username
如果要同时将 username 的主要用户组改为 docker,则直接使用 -g 选项
usermod -g docker username
镜像和容器的关系 就是类和对象的关系 镜像就相当于模板 容器才是真正运行的东西
镜像分层 是什么?
多个容器都公用一个阉割版的linux
举例 docker pull redis 会拉取很多东西 ,比如其中有一个是c语言的环境 那么以后拉取其他容器也需要c语言的环境,那就不需要再进行拉取c语言的环境的
Volume数据卷
容器既然运行起来,跑起来就会产生数据 容器是很容易丢失的 作用就是用来保存数据的, 可以让容器里面的数据映射到宿主机上面 运行容器的时候可以指定映射
Registy 注册中心
Docker hub是一个用于管理公共镜像的好地方,
我们可以使用registry镜像来构建一个容器,搭建我们的私有仓库服务
docker pull registry 可以构建局域网仓库
容器相关命令
查看本机容器
docker ps -a
查看本机运行的容器
docker ps
查看过滤容器
docker ps -f name=value
守护进程创建
docker run -di --name mynginx -p 80:80 nginx
如何进入
docker exec -it mynginx /bin/bash
文件拷贝
宿主机到容器
docker cp 需要拷贝的文件或者目录 容器名称:容器目录
容器到宿主机
docker cp 容器名称:容器目录 需要拷贝的文件或目录
目录挂载
我们可以在创建容器的时候,将宿主机的目录和容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器,而且这个操作是双向绑定的,也就是说容器内的操作也会影响到数组及,实现备份功能
但是容器被删除的时候,宿主机的内瓤不会被删除,如果多个容器挂载同一个目录,其中一个容器被删除,其他容器的内容也不会收到影响
容器和宿主机之间的数据卷属于引用的关系,数据源是从外界挂载到容器内部中,所以可以脱离容器的生命周期而独立存在,正式由于数据卷的生命周期不等同于容器的生命周期,在容器退出或者删除以后,数据卷不会收到影响,
创建容器添加-v参数 格式为宿主机目录:容器目录
例如
docker run -di -v /mydata/docker_centos/data :/usr/local/data --name centos7-01 centos:7
多目录挂载
docker run -di -v /宿主机目录:/容器目录 -v /宿主机目录2:/容器目录2 镜像名
如果挂在时候出现权限不足的情况, 是因为centos中安全模块SELinux把权限禁用掉了, 通过 --privileged=true 给该容器加权限来解决挂载目录没有权限的问题
匿名挂载 (不关心容器中的文件具体挂载到了宿主机的哪个地方)
匿名挂载只需要写容器目录即可
容器外对应的目录会在var/lib/docker/volumes中生成
docker run -di -v /usr/local/data --name centos7-02 centos:7
docker 修改配置信息 来修改目录卷
docker inspect 容器名称 里面有个"Mounts" 修改信息
容器详细配置信息目录
var/lib/docker
具名挂载
就是指定镜像挂载的位置 docker run -di -v docker_nginx_data :/usr/local/data --name nginx06 nginx
到 var/lib/docker/volumes/中就会有一个docker_nginx_data文件夹
docker在挂载的时候还能设置权限
只读 只能通过宿主机内容实现对容器的数据管理
docker run -it -v /宿主机目录 :/容器目录 :ro 镜像名
读写 默认
docker run -it -v
挂载继承
volunes-form
容器 centos7-01 指定目录挂载
docker run -di -v /mydata/docker_centos/data :/usr/local/data --name centos7-01 centos:7
容器 centos7-05 相当于继承centos01容器的挂载目录
docker run -di --volums-from centos7-01 --name centos7-05 centos:7
查看目录卷详细信息
docker volume inspect docker_nginx_data
查看容器ip地址
docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名
docker inspect 容器名称|容器id
也可以使用
docker inspect nginx07 查看NETworks 信息
构建一个镜像
docker commit :从容器创建一个新的镜像
docker build: 配合Dockerfile文件创建镜像
docker commit
目标 通过基础镜像centos7 在该镜像中安装jdk和tomcat以后 将其制作成为一个新的镜像mycentos:7
1.创建容器
docker pull centos:7
docker run -di --name mycentos centos:7
2.拷贝资源
将宿主机上的jdk和tomcat拷贝到容器
docker cp xxxx mycentos:/root
docker cp xxx mycentos:/root
3.解压文件
4.构建镜像
docker commit -a = "chenchen" -m ="这是构建信息" 容器名称 目标镜像名称
-a 作者
-m "构建信息"
5.docker images 查看
6.基于创建的镜像 生成一个带有jdk的容器
docker run -di --name 容器名 镜像名:tag
docker file 常用命令
1。From 语法 FROM <image>:<tag> 指明构建的新镜像来自于哪个基础镜像,如果没有选择tag 那么默认为latest
如果不以任何镜像为基础 那么写法为 FROM scratch 官方说明scratch镜像是一个空镜像
2.MAINTAINER(deprecated)
语法 MAINIAINER <name> 知名镜像维护者以及连接方式 过时 推荐LABEL
3. LABEL <KEY>=<VALUE> <KEY>=<VALUE>
功能是为镜像指定标签,也可以使用LABEL指定镜像作者
4.RUN
RUN <command>
构建镜像时运行的Shell脚本, 比如构建的新镜像中我们想在/usr/local目录下创建一个java目录
RUN mkdir -p /usr/local/java
5 ADD 拷贝资源
ADD <src> ....<dest>
拷贝文件或目录到镜像中 src可以是一个本地文件按或者是一个本地压缩文件,压缩文件会自动解压,还可以是一个url 如果吧src携程一个url 那么ADD就类似与wget 然后自动下载和解压
ADD jdk-11.0.tat.gz /usr/local/java
6.COPY
拷贝我呢见或者目录到镜像中,不支持自动下载和解压
7.EXPOSE 暴露容器中端口给外部,可以指定端口是监听TCP还是UDP 默认是TCP
EXPOSE 80 443 8080/tcp
如果想让容器与宿主机的端口有因施工和关系,必须在容器启动的时候加上-P 参数
8 ENV
语法 ENV <key><value 添加单个 ENV <KEY>=<VALUE> 添加多个
设置容器内环境变量
ENV JAVA_HOME /usr/local/java/jdk-11.0.6
9CMD
语法:
CMD ["executable" "param1","param2"] 比如 CMD ["./usr/local/tomat/bin/catalina.sh","run"]
CMD ["param1","param2"] 比如 CMD ["echo","$JAVA_HOME"]
CMD command param1 param2 比如 CMD echo $JAVA_HOME
启动容器时执行的Shell命令 在Dockerfile中只能有一条CMD命令 如果设置了多条CMD 只有最后一条会生效
CMD echo $JAVA_HOME
如果创建容器的时候指定了命令 则CMD命令会被替代 假如镜像叫centos:7 创建容器的命令是 docker run -it --name centos7 centos:7 echo "helloworld"
或者 docker run -it --name centos7 centos:7 /bin/bash 就不会输出$JAVA_HOME的环境变量信息了,因为CMD命令被 "echo helloworld" "bin/bash" 覆盖了
10 ENTRYPOINT entrypoint
ENTRYPOINT ["executable" "param1","param2"] 比如 ENTRYPOINT ["./usr/local/tomat/bin/catalina.sh","run"]
ENTRYPOINT ["param1","param2"] 比如 ENTRYPOINT ["echo","$JAVA_HOME"]
ENTRYPOINT command param1 param2 比如 ENTRYPOINT echo $JAVA_HOME
和CMD命令一样,只是指令不会被覆盖
如果Dockerfile中 同时写了 CMD 和 ENTRYPOINT 并且CMD指令不是一个完整的可执行命令 那么CMD指定的内容将会作为ENTRYPOINT的参数
如果Dockerfile中 同时写了CMD 和 ENTRYPOINT 并且CMD指令是一个完整的可执行命令 那么他两个会相互覆盖, 谁在后面谁生效
11 WORKDIR 设置一个工作目录
WORKDIR /usr/local 默认进来的目录
12 VOLUME
指定容器挂载点到宿主机自动生成的目录或其他容器, 一般场景为需要持久化存储数据时
容器的 /var/lib/mysql 目录会在运行时自动挂载为匿名卷 匿名卷在宿主机的 /var/lib/docker/volumes 目录下
一般不会在Dockerfile中用到,更常见的还是在docker run 的时候通过-v指定数据卷
容器必须有前台任务在执行,否则直接退出 run 会阻塞展示
构建DockerFile
docker build -f /usr/local/dockerfile/Dockerfile -t mycentos:7 /资源位置
-f 指定dockefile文件位置
-t 指定创建的镜像的名字
mkdir -p usr/local/docker-nginx
vi docker-compose.yml
#描述Compose文件的版本信息
version:"3.8"
#定义服务,可以多个
services:
nginx: #服务名称
image:nginx #创建容器时所需要的镜像
container_name: mynginx #容器名称, 默认为"工程名称_服务条目名称_序号"
ports: #宿主机与容器的端口映射
-"80:80" #左边宿主机端口:右边容器端口
networks: #配置容器连接的网络,引用顶级networks下的条目
-nginx-net
#定义网络,可以多个,如果不声明,默认会创建一个网络名称为"工程名称_default"的bridge网络
networks:
nginx-net: #一个具体网络的条目名称
name:nginx-net #网络名称,默认为"工程名称_网络条目名称"
driver:bridge #网络模式,默认为bridge
https://vuepress.mirror.docker-practice.com/
docker-compose up 创建并启动所有服务,这个简单的案例只有一个Nginx
前台启动 docker-compose up
后台启动
docker-compose up -d
docker-compose down 删除容器,移除网络
用docker-compose搭建redis集群
1.编写Redis配置文件
2.编写Docker-compose文件
version:"3.8"
services:
redis-6371:
image:redis
container_name:redis_6371
restart:always
network_mode:"host"
volumes:
- /usr/local/docker-redis/redis-cluster/6371/config/redis.conf:/usr/lcoal/etc/redis/redis.conf
-/usr/local/docker-redis/redis-cluster/6371/data:/data
command:redis-server /usr/local/etc/redis/redis.conf #覆盖容器启动后默认执行的命令
redis-6372:
image:redis
container_name:redis_6372
restart:always
network_mode:"host"
volumes:
- /usr/local/docker-redis/redis-cluster/6372/config/redis.conf:/usr/lcoal/etc/redis/redis.conf
-/usr/local/docker-redis/redis-cluster/6372/data:/data
command:redis-server /usr/local/etc/redis/redis.conf #覆盖容器启动后默认执行的命令
3.创建集群
Swarm概念
Docker Swarm 是Docker官方推出的容器集群管理工具,基于go语言实现,使用它可以将多个Docker主机封装为单个大型的虚拟docker主机,快速打造一套容器云平台
docker swarm 是生产环境中运行docker应用程序最简单的方法,作为容器集群管理器,Swarm最大的优势之一就是100%支持标准呢的Docker API
各种基于表中API的工具比如 compose docker_py 各种管理软件,甚至docker本身等都可以很容易的与Swarm进行集成,Swarm内置了对Docker网络插件的支持,用户可以很容器的部署跨主机的容器集群服务
和Compose一样, 都是Docker官网编排工具,但不同的是, Docker Compose是一个在单个服务器或主机上创建多个容器的工具,而docker Swarm则可以咋多个服务器或主机上创建容器集群服务,对于微服务的部署,显然docker swarm会更加适合。 如果数量巨大 ,建议使用k8s
一个Swarm由多个主机组成,以Swarm集群模式运行,Swarm集群由manager节点(管理者角色,管理成员和委托任务)和worker节点(工作者角色,运行Swarm服务)组成,这些Docker主机有些是Manager节点,有些是Worker节点,或者同时扮演这两种角色。
Swarm创建服务的时候,需要指定要使用赶得及ing想,在运行的容器中执行的命令,定义其副本的数量,可用的网络和数据卷,将服务公开给外部的端口等等,与独立容器相比,群居服务的主要优势之一是,你可以修改服务的配置,包括它所连接的网络和数据卷,而不需要手动重启服务,还有就是如果一个worker node 不可用了,Docker会调用不可用的Node的task任务到其他nodes上。
Nodes
Swarm集群由Manager阶段和worker节点组成, 一个节点就是Swarm集群中的一个示例,也就是一个Docker主机,你可以运行一个或者多个节点在单台物理机上或云服务器上,但是生产环境上,典型的部署方式是 Docker节点交叉分布式部署在堕胎物理机或云主机上,节点名称默认为机器的hostname
Manager 负责整个集群的管理工作,包括集群配置,服务管理,容器编排等所有跟集群有关的工作,他会选举出一个leader来指挥编排任务
worker 工作节点接受和执行从管理节点分派的任务(task)运行在相应的服务(services)上
Services and Task
服务是一个抽象的概念,是对要在管理节点或者工作节点上执行的任务的定义,他是集群胸痛的中心结构,是用户与集群交互的主要根源,Swarm创建服务是,可以为服务定义以下信息:
服务名称:
使用哪个镜像来创建容器
要运行多少个副本
服务的容器要连接到哪个网络上
要映射哪些端口
任务 包括一个docker 容器和在容器中运行的命令,任务是一个集群的最小单元,任务与容器是一对一的关系,管理节点根据服务规模中设置的副本数量将任务分配给工作节点, 一旦任务被非陪到一个节点,便无法移动到另一个节点,他只能在分配的节点上运行或失败
Reolicated and global services 副本和全局 服务
swarm 提供了节点的弹性扩容和缩容,
副本服务,当服务需要动态扩容是,只需要通过scale参数或者--replicas n参数指定运行相同任务的数量,即可复制出新的副本,将一系列复制任务分发至各节点当中,这种操作成为副本服务
全局服务, 可以通过 --mode global 参数将服务分发至全部节点智障,这种操作我们成为全局服务,在每个节点上运行一个相同的任务,不需要预先指定任务的数量,每增加一个节点到Swarm中,协调器就会创建一个任务,然后调度器把任务分配给新的节点
Overlay网络(虚拟化产生的技术)