大一菜鸡的个人笔记,欢迎指点和交流。
Docker
Docker的意义
把项目和运行环境打包成镜像,在docker仓库下载我们发布的镜像。
Docker和虚拟机的不同
传统虚拟机虚拟出一条硬件,运行一个完整的操纵系统,然后在这个系统上安装和运行软件。
容器中的应用直接运行在宿主机,没有内核,也没有虚拟硬件,所以效率高。每个容器之间互不影响。
组成
镜像(image):镜像像是一个模板,通过这个模板创建容器服务,通过这个镜像可以创建多个容器。(最终服务运行或者项目运行就是在容器中的)
容器(container):Docker利用容器技术,独立运行一个或者一组应用,通过镜像来创建。
仓库(repository):存放镜像的地方,分为公用仓库和私有仓库。
DockerHub 阿里云
Docker比起虚拟机的优势
Docker的抽象层比虚拟机少
Docker使用宿主机内核,虚拟机加载Guest Os
命令
帮助命令
docker version 显示版本信息
docker info 显示系统信息 包括镜像和容器的数量
docker --help 帮助命令
镜像命令
docker images
docker images 查看所有本地的主机上的镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest bf756fb1ae65 6 months ago 13.3kB
REPOSITORY 镜像的仓库源
TAG 标签
IMAGE ID 镜像的id
CREATED 镜像的创建时间
SIZE 镜像的大小
docker images -q 只显示镜像的id
docker images -a 显示所有镜像
docker search
可选限制条件:--filter= START= 3000
docker pull 下载镜像 如果不写tag 默认是latest
docker pull mysql:5.7 指定版本下载
docker rmi -f id 根据id删除镜像
docker rmi -f id id id id 删除多个镜像
docker rmi -f ${docker image -aq} 根据搜索结果把所有镜像都删除
运行容器
docker run image
--name= "Name" 容器名字
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口 -p :8080
例: docker run -it centos /bin/bash
docker ps 列出所有运行的容器
docker ps -a -n= 1 只列出一个
docker ps -aq 显示所有容器的编号
退出容器
exit 停止容器并退出
Ctrl + P + Q 容器不停止 退出
删除容器
docker rm id 根据id删除容器
docker rm -f ${docker ps -aq} 删除所有容器
docker ps -a -q| xargs docker rm 删除所有的容器
启动和停止容器
docker start 容器id 启动容器
docker restart 容器id 重启容器
docker stop 容器id 停止当前正在运行的容器
docker kill 容器id 强制停止当前容器
其他常用指令
后台启动容器
docker run -d 镜像名 后台运行镜像
docker发现没有前台运行 就会停止
查看日志
docker logs
查看容器中进程信息
docker top id
docker inspect id 详细信息
进入当前运行的容器
docker exec -it 容器id /bin/bash
docker attach --help 查看帮助指令
docker attach 容器id
docker exec 进入容器后开启一个新的终端
docker attach 进入容器正在执行的终端 不会启动新的进程
把容器内的文件复制到主机上
docker cp 容器id:目录 复制到的目录
命令手册
service docker restart docker未启动 重启docker
docker search nginx 搜索nginx的镜像
docker pull nginx 下载nginx的镜像
docker images 查看本机镜像
docker run -d --name nginx01 -p:3344:80 nginx 在后台运行nginx镜像 并给nginx起别名nginx01 以公网的3344端口映射到内部的80端口
docker ps 查看运行中的所有容器
curl localhost:3344 访问本机的3344端口
docker exec -it nginx02 /bin/bash 进入别名为nginx02的镜像
whereis nginx 找到nginx的所在目录
exit 退出容器
docker stop 容器id 停止容器
docker run -it --rm tomcat:9.0 下载tomcat9.0版本( 如果没有) ,并运行,运行完了立即删除。
docker run -d -p 3355:8080 --name tomcat01 tomcat 以暴露端口的方式启动
cp -r webapps.dist/* webapps 把webapps.diss目录下的所有文件复制到webapps目录
docker stats 查看CPU的状态
docker Ctrl+Shift+C 退出查看CPU状态
docker run -d --name elasticsearch02 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS= "Xms64m -Xmx512m" elasticsearch:7.6.2
修改镜像的配置文件 限制可用内存大小
docker run -d -p 8088:9000 \
--restart= always -v /var/run/docker.sock:/var/run/docker.sock --privileged= true portainer/portainer
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
端口的理解
Docker镜像
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于软件运行环境开发的软件,包含库、代码、环境变量和配置文件。
Docker原理
UnionFS(联合文件系统)
是一种分层、轻量级并且高性能的文件系统,支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载在同一个虚拟文件系统下。Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
Docker镜像加载原理
docker的镜像实际上是由一层一层的文件系统组成,这种系统就是UnionFS。
bootfs(boot file system)主要包含bootloader和kernel,bootloader 主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后内核存放在内存之中,内存的使用权已由bootfs转交给内核,此时系统会卸载bootfs。
rootfs在bootfs之上。包含典型Linux系统中的/dev /proc /bin /etc 等标准目录和文件 rootfs就是各种不同的操作系统发行版 如 Ubuntu Centos等
镜像大小比起平常的文件显得很小,就是因为对于一个精简的镜像,rootfs只包含最基本的命令,工具和程序库就可以了,底层使用Host的kernel,公用bootfs。
特点
Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部。这一层就是我们通常说的容器层,容器层之下是镜像层。
提交自己的镜像
docker commit 提交新的镜像
docker commit -a= "rush" -m= "add webapps app" 5e805f6fd6f4 tomcat02:1.0
最下面是镜像层 commit可以保存当前容器的状态 获得新的镜像
容器数据卷
将容器的数据存储在本地 实现容器的持久化和同步操作,容器间的数据共享。
指定路径挂载
docker run -it -v /home/ceshi:/home centos /bin/bash 将容器的/home目录映射道本机的/home/ceshi目录
docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql
使用docker inspect 镜像id 在Mounts可以查看挂载信息
停止容器后修改文件 启动容器可查看到修改后的文件
匿名挂载(不建议使用)
docker run -d -P --name nginx02 -v /etc/nginx nginx
随机生成卷名 不方便
具名挂载
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
docker volume ls 查看所有卷的情况
docker volume inspect juming-nginx
-v+卷名+内路径,没有指定目录下都是在主机的/var/lib/docker/volumes目录下
使用具名挂载可以很方便的找到我们的卷
读写权限
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx
ro表示readOnly 只读
rw表示readWrite 可读可写
一旦设置 不可修改 默认为rw
数据卷容器(多个mysql数据同步)
docker run -it --name docker01 rush/centos:1.0 启动第一个容器
docker run -it --name docker02 --volumes-from docker01 启动第二个容器 并绑定第一个容器
docker run -it --name docker03 --volumes-from docker01
三个容器的数据卷建立了连接
如果把docker01容器删除 其他容器的对应数据卷不会被删除
使用备份机制而不是共享机制,指向的都是本地的真实目录的地址
多个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= rush2017 --name mysql01 mysql:5.7
docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD= rush2017 --name mysql02 mysql:5.7
--volumes-from mysql01 mysql:5.7
可以实现两个mysql数据同步
DockerFile
1.编写DockerFile文件
2.docker build 构建镜像
3.docker run 运行镜像
4.docker push 发布镜像
特性
每个关键字都必须是大写字母
从上到下执行
#表示注释
每一个指令都会创建提交一个新的镜像层
DockerFile就是用来构建docker镜像的构建文件
包含了命令和脚本
创建一个dockerfile文件 写入脚本
FROM centos
VOLUME [ "volume01" ,"volume02" ] 创建时挂载
CMD echo "----end-----"
CMD /bin/bash
然后 docker build -f /home /dockerfile -t rush/centos:1.0
这种挂载属于匿名挂载
需要使用inspect命令找到对应的随机目录
DockerFile指令
FROM 用来说明这个镜像的妈妈是谁( 基础镜像 例如Centos)
MAINTAINER 谁是它的监护人( 维护者信息 姓名+邮箱)
RUN 构建时需要运行的命令( 你想让他干啥)
ADD 想要集成的组件 如tomcat镜像
WORKDIR 镜像的工作目录
VOLUME 挂载的主机目录
EXPOSE 对外指定端口 类似-p
CMD 容器启动后要干的事情 只有最后一个会生效
ENTRYPOINT 容器启动后要干的事情,可追加命令
RUN 容器启动后要干的事情
COPY 将文件拷贝到镜像中
ENV 配置环境变量
最基础的镜像: scratch
构建自己的centos
1.构建DockerFile文件
FROM centos
MAINTAINER rush<1907779674@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 "成功啦"
CMD /bin/bash
2.通过文件构建镜像
docker build -f myDockerFile -t mycentos:1.0 .
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
制作自己的tomcat镜像
把需要用的文件放到同一目录下
From centos
MAINTAINER rush< 1907779674@qq.com>
COPY readme.txt /usr/local/readme.txt 这是放入容器类的目录
ADD jdk-8u11-linux-x64.tar.gz /usr/local/ 会自动解压到该目录
ADD apache-tomcat-9.0.22.tar.gz /usr/local/ 会自动解压到该目录
RUN yum -y install vim
ENV MYPATH /usr/local/
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_11
ENV CLASSPATH $JAVA_HOME /lib/dt.jar:$JAVA_HOME /lib/tools.jar
ENV CATALINE_HOME /usr/local/apache-tomcat-9.0.22
ENV CATALINE_BASH /usr/local/apache-tomcat-9.0.22
ENV PATH $PATH : $JAVA_HOME /bin:$CATALINE_HOME /lib:$CATALINE_HOME /bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.22/startup.sh && tail -F /url/local/apache-tomcat-9.0.22/bin/logs/cataline.out 运行tomcat
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
发布镜像
docker tag 镜像id 作者账号名/镜像名:版本号
docker push
Docker Compose
微服务架构的应用一般包含多个微服务,每个微服务一般都会部署多个实例,如果每个实例都需要手动操作,那么效率之低,维护工作量之大可想而知。
Docker Compose就是帮助我们管理容器的神器,它是用于定义和运行多容器Docker的应用程序工具。
下载Docker Compose
推荐使用国内的镜像 可以修改下方的1.22.0下载想要的版本
curl -L https://get.daocloud.io/docker/compose/releases/download/1.22.0/docker-compose-` uname -s`
-` uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
github下载
sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$( uname -s) -$( uname -m) -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
使用方式
①打包项目获得jar包
②在jar包所在路径创建Dockerfile
如
FROM java:8
VOLUME /tmp
ADD docker-demo-0.0.1-SNAPSHOT.jar app.jar
RUN bash -c 'touch /app.jar'
EXPOSE 9000
ENTRYPOINT [ "java" ,"-Djava.security.egd=file:/dev/./urandom" ,"-jar" ,"app.jar" ]
③在jar包所在路径创建docker-compose.yml文件
如
version: '2'
services:
docker-demo:
build: .
ports:
- "9000:8761"
把文件夹拉到Linux环境下,执行命令
docker-compose up -d 构建镜像并后台启动
三层容器
Docker将所管理的容器分为三层,工程(Project)、服务(Service)、容器(Container),docker-compose.yml文件的目录组成一个工程,一个工程包含多个服务,每个服务中包含了容器运行的镜像、参数、依赖,一个服务可以包含多个容器实例。
Docker Compose命令
docker-compose ps 列出所有运行中的容器
docker-compose logs 读取日志
docker-compose port eureka 8761 打印eureka服务 8761端口绑定的公共端口
docker-compose build 构建服务
docker-compose start/stop eureka 启动或停止容器
docker-compose rm eureka 删除容器
docker-compose up 构建、启动容器
注意事项
当服务的配置发生改变时,需使用docker-compose up命令更新配置。之后,Compose会删除旧容器并创建新容器,新容器会以不同的IP地址加入网络,名称保持不变,任何指向旧容器的连接都会被关闭,直到重新连接新容器。
资料来源——
https://www.jianshu.com/p/658911a8cff3