镜像是一个模板,可以用来创建容器,一个镜像可以创建多个容器
独立运行一个或者一个组应用,通过镜像创建,可以看为一个简易linux系统
存放镜像的地方,分为公有仓库和私有仓库
在本机寻找镜像——>有则运行,无则去DockerHub下载并运行
docker是一个CS结构,守护进程运行在主机上,通过Socket从客户端访问
Docker比虚拟机抽象层更少
利用的是宿主机的内核,而VM需要的是GuestOS
docker version
docker info
docker --help
###镜像命令
docker images #查看所有镜像
#可选项:
#-a 显示所有
#-q 只显示id
docker search #搜索镜像
docker pull mysql:5.7 #下载镜像
#如果不写tag,默认就是latest,随后进行分层下载,image的核心,联合文件系统
#会输出Digest:签名
#会输出docker.io/library/mysql:latest,即真实地址
docker rmi #删除镜像
#可选项
#docker rmi -f $(docker images -aq) 删除全部镜像
###容器命令
docker run #启动容器
#可选项
#--name 容器命名 --name="Name"
#-d 后台方式
#-it 交互方式
#-p 指定端口 -p 主机端口:容器端口
#-P 大写P就是随机指定端口
docker ps #列出容器
#可选项
#-a 列出所有容器,包括历史运行过的容器
#-q 只显示容器id
exit #容器内直接停止容器并退出
Ctrl+P+Q #容器不停止并退出
docker rm #删除容器
#可选项
#docker rm -f $(docker ps -aq) 删除全部容器
docker start 容器id #启动容器
docker restart 容器id #重启容器
docker stop 容器id #停止容器
docker kill 容器id #杀死容器
tips:docker容器使用后台运行,如果没有前台进程,则会自动停止
###其他命令
docker logs -tf --tail 10 容器id #查看日志
docker top 容器id #查看容器内的进程
docker inspect 容器id #查看镜像元数据
docker exec -it 容器id /bin/bash #进入当前正在运行的容器,开启新终端
docker attach 容器id #进入当前正在运行的容器,进入正在执行的终端
docker cp 容器id:容器内路径 当前目录
是一种分层、轻量级并且高性能的文件系统。
bootfs包含BootLoader和kernel,前者引导加载kernel,linux启动的时候会加载bootfs。
rootfs在bootfs上层,包含的是典型Linux的/dev、/proc、/bin、/etc等文件,rootfs是各种不同的操作系统发行版,例如ubuntu或者arch。
对于不同的linux,bootfs基本一致,只有rootfs有区别,所以只需要一层bootfs(即docker内置的),而每个镜像都是不同的rootfs而已。
第三层:应用程序(redis等)
第二层:rootfs(centos等)
第一层:bootfs(kernel)
镜像是只读的,不可改变,启动容器时是新增了一个可写层被加载到镜像顶层,即容器层。
由于如果数据都在容器中,那么容器删除的时候数据就会丢失,所以需要数据持久化。
可以通过容器数据卷的方式实现容器的持久化和同步操作。
#使用-v挂载
docker run -it -v 主机目录:容器内目录
本质上类似pd等vm的共享文件夹。
每运行一个容器,Docker都会分配一个ip地址,这个虚拟设备接口是成对出现的,一边连着协议,一边彼此相连。
使用了veth-pair技术,充当一个桥梁。
所有容器在不指定网络情况下, 都是docker0路由的,docker会分配一个默认可用的ip。
因为每次重启容器ip地址都会改变,因此如果一旦崩溃了,通过ip就不可访问了,因此需要通过–link实现高可用。
本质上是修改了/etc/hosts,将ip地址映射给容器名了。
不支持容器名连接访问。
#创建网络配置
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
#使用网络配置
docker run -itd --net mynet mysql
自定义的网络已经由docker维护好了对应的关系
#创建网络配置
docker network create redis --subnet 172.38.0.0/16
#使用脚本配置redis
for port in $(seq 1 6);\
do \
mkdir -p /home/redis/node-${port}/conf
touch /home/redis/node-${port}/conf/redis.conf
cat << EOF >/home/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
#运行容器
for port in $(seq 1 6); \
do \
docker run -p 637${port}:6379 -p 1637${port}:16379 --name redis-${port} \
-v /home/redis/node-${port}/data:/data \
-v /home/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.1${port} redis redis-server /etc/redis/redis.conf; \
done
#构建集群
docker exec -it redis-1 /bin/sh
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
把主机挂载的地址改为home目录 就可以解决 启动自动停止的问题
首先mvn package得到jar包
随后编写Dockerfile
FROM java:8
COPY *.jar /app.jar
CMD ["--server.port=8080"]
EXPOSE 8080
ENTRYPOINT["java","-jar","/app.jar"]
上传文件到服务器
docker build -t imagename .
docker run -d -P --name containername imagename
docker ps
curl localhost:32779/hello