Docker部分总结

安装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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值