安装Docker
# 需要的安装包
yum install -y yum-utils
#设置镜像的仓库 默认是国外的
yum-config-manager \
--add-repo
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#更新软件包索引
yum makecache fast
#安装docker docker-ce 社区版 docker-ee企业版
yum install docker-ce docker-ce-cli containerd.io
#启动docker
systemctl start docker
docker version
/var/lib/docker docker的默认路径
#可以阿里云镜像加速
docker有着比虚拟机更少的抽象层
docker利用的是宿主机的内核,vm需要的Guest OS
docker常用命令
version
#显示版本
info
#显示docker系统信息
-a --all
#显示所有镜像
-q --quiet
#像是镜像的 id
-it
#使用交互式运行,进入容器查看内容
pu1l Pu1l an image or a repository from the docker registry server# 从docker镜像源服务器拉取指定镜像或者库镜像
push Push an image or a repository to the docker registry server
#推送指定镜像或者库镜像至docker源服务器
restart Restart a running container
#重启运行的容器
rm docker rm -f $(docker ps -aq)#移除所有
#移除一个或者多个容器
rmi Remove one or more images
#移除一个或多个镜像[无容器使用该镜像才可删除,否则需删除相关容器才可继续或-f强制删除]
run Run a command in a new container
#创建一个新的容器并运行一个命令
save save an image to a tar archive
#保存一个镜像为一个 tar 包[对应1oad]
search search for an image on the Docker Hub
#在docker hub中搜索镜像
start start a stopped containers
#启动容器
stop stop a running containers
#停止容器
tag Tag an image into a repository
#给源中镜像打标签
top Lookup the running processes of a container
#查看容器中运行的进程信息
unpause Unpause a paused container
#取消暂停容器
version show the docker version information
#查看docker 版本号
wait Block until a container stops,then print its exit code #截取容器停止时的退出状态值
docker exec -it ID 进入后开启一个新的终端
docker attach ID 进入正在运行的终端
#进入容器
docker cp 容器id:容器内路径 目的的主机路径
#复制
容器数据卷
使用数据卷
通过数据卷挂载可以将数据持久化,当容器挂掉后数据还存在
直接使用命令来挂载 -v 卷挂载
docker run -it -v 主机目录:容器内目录(以centos为例)
docker run -it -v /home/volums:/home centos /bin/bash
# 启动后通过docker inspect 容器id 查看 Mounts:{}是否挂载成功
docker inspect 容器id
匿名挂载
docker run -d -P --name nginx01 -v /etc/nginx nginx
具名挂载
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
# 查看一下这个卷
docker volume inspect juming-nginx
所有的docker容器内的卷,没有指定目录的情况下都在/var/lib/docker/volumes/xxxxx/_data
ro readonly 只读
rw readwrite 可读可写
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro(rw) nginx
docker run -it --name docker03 --volumes-from docker01 qp/centos:1.0
--volumes-from 数据共享
docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysql
-e MYSQL_ROOT_PASSWORD=xxxxxx --name mysql01 mysql:tag
docker run -d -p 3311:3306 -e MYSQL_ROOT_PASSWORD=xxxxxx
--name mysql02 --volumes-from mysql01 mysql:tag
这个时候,可以实现两个容器数据同步
结论:
容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止,但是一旦持久化到本地 -v,本地数据是不会被删除的
docker部署Elasticsearch
# es 暴露的端口多
# es 十分耗内存
# es 的数据一般需要放置到安全目录!挂载
# --net somentwork ?网络配置
# 启动
-d 后台运行
-p 端口映射(访问的端口号:端口号)
-e 环境配置
--name 容器名字
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e
"discovery.type=single-node" elasticsearch:tag
# 建议设置大小 -e ES_JAVA_OPTS="-Xms64m -Xmx512m"
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e
"discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m"
elasticsearch:tag
docker部署Kiabana
1.下载Kibana镜像
docker pull kiabana:tag
2.查看镜像
docker images
3.编辑kiabana.yml配置文件
kiabana.yml配置文件放在宿主机/home/kiabana/data/elk/目录下,内容如下:
server.name: kibana
server.host: "0"
elasticsearch.hosts: [ "http://IP:9200" ]
xpack.monitoring.ui.container.elasticsearch.enabled: true
4.运行 Kiabana
docker run -d --restart=always --log-driver json-file --log-opt max-size=100m
--log-opt max-file=2 --name xinyar-kiabana -p 5601:5601 -v
/home/kiabana/data/elk/kiabana.yml:/usr/share/kibana/config/kiabana.yml kiabana:tag
5. 查看容器启动状态
docker ps
portainer图形化界面工具
docker run -d -p 8088:9000 --restart=always
-v /var/run/docker.sock:/var/run/docker.sock
--privileged=true portainer/portainer
commit镜像
docker commit 提交容器成为一个新的副本
# 命令和git原理类似
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG]
安装MYSQL
# 获取镜像
docker pull mysql:8.0
# 运行容器
#设置密码 -e MYSQL_ROOT_PASSWORD=123456
docker run -p 3310:3306 --name mysql
-v /home/mysql/log:/var/log/mysql
-v /home/mysql/data:/var/lib/mysql -v /home/mysql/conf:/etc/mysql/conf.d
-e MYSQL_ROOT_PASSWORD=xxxxxx -d mysql:tag
Dockerfile
Dockfile就是用来构建docker镜像的构建文件!命令参数脚本!
1.编写一个dockerfile文件
2.docker build 构建成为一个镜像
3.docker run 运行镜像
4.docker push 发布镜像
docker构建过程
基础知识:
1.每个保留关键字(指令)都必须是大写字母
2.执行从上到下
3.#表示注释
4.每一个指令都会创建提交一个新的镜像层
DockerFile:构建文件,定义了一切的步骤,源代码
DockerImages:通过DockerFile构建生成的镜像,最终发布和运行产品,原来是jar或war
Docker容器:容器就是镜像运行起来提供服务器
DockerFile的指令
FROM #基础镜像,一切从这里开始构建
MAINTAINER #镜像是谁写的 姓名+邮箱
RUN #镜像构建时候需要运行的命令
ADD #添加内容(tomcat包)
WORKDIR #镜像的工作目录
VOLUME #挂载的目录
EXPOST #保留端口配置(不配置需要通过-p来暴露端口)
CMD #指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替换
ENTRYPOINT #指定这个容器启动的时候要运行的命令,可追加命令
ONBUILD #当构建一个被继承DockerFile 这个实收就会运行ONBUILD指令,(触发指令)
ENV #构建时设置环境变量
COPY #拷贝文件到镜像中
创建自己的centos
FROM centos
MAINTAINER xx<xxxxxxx@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "---end---"
CMD /bin/bash
#通过这个文件构建镜像
docker build -f mydockerfile(文件路径) -t mycentos:0.1 .
Successfully built 0cc8a8f9a500
Successfully tagged mycentos:0.1
实战Tomcat镜像
1.准备镜像文件 tomcat压缩包,jdk的压缩包
2.编写dockerfile(官方命名Dockerfile,build会自动找这个文件,不用-f指定了)
FROM centos
MAINTAINER xx<xxxxx@qq.com>
COPY readme.txt /usr/local/readme.txt
ADD jdk-8u151-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-8.5.15.tar.gz /usr/local/
RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_151
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.15
ENV CATALINA_BASH /usr/local/apache-tomcat-8.5.15
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-8.5.15/bin/startup.sh && tail -F /url/local/apache-tomcat-8.5.15/bin/logs/catalina.out
3.构建镜像
docker build -t diytomcat
4.启动镜像
docker run -d -p 9090:8080 --name mytomcat -v /home/mytomcat
/build/tomcat/test:/usr/local/apache-tomcat-8.5.15/webapps/test -v /home/mytomcat/build/tomcat/tomcatlogs/:/usr/local/apache-tomcat-8.5.15/logs diytomcat
5.访问测试
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
</web-app>
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>hello qingpeng</title>
</head>
<body>
Hello World!<br/>
<%
System.out.println("欢迎来到我的世界!!!");
%>
</body>
</html>
发布自己镜像
注册账号
在服务器上提交自己的镜像
docker login --help
Usage: docker login [OPTIONS] [SERVER]
Log in to a Docker registry.
If no server is specified, the default is defined by the daemon.
Options:
-p, --password string Password
--password-stdin Take the password from stdin
-u, --username string Username
Docker网络
理解Docker0
#容器启动的时候会得到一个 eth0@if262 ip地址,docker分配的
docker exec -it tomcat01 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
92: eth0@if93: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
1.每启动一个docker容器,docker就会给docker容器分配一个ip,只要安装了docker,就会有一个网卡docker0 桥接模式,使用的是evth-pair技术
evth-pair 就是一对的虚拟设备接口,他们都是成对出现的,一端连着协议,一端彼此相连,这个特性,evth-pair充当一个桥梁,连接各种虚拟网络设备的
所有容器不指定网络的情况下,都是docker0路由的,docker会给我们的容器分配一个默认的可用IP
Docker中所有的网络接口都是虚拟的,传输速度快
–link
#可ping 通 反向不行 相当于tomcat03绑定了tomcat02
docker run -d -P --name tomcat03 --link tomcat02 tomcat
[root@qingpeng ~]# docker exec -it tomcat03 cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.3 tomcat02 8708e9812dc7
172.17.0.4 e991fcefa620
自定义网络(推荐)
网络模式
bridge: 桥接模式(默认)
none: 不使用网络
host:和宿主机共享网络
container:容器网络连通(用的少,局限大)
[root@qingpeng ~]# docker run -d -P --name tomcat01 tomcat
[root@qingpeng ~]# docker run -d -P --name tomcat01 --net bridge tomcat
# docker特定,默认,域名不能访问 --link可以打通链接
# --driver bridge
# --subnet 192.168.0.0/16 192.168.0.2-192.168.255.255
(00000000.00000000)16位
# --getway 192.168.0.1
[root@qingpeng ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
4e6caea0591b3da3586ce66ead4e220871652974626b0e8f0b01fd362f97f7d7
[root@qingpeng ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
984e9af2db01 bridge bridge local
028ce440ae9e host host local
4e6caea0591b mynet bridge local
c4d8c4a50b14 none null local
[root@qingpeng ~]# docker exec -it tomcat-net-01 ping 192.168.0.3
PING 192.168.0.3 (192.168.0.3) 56(84) bytes of data.
#现在不使用--link也可以访问
[root@qingpeng ~]# docker exec -it tomcat-net-01 ping tomcat-net-02
PING tomcat-net-0- (192.168.0.3) 56(84) bytes of data.
优点:不同的集群使用不同的网络,保证集群是安全和健康的跨网操作别人,使用docker network connect连通
redis集群
# 创建redis网卡
docker network create redis --subnet172.38.0.0/16
#通过脚本创建六个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
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
docker run -p 6371:6379 -p 16371:16379 --name redis-1 \
-v /mydata/redis/node-1/data:/data \
-v /mydata/redis/node-1/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.11 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
docker run -p 6372:6379 -p 16372:16379 --name redis-2 \
-v /mydata/redis/node-2/data:/data \
-v /mydata/redis/node-2/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.12 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
docker run -p 6373:6379 -p 16373:16379 --name redis-3 \
-v /mydata/redis/node-3/data:/data \
-v /mydata/redis/node-3/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.13 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
docker run -p 6374:6379 -p 16374:16379 --name redis-4 \
-v /mydata/redis/node-4/data:/data \
-v /mydata/redis/node-4/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.14 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
docker run -p 6375:6379 -p 16375:16379 --name redis-5 \
-v /mydata/redis/node-5/data:/data \
-v /mydata/redis/node-5/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.15 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
docker run -p 6376:6379 -p 16376:16379 --name redis-6 \
-v /mydata/redis/node-6/data:/data \
-v /mydata/redis/node-6/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.16 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
#创建集群
redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379 --cluster-replicas 1
docker pull 拉去镜像超时问题
配置镜像加速
过配置Docker使用国内的镜像加速服务。镜像加速服务服务提供了Docker Hub上镜像的本地缓存,从而可以更快地拉取镜像,网络连接也更稳定。
1. sudo vim /etc/docker/daemon.json
2. {
"registry-mirrors": [
"https://hub-mirror.c.163.com",
"https://registry.aliyuncs.com",
"https://docker.mirrors.ustc.edu.cn"
]
}
重启docker
sudo systemctl restart docker