早期定义:运行你的应用不需要你的环境,他能够把你的环境和项目一起打包,所以,在移植的时候,不需要在其他设备上面配置环境
优势:
1、docker能将程序和使用软件环境直接绑定在一起
2、进程级隔离,容器独立。在一台服务器上,启用多个项目,可能会互杀冲突,而doker两进程间不会互抢资源
3、镜像 机制,便于部署
Docker与虚拟机对比:
安装:下载docker脚本
curl -fsSL get.docker.com -o get-docker.sh
sh get-docker.sh --mirror Aliyun
启动docker命令
systemctl enable docker
systemctl start docker
创建docker用户组
groupadd docker
将当前用户加入docker组
sudo usermod -aG docker $USER
测试docker安装是否正确
docker run hello-world
docker version有:服务端,客户端
docker info 展示docker详细信息
镜像 Image:定义一个镜像就代表一个软件
容器Container :一个镜像与运行一次就会生成一个容器 容器就是一个运行的软件服务
docker仓库 Respostory:存储所有软件的镜像位置(搜docker hub)
本地仓库:用来存储在使用docker过程中的相关镜像
docker 如何配置阿里云镜像加速
上阿里云官网搜
例子:
sido mkdir -p /etc/docker
并写下配置
sudo tee /etc/docker/daemon.json <<- 'EOF'
{
"regostru-mirrors':["https://lz2nib3q.mirror.aliyuncs.com"]
}
EOF
重启docker
sudo systemctl daemon-reload
sudo systemctl restart docker
docker的执行命令:docker run hello-world
如果在本地仓库找不到,则会去中心仓库拉取
如存在,则直接运行
docker version
docker info 详细信息
docker --help 用来帮助信息
镜像 image
查看当前本地仓库中存在哪些镜像
docker images 或者 docker image ls
拉取一个镜像
docker pull 镜像名称
例如:docker pull redis == docker pull redis:lastest(最新版本)
搜索镜像 docker search 镜像名
删除镜像 docker image rm 镜像名(name | tag)镜像id
强制删除 docker image rm -f 镜像名(name:tag)
docker images -q 列出所有 id
docker image rm -f $(docker images xxx -q) 批量删除
使用docker命令是对容器的操作
查看docker引擎中在运行的容器
docker ps
docker ps 查看当前docker引擎中正在运行的容器
docker run xxx|xxx -d -name xxx 以name 运行在后台
注意:docker是操作系统层面的隔离,所以要把docker容器暴露给宿主机
所以在运行容器时,
docker run -p 8080(宿主机):8080容器内端口 镜像名:8.0
运行tomcat容器,同事设置容器与宿主机端口的隐射关系 -p
能够映射多个端口 -p xxx:xxx -p xxx:xxx
建议:运行tomcat,开放端口映射,后台启动该服务,指定容器名称 --name 容器名称
docker run -d -p xxx:xxx --name xxx 容器名称
停止重启暂停恢复容器
停止docker stop xxxxid
启动docker start 容器id|容器名称
重启 docker restart 容器id|容器名称
暂停docker pause 容器id|容器名称
恢复docker unpause 容器id|容器名称
docker ps -aq 查看所有的容器id
杀死容器
docker kill 容器id
删除容器
docker rm (-f) 容器id:
docker logs 容器id|容器名称
docker logs -f 容器id|容器名称 持续时间
进入容器内部
docker exec -it(交互模式) 容器id|name bash(sh)
将容器中的指定文件和目录拷贝到宿主机上 docker cp 容器id:容器中文件或目录 主机哪个目录
将主机中的指定文件和目录拷贝到容器内: docker cp 主机文件和目录 容器:容器路径
查看容器内运行进程 docker top 容器id|name
查看容器内细节指令 docker inspect 容器id|name
容器数据卷机制:数据卷 Data Volume 作用: 用来实现容器中数据和宿主机中数据进行映射的(同步的)类似共享文件夹宿主机与docker进行映射
注意:数据卷使用必须在容器首次启动时设置
使用: docker run -v 宿主机目录:容器内目录 ..
①使用绝对路径设置数据卷 docker run -v 宿主机绝对路径:容器内路径
注意:这种方式会将容器路径的原始内容全部清空,始终以宿主机路径为主
如何将容器打包成一个新的镜像
docker commit -m "deploy test project in webapps" -a "xiaochen" 容器id|name tomcat-test:8.0
镜像备份和恢复
备份镜像: docker save 镜像名:Tag -o () docker save tomcat:8.0 -o tomcat-8.0.tar
恢复:docker load -i tomcat-8.0.tar
删除全部的docker容器 docker rm -f $(docker ps -qa)
镜像原理:
镜像可执行的独立软件包,它包括运行某个软件所需的所有内容,包括代码、运行环境、库、配置文件。
UnionFS:联合文件系统 叠加文件系统
原理:一次同事加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包括所有底层的文件和目录。
docker 启动mysql
建议:使用任何容器都应参考dockerhub官方网站,搜索引擎(百度 google)
1、docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root mysql:5.6
2、docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d --name mysql01 --restart=always mysql:5.6
docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456
今后启动docker需要后台启动映射宿主机,增加数据卷数据持久化到宿主机
例如
docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 -restart=always -v /root/data:/var/lib/mysql mysql:5.6
运行mysql容器数据备份
备份全部
docker exec (mysql容器id) sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > /root/all-databases.sql
备份某库
docker exec (mysql容器id) sh -c 'exec mysqldump --databases 库名 -uroot -p"$MYSQL_ROOT_PASSWORD"' > /root/all-databases.sql
备份某库结构不要数据
docker exec (mysql容器id) sh -c 'exec mysqldump --no-data --databases 库名 -uroot -p"$MYSQL_ROOT_PASSWORD"' > /root/all-databases.sql
使用navicat提供数据备份
redis服务:5.0.12版本
与mysql类似
docker run -p 6379:6379 redis:5.0.12
启动redis 映射端口 后端启动-d 指定名称--name 总是启动 --restart=always redis:5.0.12
运行redis开启持久化 redis-server --appendonly yes
映射数据卷
docker run --name redis01 -d -p 6379:6379 --restart=always -v /root/redisdata:/data redis:5.0.12 redis-server --appendonly yes
注意:真实情况都是使用以下的这种情况
docker run --name redis01 -d -p 6379:6379 --restart=always -v /root/redisconf:/data redis:5.0.12 redis-server /data/redis.conf
配置配置文件
redis.conf
appendonly yes
appendfilename "xx.aof"
bind 0.0.0.0
nginx
运行nginx 映射端口80 docker run -p 80:80 nginx:1.19.10
启动nginx 映射端口 后台启动 总是启动 指定名称 加载指定nginx配置启动 -v 容器(/etc/nginx/nginx.conf)
拷贝文件:docker cp 容器id:/etc/nginx/nginx.conf /root/nginxconf
docker run -p 80:80 -d --restart=always --name nginx05 -v /root/nginxconfig/nginx.conf:/etc/nginx/nginx.conf nginx:1.19.10
nginx服务器 服务器
docker run -p 8081:80 -d --restart=always --name nginx04 -v /root/html:/usr/share/nginx/html nginx:1.19.10
es
docker pull elasticsearch:6.8.10
启动es 映射端口(9200(http) 9300(tcp))
启动es 映射端口后台启动 总是启动 指定名称 通过数据卷映射数据到宿主机~~ 容器内数据存储目录(/usr/share/elasticsearch/data)
docker run -p 9200:9000 -p 9300:9300 -d --restart=always --name=es -v esdata:/usr/share/elasticsearch/data -v xxx elasticsearch:6.8.10
注意:es启动如果没有知名单机方式运行,默认使用集群方式启动,如果使用集群方式启动在启动时会出现如下错误:65530 262144 虚拟机内存不足
解决方案:在宿主机中执行如下操作
vim /etc/sysctl.conf
vm.max_map_count=262144
sysctl -p 是配置生效
使es数据json符合中文,需使用分词器ik,注意ik版本要与es版本一致
放入docker es 中的plugins中
kibana 也与es一致
启动kibana 开放端口(5601)
docker run -p 5601:5601 -d --name kibana --restart=always kibana:6.8.10
启动kibana 开放端口 指定kibana链接es服务(6版本以下,7版本不用指定环境)
docker run -p 5601:5601 -d --name kibana -e ELASTICSEARCH_URL=http://192.168.80.129:9200 --restart=always kibana:6.8.10
注意:默认链接就是localhost:9200 es kibana 在一台机器上
docker 容器间的通信 网络间的使用
默认docker创建的网桥为docker0 所有的容器就链接在这上面,能通过ip进行互相通信,但是默认不能通过名称进行通信
如要用名称进行通信 如 curl http:容器名称:xxx
需要进行自定义网桥
创建网络自定义桥
docker network create -d bridge(默认) 网络名称
查看网络 docker network ls
查看某一个网络细节
docker network inspect 网络名
删除一个网络
docker network rm 网络名
docker network prune 删除所有未被用到的网络名
运行多哥容器在指定的网络中
docker run -d --network 网络名称
docker network connect 王利明
高级数据卷 Volume
定义:用来实现宿主机和容器之间文件目录映射同步
数据卷的使用:必须在容器首次启动时指定
-v 宿主机路径:容器内路径
使用绝对路径数据卷docker run -v /root/datas:/usr/local/tomcat/webapps
使用别名方式数据卷 docker run -v bb:/usr/local/tomcat/webapps
注意:bb代表一个数据卷别名
bb这个数据别名可以存在,也可以不存在 不存在docker首次用到时自动创建
第一次使用别名时将容器中原始数据保留下来 使用绝对路径方式不会保留容器中原始数据
数据卷别名:
别名代表一个docker自身维护数据卷
1、查看所有docker维护数据卷
docker volume ls
2、查看数据卷详细内容
docker inspect 数据卷别名、网桥名称、容器名称
docker network inspect 查看网桥详细
docker volume inspect 查看数据卷详细
3、删除一个数据卷
docker volume rm 数据卷别名
4、创建一个别名数据卷
docker volume create 数据卷别名
重点1:
dockerfile
指令:
from
。。。
CMD & ENTRYPOINT
作用都是用来指定容器启动时默认执行指令
注意:CMD 指令可以存在多个 但是存在多个只有最后一个生效
使用语法
CMD & ENTRYPOINT
1) 直接命令方式
java -jar ems.jar
2)json数组方法
["java","-jar","ems.jar"]
区别是什么?
1)CMD里面命令如果在运行容器时进行覆盖
docker run 镜像:版本号 覆盖自己定义命令 ls /
2)entrypoint里面命令如果在运行容器时进行覆盖
docker run --entrypoint=覆盖指令 镜像:版本号 传递参数
如果使用
entrypotin 用来书写一个容器固定的指定
cmd 用来给entry传递参数
注意:配合使用时必须使用json数组语法
现有docker进行项目部署存在问题
1.为了完成一个完整项目势必用到n多哥容器配合完成项目中业务开发,一旦引入n多哥容器,n多个容器之间就会形成某种依赖,也就意味某个容器某些容器运行需要其他哦让其有限启动后才能正常运行
容器编排显得至关重要
2、目前这种方式使用容器,没有办法站在项目的角度将一个项目用到一组容器划分到一起,日后难点在于项目多服务器部署
项目角度管理项目用到一组容器
docker compose对docker容器集群的快速编排。
docker-compose在线安装
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
赋予权限:sudo chmod +x /usr/local/bin/docker-compose
docker-compose 第一案例
1、创建一个项目 mkdir ems
服务
项目
docker-compose模板
代表一个docker-compose项目的版本号
version:"3.8"
service:
tomcat:
image: tomcat:8.0 #代表使用哪个镜像, 类似于docker run 指定的镜像名称
ports: #代表宿主机和容器中端口映射 类似于docker run -p 参数
8080:8080
启动docker-compose一组服务
docker-compose up 指定这个命令必须在
version:“3.8”
services:
tomcat:
container_name: tomcat01 代表给容器指定一个名称 类似于 docker run --name xxx
image: tomcat:8.0
ports:
-"8080:8080"
redis:
image: redis:5.6
ports:
- "6379:6379"
mysql:
image: mysql:5.6
ports:
- "3306:3306"
environment:
- "MYSQL_ROOT_PASSWORD=123456"
volumes:
- /root/mysqldata1:/var/lib/mysql #代表给当前容器和宿主机指定数据卷 类似 docker run -v
在docker-compose中必须提前创建数据卷才能使用
取别名
volumes:
- mydata:/var/lib/mysql
volumes:
mydata:
docker-compose 模板命令
build指令:通过docker-compose在启动容器之前现根据dockerfile构建镜像,然后根据构建镜像启动容器
command 指令 覆盖容器启动后默认执行的命令
depend_on
- tomcat #书写依赖的服务名
注意:服务不会等待被依赖服务完全启动才启动
environment 用来给容器启动指定环境变量
env_file 环境变量指定环境变量文件,同上私密
env_file:
- ./aa.env
expose(使用dockerfile暴露)
image 指定启动容器使用镜像是谁 相当于docker run image(镜像名)
networks 用阿里只能大概启动容器使用网桥 相当于docker run --network
使用networks需要进行声明
ports: 用来指定宿主机和容器端口映射 docker run -p
volumes: 用来指定宿主机中容器目录映射 docker run -v
restart: 用来指定docker容器(服务)总是运行 docker run --restart=always
docker-compose 命令的基本使用
docker-compose -f docker-compose.yml 命令 [选项] [服务id]
docker-compose up 运行整个项目
up 服务id 运行服务
down 关闭所有并移除网络
down 服务id
docker-compose ps
-q 服务id
docker-compose exec 服务id bash
restart
docker-compose restart 对整个项目操作
docker-compose restart -t 服务id
rm
docker-compose rm 服务id
top 服务id 查看整个项目中的进行
pause暂停 和unpause 恢复
logs
docker-compose logs -f(实时) 服务id
查看运行日志
portainer docker 可视化界面
第三方开源项目,用来对docker引擎中运行所有容器进行可视化的展示
docker pull portainer/portainer
docker volume create portainer_data
如何使用:
docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer