curl -L https://get.daocloud.io/docker/compose/releases/download/1.24.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
Docker概述:
官网
https://www.docker.com/
文档
https://docs.docker.com/
仓库地址
https://hub.docker.com/
其他相关文档(命令行)
https://docs.docker.com/reference/
框架图:
linux联网环境下的Docker安装
1.环境准备
CenterOS 7、 Docker Linux安装包
系统查看
uname -r
环境查看
cat /etc/os-release
配置阿里云镜像加速
docker命令大全
https://www.runoob.com/docker/docker-command-manual.html
帮助命令
docker version
docker info
docker 命令 --help
镜像命令
2.docker search 镜像的名字 在docker hub 上面搜索镜像 -s 30 过滤30星以下的
3.docker pull 镜像名字 在阿里云上面下载镜像 docker pull redis:2.0 2.0标签 一般指2.0版本
4.docker rmi 镜像的名字 删除镜像 默认删除最新版本 也就是:latest版本 -f(force) 强制删除 可以删除多个 docker rmi -f $(docker images -aq) 删除所有的镜像
容器命令
1.新建并启动容器 docker run [OPTIONS] IMAGE [COMMAND][ARG...]
2. docker ps [options]查看正在运行的容器
3.docker start 容器id或容器name 启动容器 restart 重启
4 docker stop 容器id或容器name 停止容器
5.docker kill 容器id或容器name 强制停止容器
6.docker rm 容器id 删除已停止的容器 一次性可以删除多个 docker rm -f $(docker ps -aq) docker ps -a -q | xargs docker rm
7.docker logs -ft --tail 容器id 查看容器日志 t是加入时间戳 f跟随最新的日志打印 --tail 数字显示最后多少条
8.docker top 容器id 查看容器内运行的进程
9.docker inspect 容器id 查看容器内部细节
10.docker attach 容器id 进入到容器内部
11.docker exec -t 容器id ls -l /tmp 执行一条命令直接得到结果 docker exec -t 容器id /bin/bash 进入容器内部操作
12.docker cp 容器id:容器内路径 目的主机路径
常用其他命令
~后台启动容器 docker run -d 镜像名
~查看日志 docker logs -tf --tail 10 容器ID
~查看进程 docker top 容器ID
~查看容器历史 docker history 容器ID
~从容器拷贝到主机上 docker cp 容器ID:/home/文件名 主机目录路径
~commit镜像 docker commit -m="描述" -a="作者" 容器ID 目标镜像名:[TAG]
~镜像压缩 docker save -o 压缩文件名称 镜像名称:TAG
~压缩文件转镜像 docker load -i 压缩文件名称
~镜像添加标签 docker tag 镜像ID 目标镜像名:[TAG]
~容器数据卷
1)挂载 docker run -it -v 主机目录:容器目录 镜像名 /bin/bash
mysql:docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql.conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
2)具名挂载或匿名挂载
区分具名或匿名:docker volume ls
挂载目录查询:docker volume inspect 具名卷
3)通过dockfile文件生成镜像
docker build -f dockerfile1 -t centos:1.0 .
其中dockerfile1如下:
FROM centos
VOLUME ["colume01","colume02"]
CMD echo "-----end----"
CMD /bin/bash
4)多个数据卷共享
docker run -it --name docker02 --volumes-from docker01 centos:1.0
~创建虚拟网卡
docker network create redis --subnet 192.168.0.0/16
~建立桥接
docker network connect 容器名 容量名
~标记镜像为私有仓库的镜像
docker tag 备份镜像名:TAG 宿主机IP:5000/镜像名:TAG
~上传私有库
docker push 宿主机IP:5000/镜像名:TAG
~私有库下载到宿主机
docker pull 宿主机IP:5000/镜像名:TAG
DockerFile指令
上传到阿里云镜像
Docker流程
安装MySQL
#从镜像仓库里拉取对应版本的mysql镜像,此步可省略,在运行前也会先拉取对应版本镜像
docker pull mysql:5.7
docker run -p 3306:3306 --name mysql -v /root/mysql/conf:/etc/mysql/conf.d -v /root/mysql/logs:/logs -v /root/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root123 -d mysql:5.7
--创建数据库
create schema `数据库名` default character set utf8 collate utf8_general_ci;
--创建用户
create user '用户名'@'%' identified by '密码';
--用户授权数据库,*代表所有schema的所有数据库
grant all on *.* to `用户名`;
grant select,insert,update,delete,create on *.* to `用户名`;
--立即启用修改
flush privileges;
#mysql数据库备份
docker exec mysql容器ID sh -c ' exec mysqldump --all-databases -uroot -p"root123" ' > /root/mysql/init-databases.sql
安装Nginx
#从远程仓库拉取nginx
docker pull nginx
#创建一个测试nginx容器
docker run --name tmp-nginx-container -d nginx
#从容器拷贝配置文件到宿主机,如果本来就存在文件则不执行该操作
docker cp tmp-nginx-container:/etc/nginx/nginx.conf /root/nginx/nginx.conf
docker ps tmp-nginx-container:/etc/nginx/conf.d /root/nginx/conf.d
#删除测试容器
docker rm -f tmp-nginx-container
#创建nginx容器,挂载时root下对应文件不存在,测试时会报错
docker run --name nginx -p 80:80 -v /root/nginx/conf.d:/etc/nginx/conf.d -v /root/nginx/nginx.conf:/etc/nginx/nginx.conf -v /root/nginx/log:/var/log/nginx -d nginx
#测试
curl localhost
docker exec -it nginx bash
安装单机redis
#拉取redis
docker pull redis:3.2
#拷贝redis配置文件到/root/redis/conf目录下
/root/redis/conf/redis.conf
#后台运行redis,注意:不同版本的redis生成的dump.rdb文件可能不同,启动时会报错
docker run -p 6379:6379 -p 16379:16379 --name redis -v /root/redis/data:/data -v /root/redis/conf:/usr/local/etc/redis -d redis:3.2 redis-server /usr/local/etc/redis/redis.conf
#测试
docker exec -it redis bash
cd /data
cd /usr/local/etc/redis/
docker exec -it redis redis-cli
get a
set a b
get a
quit
Redis集群部署
#创建网卡
docker network create redis --subnet 172.38.0.0/16
docker network ls
docker network inspect redis
#shell脚本创建redis集群
for port in $(seq 1 6); \
do \
mkdir -p /mydata/redis/node-${port}/conf
touch /mydata/redis/node-${port}/conf/redis.conf
cat << EOF > /mydata/redis/node-${port}/conf/redis.conf
port 6379
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.38.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done
#shell脚本启动redis群组
for port in $(seq 1 6); \
do \
docker run -p 637${port}:6379 -p 1637${port}:16379 --name redis-${port} \
-v /mydata/redis/node-${port}/data:/data \
-v /mydata/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.1${port} redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf; \
done
#创建集群 分片+高可用+负载均衡
redis-cli --cluster create 172.38.3.11:6379 172.38.3.12:6379 172.38.3.13:6379 172.38.3.14:6379 172.38.3.15:6379 172.38.3.16:6379 --cluster-replicas 1
#测试
#进入任一redis容器
docker exec -it redis-1 /bin/sh
redis-cli -c
> cluster info
> cluster nodes
> set a b
> get a
#在宿主机将保存数据的容器停止
docker stop redis-3
#单个redis下载并安装
docker run -p 6379:6379 -v /root/redis/data:/data -v /root/redis/redis.conf:/usr/local/etc/redis/redis.conf -d redis:3.2 redis-server /usr/local/etc/redis/redis.conf --appendonly yes
#进入redis容器并打开redis客户端
docker exec -it redis容器ID redis-cli
安装mongodb
#拉取对应版本的mongo镜像
docker pull mongo:3.6.5
#创建mongo容器
docker run -p 27017:27017 --name mongo -v /root/mongo/data:/data/db -v /root/mongo/conf:/data/configdb -v /root/mongo/backup:/data/backup -d mongo:3.6.5
#查看是否启动成功
docker ps -a
mongo 192.168.3.128:27017 #在安装的mongo客户端的主机上查询
use test
db.test.insert({"name":"cap"})
#数据库备份
docker exec mongo sh -c 'exec mongodump --help'
docker exec mongo sh -c 'exec mongodump -h localhost --port 27017 -d test -c test -o /data/backup'
#数据库恢复,注意:原集合恢复不改名不需要设置-d 数据库 -c 集合
docker exec mongo sh -c 'exec mongorestore --help'
docker exec mongo sh -c 'exec mongorestore -h localhost --port 27017 -d test2 -c test2 --dir /data/backup/test/test.bson'
安装带有libreoffice和jdk8的centos
参考文档:
https://www.jianshu.com/p/90dbf66c424a?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation
https://blog.csdn.net/qq_44470091/article/details/102517556
#root用户宿主机创建centos7-with-libreoffice目录
cd ~
mkdir centos7-with-libreoffice
#在http://mirrors.ustc.edu.cn/tdf/libreoffice/stable下载libreoffice的rpm安装包和语言包
LibreOffice_7.0.6_Linux_x86-64_rpm.tar.gz 和 LibreOffice_7.0.6_Linux_x86-64_rpm_langpack_zh-CN.tar.gz
#在https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html官网下载oracle下载安装包
jdk-8u301-linux-x64.tar.gz
#创建Dockerfile文件,内容如下:
#基于centos7版本镜像
FROM centos:7
#以下设置中文语言环境与修改时区
ENV LANG=zh_CN.UTF-8 \
LANGUAGE=zh_CN:zh \
LC_ALL=zh_CN.UTF-8
RUN yum update -y && \
yum reinstall -y glibc-common && \
yum install -y telnet net-tools && \
yum clean all && \
rm -rf /tmp/* rm -rf /var/cache/yum/* && \
localedef -c -f UTF-8 -i zh_CN zh_CN.UTF-8 && \
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
#加入windows字体包
#ADD chinese.tar.gz /usr/share/fonts/
#将下载好的包解压到相应文件下
ADD LibreOffice_7.0.6_Linux_x86-64_rpm.tar.gz /home/
ADD LibreOffice_7.0.6_Linux_x86-64_rpm_langpack_zh-CN.tar.gz /usr/
#执行安装
RUN cd /home/LibreOffice_7.0.6.2_Linux_x86-64_rpm/RPMS/ \
&& yum localinstall *.rpm -y \
&& cd /usr/LibreOffice_7.0.6.2_Linux_x86-64_rpm_langpack_zh-CN/RPMS/ \
&& yum localinstall *.rpm -y \
\
#安装依赖
&& yum install ibus -y \
#加入中文字体支持并赋权限
&& cd /usr/share/fonts/ \
&& chmod -R 755 /usr/share/fonts \
&& yum install mkfontscale -y \
&& mkfontscale \
&& yum install fontconfig -y \
&& mkfontdir \
&& fc-cache -fv \
&& mkdir /usr/local/java/ \
\
#清理缓存,减少镜像大小
&& yum clean all
#加入安装java环境
ADD jdk-8u301-linux-x64.tar.gz /usr/local/java/
RUN ln -s /usr/local/java/jdk1.8.0_301 /usr/local/java/jdk
#配置环境变量
ENV JAVA_HOME /usr/local/java/jdk
ENV JRE_HOME ${JAVA_HOME}/jre
ENV CLASSPATH .:${JAVA_HOME}/lib:${JRE_HOME}/lib
ENV PATH ${JAVA_HOME}/bin:$PATH
CMD ["bash"]
#上传LibreOffice和jdk的三个安装包和Dockerfile到centos7-with-libreoffice目录下
#可使用rz工具,安装方式yum -y install lrzsz
#创建带libreoffice的centos镜像
docker build -t centos:libreoffice .
#测试,记录此libreoffice的全路径,在java应用中需要使用
docker run -it --rm centos:libreoffice bash
cd /opt/libreoffice7.0
pwd
SpringBoot打包Docker镜像
1.搭建springboot项目
2.打包应用
3.编写Dockerfile(下载docker插件),放到项目目录下
FROM java:8
COPY *.jar /app.jar
CMD ["--server.port=8080"]
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]
4.上传jar和Dockerfile,构建镜像
docker build -t app .
docker images
docker run -d -P --name app-springboot app
docker ps
curl localhost:38080/hello
5.发布运行
发布基于centos:libreoffice镜像的应用
#创建Dockerfile文件,内容如下
FROM centos:libreoffice
MAINTAINER crcc
ENV MYPATH /etc/iot_green
WORKDIR $MYPATH
COPY *.jar $MYPATH/app.jar
COPY *.properties $MYPATH/
RUN chmod 755 *
CMD ["--server.port=7000"]
EXPOSE 7000
VOLUME ["/etc/iot_green/Logs","/etc/iot_green/material","/etc/iot_green/product"]
ENTRYPOINT ["java","-jar","/etc/iot_green/app.jar"]
#修改application.properties等文件配置,例如:
spring.profiles.active=dev
jodconverter.local.office-home=/opt/libreoffice7.0
primary.mongodb.host=192.168.3.128
#打包应用为jar
#打开宿主机,创建目录
mkdir /root/app
#上传Dockerfile,*.properties,*.jar文件到/root/app目录
#创建green:1.0的镜像
docker build -t green:1.0 .
#创建green容器
docker run -p 7000:7000 --name green -v /root/green/log:/etc/iot_green/Logs -v /root/green/material:/etc/iot_green/material -v /root/green/product:/etc/iot_green/product -d green:1.0
#测试
docker exec -it green bash
http://192.168.3.128:7000
Docker Compose
Docker私有仓库
Docker Swarm
#参考文档
https://www.runoob.com/docker/docker-swarm.html
#1.安装docker-machine,安装前需要先安装docker
#2.创建 swarm 集群管理节点(manager)
docker-machine create -d virtualbox swarm-manager
#3.管理节点关联到分配的IP
docker-machine ssh swarm-manager
docker swarm init --advertise-addr 192.168.99.107 #这里的 IP 为创建机器时分配的 ip。
#4.创建 swarm 集群工作节点(worker)
docker-machine create -d virtualbox swarm-worker1
docker-machine create -d virtualbox swarm-worker2
#5.分别进入两个机器里,指定添加至上一步中创建的集群
docker-machine ssh swarm-worker1
docker swarm init --advertise-addr 192.168.99.108 #这里的 IP 为创建机器时分配的 ip。
docker swarm join --token SWMTKN-1-4oogo9qziq768dma0uh3j0z0m5twlm10iynvz7ixza96k6jh9p-ajkb6w7qd06y1e33yrgko64sk 192.168.99.107:2377
#6.部署服务到集群中(跟集群管理有关的任何操作,都是在管理节点上操作的)
docker service create --replicas 1 --name helloworld alpine ping docker.com
#查看 helloworld 服务运行在哪个节点上,可以看到目前是在 swarm-worker1 节点
docker service ps helloworld
#查看 helloworld 部署的具体信息
docker service inspect --pretty helloworld
#扩展集群服务
docker service scale helloworld=2
#删除服务
docker service rm helloworld
docker service ps helloworld
#滚动升级服务
#1)创建一个 3.0.6 版本的 redis
docker service create --replicas 1 --name redis --update-delay 10s redis:3.0.6
#2)滚动升级 redis
docker service update --image redis:3.0.7 redis
#停止某个节点接收新的任务
#查看所有的节点
docker node ls
#停止节点 swarm-worker1
docker node update --availability drain swarm-worker1
#重新激活节点
docker node update --availability active swarm-worker1
错误解决
~报错信息:IPv4 forwarding is disabled. Networking will not work.
解决办法:追加信息到00-system.conf后,重启docker网络服务,重启容器
echo 'net.ipv4.ip_forward=1'>>/usr/lib/sysctl.d/00-system.conf
systemctl restart network