Docker

大一菜鸡的个人笔记,欢迎指点和交流。

Docker

Docker的意义

把项目和运行环境打包成镜像,在docker仓库下载我们发布的镜像。

Docker和虚拟机的不同

传统虚拟机虚拟出一条硬件,运行一个完整的操纵系统,然后在这个系统上安装和运行软件。

容器中的应用直接运行在宿主机,没有内核,也没有虚拟硬件,所以效率高。每个容器之间互不影响。

组成

  • ​ 镜像(image):镜像像是一个模板,通过这个模板创建容器服务,通过这个镜像可以创建多个容器。(最终服务运行或者项目运行就是在容器中的)
  • ​ 容器(container):Docker利用容器技术,独立运行一个或者一组应用,通过镜像来创建。
  • ​ 仓库(repository):存放镜像的地方,分为公用仓库和私有仓库。

DockerHub 阿里云

Docker比起虚拟机的优势

image-20200719181016358

  • Docker的抽象层比虚拟机少
  • Docker使用宿主机内核,虚拟机加载Guest Os

image-20200719181410342

命令

帮助命令

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

端口的理解

image-20200721094504470

Docker镜像

​ 镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于软件运行环境开发的软件,包含库、代码、环境变量和配置文件。

Docker原理

UnionFS(联合文件系统)

​ 是一种分层、轻量级并且高性能的文件系统,支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载在同一个虚拟文件系统下。Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

image-20200721114548439

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 

image-20200721131208045

最下面是镜像层 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可以查看挂载信息

image-20200721133033150

停止容器后修改文件 启动容器可查看到修改后的文件

匿名挂载(不建议使用)

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 发布镜像

特性

  • 每个关键字都必须是大写字母
  • 从上到下执行
  • #表示注释
  • 每一个指令都会创建提交一个新的镜像层

image-20200721155638411

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 .

制作自己的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 

发布镜像

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' # 表示该 Docker-Compose 文件使用的是 Version 2 file
services:
  docker-demo:  # 指定服务名称
    build: .  # 指定 Dockerfile 所在路径
    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

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值